diff options
Diffstat (limited to 'drivers/media/dvb/frontends')
73 files changed, 13138 insertions, 6172 deletions
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig index d7c4837fa71c..cd7f9b7cbffa 100644 --- a/drivers/media/dvb/frontends/Kconfig +++ b/drivers/media/dvb/frontends/Kconfig | |||
@@ -201,6 +201,21 @@ config DVB_SI21XX | |||
201 | help | 201 | help |
202 | A DVB-S tuner module. Say Y when you want to support this frontend. | 202 | A DVB-S tuner module. Say Y when you want to support this frontend. |
203 | 203 | ||
204 | config DVB_DS3000 | ||
205 | tristate "Montage Tehnology DS3000 based" | ||
206 | depends on DVB_CORE && I2C | ||
207 | default m if DVB_FE_CUSTOMISE | ||
208 | help | ||
209 | A DVB-S/S2 tuner module. Say Y when you want to support this frontend. | ||
210 | |||
211 | config DVB_MB86A16 | ||
212 | tristate "Fujitsu MB86A16 based" | ||
213 | depends on DVB_CORE && I2C | ||
214 | default m if DVB_FE_CUSTOMISE | ||
215 | help | ||
216 | A DVB-S/DSS Direct Conversion reveiver. | ||
217 | Say Y when you want to support this frontend. | ||
218 | |||
204 | comment "DVB-T (terrestrial) frontends" | 219 | comment "DVB-T (terrestrial) frontends" |
205 | depends on DVB_CORE | 220 | depends on DVB_CORE |
206 | 221 | ||
@@ -342,6 +357,13 @@ config DVB_AF9013 | |||
342 | help | 357 | help |
343 | Say Y when you want to support this frontend. | 358 | Say Y when you want to support this frontend. |
344 | 359 | ||
360 | config DVB_EC100 | ||
361 | tristate "E3C EC100" | ||
362 | depends on DVB_CORE && I2C | ||
363 | default m if DVB_FE_CUSTOMISE | ||
364 | help | ||
365 | Say Y when you want to support this frontend. | ||
366 | |||
345 | comment "DVB-C (cable) frontends" | 367 | comment "DVB-C (cable) frontends" |
346 | depends on DVB_CORE | 368 | depends on DVB_CORE |
347 | 369 | ||
@@ -512,6 +534,15 @@ config DVB_TUNER_DIB0070 | |||
512 | This device is only used inside a SiP called together with a | 534 | This device is only used inside a SiP called together with a |
513 | demodulator for now. | 535 | demodulator for now. |
514 | 536 | ||
537 | config DVB_TUNER_DIB0090 | ||
538 | tristate "DiBcom DiB0090 silicon base-band tuner" | ||
539 | depends on I2C | ||
540 | default m if DVB_FE_CUSTOMISE | ||
541 | help | ||
542 | A driver for the silicon baseband tuner DiB0090 from DiBcom. | ||
543 | This device is only used inside a SiP called together with a | ||
544 | demodulator for now. | ||
545 | |||
515 | comment "SEC control devices for DVB-S" | 546 | comment "SEC control devices for DVB-S" |
516 | depends on DVB_CORE | 547 | depends on DVB_CORE |
517 | 548 | ||
@@ -557,6 +588,24 @@ config DVB_LGS8GXX | |||
557 | help | 588 | help |
558 | A DMB-TH tuner module. Say Y when you want to support this frontend. | 589 | A DMB-TH tuner module. Say Y when you want to support this frontend. |
559 | 590 | ||
591 | config DVB_ATBM8830 | ||
592 | tristate "AltoBeam ATBM8830/8831 DMB-TH demodulator" | ||
593 | depends on DVB_CORE && I2C | ||
594 | default m if DVB_FE_CUSTOMISE | ||
595 | help | ||
596 | A DMB-TH tuner module. Say Y when you want to support this frontend. | ||
597 | |||
598 | config DVB_TDA665x | ||
599 | tristate "TDA665x tuner" | ||
600 | depends on DVB_CORE && I2C | ||
601 | default m if DVB_FE_CUSTOMISE | ||
602 | help | ||
603 | Support for tuner modules based on Philips TDA6650/TDA6651 chips. | ||
604 | Say Y when you want to support this chip. | ||
605 | |||
606 | Currently supported tuners: | ||
607 | * Panasonic ENV57H12D5 (ET-50DT) | ||
608 | |||
560 | comment "Tools to develop new frontends" | 609 | comment "Tools to develop new frontends" |
561 | 610 | ||
562 | config DVB_DUMMY_FE | 611 | config DVB_DUMMY_FE |
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile index 3523767e7a76..874e8ada4d1d 100644 --- a/drivers/media/dvb/frontends/Makefile +++ b/drivers/media/dvb/frontends/Makefile | |||
@@ -55,6 +55,7 @@ obj-$(CONFIG_DVB_TDA10086) += tda10086.o | |||
55 | obj-$(CONFIG_DVB_TDA826X) += tda826x.o | 55 | obj-$(CONFIG_DVB_TDA826X) += tda826x.o |
56 | obj-$(CONFIG_DVB_TDA8261) += tda8261.o | 56 | obj-$(CONFIG_DVB_TDA8261) += tda8261.o |
57 | obj-$(CONFIG_DVB_TUNER_DIB0070) += dib0070.o | 57 | obj-$(CONFIG_DVB_TUNER_DIB0070) += dib0070.o |
58 | obj-$(CONFIG_DVB_TUNER_DIB0090) += dib0090.o | ||
58 | obj-$(CONFIG_DVB_TUA6100) += tua6100.o | 59 | obj-$(CONFIG_DVB_TUA6100) += tua6100.o |
59 | obj-$(CONFIG_DVB_S5H1409) += s5h1409.o | 60 | obj-$(CONFIG_DVB_S5H1409) += s5h1409.o |
60 | obj-$(CONFIG_DVB_TUNER_ITD1000) += itd1000.o | 61 | obj-$(CONFIG_DVB_TUNER_ITD1000) += itd1000.o |
@@ -63,7 +64,9 @@ obj-$(CONFIG_DVB_TDA10048) += tda10048.o | |||
63 | obj-$(CONFIG_DVB_TUNER_CX24113) += cx24113.o | 64 | obj-$(CONFIG_DVB_TUNER_CX24113) += cx24113.o |
64 | obj-$(CONFIG_DVB_S5H1411) += s5h1411.o | 65 | obj-$(CONFIG_DVB_S5H1411) += s5h1411.o |
65 | obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o | 66 | obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o |
67 | obj-$(CONFIG_DVB_TDA665x) += tda665x.o | ||
66 | obj-$(CONFIG_DVB_LGS8GXX) += lgs8gxx.o | 68 | obj-$(CONFIG_DVB_LGS8GXX) += lgs8gxx.o |
69 | obj-$(CONFIG_DVB_ATBM8830) += atbm8830.o | ||
67 | obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o | 70 | obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o |
68 | obj-$(CONFIG_DVB_AF9013) += af9013.o | 71 | obj-$(CONFIG_DVB_AF9013) += af9013.o |
69 | obj-$(CONFIG_DVB_CX24116) += cx24116.o | 72 | obj-$(CONFIG_DVB_CX24116) += cx24116.o |
@@ -76,3 +79,6 @@ obj-$(CONFIG_DVB_STV0900) += stv0900.o | |||
76 | obj-$(CONFIG_DVB_STV090x) += stv090x.o | 79 | obj-$(CONFIG_DVB_STV090x) += stv090x.o |
77 | obj-$(CONFIG_DVB_STV6110x) += stv6110x.o | 80 | obj-$(CONFIG_DVB_STV6110x) += stv6110x.o |
78 | obj-$(CONFIG_DVB_ISL6423) += isl6423.o | 81 | obj-$(CONFIG_DVB_ISL6423) += isl6423.o |
82 | obj-$(CONFIG_DVB_EC100) += ec100.o | ||
83 | obj-$(CONFIG_DVB_DS3000) += ds3000.o | ||
84 | obj-$(CONFIG_DVB_MB86A16) += mb86a16.o | ||
diff --git a/drivers/media/dvb/frontends/af9013.h b/drivers/media/dvb/frontends/af9013.h index 28b90c91c766..e90fa92b1c1d 100644 --- a/drivers/media/dvb/frontends/af9013.h +++ b/drivers/media/dvb/frontends/af9013.h | |||
@@ -44,6 +44,7 @@ enum af9013_tuner { | |||
44 | AF9013_TUNER_MT2060_2 = 147, /* Microtune */ | 44 | AF9013_TUNER_MT2060_2 = 147, /* Microtune */ |
45 | AF9013_TUNER_TDA18271 = 156, /* NXP */ | 45 | AF9013_TUNER_TDA18271 = 156, /* NXP */ |
46 | AF9013_TUNER_QT1010A = 162, /* Quantek */ | 46 | AF9013_TUNER_QT1010A = 162, /* Quantek */ |
47 | AF9013_TUNER_TDA18218 = 179, /* NXP */ | ||
47 | }; | 48 | }; |
48 | 49 | ||
49 | /* AF9013/5 GPIOs (mostly guessed) | 50 | /* AF9013/5 GPIOs (mostly guessed) |
diff --git a/drivers/media/dvb/frontends/atbm8830.c b/drivers/media/dvb/frontends/atbm8830.c new file mode 100644 index 000000000000..43aac2f85c2e --- /dev/null +++ b/drivers/media/dvb/frontends/atbm8830.c | |||
@@ -0,0 +1,511 @@ | |||
1 | /* | ||
2 | * Support for AltoBeam GB20600 (a.k.a DMB-TH) demodulator | ||
3 | * ATBM8830, ATBM8831 | ||
4 | * | ||
5 | * Copyright (C) 2009 David T.L. Wong <davidtlwong@gmail.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #include <asm/div64.h> | ||
23 | #include "dvb_frontend.h" | ||
24 | |||
25 | #include "atbm8830.h" | ||
26 | #include "atbm8830_priv.h" | ||
27 | |||
28 | #define dprintk(args...) \ | ||
29 | do { \ | ||
30 | if (debug) \ | ||
31 | printk(KERN_DEBUG "atbm8830: " args); \ | ||
32 | } while (0) | ||
33 | |||
34 | static int debug; | ||
35 | |||
36 | module_param(debug, int, 0644); | ||
37 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); | ||
38 | |||
39 | static int atbm8830_write_reg(struct atbm_state *priv, u16 reg, u8 data) | ||
40 | { | ||
41 | int ret = 0; | ||
42 | u8 dev_addr; | ||
43 | u8 buf1[] = { reg >> 8, reg & 0xFF }; | ||
44 | u8 buf2[] = { data }; | ||
45 | struct i2c_msg msg1 = { .flags = 0, .buf = buf1, .len = 2 }; | ||
46 | struct i2c_msg msg2 = { .flags = 0, .buf = buf2, .len = 1 }; | ||
47 | |||
48 | dev_addr = priv->config->demod_address; | ||
49 | msg1.addr = dev_addr; | ||
50 | msg2.addr = dev_addr; | ||
51 | |||
52 | if (debug >= 2) | ||
53 | printk(KERN_DEBUG "%s: reg=0x%04X, data=0x%02X\n", | ||
54 | __func__, reg, data); | ||
55 | |||
56 | ret = i2c_transfer(priv->i2c, &msg1, 1); | ||
57 | if (ret != 1) | ||
58 | return -EIO; | ||
59 | |||
60 | ret = i2c_transfer(priv->i2c, &msg2, 1); | ||
61 | return (ret != 1) ? -EIO : 0; | ||
62 | } | ||
63 | |||
64 | static int atbm8830_read_reg(struct atbm_state *priv, u16 reg, u8 *p_data) | ||
65 | { | ||
66 | int ret; | ||
67 | u8 dev_addr; | ||
68 | |||
69 | u8 buf1[] = { reg >> 8, reg & 0xFF }; | ||
70 | u8 buf2[] = { 0 }; | ||
71 | struct i2c_msg msg1 = { .flags = 0, .buf = buf1, .len = 2 }; | ||
72 | struct i2c_msg msg2 = { .flags = I2C_M_RD, .buf = buf2, .len = 1 }; | ||
73 | |||
74 | dev_addr = priv->config->demod_address; | ||
75 | msg1.addr = dev_addr; | ||
76 | msg2.addr = dev_addr; | ||
77 | |||
78 | ret = i2c_transfer(priv->i2c, &msg1, 1); | ||
79 | if (ret != 1) { | ||
80 | dprintk(KERN_DEBUG "%s: error reg=0x%04x, ret=%i\n", | ||
81 | __func__, reg, ret); | ||
82 | return -EIO; | ||
83 | } | ||
84 | |||
85 | ret = i2c_transfer(priv->i2c, &msg2, 1); | ||
86 | if (ret != 1) | ||
87 | return -EIO; | ||
88 | |||
89 | *p_data = buf2[0]; | ||
90 | if (debug >= 2) | ||
91 | printk(KERN_DEBUG "%s: reg=0x%04X, data=0x%02X\n", | ||
92 | __func__, reg, buf2[0]); | ||
93 | |||
94 | return 0; | ||
95 | } | ||
96 | |||
97 | /* Lock register latch so that multi-register read is atomic */ | ||
98 | static inline int atbm8830_reglatch_lock(struct atbm_state *priv, int lock) | ||
99 | { | ||
100 | return atbm8830_write_reg(priv, REG_READ_LATCH, lock ? 1 : 0); | ||
101 | } | ||
102 | |||
103 | static int set_osc_freq(struct atbm_state *priv, u32 freq /*in kHz*/) | ||
104 | { | ||
105 | u32 val; | ||
106 | u64 t; | ||
107 | |||
108 | /* 0x100000 * freq / 30.4MHz */ | ||
109 | t = (u64)0x100000 * freq; | ||
110 | do_div(t, 30400); | ||
111 | val = t; | ||
112 | |||
113 | atbm8830_write_reg(priv, REG_OSC_CLK, val); | ||
114 | atbm8830_write_reg(priv, REG_OSC_CLK + 1, val >> 8); | ||
115 | atbm8830_write_reg(priv, REG_OSC_CLK + 2, val >> 16); | ||
116 | |||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | static int set_if_freq(struct atbm_state *priv, u32 freq /*in kHz*/) | ||
121 | { | ||
122 | |||
123 | u32 fs = priv->config->osc_clk_freq; | ||
124 | u64 t; | ||
125 | u32 val; | ||
126 | u8 dat; | ||
127 | |||
128 | if (freq != 0) { | ||
129 | /* 2 * PI * (freq - fs) / fs * (2 ^ 22) */ | ||
130 | t = (u64) 2 * 31416 * (freq - fs); | ||
131 | t <<= 22; | ||
132 | do_div(t, fs); | ||
133 | do_div(t, 1000); | ||
134 | val = t; | ||
135 | |||
136 | atbm8830_write_reg(priv, REG_TUNER_BASEBAND, 1); | ||
137 | atbm8830_write_reg(priv, REG_IF_FREQ, val); | ||
138 | atbm8830_write_reg(priv, REG_IF_FREQ+1, val >> 8); | ||
139 | atbm8830_write_reg(priv, REG_IF_FREQ+2, val >> 16); | ||
140 | |||
141 | atbm8830_read_reg(priv, REG_ADC_CONFIG, &dat); | ||
142 | dat &= 0xFC; | ||
143 | atbm8830_write_reg(priv, REG_ADC_CONFIG, dat); | ||
144 | } else { | ||
145 | /* Zero IF */ | ||
146 | atbm8830_write_reg(priv, REG_TUNER_BASEBAND, 0); | ||
147 | |||
148 | atbm8830_read_reg(priv, REG_ADC_CONFIG, &dat); | ||
149 | dat &= 0xFC; | ||
150 | dat |= 0x02; | ||
151 | atbm8830_write_reg(priv, REG_ADC_CONFIG, dat); | ||
152 | |||
153 | if (priv->config->zif_swap_iq) | ||
154 | atbm8830_write_reg(priv, REG_SWAP_I_Q, 0x03); | ||
155 | else | ||
156 | atbm8830_write_reg(priv, REG_SWAP_I_Q, 0x01); | ||
157 | } | ||
158 | |||
159 | return 0; | ||
160 | } | ||
161 | |||
162 | static int is_locked(struct atbm_state *priv, u8 *locked) | ||
163 | { | ||
164 | u8 status; | ||
165 | |||
166 | atbm8830_read_reg(priv, REG_LOCK_STATUS, &status); | ||
167 | |||
168 | if (locked != NULL) | ||
169 | *locked = (status == 1); | ||
170 | return 0; | ||
171 | } | ||
172 | |||
173 | static int set_agc_config(struct atbm_state *priv, | ||
174 | u8 min, u8 max, u8 hold_loop) | ||
175 | { | ||
176 | /* no effect if both min and max are zero */ | ||
177 | if (!min && !max) | ||
178 | return 0; | ||
179 | |||
180 | atbm8830_write_reg(priv, REG_AGC_MIN, min); | ||
181 | atbm8830_write_reg(priv, REG_AGC_MAX, max); | ||
182 | atbm8830_write_reg(priv, REG_AGC_HOLD_LOOP, hold_loop); | ||
183 | |||
184 | return 0; | ||
185 | } | ||
186 | |||
187 | static int set_static_channel_mode(struct atbm_state *priv) | ||
188 | { | ||
189 | int i; | ||
190 | |||
191 | for (i = 0; i < 5; i++) | ||
192 | atbm8830_write_reg(priv, 0x099B + i, 0x08); | ||
193 | |||
194 | atbm8830_write_reg(priv, 0x095B, 0x7F); | ||
195 | atbm8830_write_reg(priv, 0x09CB, 0x01); | ||
196 | atbm8830_write_reg(priv, 0x09CC, 0x7F); | ||
197 | atbm8830_write_reg(priv, 0x09CD, 0x7F); | ||
198 | atbm8830_write_reg(priv, 0x0E01, 0x20); | ||
199 | |||
200 | /* For single carrier */ | ||
201 | atbm8830_write_reg(priv, 0x0B03, 0x0A); | ||
202 | atbm8830_write_reg(priv, 0x0935, 0x10); | ||
203 | atbm8830_write_reg(priv, 0x0936, 0x08); | ||
204 | atbm8830_write_reg(priv, 0x093E, 0x08); | ||
205 | atbm8830_write_reg(priv, 0x096E, 0x06); | ||
206 | |||
207 | /* frame_count_max0 */ | ||
208 | atbm8830_write_reg(priv, 0x0B09, 0x00); | ||
209 | /* frame_count_max1 */ | ||
210 | atbm8830_write_reg(priv, 0x0B0A, 0x08); | ||
211 | |||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | static int set_ts_config(struct atbm_state *priv) | ||
216 | { | ||
217 | const struct atbm8830_config *cfg = priv->config; | ||
218 | |||
219 | /*Set parallel/serial ts mode*/ | ||
220 | atbm8830_write_reg(priv, REG_TS_SERIAL, cfg->serial_ts ? 1 : 0); | ||
221 | atbm8830_write_reg(priv, REG_TS_CLK_MODE, cfg->serial_ts ? 1 : 0); | ||
222 | /*Set ts sampling edge*/ | ||
223 | atbm8830_write_reg(priv, REG_TS_SAMPLE_EDGE, | ||
224 | cfg->ts_sampling_edge ? 1 : 0); | ||
225 | /*Set ts clock freerun*/ | ||
226 | atbm8830_write_reg(priv, REG_TS_CLK_FREERUN, | ||
227 | cfg->ts_clk_gated ? 0 : 1); | ||
228 | |||
229 | return 0; | ||
230 | } | ||
231 | |||
232 | static int atbm8830_init(struct dvb_frontend *fe) | ||
233 | { | ||
234 | struct atbm_state *priv = fe->demodulator_priv; | ||
235 | const struct atbm8830_config *cfg = priv->config; | ||
236 | |||
237 | /*Set oscillator frequency*/ | ||
238 | set_osc_freq(priv, cfg->osc_clk_freq); | ||
239 | |||
240 | /*Set IF frequency*/ | ||
241 | set_if_freq(priv, cfg->if_freq); | ||
242 | |||
243 | /*Set AGC Config*/ | ||
244 | set_agc_config(priv, cfg->agc_min, cfg->agc_max, | ||
245 | cfg->agc_hold_loop); | ||
246 | |||
247 | /*Set static channel mode*/ | ||
248 | set_static_channel_mode(priv); | ||
249 | |||
250 | set_ts_config(priv); | ||
251 | /*Turn off DSP reset*/ | ||
252 | atbm8830_write_reg(priv, 0x000A, 0); | ||
253 | |||
254 | /*SW version test*/ | ||
255 | atbm8830_write_reg(priv, 0x020C, 11); | ||
256 | |||
257 | /* Run */ | ||
258 | atbm8830_write_reg(priv, REG_DEMOD_RUN, 1); | ||
259 | |||
260 | return 0; | ||
261 | } | ||
262 | |||
263 | |||
264 | static void atbm8830_release(struct dvb_frontend *fe) | ||
265 | { | ||
266 | struct atbm_state *state = fe->demodulator_priv; | ||
267 | dprintk("%s\n", __func__); | ||
268 | |||
269 | kfree(state); | ||
270 | } | ||
271 | |||
272 | static int atbm8830_set_fe(struct dvb_frontend *fe, | ||
273 | struct dvb_frontend_parameters *fe_params) | ||
274 | { | ||
275 | struct atbm_state *priv = fe->demodulator_priv; | ||
276 | int i; | ||
277 | u8 locked = 0; | ||
278 | dprintk("%s\n", __func__); | ||
279 | |||
280 | /* set frequency */ | ||
281 | if (fe->ops.tuner_ops.set_params) { | ||
282 | if (fe->ops.i2c_gate_ctrl) | ||
283 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
284 | fe->ops.tuner_ops.set_params(fe, fe_params); | ||
285 | if (fe->ops.i2c_gate_ctrl) | ||
286 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
287 | } | ||
288 | |||
289 | /* start auto lock */ | ||
290 | for (i = 0; i < 10; i++) { | ||
291 | mdelay(100); | ||
292 | dprintk("Try %d\n", i); | ||
293 | is_locked(priv, &locked); | ||
294 | if (locked != 0) { | ||
295 | dprintk("ATBM8830 locked!\n"); | ||
296 | break; | ||
297 | } | ||
298 | } | ||
299 | |||
300 | return 0; | ||
301 | } | ||
302 | |||
303 | static int atbm8830_get_fe(struct dvb_frontend *fe, | ||
304 | struct dvb_frontend_parameters *fe_params) | ||
305 | { | ||
306 | dprintk("%s\n", __func__); | ||
307 | |||
308 | /* TODO: get real readings from device */ | ||
309 | /* inversion status */ | ||
310 | fe_params->inversion = INVERSION_OFF; | ||
311 | |||
312 | /* bandwidth */ | ||
313 | fe_params->u.ofdm.bandwidth = BANDWIDTH_8_MHZ; | ||
314 | |||
315 | fe_params->u.ofdm.code_rate_HP = FEC_AUTO; | ||
316 | fe_params->u.ofdm.code_rate_LP = FEC_AUTO; | ||
317 | |||
318 | fe_params->u.ofdm.constellation = QAM_AUTO; | ||
319 | |||
320 | /* transmission mode */ | ||
321 | fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO; | ||
322 | |||
323 | /* guard interval */ | ||
324 | fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO; | ||
325 | |||
326 | /* hierarchy */ | ||
327 | fe_params->u.ofdm.hierarchy_information = HIERARCHY_NONE; | ||
328 | |||
329 | return 0; | ||
330 | } | ||
331 | |||
332 | static int atbm8830_get_tune_settings(struct dvb_frontend *fe, | ||
333 | struct dvb_frontend_tune_settings *fesettings) | ||
334 | { | ||
335 | fesettings->min_delay_ms = 0; | ||
336 | fesettings->step_size = 0; | ||
337 | fesettings->max_drift = 0; | ||
338 | return 0; | ||
339 | } | ||
340 | |||
341 | static int atbm8830_read_status(struct dvb_frontend *fe, fe_status_t *fe_status) | ||
342 | { | ||
343 | struct atbm_state *priv = fe->demodulator_priv; | ||
344 | u8 locked = 0; | ||
345 | u8 agc_locked = 0; | ||
346 | |||
347 | dprintk("%s\n", __func__); | ||
348 | *fe_status = 0; | ||
349 | |||
350 | is_locked(priv, &locked); | ||
351 | if (locked) { | ||
352 | *fe_status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | | ||
353 | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; | ||
354 | } | ||
355 | dprintk("%s: fe_status=0x%x\n", __func__, *fe_status); | ||
356 | |||
357 | atbm8830_read_reg(priv, REG_AGC_LOCK, &agc_locked); | ||
358 | dprintk("AGC Lock: %d\n", agc_locked); | ||
359 | |||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | static int atbm8830_read_ber(struct dvb_frontend *fe, u32 *ber) | ||
364 | { | ||
365 | struct atbm_state *priv = fe->demodulator_priv; | ||
366 | u32 frame_err; | ||
367 | u8 t; | ||
368 | |||
369 | dprintk("%s\n", __func__); | ||
370 | |||
371 | atbm8830_reglatch_lock(priv, 1); | ||
372 | |||
373 | atbm8830_read_reg(priv, REG_FRAME_ERR_CNT + 1, &t); | ||
374 | frame_err = t & 0x7F; | ||
375 | frame_err <<= 8; | ||
376 | atbm8830_read_reg(priv, REG_FRAME_ERR_CNT, &t); | ||
377 | frame_err |= t; | ||
378 | |||
379 | atbm8830_reglatch_lock(priv, 0); | ||
380 | |||
381 | *ber = frame_err * 100 / 32767; | ||
382 | |||
383 | dprintk("%s: ber=0x%x\n", __func__, *ber); | ||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | static int atbm8830_read_signal_strength(struct dvb_frontend *fe, u16 *signal) | ||
388 | { | ||
389 | struct atbm_state *priv = fe->demodulator_priv; | ||
390 | u32 pwm; | ||
391 | u8 t; | ||
392 | |||
393 | dprintk("%s\n", __func__); | ||
394 | atbm8830_reglatch_lock(priv, 1); | ||
395 | |||
396 | atbm8830_read_reg(priv, REG_AGC_PWM_VAL + 1, &t); | ||
397 | pwm = t & 0x03; | ||
398 | pwm <<= 8; | ||
399 | atbm8830_read_reg(priv, REG_AGC_PWM_VAL, &t); | ||
400 | pwm |= t; | ||
401 | |||
402 | atbm8830_reglatch_lock(priv, 0); | ||
403 | |||
404 | dprintk("AGC PWM = 0x%02X\n", pwm); | ||
405 | pwm = 0x400 - pwm; | ||
406 | |||
407 | *signal = pwm * 0x10000 / 0x400; | ||
408 | |||
409 | return 0; | ||
410 | } | ||
411 | |||
412 | static int atbm8830_read_snr(struct dvb_frontend *fe, u16 *snr) | ||
413 | { | ||
414 | dprintk("%s\n", __func__); | ||
415 | *snr = 0; | ||
416 | return 0; | ||
417 | } | ||
418 | |||
419 | static int atbm8830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | ||
420 | { | ||
421 | dprintk("%s\n", __func__); | ||
422 | *ucblocks = 0; | ||
423 | return 0; | ||
424 | } | ||
425 | |||
426 | static int atbm8830_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | ||
427 | { | ||
428 | struct atbm_state *priv = fe->demodulator_priv; | ||
429 | |||
430 | return atbm8830_write_reg(priv, REG_I2C_GATE, enable ? 1 : 0); | ||
431 | } | ||
432 | |||
433 | static struct dvb_frontend_ops atbm8830_ops = { | ||
434 | .info = { | ||
435 | .name = "AltoBeam ATBM8830/8831 DMB-TH", | ||
436 | .type = FE_OFDM, | ||
437 | .frequency_min = 474000000, | ||
438 | .frequency_max = 858000000, | ||
439 | .frequency_stepsize = 10000, | ||
440 | .caps = | ||
441 | FE_CAN_FEC_AUTO | | ||
442 | FE_CAN_QAM_AUTO | | ||
443 | FE_CAN_TRANSMISSION_MODE_AUTO | | ||
444 | FE_CAN_GUARD_INTERVAL_AUTO | ||
445 | }, | ||
446 | |||
447 | .release = atbm8830_release, | ||
448 | |||
449 | .init = atbm8830_init, | ||
450 | .sleep = NULL, | ||
451 | .write = NULL, | ||
452 | .i2c_gate_ctrl = atbm8830_i2c_gate_ctrl, | ||
453 | |||
454 | .set_frontend = atbm8830_set_fe, | ||
455 | .get_frontend = atbm8830_get_fe, | ||
456 | .get_tune_settings = atbm8830_get_tune_settings, | ||
457 | |||
458 | .read_status = atbm8830_read_status, | ||
459 | .read_ber = atbm8830_read_ber, | ||
460 | .read_signal_strength = atbm8830_read_signal_strength, | ||
461 | .read_snr = atbm8830_read_snr, | ||
462 | .read_ucblocks = atbm8830_read_ucblocks, | ||
463 | }; | ||
464 | |||
465 | struct dvb_frontend *atbm8830_attach(const struct atbm8830_config *config, | ||
466 | struct i2c_adapter *i2c) | ||
467 | { | ||
468 | struct atbm_state *priv = NULL; | ||
469 | u8 data = 0; | ||
470 | |||
471 | dprintk("%s()\n", __func__); | ||
472 | |||
473 | if (config == NULL || i2c == NULL) | ||
474 | return NULL; | ||
475 | |||
476 | priv = kzalloc(sizeof(struct atbm_state), GFP_KERNEL); | ||
477 | if (priv == NULL) | ||
478 | goto error_out; | ||
479 | |||
480 | priv->config = config; | ||
481 | priv->i2c = i2c; | ||
482 | |||
483 | /* check if the demod is there */ | ||
484 | if (atbm8830_read_reg(priv, REG_CHIP_ID, &data) != 0) { | ||
485 | dprintk("%s atbm8830/8831 not found at i2c addr 0x%02X\n", | ||
486 | __func__, priv->config->demod_address); | ||
487 | goto error_out; | ||
488 | } | ||
489 | dprintk("atbm8830 chip id: 0x%02X\n", data); | ||
490 | |||
491 | memcpy(&priv->frontend.ops, &atbm8830_ops, | ||
492 | sizeof(struct dvb_frontend_ops)); | ||
493 | priv->frontend.demodulator_priv = priv; | ||
494 | |||
495 | atbm8830_init(&priv->frontend); | ||
496 | |||
497 | atbm8830_i2c_gate_ctrl(&priv->frontend, 1); | ||
498 | |||
499 | return &priv->frontend; | ||
500 | |||
501 | error_out: | ||
502 | dprintk("%s() error_out\n", __func__); | ||
503 | kfree(priv); | ||
504 | return NULL; | ||
505 | |||
506 | } | ||
507 | EXPORT_SYMBOL(atbm8830_attach); | ||
508 | |||
509 | MODULE_DESCRIPTION("AltoBeam ATBM8830/8831 GB20600 demodulator driver"); | ||
510 | MODULE_AUTHOR("David T. L. Wong <davidtlwong@gmail.com>"); | ||
511 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/atbm8830.h b/drivers/media/dvb/frontends/atbm8830.h new file mode 100644 index 000000000000..e8149f393300 --- /dev/null +++ b/drivers/media/dvb/frontends/atbm8830.h | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * Support for AltoBeam GB20600 (a.k.a DMB-TH) demodulator | ||
3 | * ATBM8830, ATBM8831 | ||
4 | * | ||
5 | * Copyright (C) 2009 David T.L. Wong <davidtlwong@gmail.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #ifndef __ATBM8830_H__ | ||
23 | #define __ATBM8830_H__ | ||
24 | |||
25 | #include <linux/dvb/frontend.h> | ||
26 | #include <linux/i2c.h> | ||
27 | |||
28 | #define ATBM8830_PROD_8830 0 | ||
29 | #define ATBM8830_PROD_8831 1 | ||
30 | |||
31 | struct atbm8830_config { | ||
32 | |||
33 | /* product type */ | ||
34 | u8 prod; | ||
35 | |||
36 | /* the demodulator's i2c address */ | ||
37 | u8 demod_address; | ||
38 | |||
39 | /* parallel or serial transport stream */ | ||
40 | u8 serial_ts; | ||
41 | |||
42 | /* transport stream clock output only when receving valid stream */ | ||
43 | u8 ts_clk_gated; | ||
44 | |||
45 | /* Decoder sample TS data at rising edge of clock */ | ||
46 | u8 ts_sampling_edge; | ||
47 | |||
48 | /* Oscillator clock frequency */ | ||
49 | u32 osc_clk_freq; /* in kHz */ | ||
50 | |||
51 | /* IF frequency */ | ||
52 | u32 if_freq; /* in kHz */ | ||
53 | |||
54 | /* Swap I/Q for zero IF */ | ||
55 | u8 zif_swap_iq; | ||
56 | |||
57 | /* Tuner AGC settings */ | ||
58 | u8 agc_min; | ||
59 | u8 agc_max; | ||
60 | u8 agc_hold_loop; | ||
61 | }; | ||
62 | |||
63 | #if defined(CONFIG_DVB_ATBM8830) || \ | ||
64 | (defined(CONFIG_DVB_ATBM8830_MODULE) && defined(MODULE)) | ||
65 | extern struct dvb_frontend *atbm8830_attach(const struct atbm8830_config *config, | ||
66 | struct i2c_adapter *i2c); | ||
67 | #else | ||
68 | static inline | ||
69 | struct dvb_frontend *atbm8830_attach(const struct atbm8830_config *config, | ||
70 | struct i2c_adapter *i2c) { | ||
71 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
72 | return NULL; | ||
73 | } | ||
74 | #endif /* CONFIG_DVB_ATBM8830 */ | ||
75 | |||
76 | #endif /* __ATBM8830_H__ */ | ||
diff --git a/drivers/media/dvb/frontends/atbm8830_priv.h b/drivers/media/dvb/frontends/atbm8830_priv.h new file mode 100644 index 000000000000..ce960f76092a --- /dev/null +++ b/drivers/media/dvb/frontends/atbm8830_priv.h | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * Support for AltoBeam GB20600 (a.k.a DMB-TH) demodulator | ||
3 | * ATBM8830, ATBM8831 | ||
4 | * | ||
5 | * Copyright (C) 2009 David T.L. Wong <davidtlwong@gmail.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #ifndef __ATBM8830_PRIV_H | ||
23 | #define __ATBM8830_PRIV_H | ||
24 | |||
25 | struct atbm_state { | ||
26 | struct i2c_adapter *i2c; | ||
27 | /* configuration settings */ | ||
28 | const struct atbm8830_config *config; | ||
29 | struct dvb_frontend frontend; | ||
30 | }; | ||
31 | |||
32 | #define REG_CHIP_ID 0x0000 | ||
33 | #define REG_TUNER_BASEBAND 0x0001 | ||
34 | #define REG_DEMOD_RUN 0x0004 | ||
35 | #define REG_DSP_RESET 0x0005 | ||
36 | #define REG_RAM_RESET 0x0006 | ||
37 | #define REG_ADC_RESET 0x0007 | ||
38 | #define REG_TSPORT_RESET 0x0008 | ||
39 | #define REG_BLKERR_POL 0x000C | ||
40 | #define REG_I2C_GATE 0x0103 | ||
41 | #define REG_TS_SAMPLE_EDGE 0x0301 | ||
42 | #define REG_TS_PKT_LEN_204 0x0302 | ||
43 | #define REG_TS_PKT_LEN_AUTO 0x0303 | ||
44 | #define REG_TS_SERIAL 0x0305 | ||
45 | #define REG_TS_CLK_FREERUN 0x0306 | ||
46 | #define REG_TS_VALID_MODE 0x0307 | ||
47 | #define REG_TS_CLK_MODE 0x030B /* 1 for serial, 0 for parallel */ | ||
48 | |||
49 | #define REG_TS_ERRBIT_USE 0x030C | ||
50 | #define REG_LOCK_STATUS 0x030D | ||
51 | #define REG_ADC_CONFIG 0x0602 | ||
52 | #define REG_CARRIER_OFFSET 0x0827 /* 0x0827-0x0829 little endian */ | ||
53 | #define REG_DETECTED_PN_MODE 0x082D | ||
54 | #define REG_READ_LATCH 0x084D | ||
55 | #define REG_IF_FREQ 0x0A00 /* 0x0A00-0x0A02 little endian */ | ||
56 | #define REG_OSC_CLK 0x0A03 /* 0x0A03-0x0A05 little endian */ | ||
57 | #define REG_BYPASS_CCI 0x0A06 | ||
58 | #define REG_ANALOG_LUMA_DETECTED 0x0A25 | ||
59 | #define REG_ANALOG_AUDIO_DETECTED 0x0A26 | ||
60 | #define REG_ANALOG_CHROMA_DETECTED 0x0A39 | ||
61 | #define REG_FRAME_ERR_CNT 0x0B04 | ||
62 | #define REG_USE_EXT_ADC 0x0C00 | ||
63 | #define REG_SWAP_I_Q 0x0C01 | ||
64 | #define REG_TPS_MANUAL 0x0D01 | ||
65 | #define REG_TPS_CONFIG 0x0D02 | ||
66 | #define REG_BYPASS_DEINTERLEAVER 0x0E00 | ||
67 | #define REG_AGC_TARGET 0x1003 /* 0x1003-0x1005 little endian */ | ||
68 | #define REG_AGC_MIN 0x1020 | ||
69 | #define REG_AGC_MAX 0x1023 | ||
70 | #define REG_AGC_LOCK 0x1027 | ||
71 | #define REG_AGC_PWM_VAL 0x1028 /* 0x1028-0x1029 little endian */ | ||
72 | #define REG_AGC_HOLD_LOOP 0x1031 | ||
73 | |||
74 | #endif | ||
75 | |||
diff --git a/drivers/media/dvb/frontends/au8522_decoder.c b/drivers/media/dvb/frontends/au8522_decoder.c index 74981ee923c8..24268ef2753d 100644 --- a/drivers/media/dvb/frontends/au8522_decoder.c +++ b/drivers/media/dvb/frontends/au8522_decoder.c | |||
@@ -23,7 +23,6 @@ | |||
23 | /* Developer notes: | 23 | /* Developer notes: |
24 | * | 24 | * |
25 | * VBI support is not yet working | 25 | * VBI support is not yet working |
26 | * Saturation and hue setting are not yet working | ||
27 | * Enough is implemented here for CVBS and S-Video inputs, but the actual | 26 | * Enough is implemented here for CVBS and S-Video inputs, but the actual |
28 | * analog demodulator code isn't implemented (not needed for xc5000 since it | 27 | * analog demodulator code isn't implemented (not needed for xc5000 since it |
29 | * has its own demodulator and outputs CVBS) | 28 | * has its own demodulator and outputs CVBS) |
@@ -63,7 +62,7 @@ struct au8522_register_config { | |||
63 | The values are as follows from left to right | 62 | The values are as follows from left to right |
64 | 0="ATV RF" 1="ATV RF13" 2="CVBS" 3="S-Video" 4="PAL" 5=CVBS13" 6="SVideo13" | 63 | 0="ATV RF" 1="ATV RF13" 2="CVBS" 3="S-Video" 4="PAL" 5=CVBS13" 6="SVideo13" |
65 | */ | 64 | */ |
66 | struct au8522_register_config filter_coef[] = { | 65 | static const struct au8522_register_config filter_coef[] = { |
67 | {AU8522_FILTER_COEF_R410, {0x25, 0x00, 0x25, 0x25, 0x00, 0x00, 0x00} }, | 66 | {AU8522_FILTER_COEF_R410, {0x25, 0x00, 0x25, 0x25, 0x00, 0x00, 0x00} }, |
68 | {AU8522_FILTER_COEF_R411, {0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00} }, | 67 | {AU8522_FILTER_COEF_R411, {0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00} }, |
69 | {AU8522_FILTER_COEF_R412, {0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00} }, | 68 | {AU8522_FILTER_COEF_R412, {0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00} }, |
@@ -105,7 +104,7 @@ struct au8522_register_config filter_coef[] = { | |||
105 | 0="SIF" 1="ATVRF/ATVRF13" | 104 | 0="SIF" 1="ATVRF/ATVRF13" |
106 | Note: the "ATVRF/ATVRF13" mode has never been tested | 105 | Note: the "ATVRF/ATVRF13" mode has never been tested |
107 | */ | 106 | */ |
108 | struct au8522_register_config lpfilter_coef[] = { | 107 | static const struct au8522_register_config lpfilter_coef[] = { |
109 | {0x060b, {0x21, 0x0b} }, | 108 | {0x060b, {0x21, 0x0b} }, |
110 | {0x060c, {0xad, 0xad} }, | 109 | {0x060c, {0xad, 0xad} }, |
111 | {0x060d, {0x70, 0xf0} }, | 110 | {0x060d, {0x70, 0xf0} }, |
@@ -236,8 +235,10 @@ static void setup_decoder_defaults(struct au8522_state *state, u8 input_mode) | |||
236 | state->contrast = 0x79; | 235 | state->contrast = 0x79; |
237 | au8522_writereg(state, AU8522_TVDEC_SATURATION_CB_REG00CH, 0x80); | 236 | au8522_writereg(state, AU8522_TVDEC_SATURATION_CB_REG00CH, 0x80); |
238 | au8522_writereg(state, AU8522_TVDEC_SATURATION_CR_REG00DH, 0x80); | 237 | au8522_writereg(state, AU8522_TVDEC_SATURATION_CR_REG00DH, 0x80); |
238 | state->saturation = 0x80; | ||
239 | au8522_writereg(state, AU8522_TVDEC_HUE_H_REG00EH, 0x00); | 239 | au8522_writereg(state, AU8522_TVDEC_HUE_H_REG00EH, 0x00); |
240 | au8522_writereg(state, AU8522_TVDEC_HUE_L_REG00FH, 0x00); | 240 | au8522_writereg(state, AU8522_TVDEC_HUE_L_REG00FH, 0x00); |
241 | state->hue = 0x00; | ||
241 | 242 | ||
242 | /* Other decoder registers */ | 243 | /* Other decoder registers */ |
243 | au8522_writereg(state, AU8522_TVDEC_INT_MASK_REG010H, 0x00); | 244 | au8522_writereg(state, AU8522_TVDEC_INT_MASK_REG010H, 0x00); |
@@ -315,7 +316,7 @@ static void setup_decoder_defaults(struct au8522_state *state, u8 input_mode) | |||
315 | if (input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13 || | 316 | if (input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13 || |
316 | input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH24) { | 317 | input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH24) { |
317 | /* Despite what the table says, for the HVR-950q we still need | 318 | /* Despite what the table says, for the HVR-950q we still need |
318 | to be in CVBS mode for the S-Video input (reason uknown). */ | 319 | to be in CVBS mode for the S-Video input (reason unknown). */ |
319 | /* filter_coef_type = 3; */ | 320 | /* filter_coef_type = 3; */ |
320 | filter_coef_type = 5; | 321 | filter_coef_type = 5; |
321 | } else { | 322 | } else { |
@@ -504,7 +505,19 @@ static int au8522_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) | |||
504 | ctrl->value); | 505 | ctrl->value); |
505 | break; | 506 | break; |
506 | case V4L2_CID_SATURATION: | 507 | case V4L2_CID_SATURATION: |
508 | state->saturation = ctrl->value; | ||
509 | au8522_writereg(state, AU8522_TVDEC_SATURATION_CB_REG00CH, | ||
510 | ctrl->value); | ||
511 | au8522_writereg(state, AU8522_TVDEC_SATURATION_CR_REG00DH, | ||
512 | ctrl->value); | ||
513 | break; | ||
507 | case V4L2_CID_HUE: | 514 | case V4L2_CID_HUE: |
515 | state->hue = ctrl->value; | ||
516 | au8522_writereg(state, AU8522_TVDEC_HUE_H_REG00EH, | ||
517 | ctrl->value >> 8); | ||
518 | au8522_writereg(state, AU8522_TVDEC_HUE_L_REG00FH, | ||
519 | ctrl->value & 0xFF); | ||
520 | break; | ||
508 | case V4L2_CID_AUDIO_VOLUME: | 521 | case V4L2_CID_AUDIO_VOLUME: |
509 | case V4L2_CID_AUDIO_BASS: | 522 | case V4L2_CID_AUDIO_BASS: |
510 | case V4L2_CID_AUDIO_TREBLE: | 523 | case V4L2_CID_AUDIO_TREBLE: |
@@ -534,7 +547,11 @@ static int au8522_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) | |||
534 | ctrl->value = state->contrast; | 547 | ctrl->value = state->contrast; |
535 | break; | 548 | break; |
536 | case V4L2_CID_SATURATION: | 549 | case V4L2_CID_SATURATION: |
550 | ctrl->value = state->saturation; | ||
551 | break; | ||
537 | case V4L2_CID_HUE: | 552 | case V4L2_CID_HUE: |
553 | ctrl->value = state->hue; | ||
554 | break; | ||
538 | case V4L2_CID_AUDIO_VOLUME: | 555 | case V4L2_CID_AUDIO_VOLUME: |
539 | case V4L2_CID_AUDIO_BASS: | 556 | case V4L2_CID_AUDIO_BASS: |
540 | case V4L2_CID_AUDIO_TREBLE: | 557 | case V4L2_CID_AUDIO_TREBLE: |
@@ -632,8 +649,9 @@ static int au8522_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc) | |||
632 | case V4L2_CID_BRIGHTNESS: | 649 | case V4L2_CID_BRIGHTNESS: |
633 | return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128); | 650 | return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128); |
634 | case V4L2_CID_SATURATION: | 651 | case V4L2_CID_SATURATION: |
652 | return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128); | ||
635 | case V4L2_CID_HUE: | 653 | case V4L2_CID_HUE: |
636 | /* Not yet implemented */ | 654 | return v4l2_ctrl_query_fill(qc, -32768, 32768, 1, 0); |
637 | default: | 655 | default: |
638 | break; | 656 | break; |
639 | } | 657 | } |
diff --git a/drivers/media/dvb/frontends/au8522_dig.c b/drivers/media/dvb/frontends/au8522_dig.c index 956b80f4979c..a1fed0fa8ed4 100644 --- a/drivers/media/dvb/frontends/au8522_dig.c +++ b/drivers/media/dvb/frontends/au8522_dig.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/string.h> | 25 | #include <linux/string.h> |
26 | #include <linux/slab.h> | ||
27 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
28 | #include "dvb_frontend.h" | 27 | #include "dvb_frontend.h" |
29 | #include "au8522.h" | 28 | #include "au8522.h" |
diff --git a/drivers/media/dvb/frontends/au8522_priv.h b/drivers/media/dvb/frontends/au8522_priv.h index f328f2b3ad3d..c74c4e72fe91 100644 --- a/drivers/media/dvb/frontends/au8522_priv.h +++ b/drivers/media/dvb/frontends/au8522_priv.h | |||
@@ -62,6 +62,8 @@ struct au8522_state { | |||
62 | u32 rev; | 62 | u32 rev; |
63 | u8 brightness; | 63 | u8 brightness; |
64 | u8 contrast; | 64 | u8 contrast; |
65 | u8 saturation; | ||
66 | s16 hue; | ||
65 | }; | 67 | }; |
66 | 68 | ||
67 | /* These are routines shared by both the VSB/QAM demodulator and the analog | 69 | /* These are routines shared by both the VSB/QAM demodulator and the analog |
diff --git a/drivers/media/dvb/frontends/cx24110.c b/drivers/media/dvb/frontends/cx24110.c index ffbcfabd83f0..00a4e8f03304 100644 --- a/drivers/media/dvb/frontends/cx24110.c +++ b/drivers/media/dvb/frontends/cx24110.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | cx24110 - Single Chip Satellite Channel Receiver driver module | 2 | cx24110 - Single Chip Satellite Channel Receiver driver module |
3 | 3 | ||
4 | Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@htp-tel.de> based on | 4 | Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@htp-tel.de> based on |
@@ -96,7 +96,7 @@ static struct {u8 reg; u8 data;} cx24110_regdata[]= | |||
96 | {0x42,0x00}, /* @ middle bytes " */ | 96 | {0x42,0x00}, /* @ middle bytes " */ |
97 | {0x43,0x00}, /* @ LSB " */ | 97 | {0x43,0x00}, /* @ LSB " */ |
98 | /* leave the carrier tracking loop parameters on default */ | 98 | /* leave the carrier tracking loop parameters on default */ |
99 | /* leave the bit timing loop parameters at gefault */ | 99 | /* leave the bit timing loop parameters at default */ |
100 | {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */ | 100 | {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */ |
101 | /* the cx24108 data sheet for symbol rates above 15MS/s */ | 101 | /* the cx24108 data sheet for symbol rates above 15MS/s */ |
102 | {0x57,0x00}, /* @ Filter sigma delta enabled, positive */ | 102 | {0x57,0x00}, /* @ Filter sigma delta enabled, positive */ |
diff --git a/drivers/media/dvb/frontends/cx24113.c b/drivers/media/dvb/frontends/cx24113.c index 075b2b57cf09..e9ee55592fd3 100644 --- a/drivers/media/dvb/frontends/cx24113.c +++ b/drivers/media/dvb/frontends/cx24113.c | |||
@@ -589,7 +589,7 @@ struct dvb_frontend *cx24113_attach(struct dvb_frontend *fe, | |||
589 | info("detected CX24113 variant\n"); | 589 | info("detected CX24113 variant\n"); |
590 | break; | 590 | break; |
591 | case REV_CX24113: | 591 | case REV_CX24113: |
592 | info("sucessfully detected\n"); | 592 | info("successfully detected\n"); |
593 | break; | 593 | break; |
594 | default: | 594 | default: |
595 | err("unsupported device id: %x\n", state->rev); | 595 | err("unsupported device id: %x\n", state->rev); |
diff --git a/drivers/media/dvb/frontends/dib0070.c b/drivers/media/dvb/frontends/dib0070.c index 2be17b93e0bd..d4e466a90e43 100644 --- a/drivers/media/dvb/frontends/dib0070.c +++ b/drivers/media/dvb/frontends/dib0070.c | |||
@@ -25,6 +25,7 @@ | |||
25 | */ | 25 | */ |
26 | 26 | ||
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/slab.h> | ||
28 | #include <linux/i2c.h> | 29 | #include <linux/i2c.h> |
29 | 30 | ||
30 | #include "dvb_frontend.h" | 31 | #include "dvb_frontend.h" |
@@ -49,21 +50,6 @@ MODULE_PARM_DESC(debug, "turn on debugging (default: 0)"); | |||
49 | #define DIB0070_P1G 0x03 | 50 | #define DIB0070_P1G 0x03 |
50 | #define DIB0070S_P1A 0x02 | 51 | #define DIB0070S_P1A 0x02 |
51 | 52 | ||
52 | enum frontend_tune_state { | ||
53 | CT_TUNER_START = 10, | ||
54 | CT_TUNER_STEP_0, | ||
55 | CT_TUNER_STEP_1, | ||
56 | CT_TUNER_STEP_2, | ||
57 | CT_TUNER_STEP_3, | ||
58 | CT_TUNER_STEP_4, | ||
59 | CT_TUNER_STEP_5, | ||
60 | CT_TUNER_STEP_6, | ||
61 | CT_TUNER_STEP_7, | ||
62 | CT_TUNER_STOP, | ||
63 | }; | ||
64 | |||
65 | #define FE_CALLBACK_TIME_NEVER 0xffffffff | ||
66 | |||
67 | struct dib0070_state { | 53 | struct dib0070_state { |
68 | struct i2c_adapter *i2c; | 54 | struct i2c_adapter *i2c; |
69 | struct dvb_frontend *fe; | 55 | struct dvb_frontend *fe; |
@@ -71,10 +57,10 @@ struct dib0070_state { | |||
71 | u16 wbd_ff_offset; | 57 | u16 wbd_ff_offset; |
72 | u8 revision; | 58 | u8 revision; |
73 | 59 | ||
74 | enum frontend_tune_state tune_state; | 60 | enum frontend_tune_state tune_state; |
75 | u32 current_rf; | 61 | u32 current_rf; |
76 | 62 | ||
77 | /* for the captrim binary search */ | 63 | /* for the captrim binary search */ |
78 | s8 step; | 64 | s8 step; |
79 | u16 adc_diff; | 65 | u16 adc_diff; |
80 | 66 | ||
@@ -85,7 +71,7 @@ struct dib0070_state { | |||
85 | const struct dib0070_tuning *current_tune_table_index; | 71 | const struct dib0070_tuning *current_tune_table_index; |
86 | const struct dib0070_lna_match *lna_match; | 72 | const struct dib0070_lna_match *lna_match; |
87 | 73 | ||
88 | u8 wbd_gain_current; | 74 | u8 wbd_gain_current; |
89 | u16 wbd_offset_3_3[2]; | 75 | u16 wbd_offset_3_3[2]; |
90 | }; | 76 | }; |
91 | 77 | ||
@@ -93,8 +79,8 @@ static uint16_t dib0070_read_reg(struct dib0070_state *state, u8 reg) | |||
93 | { | 79 | { |
94 | u8 b[2]; | 80 | u8 b[2]; |
95 | struct i2c_msg msg[2] = { | 81 | struct i2c_msg msg[2] = { |
96 | {.addr = state->cfg->i2c_address,.flags = 0,.buf = ®,.len = 1}, | 82 | { .addr = state->cfg->i2c_address, .flags = 0, .buf = ®, .len = 1 }, |
97 | {.addr = state->cfg->i2c_address,.flags = I2C_M_RD,.buf = b,.len = 2}, | 83 | { .addr = state->cfg->i2c_address, .flags = I2C_M_RD, .buf = b, .len = 2 }, |
98 | }; | 84 | }; |
99 | if (i2c_transfer(state->i2c, msg, 2) != 2) { | 85 | if (i2c_transfer(state->i2c, msg, 2) != 2) { |
100 | printk(KERN_WARNING "DiB0070 I2C read failed\n"); | 86 | printk(KERN_WARNING "DiB0070 I2C read failed\n"); |
@@ -106,7 +92,7 @@ static uint16_t dib0070_read_reg(struct dib0070_state *state, u8 reg) | |||
106 | static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val) | 92 | static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val) |
107 | { | 93 | { |
108 | u8 b[3] = { reg, val >> 8, val & 0xff }; | 94 | u8 b[3] = { reg, val >> 8, val & 0xff }; |
109 | struct i2c_msg msg = {.addr = state->cfg->i2c_address,.flags = 0,.buf = b,.len = 3 }; | 95 | struct i2c_msg msg = { .addr = state->cfg->i2c_address, .flags = 0, .buf = b, .len = 3 }; |
110 | if (i2c_transfer(state->i2c, &msg, 1) != 1) { | 96 | if (i2c_transfer(state->i2c, &msg, 1) != 1) { |
111 | printk(KERN_WARNING "DiB0070 I2C write failed\n"); | 97 | printk(KERN_WARNING "DiB0070 I2C write failed\n"); |
112 | return -EREMOTEIO; | 98 | return -EREMOTEIO; |
@@ -124,30 +110,30 @@ static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val) | |||
124 | 110 | ||
125 | static int dib0070_set_bandwidth(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch) | 111 | static int dib0070_set_bandwidth(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch) |
126 | { | 112 | { |
127 | struct dib0070_state *state = fe->tuner_priv; | 113 | struct dib0070_state *state = fe->tuner_priv; |
128 | u16 tmp = dib0070_read_reg(state, 0x02) & 0x3fff; | 114 | u16 tmp = dib0070_read_reg(state, 0x02) & 0x3fff; |
129 | 115 | ||
130 | if (state->fe->dtv_property_cache.bandwidth_hz / 1000 > 7000) | 116 | if (state->fe->dtv_property_cache.bandwidth_hz/1000 > 7000) |
131 | tmp |= (0 << 14); | 117 | tmp |= (0 << 14); |
132 | else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 > 6000) | 118 | else if (state->fe->dtv_property_cache.bandwidth_hz/1000 > 6000) |
133 | tmp |= (1 << 14); | 119 | tmp |= (1 << 14); |
134 | else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 > 5000) | 120 | else if (state->fe->dtv_property_cache.bandwidth_hz/1000 > 5000) |
135 | tmp |= (2 << 14); | 121 | tmp |= (2 << 14); |
136 | else | 122 | else |
137 | tmp |= (3 << 14); | 123 | tmp |= (3 << 14); |
138 | 124 | ||
139 | dib0070_write_reg(state, 0x02, tmp); | 125 | dib0070_write_reg(state, 0x02, tmp); |
140 | 126 | ||
141 | /* sharpen the BB filter in ISDB-T to have higher immunity to adjacent channels */ | 127 | /* sharpen the BB filter in ISDB-T to have higher immunity to adjacent channels */ |
142 | if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT) { | 128 | if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT) { |
143 | u16 value = dib0070_read_reg(state, 0x17); | 129 | u16 value = dib0070_read_reg(state, 0x17); |
144 | 130 | ||
145 | dib0070_write_reg(state, 0x17, value & 0xfffc); | 131 | dib0070_write_reg(state, 0x17, value & 0xfffc); |
146 | tmp = dib0070_read_reg(state, 0x01) & 0x01ff; | 132 | tmp = dib0070_read_reg(state, 0x01) & 0x01ff; |
147 | dib0070_write_reg(state, 0x01, tmp | (60 << 9)); | 133 | dib0070_write_reg(state, 0x01, tmp | (60 << 9)); |
148 | 134 | ||
149 | dib0070_write_reg(state, 0x17, value); | 135 | dib0070_write_reg(state, 0x17, value); |
150 | } | 136 | } |
151 | return 0; | 137 | return 0; |
152 | } | 138 | } |
153 | 139 | ||
@@ -160,14 +146,14 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state | |||
160 | if (*tune_state == CT_TUNER_STEP_0) { | 146 | if (*tune_state == CT_TUNER_STEP_0) { |
161 | 147 | ||
162 | dib0070_write_reg(state, 0x0f, 0xed10); | 148 | dib0070_write_reg(state, 0x0f, 0xed10); |
163 | dib0070_write_reg(state, 0x17, 0x0034); | 149 | dib0070_write_reg(state, 0x17, 0x0034); |
164 | 150 | ||
165 | dib0070_write_reg(state, 0x18, 0x0032); | 151 | dib0070_write_reg(state, 0x18, 0x0032); |
166 | state->step = state->captrim = state->fcaptrim = 64; | 152 | state->step = state->captrim = state->fcaptrim = 64; |
167 | state->adc_diff = 3000; | 153 | state->adc_diff = 3000; |
168 | ret = 20; | 154 | ret = 20; |
169 | 155 | ||
170 | *tune_state = CT_TUNER_STEP_1; | 156 | *tune_state = CT_TUNER_STEP_1; |
171 | } else if (*tune_state == CT_TUNER_STEP_1) { | 157 | } else if (*tune_state == CT_TUNER_STEP_1) { |
172 | state->step /= 2; | 158 | state->step /= 2; |
173 | dib0070_write_reg(state, 0x14, state->lo4 | state->captrim); | 159 | dib0070_write_reg(state, 0x14, state->lo4 | state->captrim); |
@@ -178,7 +164,7 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state | |||
178 | 164 | ||
179 | adc = dib0070_read_reg(state, 0x19); | 165 | adc = dib0070_read_reg(state, 0x19); |
180 | 166 | ||
181 | dprintk("CAPTRIM=%hd; ADC = %hd (ADC) & %dmV", state->captrim, adc, (u32) adc * (u32) 1800 / (u32) 1024); | 167 | dprintk("CAPTRIM=%hd; ADC = %hd (ADC) & %dmV", state->captrim, adc, (u32) adc*(u32)1800/(u32)1024); |
182 | 168 | ||
183 | if (adc >= 400) { | 169 | if (adc >= 400) { |
184 | adc -= 400; | 170 | adc -= 400; |
@@ -193,6 +179,8 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state | |||
193 | state->adc_diff = adc; | 179 | state->adc_diff = adc; |
194 | state->fcaptrim = state->captrim; | 180 | state->fcaptrim = state->captrim; |
195 | 181 | ||
182 | |||
183 | |||
196 | } | 184 | } |
197 | state->captrim += (step_sign * state->step); | 185 | state->captrim += (step_sign * state->step); |
198 | 186 | ||
@@ -213,7 +201,7 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state | |||
213 | static int dib0070_set_ctrl_lo5(struct dvb_frontend *fe, u8 vco_bias_trim, u8 hf_div_trim, u8 cp_current, u8 third_order_filt) | 201 | static int dib0070_set_ctrl_lo5(struct dvb_frontend *fe, u8 vco_bias_trim, u8 hf_div_trim, u8 cp_current, u8 third_order_filt) |
214 | { | 202 | { |
215 | struct dib0070_state *state = fe->tuner_priv; | 203 | struct dib0070_state *state = fe->tuner_priv; |
216 | u16 lo5 = (third_order_filt << 14) | (0 << 13) | (1 << 12) | (3 << 9) | (cp_current << 6) | (hf_div_trim << 3) | (vco_bias_trim << 0); | 204 | u16 lo5 = (third_order_filt << 14) | (0 << 13) | (1 << 12) | (3 << 9) | (cp_current << 6) | (hf_div_trim << 3) | (vco_bias_trim << 0); |
217 | dprintk("CTRL_LO5: 0x%x", lo5); | 205 | dprintk("CTRL_LO5: 0x%x", lo5); |
218 | return dib0070_write_reg(state, 0x15, lo5); | 206 | return dib0070_write_reg(state, 0x15, lo5); |
219 | } | 207 | } |
@@ -227,99 +215,99 @@ void dib0070_ctrl_agc_filter(struct dvb_frontend *fe, u8 open) | |||
227 | dib0070_write_reg(state, 0x1a, 0x0000); | 215 | dib0070_write_reg(state, 0x1a, 0x0000); |
228 | } else { | 216 | } else { |
229 | dib0070_write_reg(state, 0x1b, 0x4112); | 217 | dib0070_write_reg(state, 0x1b, 0x4112); |
230 | if (state->cfg->vga_filter != 0) { | 218 | if (state->cfg->vga_filter != 0) { |
231 | dib0070_write_reg(state, 0x1a, state->cfg->vga_filter); | 219 | dib0070_write_reg(state, 0x1a, state->cfg->vga_filter); |
232 | dprintk("vga filter register is set to %x", state->cfg->vga_filter); | 220 | dprintk("vga filter register is set to %x", state->cfg->vga_filter); |
233 | } else | 221 | } else |
234 | dib0070_write_reg(state, 0x1a, 0x0009); | 222 | dib0070_write_reg(state, 0x1a, 0x0009); |
235 | } | 223 | } |
236 | } | 224 | } |
237 | 225 | ||
238 | EXPORT_SYMBOL(dib0070_ctrl_agc_filter); | 226 | EXPORT_SYMBOL(dib0070_ctrl_agc_filter); |
239 | struct dib0070_tuning { | 227 | struct dib0070_tuning { |
240 | u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ | 228 | u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ |
241 | u8 switch_trim; | 229 | u8 switch_trim; |
242 | u8 vco_band; | 230 | u8 vco_band; |
243 | u8 hfdiv; | 231 | u8 hfdiv; |
244 | u8 vco_multi; | 232 | u8 vco_multi; |
245 | u8 presc; | 233 | u8 presc; |
246 | u8 wbdmux; | 234 | u8 wbdmux; |
247 | u16 tuner_enable; | 235 | u16 tuner_enable; |
248 | }; | 236 | }; |
249 | 237 | ||
250 | struct dib0070_lna_match { | 238 | struct dib0070_lna_match { |
251 | u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ | 239 | u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ |
252 | u8 lna_band; | 240 | u8 lna_band; |
253 | }; | 241 | }; |
254 | 242 | ||
255 | static const struct dib0070_tuning dib0070s_tuning_table[] = { | 243 | static const struct dib0070_tuning dib0070s_tuning_table[] = { |
256 | {570000, 2, 1, 3, 6, 6, 2, 0x4000 | 0x0800}, /* UHF */ | 244 | { 570000, 2, 1, 3, 6, 6, 2, 0x4000 | 0x0800 }, /* UHF */ |
257 | {700000, 2, 0, 2, 4, 2, 2, 0x4000 | 0x0800}, | 245 | { 700000, 2, 0, 2, 4, 2, 2, 0x4000 | 0x0800 }, |
258 | {863999, 2, 1, 2, 4, 2, 2, 0x4000 | 0x0800}, | 246 | { 863999, 2, 1, 2, 4, 2, 2, 0x4000 | 0x0800 }, |
259 | {1500000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400}, /* LBAND */ | 247 | { 1500000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400 }, /* LBAND */ |
260 | {1600000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400}, | 248 | { 1600000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400 }, |
261 | {2000000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400}, | 249 | { 2000000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400 }, |
262 | {0xffffffff, 0, 0, 8, 1, 2, 1, 0x8000 | 0x1000}, /* SBAND */ | 250 | { 0xffffffff, 0, 0, 8, 1, 2, 1, 0x8000 | 0x1000 }, /* SBAND */ |
263 | }; | 251 | }; |
264 | 252 | ||
265 | static const struct dib0070_tuning dib0070_tuning_table[] = { | 253 | static const struct dib0070_tuning dib0070_tuning_table[] = { |
266 | {115000, 1, 0, 7, 24, 2, 1, 0x8000 | 0x1000}, /* FM below 92MHz cannot be tuned */ | 254 | { 115000, 1, 0, 7, 24, 2, 1, 0x8000 | 0x1000 }, /* FM below 92MHz cannot be tuned */ |
267 | {179500, 1, 0, 3, 16, 2, 1, 0x8000 | 0x1000}, /* VHF */ | 255 | { 179500, 1, 0, 3, 16, 2, 1, 0x8000 | 0x1000 }, /* VHF */ |
268 | {189999, 1, 1, 3, 16, 2, 1, 0x8000 | 0x1000}, | 256 | { 189999, 1, 1, 3, 16, 2, 1, 0x8000 | 0x1000 }, |
269 | {250000, 1, 0, 6, 12, 2, 1, 0x8000 | 0x1000}, | 257 | { 250000, 1, 0, 6, 12, 2, 1, 0x8000 | 0x1000 }, |
270 | {569999, 2, 1, 5, 6, 2, 2, 0x4000 | 0x0800}, /* UHF */ | 258 | { 569999, 2, 1, 5, 6, 2, 2, 0x4000 | 0x0800 }, /* UHF */ |
271 | {699999, 2, 0, 1, 4, 2, 2, 0x4000 | 0x0800}, | 259 | { 699999, 2, 0, 1, 4, 2, 2, 0x4000 | 0x0800 }, |
272 | {863999, 2, 1, 1, 4, 2, 2, 0x4000 | 0x0800}, | 260 | { 863999, 2, 1, 1, 4, 2, 2, 0x4000 | 0x0800 }, |
273 | {0xffffffff, 0, 1, 0, 2, 2, 4, 0x2000 | 0x0400}, /* LBAND or everything higher than UHF */ | 261 | { 0xffffffff, 0, 1, 0, 2, 2, 4, 0x2000 | 0x0400 }, /* LBAND or everything higher than UHF */ |
274 | }; | 262 | }; |
275 | 263 | ||
276 | static const struct dib0070_lna_match dib0070_lna_flip_chip[] = { | 264 | static const struct dib0070_lna_match dib0070_lna_flip_chip[] = { |
277 | {180000, 0}, /* VHF */ | 265 | { 180000, 0 }, /* VHF */ |
278 | {188000, 1}, | 266 | { 188000, 1 }, |
279 | {196400, 2}, | 267 | { 196400, 2 }, |
280 | {250000, 3}, | 268 | { 250000, 3 }, |
281 | {550000, 0}, /* UHF */ | 269 | { 550000, 0 }, /* UHF */ |
282 | {590000, 1}, | 270 | { 590000, 1 }, |
283 | {666000, 3}, | 271 | { 666000, 3 }, |
284 | {864000, 5}, | 272 | { 864000, 5 }, |
285 | {1500000, 0}, /* LBAND or everything higher than UHF */ | 273 | { 1500000, 0 }, /* LBAND or everything higher than UHF */ |
286 | {1600000, 1}, | 274 | { 1600000, 1 }, |
287 | {2000000, 3}, | 275 | { 2000000, 3 }, |
288 | {0xffffffff, 7}, | 276 | { 0xffffffff, 7 }, |
289 | }; | 277 | }; |
290 | 278 | ||
291 | static const struct dib0070_lna_match dib0070_lna[] = { | 279 | static const struct dib0070_lna_match dib0070_lna[] = { |
292 | {180000, 0}, /* VHF */ | 280 | { 180000, 0 }, /* VHF */ |
293 | {188000, 1}, | 281 | { 188000, 1 }, |
294 | {196400, 2}, | 282 | { 196400, 2 }, |
295 | {250000, 3}, | 283 | { 250000, 3 }, |
296 | {550000, 2}, /* UHF */ | 284 | { 550000, 2 }, /* UHF */ |
297 | {650000, 3}, | 285 | { 650000, 3 }, |
298 | {750000, 5}, | 286 | { 750000, 5 }, |
299 | {850000, 6}, | 287 | { 850000, 6 }, |
300 | {864000, 7}, | 288 | { 864000, 7 }, |
301 | {1500000, 0}, /* LBAND or everything higher than UHF */ | 289 | { 1500000, 0 }, /* LBAND or everything higher than UHF */ |
302 | {1600000, 1}, | 290 | { 1600000, 1 }, |
303 | {2000000, 3}, | 291 | { 2000000, 3 }, |
304 | {0xffffffff, 7}, | 292 | { 0xffffffff, 7 }, |
305 | }; | 293 | }; |
306 | 294 | ||
307 | #define LPF 100 // define for the loop filter 100kHz by default 16-07-06 | 295 | #define LPF 100 |
308 | static int dib0070_tune_digital(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch) | 296 | static int dib0070_tune_digital(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch) |
309 | { | 297 | { |
310 | struct dib0070_state *state = fe->tuner_priv; | 298 | struct dib0070_state *state = fe->tuner_priv; |
311 | 299 | ||
312 | const struct dib0070_tuning *tune; | 300 | const struct dib0070_tuning *tune; |
313 | const struct dib0070_lna_match *lna_match; | 301 | const struct dib0070_lna_match *lna_match; |
314 | 302 | ||
315 | enum frontend_tune_state *tune_state = &state->tune_state; | 303 | enum frontend_tune_state *tune_state = &state->tune_state; |
316 | int ret = 10; /* 1ms is the default delay most of the time */ | 304 | int ret = 10; /* 1ms is the default delay most of the time */ |
317 | 305 | ||
318 | u8 band = (u8) BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000); | 306 | u8 band = (u8)BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency/1000); |
319 | u32 freq = fe->dtv_property_cache.frequency / 1000 + (band == BAND_VHF ? state->cfg->freq_offset_khz_vhf : state->cfg->freq_offset_khz_uhf); | 307 | u32 freq = fe->dtv_property_cache.frequency/1000 + (band == BAND_VHF ? state->cfg->freq_offset_khz_vhf : state->cfg->freq_offset_khz_uhf); |
320 | 308 | ||
321 | #ifdef CONFIG_SYS_ISDBT | 309 | #ifdef CONFIG_SYS_ISDBT |
322 | if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT && state->fe->dtv_property_cache.isdbt_sb_mode == 1) | 310 | if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT && state->fe->dtv_property_cache.isdbt_sb_mode == 1) |
323 | if (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2) | 311 | if (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2) |
324 | && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1))) | 312 | && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1))) |
325 | || (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2) == 0) | 313 | || (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2) == 0) |
@@ -328,172 +316,180 @@ static int dib0070_tune_digital(struct dvb_frontend *fe, struct dvb_frontend_par | |||
328 | && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))) | 316 | && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))) |
329 | freq += 850; | 317 | freq += 850; |
330 | #endif | 318 | #endif |
319 | if (state->current_rf != freq) { | ||
320 | |||
321 | switch (state->revision) { | ||
322 | case DIB0070S_P1A: | ||
323 | tune = dib0070s_tuning_table; | ||
324 | lna_match = dib0070_lna; | ||
325 | break; | ||
326 | default: | ||
327 | tune = dib0070_tuning_table; | ||
328 | if (state->cfg->flip_chip) | ||
329 | lna_match = dib0070_lna_flip_chip; | ||
330 | else | ||
331 | lna_match = dib0070_lna; | ||
332 | break; | ||
333 | } | ||
334 | while (freq > tune->max_freq) /* find the right one */ | ||
335 | tune++; | ||
336 | while (freq > lna_match->max_freq) /* find the right one */ | ||
337 | lna_match++; | ||
338 | |||
339 | state->current_tune_table_index = tune; | ||
340 | state->lna_match = lna_match; | ||
341 | } | ||
342 | |||
343 | if (*tune_state == CT_TUNER_START) { | ||
344 | dprintk("Tuning for Band: %hd (%d kHz)", band, freq); | ||
331 | if (state->current_rf != freq) { | 345 | if (state->current_rf != freq) { |
346 | u8 REFDIV; | ||
347 | u32 FBDiv, Rest, FREF, VCOF_kHz; | ||
348 | u8 Den; | ||
349 | |||
350 | state->current_rf = freq; | ||
351 | state->lo4 = (state->current_tune_table_index->vco_band << 11) | (state->current_tune_table_index->hfdiv << 7); | ||
352 | |||
353 | |||
354 | dib0070_write_reg(state, 0x17, 0x30); | ||
355 | |||
356 | |||
357 | VCOF_kHz = state->current_tune_table_index->vco_multi * freq * 2; | ||
358 | |||
359 | switch (band) { | ||
360 | case BAND_VHF: | ||
361 | REFDIV = (u8) ((state->cfg->clock_khz + 9999) / 10000); | ||
362 | break; | ||
363 | case BAND_FM: | ||
364 | REFDIV = (u8) ((state->cfg->clock_khz) / 1000); | ||
365 | break; | ||
366 | default: | ||
367 | REFDIV = (u8) (state->cfg->clock_khz / 10000); | ||
368 | break; | ||
369 | } | ||
370 | FREF = state->cfg->clock_khz / REFDIV; | ||
371 | |||
372 | |||
332 | 373 | ||
333 | switch (state->revision) { | 374 | switch (state->revision) { |
334 | case DIB0070S_P1A: | 375 | case DIB0070S_P1A: |
335 | tune = dib0070s_tuning_table; | 376 | FBDiv = (VCOF_kHz / state->current_tune_table_index->presc / FREF); |
336 | lna_match = dib0070_lna; | 377 | Rest = (VCOF_kHz / state->current_tune_table_index->presc) - FBDiv * FREF; |
337 | break; | 378 | break; |
379 | |||
380 | case DIB0070_P1G: | ||
381 | case DIB0070_P1F: | ||
338 | default: | 382 | default: |
339 | tune = dib0070_tuning_table; | 383 | FBDiv = (freq / (FREF / 2)); |
340 | if (state->cfg->flip_chip) | 384 | Rest = 2 * freq - FBDiv * FREF; |
341 | lna_match = dib0070_lna_flip_chip; | ||
342 | else | ||
343 | lna_match = dib0070_lna; | ||
344 | break; | 385 | break; |
345 | } | 386 | } |
346 | while (freq > tune->max_freq) /* find the right one */ | ||
347 | tune++; | ||
348 | while (freq > lna_match->max_freq) /* find the right one */ | ||
349 | lna_match++; | ||
350 | 387 | ||
351 | state->current_tune_table_index = tune; | 388 | if (Rest < LPF) |
352 | state->lna_match = lna_match; | 389 | Rest = 0; |
353 | } | 390 | else if (Rest < 2 * LPF) |
391 | Rest = 2 * LPF; | ||
392 | else if (Rest > (FREF - LPF)) { | ||
393 | Rest = 0; | ||
394 | FBDiv += 1; | ||
395 | } else if (Rest > (FREF - 2 * LPF)) | ||
396 | Rest = FREF - 2 * LPF; | ||
397 | Rest = (Rest * 6528) / (FREF / 10); | ||
398 | |||
399 | Den = 1; | ||
400 | if (Rest > 0) { | ||
401 | state->lo4 |= (1 << 14) | (1 << 12); | ||
402 | Den = 255; | ||
403 | } | ||
404 | |||
354 | 405 | ||
355 | if (*tune_state == CT_TUNER_START) { | 406 | dib0070_write_reg(state, 0x11, (u16)FBDiv); |
356 | dprintk("Tuning for Band: %hd (%d kHz)", band, freq); | 407 | dib0070_write_reg(state, 0x12, (Den << 8) | REFDIV); |
357 | if (state->current_rf != freq) { | 408 | dib0070_write_reg(state, 0x13, (u16) Rest); |
358 | u8 REFDIV; | 409 | |
359 | u32 FBDiv, Rest, FREF, VCOF_kHz; | 410 | if (state->revision == DIB0070S_P1A) { |
360 | u8 Den; | 411 | |
361 | 412 | if (band == BAND_SBAND) { | |
362 | state->current_rf = freq; | 413 | dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0); |
363 | state->lo4 = (state->current_tune_table_index->vco_band << 11) | (state->current_tune_table_index->hfdiv << 7); | 414 | dib0070_write_reg(state, 0x1d, 0xFFFF); |
364 | 415 | } else | |
365 | dib0070_write_reg(state, 0x17, 0x30); | 416 | dib0070_set_ctrl_lo5(fe, 5, 4, 3, 1); |
366 | |||
367 | VCOF_kHz = state->current_tune_table_index->vco_multi * freq * 2; | ||
368 | |||
369 | switch (band) { | ||
370 | case BAND_VHF: | ||
371 | REFDIV = (u8) ((state->cfg->clock_khz + 9999) / 10000); | ||
372 | break; | ||
373 | case BAND_FM: | ||
374 | REFDIV = (u8) ((state->cfg->clock_khz) / 1000); | ||
375 | break; | ||
376 | default: | ||
377 | REFDIV = (u8) (state->cfg->clock_khz / 10000); | ||
378 | break; | ||
379 | } | ||
380 | FREF = state->cfg->clock_khz / REFDIV; | ||
381 | |||
382 | switch (state->revision) { | ||
383 | case DIB0070S_P1A: | ||
384 | FBDiv = (VCOF_kHz / state->current_tune_table_index->presc / FREF); | ||
385 | Rest = (VCOF_kHz / state->current_tune_table_index->presc) - FBDiv * FREF; | ||
386 | break; | ||
387 | |||
388 | case DIB0070_P1G: | ||
389 | case DIB0070_P1F: | ||
390 | default: | ||
391 | FBDiv = (freq / (FREF / 2)); | ||
392 | Rest = 2 * freq - FBDiv * FREF; | ||
393 | break; | ||
394 | } | ||
395 | |||
396 | if (Rest < LPF) | ||
397 | Rest = 0; | ||
398 | else if (Rest < 2 * LPF) | ||
399 | Rest = 2 * LPF; | ||
400 | else if (Rest > (FREF - LPF)) { | ||
401 | Rest = 0; | ||
402 | FBDiv += 1; | ||
403 | } else if (Rest > (FREF - 2 * LPF)) | ||
404 | Rest = FREF - 2 * LPF; | ||
405 | Rest = (Rest * 6528) / (FREF / 10); | ||
406 | |||
407 | Den = 1; | ||
408 | if (Rest > 0) { | ||
409 | state->lo4 |= (1 << 14) | (1 << 12); | ||
410 | Den = 255; | ||
411 | } | ||
412 | |||
413 | dib0070_write_reg(state, 0x11, (u16) FBDiv); | ||
414 | dib0070_write_reg(state, 0x12, (Den << 8) | REFDIV); | ||
415 | dib0070_write_reg(state, 0x13, (u16) Rest); | ||
416 | |||
417 | if (state->revision == DIB0070S_P1A) { | ||
418 | |||
419 | if (band == BAND_SBAND) { | ||
420 | dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0); | ||
421 | dib0070_write_reg(state, 0x1d, 0xFFFF); | ||
422 | } else | ||
423 | dib0070_set_ctrl_lo5(fe, 5, 4, 3, 1); | ||
424 | } | ||
425 | |||
426 | dib0070_write_reg(state, 0x20, | ||
427 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001 | state->current_tune_table_index->tuner_enable); | ||
428 | |||
429 | dprintk("REFDIV: %hd, FREF: %d", REFDIV, FREF); | ||
430 | dprintk("FBDIV: %d, Rest: %d", FBDiv, Rest); | ||
431 | dprintk("Num: %hd, Den: %hd, SD: %hd", (u16) Rest, Den, (state->lo4 >> 12) & 0x1); | ||
432 | dprintk("HFDIV code: %hd", state->current_tune_table_index->hfdiv); | ||
433 | dprintk("VCO = %hd", state->current_tune_table_index->vco_band); | ||
434 | dprintk("VCOF: ((%hd*%d) << 1))", state->current_tune_table_index->vco_multi, freq); | ||
435 | |||
436 | *tune_state = CT_TUNER_STEP_0; | ||
437 | } else { /* we are already tuned to this frequency - the configuration is correct */ | ||
438 | ret = 50; /* wakeup time */ | ||
439 | *tune_state = CT_TUNER_STEP_5; | ||
440 | } | 417 | } |
441 | } else if ((*tune_state > CT_TUNER_START) && (*tune_state < CT_TUNER_STEP_4)) { | ||
442 | 418 | ||
443 | ret = dib0070_captrim(state, tune_state); | 419 | dib0070_write_reg(state, 0x20, |
420 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001 | state->current_tune_table_index->tuner_enable); | ||
444 | 421 | ||
445 | } else if (*tune_state == CT_TUNER_STEP_4) { | 422 | dprintk("REFDIV: %hd, FREF: %d", REFDIV, FREF); |
446 | const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain; | 423 | dprintk("FBDIV: %d, Rest: %d", FBDiv, Rest); |
447 | if (tmp != NULL) { | 424 | dprintk("Num: %hd, Den: %hd, SD: %hd", (u16) Rest, Den, (state->lo4 >> 12) & 0x1); |
448 | while (freq / 1000 > tmp->freq) /* find the right one */ | 425 | dprintk("HFDIV code: %hd", state->current_tune_table_index->hfdiv); |
449 | tmp++; | 426 | dprintk("VCO = %hd", state->current_tune_table_index->vco_band); |
450 | dib0070_write_reg(state, 0x0f, | 427 | dprintk("VCOF: ((%hd*%d) << 1))", state->current_tune_table_index->vco_multi, freq); |
451 | (0 << 15) | (1 << 14) | (3 << 12) | (tmp->wbd_gain_val << 9) | (0 << 8) | (1 << 7) | (state-> | 428 | |
452 | current_tune_table_index-> | 429 | *tune_state = CT_TUNER_STEP_0; |
453 | wbdmux << 0)); | 430 | } else { /* we are already tuned to this frequency - the configuration is correct */ |
454 | state->wbd_gain_current = tmp->wbd_gain_val; | 431 | ret = 50; /* wakeup time */ |
455 | } else { | 432 | *tune_state = CT_TUNER_STEP_5; |
433 | } | ||
434 | } else if ((*tune_state > CT_TUNER_START) && (*tune_state < CT_TUNER_STEP_4)) { | ||
435 | |||
436 | ret = dib0070_captrim(state, tune_state); | ||
437 | |||
438 | } else if (*tune_state == CT_TUNER_STEP_4) { | ||
439 | const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain; | ||
440 | if (tmp != NULL) { | ||
441 | while (freq/1000 > tmp->freq) /* find the right one */ | ||
442 | tmp++; | ||
443 | dib0070_write_reg(state, 0x0f, | ||
444 | (0 << 15) | (1 << 14) | (3 << 12) | ||
445 | | (tmp->wbd_gain_val << 9) | (0 << 8) | (1 << 7) | ||
446 | | (state->current_tune_table_index->wbdmux << 0)); | ||
447 | state->wbd_gain_current = tmp->wbd_gain_val; | ||
448 | } else { | ||
456 | dib0070_write_reg(state, 0x0f, | 449 | dib0070_write_reg(state, 0x0f, |
457 | (0 << 15) | (1 << 14) | (3 << 12) | (6 << 9) | (0 << 8) | (1 << 7) | (state->current_tune_table_index-> | 450 | (0 << 15) | (1 << 14) | (3 << 12) | (6 << 9) | (0 << 8) | (1 << 7) | (state->current_tune_table_index-> |
458 | wbdmux << 0)); | 451 | wbdmux << 0)); |
459 | state->wbd_gain_current = 6; | 452 | state->wbd_gain_current = 6; |
460 | } | 453 | } |
461 | 454 | ||
462 | dib0070_write_reg(state, 0x06, 0x3fff); | 455 | dib0070_write_reg(state, 0x06, 0x3fff); |
463 | dib0070_write_reg(state, 0x07, | 456 | dib0070_write_reg(state, 0x07, |
464 | (state->current_tune_table_index->switch_trim << 11) | (7 << 8) | (state->lna_match->lna_band << 3) | (3 << 0)); | 457 | (state->current_tune_table_index->switch_trim << 11) | (7 << 8) | (state->lna_match->lna_band << 3) | (3 << 0)); |
465 | dib0070_write_reg(state, 0x08, (state->lna_match->lna_band << 10) | (3 << 7) | (127)); | 458 | dib0070_write_reg(state, 0x08, (state->lna_match->lna_band << 10) | (3 << 7) | (127)); |
466 | dib0070_write_reg(state, 0x0d, 0x0d80); | 459 | dib0070_write_reg(state, 0x0d, 0x0d80); |
467 | 460 | ||
468 | dib0070_write_reg(state, 0x18, 0x07ff); | ||
469 | dib0070_write_reg(state, 0x17, 0x0033); | ||
470 | 461 | ||
471 | *tune_state = CT_TUNER_STEP_5; | 462 | dib0070_write_reg(state, 0x18, 0x07ff); |
472 | } else if (*tune_state == CT_TUNER_STEP_5) { | 463 | dib0070_write_reg(state, 0x17, 0x0033); |
473 | dib0070_set_bandwidth(fe, ch); | 464 | |
474 | *tune_state = CT_TUNER_STOP; | 465 | |
475 | } else { | 466 | *tune_state = CT_TUNER_STEP_5; |
476 | ret = FE_CALLBACK_TIME_NEVER; /* tuner finished, time to call again infinite */ | 467 | } else if (*tune_state == CT_TUNER_STEP_5) { |
477 | } | 468 | dib0070_set_bandwidth(fe, ch); |
478 | return ret; | 469 | *tune_state = CT_TUNER_STOP; |
470 | } else { | ||
471 | ret = FE_CALLBACK_TIME_NEVER; /* tuner finished, time to call again infinite */ | ||
472 | } | ||
473 | return ret; | ||
479 | } | 474 | } |
480 | 475 | ||
476 | |||
481 | static int dib0070_tune(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) | 477 | static int dib0070_tune(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) |
482 | { | 478 | { |
483 | struct dib0070_state *state = fe->tuner_priv; | 479 | struct dib0070_state *state = fe->tuner_priv; |
484 | uint32_t ret; | 480 | uint32_t ret; |
485 | 481 | ||
486 | state->tune_state = CT_TUNER_START; | 482 | state->tune_state = CT_TUNER_START; |
487 | 483 | ||
488 | do { | 484 | do { |
489 | ret = dib0070_tune_digital(fe, p); | 485 | ret = dib0070_tune_digital(fe, p); |
490 | if (ret != FE_CALLBACK_TIME_NEVER) | 486 | if (ret != FE_CALLBACK_TIME_NEVER) |
491 | msleep(ret / 10); | 487 | msleep(ret/10); |
492 | else | 488 | else |
493 | break; | 489 | break; |
494 | } while (state->tune_state != CT_TUNER_STOP); | 490 | } while (state->tune_state != CT_TUNER_STOP); |
495 | 491 | ||
496 | return 0; | 492 | return 0; |
497 | } | 493 | } |
498 | 494 | ||
499 | static int dib0070_wakeup(struct dvb_frontend *fe) | 495 | static int dib0070_wakeup(struct dvb_frontend *fe) |
@@ -512,92 +508,113 @@ static int dib0070_sleep(struct dvb_frontend *fe) | |||
512 | return 0; | 508 | return 0; |
513 | } | 509 | } |
514 | 510 | ||
515 | static const u16 dib0070_p1f_defaults[] = { | 511 | u8 dib0070_get_rf_output(struct dvb_frontend *fe) |
512 | { | ||
513 | struct dib0070_state *state = fe->tuner_priv; | ||
514 | return (dib0070_read_reg(state, 0x07) >> 11) & 0x3; | ||
515 | } | ||
516 | EXPORT_SYMBOL(dib0070_get_rf_output); | ||
517 | |||
518 | int dib0070_set_rf_output(struct dvb_frontend *fe, u8 no) | ||
519 | { | ||
520 | struct dib0070_state *state = fe->tuner_priv; | ||
521 | u16 rxrf2 = dib0070_read_reg(state, 0x07) & 0xfe7ff; | ||
522 | if (no > 3) | ||
523 | no = 3; | ||
524 | if (no < 1) | ||
525 | no = 1; | ||
526 | return dib0070_write_reg(state, 0x07, rxrf2 | (no << 11)); | ||
527 | } | ||
528 | EXPORT_SYMBOL(dib0070_set_rf_output); | ||
529 | |||
530 | static const u16 dib0070_p1f_defaults[] = | ||
531 | |||
532 | { | ||
516 | 7, 0x02, | 533 | 7, 0x02, |
517 | 0x0008, | 534 | 0x0008, |
518 | 0x0000, | 535 | 0x0000, |
519 | 0x0000, | 536 | 0x0000, |
520 | 0x0000, | 537 | 0x0000, |
521 | 0x0000, | 538 | 0x0000, |
522 | 0x0002, | 539 | 0x0002, |
523 | 0x0100, | 540 | 0x0100, |
524 | 541 | ||
525 | 3, 0x0d, | 542 | 3, 0x0d, |
526 | 0x0d80, | 543 | 0x0d80, |
527 | 0x0001, | 544 | 0x0001, |
528 | 0x0000, | 545 | 0x0000, |
529 | 546 | ||
530 | 4, 0x11, | 547 | 4, 0x11, |
531 | 0x0000, | 548 | 0x0000, |
532 | 0x0103, | 549 | 0x0103, |
533 | 0x0000, | 550 | 0x0000, |
534 | 0x0000, | 551 | 0x0000, |
535 | 552 | ||
536 | 3, 0x16, | 553 | 3, 0x16, |
537 | 0x0004 | 0x0040, | 554 | 0x0004 | 0x0040, |
538 | 0x0030, | 555 | 0x0030, |
539 | 0x07ff, | 556 | 0x07ff, |
540 | 557 | ||
541 | 6, 0x1b, | 558 | 6, 0x1b, |
542 | 0x4112, | 559 | 0x4112, |
543 | 0xff00, | 560 | 0xff00, |
544 | 0xc07f, | 561 | 0xc07f, |
545 | 0x0000, | 562 | 0x0000, |
546 | 0x0180, | 563 | 0x0180, |
547 | 0x4000 | 0x0800 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001, | 564 | 0x4000 | 0x0800 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001, |
548 | 565 | ||
549 | 0, | 566 | 0, |
550 | }; | 567 | }; |
551 | 568 | ||
552 | static u16 dib0070_read_wbd_offset(struct dib0070_state *state, u8 gain) | 569 | static u16 dib0070_read_wbd_offset(struct dib0070_state *state, u8 gain) |
553 | { | 570 | { |
554 | u16 tuner_en = dib0070_read_reg(state, 0x20); | 571 | u16 tuner_en = dib0070_read_reg(state, 0x20); |
555 | u16 offset; | 572 | u16 offset; |
556 | 573 | ||
557 | dib0070_write_reg(state, 0x18, 0x07ff); | 574 | dib0070_write_reg(state, 0x18, 0x07ff); |
558 | dib0070_write_reg(state, 0x20, 0x0800 | 0x4000 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001); | 575 | dib0070_write_reg(state, 0x20, 0x0800 | 0x4000 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001); |
559 | dib0070_write_reg(state, 0x0f, (1 << 14) | (2 << 12) | (gain << 9) | (1 << 8) | (1 << 7) | (0 << 0)); | 576 | dib0070_write_reg(state, 0x0f, (1 << 14) | (2 << 12) | (gain << 9) | (1 << 8) | (1 << 7) | (0 << 0)); |
560 | msleep(9); | 577 | msleep(9); |
561 | offset = dib0070_read_reg(state, 0x19); | 578 | offset = dib0070_read_reg(state, 0x19); |
562 | dib0070_write_reg(state, 0x20, tuner_en); | 579 | dib0070_write_reg(state, 0x20, tuner_en); |
563 | return offset; | 580 | return offset; |
564 | } | 581 | } |
565 | 582 | ||
566 | static void dib0070_wbd_offset_calibration(struct dib0070_state *state) | 583 | static void dib0070_wbd_offset_calibration(struct dib0070_state *state) |
567 | { | 584 | { |
568 | u8 gain; | 585 | u8 gain; |
569 | for (gain = 6; gain < 8; gain++) { | 586 | for (gain = 6; gain < 8; gain++) { |
570 | state->wbd_offset_3_3[gain - 6] = ((dib0070_read_wbd_offset(state, gain) * 8 * 18 / 33 + 1) / 2); | 587 | state->wbd_offset_3_3[gain - 6] = ((dib0070_read_wbd_offset(state, gain) * 8 * 18 / 33 + 1) / 2); |
571 | dprintk("Gain: %d, WBDOffset (3.3V) = %hd", gain, state->wbd_offset_3_3[gain - 6]); | 588 | dprintk("Gain: %d, WBDOffset (3.3V) = %hd", gain, state->wbd_offset_3_3[gain-6]); |
572 | } | 589 | } |
573 | } | 590 | } |
574 | 591 | ||
575 | u16 dib0070_wbd_offset(struct dvb_frontend *fe) | 592 | u16 dib0070_wbd_offset(struct dvb_frontend *fe) |
576 | { | 593 | { |
577 | struct dib0070_state *state = fe->tuner_priv; | 594 | struct dib0070_state *state = fe->tuner_priv; |
578 | const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain; | 595 | const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain; |
579 | u32 freq = fe->dtv_property_cache.frequency / 1000; | 596 | u32 freq = fe->dtv_property_cache.frequency/1000; |
580 | 597 | ||
581 | if (tmp != NULL) { | 598 | if (tmp != NULL) { |
582 | while (freq / 1000 > tmp->freq) /* find the right one */ | 599 | while (freq/1000 > tmp->freq) /* find the right one */ |
583 | tmp++; | 600 | tmp++; |
584 | state->wbd_gain_current = tmp->wbd_gain_val; | 601 | state->wbd_gain_current = tmp->wbd_gain_val; |
585 | } else | 602 | } else |
586 | state->wbd_gain_current = 6; | 603 | state->wbd_gain_current = 6; |
587 | 604 | ||
588 | return state->wbd_offset_3_3[state->wbd_gain_current - 6]; | 605 | return state->wbd_offset_3_3[state->wbd_gain_current - 6]; |
589 | } | 606 | } |
590 | |||
591 | EXPORT_SYMBOL(dib0070_wbd_offset); | 607 | EXPORT_SYMBOL(dib0070_wbd_offset); |
592 | 608 | ||
593 | #define pgm_read_word(w) (*w) | 609 | #define pgm_read_word(w) (*w) |
594 | static int dib0070_reset(struct dvb_frontend *fe) | 610 | static int dib0070_reset(struct dvb_frontend *fe) |
595 | { | 611 | { |
596 | struct dib0070_state *state = fe->tuner_priv; | 612 | struct dib0070_state *state = fe->tuner_priv; |
597 | u16 l, r, *n; | 613 | u16 l, r, *n; |
598 | 614 | ||
599 | HARD_RESET(state); | 615 | HARD_RESET(state); |
600 | 616 | ||
617 | |||
601 | #ifndef FORCE_SBAND_TUNER | 618 | #ifndef FORCE_SBAND_TUNER |
602 | if ((dib0070_read_reg(state, 0x22) >> 9) & 0x1) | 619 | if ((dib0070_read_reg(state, 0x22) >> 9) & 0x1) |
603 | state->revision = (dib0070_read_reg(state, 0x1f) >> 8) & 0xff; | 620 | state->revision = (dib0070_read_reg(state, 0x1f) >> 8) & 0xff; |
@@ -605,7 +622,7 @@ static int dib0070_reset(struct dvb_frontend *fe) | |||
605 | #else | 622 | #else |
606 | #warning forcing SBAND | 623 | #warning forcing SBAND |
607 | #endif | 624 | #endif |
608 | state->revision = DIB0070S_P1A; | 625 | state->revision = DIB0070S_P1A; |
609 | 626 | ||
610 | /* P1F or not */ | 627 | /* P1F or not */ |
611 | dprintk("Revision: %x", state->revision); | 628 | dprintk("Revision: %x", state->revision); |
@@ -620,7 +637,7 @@ static int dib0070_reset(struct dvb_frontend *fe) | |||
620 | while (l) { | 637 | while (l) { |
621 | r = pgm_read_word(n++); | 638 | r = pgm_read_word(n++); |
622 | do { | 639 | do { |
623 | dib0070_write_reg(state, (u8) r, pgm_read_word(n++)); | 640 | dib0070_write_reg(state, (u8)r, pgm_read_word(n++)); |
624 | r++; | 641 | r++; |
625 | } while (--l); | 642 | } while (--l); |
626 | l = pgm_read_word(n++); | 643 | l = pgm_read_word(n++); |
@@ -633,6 +650,7 @@ static int dib0070_reset(struct dvb_frontend *fe) | |||
633 | else | 650 | else |
634 | r = 2; | 651 | r = 2; |
635 | 652 | ||
653 | |||
636 | r |= state->cfg->osc_buffer_state << 3; | 654 | r |= state->cfg->osc_buffer_state << 3; |
637 | 655 | ||
638 | dib0070_write_reg(state, 0x10, r); | 656 | dib0070_write_reg(state, 0x10, r); |
@@ -643,16 +661,24 @@ static int dib0070_reset(struct dvb_frontend *fe) | |||
643 | dib0070_write_reg(state, 0x02, r | (1 << 5)); | 661 | dib0070_write_reg(state, 0x02, r | (1 << 5)); |
644 | } | 662 | } |
645 | 663 | ||
646 | if (state->revision == DIB0070S_P1A) | 664 | if (state->revision == DIB0070S_P1A) |
647 | dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0); | 665 | dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0); |
648 | else | 666 | else |
649 | dib0070_set_ctrl_lo5(fe, 5, 4, state->cfg->charge_pump, state->cfg->enable_third_order_filter); | 667 | dib0070_set_ctrl_lo5(fe, 5, 4, state->cfg->charge_pump, state->cfg->enable_third_order_filter); |
650 | 668 | ||
651 | dib0070_write_reg(state, 0x01, (54 << 9) | 0xc8); | 669 | dib0070_write_reg(state, 0x01, (54 << 9) | 0xc8); |
652 | 670 | ||
653 | dib0070_wbd_offset_calibration(state); | 671 | dib0070_wbd_offset_calibration(state); |
654 | 672 | ||
655 | return 0; | 673 | return 0; |
674 | } | ||
675 | |||
676 | static int dib0070_get_frequency(struct dvb_frontend *fe, u32 *frequency) | ||
677 | { | ||
678 | struct dib0070_state *state = fe->tuner_priv; | ||
679 | |||
680 | *frequency = 1000 * state->current_rf; | ||
681 | return 0; | ||
656 | } | 682 | } |
657 | 683 | ||
658 | static int dib0070_release(struct dvb_frontend *fe) | 684 | static int dib0070_release(struct dvb_frontend *fe) |
@@ -664,18 +690,18 @@ static int dib0070_release(struct dvb_frontend *fe) | |||
664 | 690 | ||
665 | static const struct dvb_tuner_ops dib0070_ops = { | 691 | static const struct dvb_tuner_ops dib0070_ops = { |
666 | .info = { | 692 | .info = { |
667 | .name = "DiBcom DiB0070", | 693 | .name = "DiBcom DiB0070", |
668 | .frequency_min = 45000000, | 694 | .frequency_min = 45000000, |
669 | .frequency_max = 860000000, | 695 | .frequency_max = 860000000, |
670 | .frequency_step = 1000, | 696 | .frequency_step = 1000, |
671 | }, | 697 | }, |
672 | .release = dib0070_release, | 698 | .release = dib0070_release, |
673 | 699 | ||
674 | .init = dib0070_wakeup, | 700 | .init = dib0070_wakeup, |
675 | .sleep = dib0070_sleep, | 701 | .sleep = dib0070_sleep, |
676 | .set_params = dib0070_tune, | 702 | .set_params = dib0070_tune, |
677 | 703 | ||
678 | // .get_frequency = dib0070_get_frequency, | 704 | .get_frequency = dib0070_get_frequency, |
679 | // .get_bandwidth = dib0070_get_bandwidth | 705 | // .get_bandwidth = dib0070_get_bandwidth |
680 | }; | 706 | }; |
681 | 707 | ||
@@ -687,7 +713,7 @@ struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter | |||
687 | 713 | ||
688 | state->cfg = cfg; | 714 | state->cfg = cfg; |
689 | state->i2c = i2c; | 715 | state->i2c = i2c; |
690 | state->fe = fe; | 716 | state->fe = fe; |
691 | fe->tuner_priv = state; | 717 | fe->tuner_priv = state; |
692 | 718 | ||
693 | if (dib0070_reset(fe) != 0) | 719 | if (dib0070_reset(fe) != 0) |
@@ -699,12 +725,11 @@ struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter | |||
699 | fe->tuner_priv = state; | 725 | fe->tuner_priv = state; |
700 | return fe; | 726 | return fe; |
701 | 727 | ||
702 | free_mem: | 728 | free_mem: |
703 | kfree(state); | 729 | kfree(state); |
704 | fe->tuner_priv = NULL; | 730 | fe->tuner_priv = NULL; |
705 | return NULL; | 731 | return NULL; |
706 | } | 732 | } |
707 | |||
708 | EXPORT_SYMBOL(dib0070_attach); | 733 | EXPORT_SYMBOL(dib0070_attach); |
709 | 734 | ||
710 | MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>"); | 735 | MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>"); |
diff --git a/drivers/media/dvb/frontends/dib0070.h b/drivers/media/dvb/frontends/dib0070.h index eec9e52ffa75..45c31fae3967 100644 --- a/drivers/media/dvb/frontends/dib0070.h +++ b/drivers/media/dvb/frontends/dib0070.h | |||
@@ -52,6 +52,8 @@ struct dib0070_config { | |||
52 | extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg); | 52 | extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg); |
53 | extern u16 dib0070_wbd_offset(struct dvb_frontend *); | 53 | extern u16 dib0070_wbd_offset(struct dvb_frontend *); |
54 | extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, u8 open); | 54 | extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, u8 open); |
55 | extern u8 dib0070_get_rf_output(struct dvb_frontend *fe); | ||
56 | extern int dib0070_set_rf_output(struct dvb_frontend *fe, u8 no); | ||
55 | #else | 57 | #else |
56 | static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg) | 58 | static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg) |
57 | { | 59 | { |
@@ -62,7 +64,7 @@ static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struc | |||
62 | static inline u16 dib0070_wbd_offset(struct dvb_frontend *fe) | 64 | static inline u16 dib0070_wbd_offset(struct dvb_frontend *fe) |
63 | { | 65 | { |
64 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 66 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
65 | return -ENODEV; | 67 | return 0; |
66 | } | 68 | } |
67 | 69 | ||
68 | static inline void dib0070_ctrl_agc_filter(struct dvb_frontend *fe, u8 open) | 70 | static inline void dib0070_ctrl_agc_filter(struct dvb_frontend *fe, u8 open) |
diff --git a/drivers/media/dvb/frontends/dib0090.c b/drivers/media/dvb/frontends/dib0090.c new file mode 100644 index 000000000000..65240b7801e8 --- /dev/null +++ b/drivers/media/dvb/frontends/dib0090.c | |||
@@ -0,0 +1,1523 @@ | |||
1 | /* | ||
2 | * Linux-DVB Driver for DiBcom's DiB0090 base-band RF Tuner. | ||
3 | * | ||
4 | * Copyright (C) 2005-9 DiBcom (http://www.dibcom.fr/) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License as | ||
8 | * published by the Free Software Foundation; either version 2 of the | ||
9 | * License, or (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | * | ||
21 | * | ||
22 | * This code is more or less generated from another driver, please | ||
23 | * excuse some codingstyle oddities. | ||
24 | * | ||
25 | */ | ||
26 | |||
27 | #include <linux/kernel.h> | ||
28 | #include <linux/slab.h> | ||
29 | #include <linux/i2c.h> | ||
30 | |||
31 | #include "dvb_frontend.h" | ||
32 | |||
33 | #include "dib0090.h" | ||
34 | #include "dibx000_common.h" | ||
35 | |||
36 | static int debug; | ||
37 | module_param(debug, int, 0644); | ||
38 | MODULE_PARM_DESC(debug, "turn on debugging (default: 0)"); | ||
39 | |||
40 | #define dprintk(args...) do { \ | ||
41 | if (debug) { \ | ||
42 | printk(KERN_DEBUG "DiB0090: "); \ | ||
43 | printk(args); \ | ||
44 | printk("\n"); \ | ||
45 | } \ | ||
46 | } while (0) | ||
47 | |||
48 | #define CONFIG_SYS_ISDBT | ||
49 | #define CONFIG_BAND_CBAND | ||
50 | #define CONFIG_BAND_VHF | ||
51 | #define CONFIG_BAND_UHF | ||
52 | #define CONFIG_DIB0090_USE_PWM_AGC | ||
53 | |||
54 | #define EN_LNA0 0x8000 | ||
55 | #define EN_LNA1 0x4000 | ||
56 | #define EN_LNA2 0x2000 | ||
57 | #define EN_LNA3 0x1000 | ||
58 | #define EN_MIX0 0x0800 | ||
59 | #define EN_MIX1 0x0400 | ||
60 | #define EN_MIX2 0x0200 | ||
61 | #define EN_MIX3 0x0100 | ||
62 | #define EN_IQADC 0x0040 | ||
63 | #define EN_PLL 0x0020 | ||
64 | #define EN_TX 0x0010 | ||
65 | #define EN_BB 0x0008 | ||
66 | #define EN_LO 0x0004 | ||
67 | #define EN_BIAS 0x0001 | ||
68 | |||
69 | #define EN_IQANA 0x0002 | ||
70 | #define EN_DIGCLK 0x0080 /* not in the 0x24 reg, only in 0x1b */ | ||
71 | #define EN_CRYSTAL 0x0002 | ||
72 | |||
73 | #define EN_UHF 0x22E9 | ||
74 | #define EN_VHF 0x44E9 | ||
75 | #define EN_LBD 0x11E9 | ||
76 | #define EN_SBD 0x44E9 | ||
77 | #define EN_CAB 0x88E9 | ||
78 | |||
79 | #define pgm_read_word(w) (*w) | ||
80 | |||
81 | struct dc_calibration; | ||
82 | |||
83 | struct dib0090_tuning { | ||
84 | u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ | ||
85 | u8 switch_trim; | ||
86 | u8 lna_tune; | ||
87 | u8 lna_bias; | ||
88 | u16 v2i; | ||
89 | u16 mix; | ||
90 | u16 load; | ||
91 | u16 tuner_enable; | ||
92 | }; | ||
93 | |||
94 | struct dib0090_pll { | ||
95 | u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ | ||
96 | u8 vco_band; | ||
97 | u8 hfdiv_code; | ||
98 | u8 hfdiv; | ||
99 | u8 topresc; | ||
100 | }; | ||
101 | |||
102 | struct dib0090_state { | ||
103 | struct i2c_adapter *i2c; | ||
104 | struct dvb_frontend *fe; | ||
105 | const struct dib0090_config *config; | ||
106 | |||
107 | u8 current_band; | ||
108 | u16 revision; | ||
109 | enum frontend_tune_state tune_state; | ||
110 | u32 current_rf; | ||
111 | |||
112 | u16 wbd_offset; | ||
113 | s16 wbd_target; /* in dB */ | ||
114 | |||
115 | s16 rf_gain_limit; /* take-over-point: where to split between bb and rf gain */ | ||
116 | s16 current_gain; /* keeps the currently programmed gain */ | ||
117 | u8 agc_step; /* new binary search */ | ||
118 | |||
119 | u16 gain[2]; /* for channel monitoring */ | ||
120 | |||
121 | const u16 *rf_ramp; | ||
122 | const u16 *bb_ramp; | ||
123 | |||
124 | /* for the software AGC ramps */ | ||
125 | u16 bb_1_def; | ||
126 | u16 rf_lt_def; | ||
127 | u16 gain_reg[4]; | ||
128 | |||
129 | /* for the captrim/dc-offset search */ | ||
130 | s8 step; | ||
131 | s16 adc_diff; | ||
132 | s16 min_adc_diff; | ||
133 | |||
134 | s8 captrim; | ||
135 | s8 fcaptrim; | ||
136 | |||
137 | const struct dc_calibration *dc; | ||
138 | u16 bb6, bb7; | ||
139 | |||
140 | const struct dib0090_tuning *current_tune_table_index; | ||
141 | const struct dib0090_pll *current_pll_table_index; | ||
142 | |||
143 | u8 tuner_is_tuned; | ||
144 | u8 agc_freeze; | ||
145 | |||
146 | u8 reset; | ||
147 | }; | ||
148 | |||
149 | static u16 dib0090_read_reg(struct dib0090_state *state, u8 reg) | ||
150 | { | ||
151 | u8 b[2]; | ||
152 | struct i2c_msg msg[2] = { | ||
153 | {.addr = state->config->i2c_address, .flags = 0, .buf = ®, .len = 1}, | ||
154 | {.addr = state->config->i2c_address, .flags = I2C_M_RD, .buf = b, .len = 2}, | ||
155 | }; | ||
156 | if (i2c_transfer(state->i2c, msg, 2) != 2) { | ||
157 | printk(KERN_WARNING "DiB0090 I2C read failed\n"); | ||
158 | return 0; | ||
159 | } | ||
160 | return (b[0] << 8) | b[1]; | ||
161 | } | ||
162 | |||
163 | static int dib0090_write_reg(struct dib0090_state *state, u32 reg, u16 val) | ||
164 | { | ||
165 | u8 b[3] = { reg & 0xff, val >> 8, val & 0xff }; | ||
166 | struct i2c_msg msg = {.addr = state->config->i2c_address, .flags = 0, .buf = b, .len = 3 }; | ||
167 | if (i2c_transfer(state->i2c, &msg, 1) != 1) { | ||
168 | printk(KERN_WARNING "DiB0090 I2C write failed\n"); | ||
169 | return -EREMOTEIO; | ||
170 | } | ||
171 | return 0; | ||
172 | } | ||
173 | |||
174 | #define HARD_RESET(state) do { if (cfg->reset) { if (cfg->sleep) cfg->sleep(fe, 0); msleep(10); cfg->reset(fe, 1); msleep(10); cfg->reset(fe, 0); msleep(10); } } while (0) | ||
175 | #define ADC_TARGET -220 | ||
176 | #define GAIN_ALPHA 5 | ||
177 | #define WBD_ALPHA 6 | ||
178 | #define LPF 100 | ||
179 | static void dib0090_write_regs(struct dib0090_state *state, u8 r, const u16 * b, u8 c) | ||
180 | { | ||
181 | do { | ||
182 | dib0090_write_reg(state, r++, *b++); | ||
183 | } while (--c); | ||
184 | } | ||
185 | |||
186 | static u16 dib0090_identify(struct dvb_frontend *fe) | ||
187 | { | ||
188 | struct dib0090_state *state = fe->tuner_priv; | ||
189 | u16 v; | ||
190 | |||
191 | v = dib0090_read_reg(state, 0x1a); | ||
192 | |||
193 | #ifdef FIRMWARE_FIREFLY | ||
194 | /* pll is not locked locked */ | ||
195 | if (!(v & 0x800)) | ||
196 | dprintk("FE%d : Identification : pll is not yet locked", fe->id); | ||
197 | #endif | ||
198 | |||
199 | /* without PLL lock info */ | ||
200 | v &= 0x3ff; | ||
201 | dprintk("P/V: %04x:", v); | ||
202 | |||
203 | if ((v >> 8) & 0xf) | ||
204 | dprintk("FE%d : Product ID = 0x%x : KROSUS", fe->id, (v >> 8) & 0xf); | ||
205 | else | ||
206 | return 0xff; | ||
207 | |||
208 | v &= 0xff; | ||
209 | if (((v >> 5) & 0x7) == 0x1) | ||
210 | dprintk("FE%d : MP001 : 9090/8096", fe->id); | ||
211 | else if (((v >> 5) & 0x7) == 0x4) | ||
212 | dprintk("FE%d : MP005 : Single Sband", fe->id); | ||
213 | else if (((v >> 5) & 0x7) == 0x6) | ||
214 | dprintk("FE%d : MP008 : diversity VHF-UHF-LBAND", fe->id); | ||
215 | else if (((v >> 5) & 0x7) == 0x7) | ||
216 | dprintk("FE%d : MP009 : diversity 29098 CBAND-UHF-LBAND-SBAND", fe->id); | ||
217 | else | ||
218 | return 0xff; | ||
219 | |||
220 | /* revision only */ | ||
221 | if ((v & 0x1f) == 0x3) | ||
222 | dprintk("FE%d : P1-D/E/F detected", fe->id); | ||
223 | else if ((v & 0x1f) == 0x1) | ||
224 | dprintk("FE%d : P1C detected", fe->id); | ||
225 | else if ((v & 0x1f) == 0x0) { | ||
226 | #ifdef CONFIG_TUNER_DIB0090_P1B_SUPPORT | ||
227 | dprintk("FE%d : P1-A/B detected: using previous driver - support will be removed soon", fe->id); | ||
228 | dib0090_p1b_register(fe); | ||
229 | #else | ||
230 | dprintk("FE%d : P1-A/B detected: driver is deactivated - not available", fe->id); | ||
231 | return 0xff; | ||
232 | #endif | ||
233 | } | ||
234 | |||
235 | return v; | ||
236 | } | ||
237 | |||
238 | static void dib0090_reset_digital(struct dvb_frontend *fe, const struct dib0090_config *cfg) | ||
239 | { | ||
240 | struct dib0090_state *state = fe->tuner_priv; | ||
241 | |||
242 | HARD_RESET(state); | ||
243 | |||
244 | dib0090_write_reg(state, 0x24, EN_PLL); | ||
245 | dib0090_write_reg(state, 0x1b, EN_DIGCLK | EN_PLL | EN_CRYSTAL); /* PLL, DIG_CLK and CRYSTAL remain */ | ||
246 | |||
247 | /* adcClkOutRatio=8->7, release reset */ | ||
248 | dib0090_write_reg(state, 0x20, ((cfg->io.adc_clock_ratio - 1) << 11) | (0 << 10) | (1 << 9) | (1 << 8) | (0 << 4) | 0); | ||
249 | if (cfg->clkoutdrive != 0) | ||
250 | dib0090_write_reg(state, 0x23, | ||
251 | (0 << 15) | ((!cfg->analog_output) << 14) | (1 << 10) | (1 << 9) | (0 << 8) | (cfg->clkoutdrive << 5) | (cfg-> | ||
252 | clkouttobamse | ||
253 | << 4) | (0 | ||
254 | << | ||
255 | 2) | ||
256 | | (0)); | ||
257 | else | ||
258 | dib0090_write_reg(state, 0x23, | ||
259 | (0 << 15) | ((!cfg->analog_output) << 14) | (1 << 10) | (1 << 9) | (0 << 8) | (7 << 5) | (cfg-> | ||
260 | clkouttobamse << 4) | (0 | ||
261 | << | ||
262 | 2) | ||
263 | | (0)); | ||
264 | |||
265 | /* enable pll, de-activate reset, ratio: 2/1 = 60MHz */ | ||
266 | dib0090_write_reg(state, 0x21, | ||
267 | (cfg->io.pll_bypass << 15) | (1 << 13) | (cfg->io.pll_range << 12) | (cfg->io.pll_loopdiv << 6) | (cfg->io.pll_prediv)); | ||
268 | |||
269 | } | ||
270 | |||
271 | static int dib0090_wakeup(struct dvb_frontend *fe) | ||
272 | { | ||
273 | struct dib0090_state *state = fe->tuner_priv; | ||
274 | if (state->config->sleep) | ||
275 | state->config->sleep(fe, 0); | ||
276 | return 0; | ||
277 | } | ||
278 | |||
279 | static int dib0090_sleep(struct dvb_frontend *fe) | ||
280 | { | ||
281 | struct dib0090_state *state = fe->tuner_priv; | ||
282 | if (state->config->sleep) | ||
283 | state->config->sleep(fe, 1); | ||
284 | return 0; | ||
285 | } | ||
286 | |||
287 | void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast) | ||
288 | { | ||
289 | struct dib0090_state *state = fe->tuner_priv; | ||
290 | if (fast) | ||
291 | dib0090_write_reg(state, 0x04, 0); | ||
292 | else | ||
293 | dib0090_write_reg(state, 0x04, 1); | ||
294 | } | ||
295 | EXPORT_SYMBOL(dib0090_dcc_freq); | ||
296 | |||
297 | static const u16 rf_ramp_pwm_cband[] = { | ||
298 | 0, /* max RF gain in 10th of dB */ | ||
299 | 0, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x2b */ | ||
300 | 0, /* ramp_max = maximum X used on the ramp */ | ||
301 | (0 << 10) | 0, /* 0x2c, LNA 1 = 0dB */ | ||
302 | (0 << 10) | 0, /* 0x2d, LNA 1 */ | ||
303 | (0 << 10) | 0, /* 0x2e, LNA 2 = 0dB */ | ||
304 | (0 << 10) | 0, /* 0x2f, LNA 2 */ | ||
305 | (0 << 10) | 0, /* 0x30, LNA 3 = 0dB */ | ||
306 | (0 << 10) | 0, /* 0x31, LNA 3 */ | ||
307 | (0 << 10) | 0, /* GAIN_4_1, LNA 4 = 0dB */ | ||
308 | (0 << 10) | 0, /* GAIN_4_2, LNA 4 */ | ||
309 | }; | ||
310 | |||
311 | static const u16 rf_ramp_vhf[] = { | ||
312 | 412, /* max RF gain in 10th of dB */ | ||
313 | 132, 307, 127, /* LNA1, 13.2dB */ | ||
314 | 105, 412, 255, /* LNA2, 10.5dB */ | ||
315 | 50, 50, 127, /* LNA3, 5dB */ | ||
316 | 125, 175, 127, /* LNA4, 12.5dB */ | ||
317 | 0, 0, 127, /* CBAND, 0dB */ | ||
318 | }; | ||
319 | |||
320 | static const u16 rf_ramp_uhf[] = { | ||
321 | 412, /* max RF gain in 10th of dB */ | ||
322 | 132, 307, 127, /* LNA1 : total gain = 13.2dB, point on the ramp where this amp is full gain, value to write to get full gain */ | ||
323 | 105, 412, 255, /* LNA2 : 10.5 dB */ | ||
324 | 50, 50, 127, /* LNA3 : 5.0 dB */ | ||
325 | 125, 175, 127, /* LNA4 : 12.5 dB */ | ||
326 | 0, 0, 127, /* CBAND : 0.0 dB */ | ||
327 | }; | ||
328 | |||
329 | static const u16 rf_ramp_cband[] = { | ||
330 | 332, /* max RF gain in 10th of dB */ | ||
331 | 132, 252, 127, /* LNA1, dB */ | ||
332 | 80, 332, 255, /* LNA2, dB */ | ||
333 | 0, 0, 127, /* LNA3, dB */ | ||
334 | 0, 0, 127, /* LNA4, dB */ | ||
335 | 120, 120, 127, /* LT1 CBAND */ | ||
336 | }; | ||
337 | |||
338 | static const u16 rf_ramp_pwm_vhf[] = { | ||
339 | 404, /* max RF gain in 10th of dB */ | ||
340 | 25, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x2b */ | ||
341 | 1011, /* ramp_max = maximum X used on the ramp */ | ||
342 | (6 << 10) | 417, /* 0x2c, LNA 1 = 13.2dB */ | ||
343 | (0 << 10) | 756, /* 0x2d, LNA 1 */ | ||
344 | (16 << 10) | 756, /* 0x2e, LNA 2 = 10.5dB */ | ||
345 | (0 << 10) | 1011, /* 0x2f, LNA 2 */ | ||
346 | (16 << 10) | 290, /* 0x30, LNA 3 = 5dB */ | ||
347 | (0 << 10) | 417, /* 0x31, LNA 3 */ | ||
348 | (7 << 10) | 0, /* GAIN_4_1, LNA 4 = 12.5dB */ | ||
349 | (0 << 10) | 290, /* GAIN_4_2, LNA 4 */ | ||
350 | }; | ||
351 | |||
352 | static const u16 rf_ramp_pwm_uhf[] = { | ||
353 | 404, /* max RF gain in 10th of dB */ | ||
354 | 25, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x2b */ | ||
355 | 1011, /* ramp_max = maximum X used on the ramp */ | ||
356 | (6 << 10) | 417, /* 0x2c, LNA 1 = 13.2dB */ | ||
357 | (0 << 10) | 756, /* 0x2d, LNA 1 */ | ||
358 | (16 << 10) | 756, /* 0x2e, LNA 2 = 10.5dB */ | ||
359 | (0 << 10) | 1011, /* 0x2f, LNA 2 */ | ||
360 | (16 << 10) | 0, /* 0x30, LNA 3 = 5dB */ | ||
361 | (0 << 10) | 127, /* 0x31, LNA 3 */ | ||
362 | (7 << 10) | 127, /* GAIN_4_1, LNA 4 = 12.5dB */ | ||
363 | (0 << 10) | 417, /* GAIN_4_2, LNA 4 */ | ||
364 | }; | ||
365 | |||
366 | static const u16 bb_ramp_boost[] = { | ||
367 | 550, /* max BB gain in 10th of dB */ | ||
368 | 260, 260, 26, /* BB1, 26dB */ | ||
369 | 290, 550, 29, /* BB2, 29dB */ | ||
370 | }; | ||
371 | |||
372 | static const u16 bb_ramp_pwm_normal[] = { | ||
373 | 500, /* max RF gain in 10th of dB */ | ||
374 | 8, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x34 */ | ||
375 | 400, | ||
376 | (2 << 9) | 0, /* 0x35 = 21dB */ | ||
377 | (0 << 9) | 168, /* 0x36 */ | ||
378 | (2 << 9) | 168, /* 0x37 = 29dB */ | ||
379 | (0 << 9) | 400, /* 0x38 */ | ||
380 | }; | ||
381 | |||
382 | struct slope { | ||
383 | int16_t range; | ||
384 | int16_t slope; | ||
385 | }; | ||
386 | static u16 slopes_to_scale(const struct slope *slopes, u8 num, s16 val) | ||
387 | { | ||
388 | u8 i; | ||
389 | u16 rest; | ||
390 | u16 ret = 0; | ||
391 | for (i = 0; i < num; i++) { | ||
392 | if (val > slopes[i].range) | ||
393 | rest = slopes[i].range; | ||
394 | else | ||
395 | rest = val; | ||
396 | ret += (rest * slopes[i].slope) / slopes[i].range; | ||
397 | val -= rest; | ||
398 | } | ||
399 | return ret; | ||
400 | } | ||
401 | |||
402 | static const struct slope dib0090_wbd_slopes[3] = { | ||
403 | {66, 120}, /* -64,-52: offset - 65 */ | ||
404 | {600, 170}, /* -52,-35: 65 - 665 */ | ||
405 | {170, 250}, /* -45,-10: 665 - 835 */ | ||
406 | }; | ||
407 | |||
408 | static s16 dib0090_wbd_to_db(struct dib0090_state *state, u16 wbd) | ||
409 | { | ||
410 | wbd &= 0x3ff; | ||
411 | if (wbd < state->wbd_offset) | ||
412 | wbd = 0; | ||
413 | else | ||
414 | wbd -= state->wbd_offset; | ||
415 | /* -64dB is the floor */ | ||
416 | return -640 + (s16) slopes_to_scale(dib0090_wbd_slopes, ARRAY_SIZE(dib0090_wbd_slopes), wbd); | ||
417 | } | ||
418 | |||
419 | static void dib0090_wbd_target(struct dib0090_state *state, u32 rf) | ||
420 | { | ||
421 | u16 offset = 250; | ||
422 | |||
423 | /* TODO : DAB digital N+/-1 interferer perfs : offset = 10 */ | ||
424 | |||
425 | if (state->current_band == BAND_VHF) | ||
426 | offset = 650; | ||
427 | #ifndef FIRMWARE_FIREFLY | ||
428 | if (state->current_band == BAND_VHF) | ||
429 | offset = state->config->wbd_vhf_offset; | ||
430 | if (state->current_band == BAND_CBAND) | ||
431 | offset = state->config->wbd_cband_offset; | ||
432 | #endif | ||
433 | |||
434 | state->wbd_target = dib0090_wbd_to_db(state, state->wbd_offset + offset); | ||
435 | dprintk("wbd-target: %d dB", (u32) state->wbd_target); | ||
436 | } | ||
437 | |||
438 | static const int gain_reg_addr[4] = { | ||
439 | 0x08, 0x0a, 0x0f, 0x01 | ||
440 | }; | ||
441 | |||
442 | static void dib0090_gain_apply(struct dib0090_state *state, s16 gain_delta, s16 top_delta, u8 force) | ||
443 | { | ||
444 | u16 rf, bb, ref; | ||
445 | u16 i, v, gain_reg[4] = { 0 }, gain; | ||
446 | const u16 *g; | ||
447 | |||
448 | if (top_delta < -511) | ||
449 | top_delta = -511; | ||
450 | if (top_delta > 511) | ||
451 | top_delta = 511; | ||
452 | |||
453 | if (force) { | ||
454 | top_delta *= (1 << WBD_ALPHA); | ||
455 | gain_delta *= (1 << GAIN_ALPHA); | ||
456 | } | ||
457 | |||
458 | if (top_delta >= ((s16) (state->rf_ramp[0] << WBD_ALPHA) - state->rf_gain_limit)) /* overflow */ | ||
459 | state->rf_gain_limit = state->rf_ramp[0] << WBD_ALPHA; | ||
460 | else | ||
461 | state->rf_gain_limit += top_delta; | ||
462 | |||
463 | if (state->rf_gain_limit < 0) /*underflow */ | ||
464 | state->rf_gain_limit = 0; | ||
465 | |||
466 | /* use gain as a temporary variable and correct current_gain */ | ||
467 | gain = ((state->rf_gain_limit >> WBD_ALPHA) + state->bb_ramp[0]) << GAIN_ALPHA; | ||
468 | if (gain_delta >= ((s16) gain - state->current_gain)) /* overflow */ | ||
469 | state->current_gain = gain; | ||
470 | else | ||
471 | state->current_gain += gain_delta; | ||
472 | /* cannot be less than 0 (only if gain_delta is less than 0 we can have current_gain < 0) */ | ||
473 | if (state->current_gain < 0) | ||
474 | state->current_gain = 0; | ||
475 | |||
476 | /* now split total gain to rf and bb gain */ | ||
477 | gain = state->current_gain >> GAIN_ALPHA; | ||
478 | |||
479 | /* requested gain is bigger than rf gain limit - ACI/WBD adjustment */ | ||
480 | if (gain > (state->rf_gain_limit >> WBD_ALPHA)) { | ||
481 | rf = state->rf_gain_limit >> WBD_ALPHA; | ||
482 | bb = gain - rf; | ||
483 | if (bb > state->bb_ramp[0]) | ||
484 | bb = state->bb_ramp[0]; | ||
485 | } else { /* high signal level -> all gains put on RF */ | ||
486 | rf = gain; | ||
487 | bb = 0; | ||
488 | } | ||
489 | |||
490 | state->gain[0] = rf; | ||
491 | state->gain[1] = bb; | ||
492 | |||
493 | /* software ramp */ | ||
494 | /* Start with RF gains */ | ||
495 | g = state->rf_ramp + 1; /* point on RF LNA1 max gain */ | ||
496 | ref = rf; | ||
497 | for (i = 0; i < 7; i++) { /* Go over all amplifiers => 5RF amps + 2 BB amps = 7 amps */ | ||
498 | if (g[0] == 0 || ref < (g[1] - g[0])) /* if total gain of the current amp is null or this amp is not concerned because it starts to work from an higher gain value */ | ||
499 | v = 0; /* force the gain to write for the current amp to be null */ | ||
500 | else if (ref >= g[1]) /* Gain to set is higher than the high working point of this amp */ | ||
501 | v = g[2]; /* force this amp to be full gain */ | ||
502 | else /* compute the value to set to this amp because we are somewhere in his range */ | ||
503 | v = ((ref - (g[1] - g[0])) * g[2]) / g[0]; | ||
504 | |||
505 | if (i == 0) /* LNA 1 reg mapping */ | ||
506 | gain_reg[0] = v; | ||
507 | else if (i == 1) /* LNA 2 reg mapping */ | ||
508 | gain_reg[0] |= v << 7; | ||
509 | else if (i == 2) /* LNA 3 reg mapping */ | ||
510 | gain_reg[1] = v; | ||
511 | else if (i == 3) /* LNA 4 reg mapping */ | ||
512 | gain_reg[1] |= v << 7; | ||
513 | else if (i == 4) /* CBAND LNA reg mapping */ | ||
514 | gain_reg[2] = v | state->rf_lt_def; | ||
515 | else if (i == 5) /* BB gain 1 reg mapping */ | ||
516 | gain_reg[3] = v << 3; | ||
517 | else if (i == 6) /* BB gain 2 reg mapping */ | ||
518 | gain_reg[3] |= v << 8; | ||
519 | |||
520 | g += 3; /* go to next gain bloc */ | ||
521 | |||
522 | /* When RF is finished, start with BB */ | ||
523 | if (i == 4) { | ||
524 | g = state->bb_ramp + 1; /* point on BB gain 1 max gain */ | ||
525 | ref = bb; | ||
526 | } | ||
527 | } | ||
528 | gain_reg[3] |= state->bb_1_def; | ||
529 | gain_reg[3] |= ((bb % 10) * 100) / 125; | ||
530 | |||
531 | #ifdef DEBUG_AGC | ||
532 | dprintk("GA CALC: DB: %3d(rf) + %3d(bb) = %3d gain_reg[0]=%04x gain_reg[1]=%04x gain_reg[2]=%04x gain_reg[0]=%04x", rf, bb, rf + bb, | ||
533 | gain_reg[0], gain_reg[1], gain_reg[2], gain_reg[3]); | ||
534 | #endif | ||
535 | |||
536 | /* Write the amplifier regs */ | ||
537 | for (i = 0; i < 4; i++) { | ||
538 | v = gain_reg[i]; | ||
539 | if (force || state->gain_reg[i] != v) { | ||
540 | state->gain_reg[i] = v; | ||
541 | dib0090_write_reg(state, gain_reg_addr[i], v); | ||
542 | } | ||
543 | } | ||
544 | } | ||
545 | |||
546 | static void dib0090_set_boost(struct dib0090_state *state, int onoff) | ||
547 | { | ||
548 | state->bb_1_def &= 0xdfff; | ||
549 | state->bb_1_def |= onoff << 13; | ||
550 | } | ||
551 | |||
552 | static void dib0090_set_rframp(struct dib0090_state *state, const u16 * cfg) | ||
553 | { | ||
554 | state->rf_ramp = cfg; | ||
555 | } | ||
556 | |||
557 | static void dib0090_set_rframp_pwm(struct dib0090_state *state, const u16 * cfg) | ||
558 | { | ||
559 | state->rf_ramp = cfg; | ||
560 | |||
561 | dib0090_write_reg(state, 0x2a, 0xffff); | ||
562 | |||
563 | dprintk("total RF gain: %ddB, step: %d", (u32) cfg[0], dib0090_read_reg(state, 0x2a)); | ||
564 | |||
565 | dib0090_write_regs(state, 0x2c, cfg + 3, 6); | ||
566 | dib0090_write_regs(state, 0x3e, cfg + 9, 2); | ||
567 | } | ||
568 | |||
569 | static void dib0090_set_bbramp(struct dib0090_state *state, const u16 * cfg) | ||
570 | { | ||
571 | state->bb_ramp = cfg; | ||
572 | dib0090_set_boost(state, cfg[0] > 500); /* we want the boost if the gain is higher that 50dB */ | ||
573 | } | ||
574 | |||
575 | static void dib0090_set_bbramp_pwm(struct dib0090_state *state, const u16 * cfg) | ||
576 | { | ||
577 | state->bb_ramp = cfg; | ||
578 | |||
579 | dib0090_set_boost(state, cfg[0] > 500); /* we want the boost if the gain is higher that 50dB */ | ||
580 | |||
581 | dib0090_write_reg(state, 0x33, 0xffff); | ||
582 | dprintk("total BB gain: %ddB, step: %d", (u32) cfg[0], dib0090_read_reg(state, 0x33)); | ||
583 | dib0090_write_regs(state, 0x35, cfg + 3, 4); | ||
584 | } | ||
585 | |||
586 | void dib0090_pwm_gain_reset(struct dvb_frontend *fe) | ||
587 | { | ||
588 | struct dib0090_state *state = fe->tuner_priv; | ||
589 | /* reset the AGC */ | ||
590 | |||
591 | if (state->config->use_pwm_agc) { | ||
592 | #ifdef CONFIG_BAND_SBAND | ||
593 | if (state->current_band == BAND_SBAND) { | ||
594 | dib0090_set_rframp_pwm(state, rf_ramp_pwm_sband); | ||
595 | dib0090_set_bbramp_pwm(state, bb_ramp_pwm_boost); | ||
596 | } else | ||
597 | #endif | ||
598 | #ifdef CONFIG_BAND_CBAND | ||
599 | if (state->current_band == BAND_CBAND) { | ||
600 | dib0090_set_rframp_pwm(state, rf_ramp_pwm_cband); | ||
601 | dib0090_set_bbramp_pwm(state, bb_ramp_pwm_normal); | ||
602 | } else | ||
603 | #endif | ||
604 | #ifdef CONFIG_BAND_VHF | ||
605 | if (state->current_band == BAND_VHF) { | ||
606 | dib0090_set_rframp_pwm(state, rf_ramp_pwm_vhf); | ||
607 | dib0090_set_bbramp_pwm(state, bb_ramp_pwm_normal); | ||
608 | } else | ||
609 | #endif | ||
610 | { | ||
611 | dib0090_set_rframp_pwm(state, rf_ramp_pwm_uhf); | ||
612 | dib0090_set_bbramp_pwm(state, bb_ramp_pwm_normal); | ||
613 | } | ||
614 | |||
615 | if (state->rf_ramp[0] != 0) | ||
616 | dib0090_write_reg(state, 0x32, (3 << 11)); | ||
617 | else | ||
618 | dib0090_write_reg(state, 0x32, (0 << 11)); | ||
619 | |||
620 | dib0090_write_reg(state, 0x39, (1 << 10)); | ||
621 | } | ||
622 | } | ||
623 | EXPORT_SYMBOL(dib0090_pwm_gain_reset); | ||
624 | |||
625 | int dib0090_gain_control(struct dvb_frontend *fe) | ||
626 | { | ||
627 | struct dib0090_state *state = fe->tuner_priv; | ||
628 | enum frontend_tune_state *tune_state = &state->tune_state; | ||
629 | int ret = 10; | ||
630 | |||
631 | u16 wbd_val = 0; | ||
632 | u8 apply_gain_immediatly = 1; | ||
633 | s16 wbd_error = 0, adc_error = 0; | ||
634 | |||
635 | if (*tune_state == CT_AGC_START) { | ||
636 | state->agc_freeze = 0; | ||
637 | dib0090_write_reg(state, 0x04, 0x0); | ||
638 | |||
639 | #ifdef CONFIG_BAND_SBAND | ||
640 | if (state->current_band == BAND_SBAND) { | ||
641 | dib0090_set_rframp(state, rf_ramp_sband); | ||
642 | dib0090_set_bbramp(state, bb_ramp_boost); | ||
643 | } else | ||
644 | #endif | ||
645 | #ifdef CONFIG_BAND_VHF | ||
646 | if (state->current_band == BAND_VHF) { | ||
647 | dib0090_set_rframp(state, rf_ramp_vhf); | ||
648 | dib0090_set_bbramp(state, bb_ramp_boost); | ||
649 | } else | ||
650 | #endif | ||
651 | #ifdef CONFIG_BAND_CBAND | ||
652 | if (state->current_band == BAND_CBAND) { | ||
653 | dib0090_set_rframp(state, rf_ramp_cband); | ||
654 | dib0090_set_bbramp(state, bb_ramp_boost); | ||
655 | } else | ||
656 | #endif | ||
657 | { | ||
658 | dib0090_set_rframp(state, rf_ramp_uhf); | ||
659 | dib0090_set_bbramp(state, bb_ramp_boost); | ||
660 | } | ||
661 | |||
662 | dib0090_write_reg(state, 0x32, 0); | ||
663 | dib0090_write_reg(state, 0x39, 0); | ||
664 | |||
665 | dib0090_wbd_target(state, state->current_rf); | ||
666 | |||
667 | state->rf_gain_limit = state->rf_ramp[0] << WBD_ALPHA; | ||
668 | state->current_gain = ((state->rf_ramp[0] + state->bb_ramp[0]) / 2) << GAIN_ALPHA; | ||
669 | |||
670 | *tune_state = CT_AGC_STEP_0; | ||
671 | } else if (!state->agc_freeze) { | ||
672 | s16 wbd; | ||
673 | |||
674 | int adc; | ||
675 | wbd_val = dib0090_read_reg(state, 0x1d); | ||
676 | |||
677 | /* read and calc the wbd power */ | ||
678 | wbd = dib0090_wbd_to_db(state, wbd_val); | ||
679 | wbd_error = state->wbd_target - wbd; | ||
680 | |||
681 | if (*tune_state == CT_AGC_STEP_0) { | ||
682 | if (wbd_error < 0 && state->rf_gain_limit > 0) { | ||
683 | #ifdef CONFIG_BAND_CBAND | ||
684 | /* in case of CBAND tune reduce first the lt_gain2 before adjusting the RF gain */ | ||
685 | u8 ltg2 = (state->rf_lt_def >> 10) & 0x7; | ||
686 | if (state->current_band == BAND_CBAND && ltg2) { | ||
687 | ltg2 >>= 1; | ||
688 | state->rf_lt_def &= ltg2 << 10; /* reduce in 3 steps from 7 to 0 */ | ||
689 | } | ||
690 | #endif | ||
691 | } else { | ||
692 | state->agc_step = 0; | ||
693 | *tune_state = CT_AGC_STEP_1; | ||
694 | } | ||
695 | } else { | ||
696 | /* calc the adc power */ | ||
697 | adc = state->config->get_adc_power(fe); | ||
698 | adc = (adc * ((s32) 355774) + (((s32) 1) << 20)) >> 21; /* included in [0:-700] */ | ||
699 | |||
700 | adc_error = (s16) (((s32) ADC_TARGET) - adc); | ||
701 | #ifdef CONFIG_STANDARD_DAB | ||
702 | if (state->fe->dtv_property_cache.delivery_system == STANDARD_DAB) | ||
703 | adc_error += 130; | ||
704 | #endif | ||
705 | #ifdef CONFIG_STANDARD_DVBT | ||
706 | if (state->fe->dtv_property_cache.delivery_system == STANDARD_DVBT && | ||
707 | (state->fe->dtv_property_cache.modulation == QAM_64 || state->fe->dtv_property_cache.modulation == QAM_16)) | ||
708 | adc_error += 60; | ||
709 | #endif | ||
710 | #ifdef CONFIG_SYS_ISDBT | ||
711 | if ((state->fe->dtv_property_cache.delivery_system == SYS_ISDBT) && (((state->fe->dtv_property_cache.layer[0].segment_count > | ||
712 | 0) | ||
713 | && | ||
714 | ((state->fe->dtv_property_cache.layer[0].modulation == | ||
715 | QAM_64) | ||
716 | || (state->fe->dtv_property_cache.layer[0]. | ||
717 | modulation == QAM_16))) | ||
718 | || | ||
719 | ((state->fe->dtv_property_cache.layer[1].segment_count > | ||
720 | 0) | ||
721 | && | ||
722 | ((state->fe->dtv_property_cache.layer[1].modulation == | ||
723 | QAM_64) | ||
724 | || (state->fe->dtv_property_cache.layer[1]. | ||
725 | modulation == QAM_16))) | ||
726 | || | ||
727 | ((state->fe->dtv_property_cache.layer[2].segment_count > | ||
728 | 0) | ||
729 | && | ||
730 | ((state->fe->dtv_property_cache.layer[2].modulation == | ||
731 | QAM_64) | ||
732 | || (state->fe->dtv_property_cache.layer[2]. | ||
733 | modulation == QAM_16))) | ||
734 | ) | ||
735 | ) | ||
736 | adc_error += 60; | ||
737 | #endif | ||
738 | |||
739 | if (*tune_state == CT_AGC_STEP_1) { /* quickly go to the correct range of the ADC power */ | ||
740 | if (ABS(adc_error) < 50 || state->agc_step++ > 5) { | ||
741 | |||
742 | #ifdef CONFIG_STANDARD_DAB | ||
743 | if (state->fe->dtv_property_cache.delivery_system == STANDARD_DAB) { | ||
744 | dib0090_write_reg(state, 0x02, (1 << 15) | (15 << 11) | (31 << 6) | (63)); /* cap value = 63 : narrow BB filter : Fc = 1.8MHz */ | ||
745 | dib0090_write_reg(state, 0x04, 0x0); | ||
746 | } else | ||
747 | #endif | ||
748 | { | ||
749 | dib0090_write_reg(state, 0x02, (1 << 15) | (3 << 11) | (6 << 6) | (32)); | ||
750 | dib0090_write_reg(state, 0x04, 0x01); /*0 = 1KHz ; 1 = 150Hz ; 2 = 50Hz ; 3 = 50KHz ; 4 = servo fast */ | ||
751 | } | ||
752 | |||
753 | *tune_state = CT_AGC_STOP; | ||
754 | } | ||
755 | } else { | ||
756 | /* everything higher than or equal to CT_AGC_STOP means tracking */ | ||
757 | ret = 100; /* 10ms interval */ | ||
758 | apply_gain_immediatly = 0; | ||
759 | } | ||
760 | } | ||
761 | #ifdef DEBUG_AGC | ||
762 | dprintk | ||
763 | ("FE: %d, tune state %d, ADC = %3ddB (ADC err %3d) WBD %3ddB (WBD err %3d, WBD val SADC: %4d), RFGainLimit (TOP): %3d, signal: %3ddBm", | ||
764 | (u32) fe->id, (u32) *tune_state, (u32) adc, (u32) adc_error, (u32) wbd, (u32) wbd_error, (u32) wbd_val, | ||
765 | (u32) state->rf_gain_limit >> WBD_ALPHA, (s32) 200 + adc - (state->current_gain >> GAIN_ALPHA)); | ||
766 | #endif | ||
767 | } | ||
768 | |||
769 | /* apply gain */ | ||
770 | if (!state->agc_freeze) | ||
771 | dib0090_gain_apply(state, adc_error, wbd_error, apply_gain_immediatly); | ||
772 | return ret; | ||
773 | } | ||
774 | EXPORT_SYMBOL(dib0090_gain_control); | ||
775 | |||
776 | void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt) | ||
777 | { | ||
778 | struct dib0090_state *state = fe->tuner_priv; | ||
779 | if (rf) | ||
780 | *rf = state->gain[0]; | ||
781 | if (bb) | ||
782 | *bb = state->gain[1]; | ||
783 | if (rf_gain_limit) | ||
784 | *rf_gain_limit = state->rf_gain_limit; | ||
785 | if (rflt) | ||
786 | *rflt = (state->rf_lt_def >> 10) & 0x7; | ||
787 | } | ||
788 | EXPORT_SYMBOL(dib0090_get_current_gain); | ||
789 | |||
790 | u16 dib0090_get_wbd_offset(struct dvb_frontend *tuner) | ||
791 | { | ||
792 | struct dib0090_state *st = tuner->tuner_priv; | ||
793 | return st->wbd_offset; | ||
794 | } | ||
795 | EXPORT_SYMBOL(dib0090_get_wbd_offset); | ||
796 | |||
797 | static const u16 dib0090_defaults[] = { | ||
798 | |||
799 | 25, 0x01, | ||
800 | 0x0000, | ||
801 | 0x99a0, | ||
802 | 0x6008, | ||
803 | 0x0000, | ||
804 | 0x8acb, | ||
805 | 0x0000, | ||
806 | 0x0405, | ||
807 | 0x0000, | ||
808 | 0x0000, | ||
809 | 0x0000, | ||
810 | 0xb802, | ||
811 | 0x0300, | ||
812 | 0x2d12, | ||
813 | 0xbac0, | ||
814 | 0x7c00, | ||
815 | 0xdbb9, | ||
816 | 0x0954, | ||
817 | 0x0743, | ||
818 | 0x8000, | ||
819 | 0x0001, | ||
820 | 0x0040, | ||
821 | 0x0100, | ||
822 | 0x0000, | ||
823 | 0xe910, | ||
824 | 0x149e, | ||
825 | |||
826 | 1, 0x1c, | ||
827 | 0xff2d, | ||
828 | |||
829 | 1, 0x39, | ||
830 | 0x0000, | ||
831 | |||
832 | 1, 0x1b, | ||
833 | EN_IQADC | EN_BB | EN_BIAS | EN_DIGCLK | EN_PLL | EN_CRYSTAL, | ||
834 | 2, 0x1e, | ||
835 | 0x07FF, | ||
836 | 0x0007, | ||
837 | |||
838 | 1, 0x24, | ||
839 | EN_UHF | EN_CRYSTAL, | ||
840 | |||
841 | 2, 0x3c, | ||
842 | 0x3ff, | ||
843 | 0x111, | ||
844 | 0 | ||
845 | }; | ||
846 | |||
847 | static int dib0090_reset(struct dvb_frontend *fe) | ||
848 | { | ||
849 | struct dib0090_state *state = fe->tuner_priv; | ||
850 | u16 l, r, *n; | ||
851 | |||
852 | dib0090_reset_digital(fe, state->config); | ||
853 | state->revision = dib0090_identify(fe); | ||
854 | |||
855 | /* Revision definition */ | ||
856 | if (state->revision == 0xff) | ||
857 | return -EINVAL; | ||
858 | #ifdef EFUSE | ||
859 | else if ((state->revision & 0x1f) >= 3) /* Update the efuse : Only available for KROSUS > P1C */ | ||
860 | dib0090_set_EFUSE(state); | ||
861 | #endif | ||
862 | |||
863 | #ifdef CONFIG_TUNER_DIB0090_P1B_SUPPORT | ||
864 | if (!(state->revision & 0x1)) /* it is P1B - reset is already done */ | ||
865 | return 0; | ||
866 | #endif | ||
867 | |||
868 | /* Upload the default values */ | ||
869 | n = (u16 *) dib0090_defaults; | ||
870 | l = pgm_read_word(n++); | ||
871 | while (l) { | ||
872 | r = pgm_read_word(n++); | ||
873 | do { | ||
874 | /* DEBUG_TUNER */ | ||
875 | /* dprintk("%d, %d, %d", l, r, pgm_read_word(n)); */ | ||
876 | dib0090_write_reg(state, r, pgm_read_word(n++)); | ||
877 | r++; | ||
878 | } while (--l); | ||
879 | l = pgm_read_word(n++); | ||
880 | } | ||
881 | |||
882 | /* Congigure in function of the crystal */ | ||
883 | if (state->config->io.clock_khz >= 24000) | ||
884 | l = 1; | ||
885 | else | ||
886 | l = 2; | ||
887 | dib0090_write_reg(state, 0x14, l); | ||
888 | dprintk("Pll lock : %d", (dib0090_read_reg(state, 0x1a) >> 11) & 0x1); | ||
889 | |||
890 | state->reset = 3; /* enable iq-offset-calibration and wbd-calibration when tuning next time */ | ||
891 | |||
892 | return 0; | ||
893 | } | ||
894 | |||
895 | #define steps(u) (((u) > 15) ? ((u)-16) : (u)) | ||
896 | #define INTERN_WAIT 10 | ||
897 | static int dib0090_get_offset(struct dib0090_state *state, enum frontend_tune_state *tune_state) | ||
898 | { | ||
899 | int ret = INTERN_WAIT * 10; | ||
900 | |||
901 | switch (*tune_state) { | ||
902 | case CT_TUNER_STEP_2: | ||
903 | /* Turns to positive */ | ||
904 | dib0090_write_reg(state, 0x1f, 0x7); | ||
905 | *tune_state = CT_TUNER_STEP_3; | ||
906 | break; | ||
907 | |||
908 | case CT_TUNER_STEP_3: | ||
909 | state->adc_diff = dib0090_read_reg(state, 0x1d); | ||
910 | |||
911 | /* Turns to negative */ | ||
912 | dib0090_write_reg(state, 0x1f, 0x4); | ||
913 | *tune_state = CT_TUNER_STEP_4; | ||
914 | break; | ||
915 | |||
916 | case CT_TUNER_STEP_4: | ||
917 | state->adc_diff -= dib0090_read_reg(state, 0x1d); | ||
918 | *tune_state = CT_TUNER_STEP_5; | ||
919 | ret = 0; | ||
920 | break; | ||
921 | |||
922 | default: | ||
923 | break; | ||
924 | } | ||
925 | |||
926 | return ret; | ||
927 | } | ||
928 | |||
929 | struct dc_calibration { | ||
930 | uint8_t addr; | ||
931 | uint8_t offset; | ||
932 | uint8_t pga:1; | ||
933 | uint16_t bb1; | ||
934 | uint8_t i:1; | ||
935 | }; | ||
936 | |||
937 | static const struct dc_calibration dc_table[] = { | ||
938 | /* Step1 BB gain1= 26 with boost 1, gain 2 = 0 */ | ||
939 | {0x06, 5, 1, (1 << 13) | (0 << 8) | (26 << 3), 1}, | ||
940 | {0x07, 11, 1, (1 << 13) | (0 << 8) | (26 << 3), 0}, | ||
941 | /* Step 2 BB gain 1 = 26 with boost = 1 & gain 2 = 29 */ | ||
942 | {0x06, 0, 0, (1 << 13) | (29 << 8) | (26 << 3), 1}, | ||
943 | {0x06, 10, 0, (1 << 13) | (29 << 8) | (26 << 3), 0}, | ||
944 | {0}, | ||
945 | }; | ||
946 | |||
947 | static void dib0090_set_trim(struct dib0090_state *state) | ||
948 | { | ||
949 | u16 *val; | ||
950 | |||
951 | if (state->dc->addr == 0x07) | ||
952 | val = &state->bb7; | ||
953 | else | ||
954 | val = &state->bb6; | ||
955 | |||
956 | *val &= ~(0x1f << state->dc->offset); | ||
957 | *val |= state->step << state->dc->offset; | ||
958 | |||
959 | dib0090_write_reg(state, state->dc->addr, *val); | ||
960 | } | ||
961 | |||
962 | static int dib0090_dc_offset_calibration(struct dib0090_state *state, enum frontend_tune_state *tune_state) | ||
963 | { | ||
964 | int ret = 0; | ||
965 | |||
966 | switch (*tune_state) { | ||
967 | |||
968 | case CT_TUNER_START: | ||
969 | /* init */ | ||
970 | dprintk("Internal DC calibration"); | ||
971 | |||
972 | /* the LNA is off */ | ||
973 | dib0090_write_reg(state, 0x24, 0x02ed); | ||
974 | |||
975 | /* force vcm2 = 0.8V */ | ||
976 | state->bb6 = 0; | ||
977 | state->bb7 = 0x040d; | ||
978 | |||
979 | state->dc = dc_table; | ||
980 | |||
981 | *tune_state = CT_TUNER_STEP_0; | ||
982 | |||
983 | /* fall through */ | ||
984 | |||
985 | case CT_TUNER_STEP_0: | ||
986 | dib0090_write_reg(state, 0x01, state->dc->bb1); | ||
987 | dib0090_write_reg(state, 0x07, state->bb7 | (state->dc->i << 7)); | ||
988 | |||
989 | state->step = 0; | ||
990 | |||
991 | state->min_adc_diff = 1023; | ||
992 | |||
993 | *tune_state = CT_TUNER_STEP_1; | ||
994 | ret = 50; | ||
995 | break; | ||
996 | |||
997 | case CT_TUNER_STEP_1: | ||
998 | dib0090_set_trim(state); | ||
999 | |||
1000 | *tune_state = CT_TUNER_STEP_2; | ||
1001 | break; | ||
1002 | |||
1003 | case CT_TUNER_STEP_2: | ||
1004 | case CT_TUNER_STEP_3: | ||
1005 | case CT_TUNER_STEP_4: | ||
1006 | ret = dib0090_get_offset(state, tune_state); | ||
1007 | break; | ||
1008 | |||
1009 | case CT_TUNER_STEP_5: /* found an offset */ | ||
1010 | dprintk("FE%d: IQC read=%d, current=%x", state->fe->id, (u32) state->adc_diff, state->step); | ||
1011 | |||
1012 | /* first turn for this frequency */ | ||
1013 | if (state->step == 0) { | ||
1014 | if (state->dc->pga && state->adc_diff < 0) | ||
1015 | state->step = 0x10; | ||
1016 | if (state->dc->pga == 0 && state->adc_diff > 0) | ||
1017 | state->step = 0x10; | ||
1018 | } | ||
1019 | |||
1020 | state->adc_diff = ABS(state->adc_diff); | ||
1021 | |||
1022 | if (state->adc_diff < state->min_adc_diff && steps(state->step) < 15) { /* stop search when the delta to 0 is increasing */ | ||
1023 | state->step++; | ||
1024 | state->min_adc_diff = state->adc_diff; | ||
1025 | *tune_state = CT_TUNER_STEP_1; | ||
1026 | } else { | ||
1027 | |||
1028 | /* the minimum was what we have seen in the step before */ | ||
1029 | state->step--; | ||
1030 | dib0090_set_trim(state); | ||
1031 | |||
1032 | dprintk("FE%d: BB Offset Cal, BBreg=%hd,Offset=%hd,Value Set=%hd", state->fe->id, state->dc->addr, state->adc_diff, | ||
1033 | state->step); | ||
1034 | |||
1035 | state->dc++; | ||
1036 | if (state->dc->addr == 0) /* done */ | ||
1037 | *tune_state = CT_TUNER_STEP_6; | ||
1038 | else | ||
1039 | *tune_state = CT_TUNER_STEP_0; | ||
1040 | |||
1041 | } | ||
1042 | break; | ||
1043 | |||
1044 | case CT_TUNER_STEP_6: | ||
1045 | dib0090_write_reg(state, 0x07, state->bb7 & ~0x0008); | ||
1046 | dib0090_write_reg(state, 0x1f, 0x7); | ||
1047 | *tune_state = CT_TUNER_START; /* reset done -> real tuning can now begin */ | ||
1048 | state->reset &= ~0x1; | ||
1049 | default: | ||
1050 | break; | ||
1051 | } | ||
1052 | return ret; | ||
1053 | } | ||
1054 | |||
1055 | static int dib0090_wbd_calibration(struct dib0090_state *state, enum frontend_tune_state *tune_state) | ||
1056 | { | ||
1057 | switch (*tune_state) { | ||
1058 | case CT_TUNER_START: | ||
1059 | /* WBD-mode=log, Bias=2, Gain=6, Testmode=1, en=1, WBDMUX=1 */ | ||
1060 | dib0090_write_reg(state, 0x10, 0xdb09 | (1 << 10)); | ||
1061 | dib0090_write_reg(state, 0x24, EN_UHF & 0x0fff); | ||
1062 | |||
1063 | *tune_state = CT_TUNER_STEP_0; | ||
1064 | return 90; /* wait for the WBDMUX to switch and for the ADC to sample */ | ||
1065 | case CT_TUNER_STEP_0: | ||
1066 | state->wbd_offset = dib0090_read_reg(state, 0x1d); | ||
1067 | dprintk("WBD calibration offset = %d", state->wbd_offset); | ||
1068 | |||
1069 | *tune_state = CT_TUNER_START; /* reset done -> real tuning can now begin */ | ||
1070 | state->reset &= ~0x2; | ||
1071 | break; | ||
1072 | default: | ||
1073 | break; | ||
1074 | } | ||
1075 | return 0; | ||
1076 | } | ||
1077 | |||
1078 | static void dib0090_set_bandwidth(struct dib0090_state *state) | ||
1079 | { | ||
1080 | u16 tmp; | ||
1081 | |||
1082 | if (state->fe->dtv_property_cache.bandwidth_hz / 1000 <= 5000) | ||
1083 | tmp = (3 << 14); | ||
1084 | else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 <= 6000) | ||
1085 | tmp = (2 << 14); | ||
1086 | else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 <= 7000) | ||
1087 | tmp = (1 << 14); | ||
1088 | else | ||
1089 | tmp = (0 << 14); | ||
1090 | |||
1091 | state->bb_1_def &= 0x3fff; | ||
1092 | state->bb_1_def |= tmp; | ||
1093 | |||
1094 | dib0090_write_reg(state, 0x01, state->bb_1_def); /* be sure that we have the right bb-filter */ | ||
1095 | } | ||
1096 | |||
1097 | static const struct dib0090_pll dib0090_pll_table[] = { | ||
1098 | #ifdef CONFIG_BAND_CBAND | ||
1099 | {56000, 0, 9, 48, 6}, | ||
1100 | {70000, 1, 9, 48, 6}, | ||
1101 | {87000, 0, 8, 32, 4}, | ||
1102 | {105000, 1, 8, 32, 4}, | ||
1103 | {115000, 0, 7, 24, 6}, | ||
1104 | {140000, 1, 7, 24, 6}, | ||
1105 | {170000, 0, 6, 16, 4}, | ||
1106 | #endif | ||
1107 | #ifdef CONFIG_BAND_VHF | ||
1108 | {200000, 1, 6, 16, 4}, | ||
1109 | {230000, 0, 5, 12, 6}, | ||
1110 | {280000, 1, 5, 12, 6}, | ||
1111 | {340000, 0, 4, 8, 4}, | ||
1112 | {380000, 1, 4, 8, 4}, | ||
1113 | {450000, 0, 3, 6, 6}, | ||
1114 | #endif | ||
1115 | #ifdef CONFIG_BAND_UHF | ||
1116 | {580000, 1, 3, 6, 6}, | ||
1117 | {700000, 0, 2, 4, 4}, | ||
1118 | {860000, 1, 2, 4, 4}, | ||
1119 | #endif | ||
1120 | #ifdef CONFIG_BAND_LBAND | ||
1121 | {1800000, 1, 0, 2, 4}, | ||
1122 | #endif | ||
1123 | #ifdef CONFIG_BAND_SBAND | ||
1124 | {2900000, 0, 14, 1, 4}, | ||
1125 | #endif | ||
1126 | }; | ||
1127 | |||
1128 | static const struct dib0090_tuning dib0090_tuning_table_fm_vhf_on_cband[] = { | ||
1129 | |||
1130 | #ifdef CONFIG_BAND_CBAND | ||
1131 | {184000, 4, 1, 15, 0x280, 0x2912, 0xb94e, EN_CAB}, | ||
1132 | {227000, 4, 3, 15, 0x280, 0x2912, 0xb94e, EN_CAB}, | ||
1133 | {380000, 4, 7, 15, 0x280, 0x2912, 0xb94e, EN_CAB}, | ||
1134 | #endif | ||
1135 | #ifdef CONFIG_BAND_UHF | ||
1136 | {520000, 2, 0, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1137 | {550000, 2, 2, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1138 | {650000, 2, 3, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1139 | {750000, 2, 5, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1140 | {850000, 2, 6, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1141 | {900000, 2, 7, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1142 | #endif | ||
1143 | #ifdef CONFIG_BAND_LBAND | ||
1144 | {1500000, 4, 0, 20, 0x300, 0x1912, 0x82c9, EN_LBD}, | ||
1145 | {1600000, 4, 1, 20, 0x300, 0x1912, 0x82c9, EN_LBD}, | ||
1146 | {1800000, 4, 3, 20, 0x300, 0x1912, 0x82c9, EN_LBD}, | ||
1147 | #endif | ||
1148 | #ifdef CONFIG_BAND_SBAND | ||
1149 | {2300000, 1, 4, 20, 0x300, 0x2d2A, 0x82c7, EN_SBD}, | ||
1150 | {2900000, 1, 7, 20, 0x280, 0x2deb, 0x8347, EN_SBD}, | ||
1151 | #endif | ||
1152 | }; | ||
1153 | |||
1154 | static const struct dib0090_tuning dib0090_tuning_table[] = { | ||
1155 | |||
1156 | #ifdef CONFIG_BAND_CBAND | ||
1157 | {170000, 4, 1, 15, 0x280, 0x2912, 0xb94e, EN_CAB}, | ||
1158 | #endif | ||
1159 | #ifdef CONFIG_BAND_VHF | ||
1160 | {184000, 1, 1, 15, 0x300, 0x4d12, 0xb94e, EN_VHF}, | ||
1161 | {227000, 1, 3, 15, 0x300, 0x4d12, 0xb94e, EN_VHF}, | ||
1162 | {380000, 1, 7, 15, 0x300, 0x4d12, 0xb94e, EN_VHF}, | ||
1163 | #endif | ||
1164 | #ifdef CONFIG_BAND_UHF | ||
1165 | {520000, 2, 0, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1166 | {550000, 2, 2, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1167 | {650000, 2, 3, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1168 | {750000, 2, 5, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1169 | {850000, 2, 6, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1170 | {900000, 2, 7, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF}, | ||
1171 | #endif | ||
1172 | #ifdef CONFIG_BAND_LBAND | ||
1173 | {1500000, 4, 0, 20, 0x300, 0x1912, 0x82c9, EN_LBD}, | ||
1174 | {1600000, 4, 1, 20, 0x300, 0x1912, 0x82c9, EN_LBD}, | ||
1175 | {1800000, 4, 3, 20, 0x300, 0x1912, 0x82c9, EN_LBD}, | ||
1176 | #endif | ||
1177 | #ifdef CONFIG_BAND_SBAND | ||
1178 | {2300000, 1, 4, 20, 0x300, 0x2d2A, 0x82c7, EN_SBD}, | ||
1179 | {2900000, 1, 7, 20, 0x280, 0x2deb, 0x8347, EN_SBD}, | ||
1180 | #endif | ||
1181 | }; | ||
1182 | |||
1183 | #define WBD 0x781 /* 1 1 1 1 0000 0 0 1 */ | ||
1184 | static int dib0090_tune(struct dvb_frontend *fe) | ||
1185 | { | ||
1186 | struct dib0090_state *state = fe->tuner_priv; | ||
1187 | const struct dib0090_tuning *tune = state->current_tune_table_index; | ||
1188 | const struct dib0090_pll *pll = state->current_pll_table_index; | ||
1189 | enum frontend_tune_state *tune_state = &state->tune_state; | ||
1190 | |||
1191 | u32 rf; | ||
1192 | u16 lo4 = 0xe900, lo5, lo6, Den; | ||
1193 | u32 FBDiv, Rest, FREF, VCOF_kHz = 0; | ||
1194 | u16 tmp, adc; | ||
1195 | int8_t step_sign; | ||
1196 | int ret = 10; /* 1ms is the default delay most of the time */ | ||
1197 | u8 c, i; | ||
1198 | |||
1199 | state->current_band = (u8) BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000); | ||
1200 | rf = fe->dtv_property_cache.frequency / 1000 + (state->current_band == | ||
1201 | BAND_UHF ? state->config->freq_offset_khz_uhf : state->config->freq_offset_khz_vhf); | ||
1202 | /* in any case we first need to do a reset if needed */ | ||
1203 | if (state->reset & 0x1) | ||
1204 | return dib0090_dc_offset_calibration(state, tune_state); | ||
1205 | else if (state->reset & 0x2) | ||
1206 | return dib0090_wbd_calibration(state, tune_state); | ||
1207 | |||
1208 | /************************* VCO ***************************/ | ||
1209 | /* Default values for FG */ | ||
1210 | /* from these are needed : */ | ||
1211 | /* Cp,HFdiv,VCOband,SD,Num,Den,FB and REFDiv */ | ||
1212 | |||
1213 | #ifdef CONFIG_SYS_ISDBT | ||
1214 | if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT && state->fe->dtv_property_cache.isdbt_sb_mode == 1) | ||
1215 | rf += 850; | ||
1216 | #endif | ||
1217 | |||
1218 | if (state->current_rf != rf) { | ||
1219 | state->tuner_is_tuned = 0; | ||
1220 | |||
1221 | tune = dib0090_tuning_table; | ||
1222 | |||
1223 | tmp = (state->revision >> 5) & 0x7; | ||
1224 | if (tmp == 0x4 || tmp == 0x7) { | ||
1225 | /* CBAND tuner version for VHF */ | ||
1226 | if (state->current_band == BAND_FM || state->current_band == BAND_VHF) { | ||
1227 | /* Force CBAND */ | ||
1228 | state->current_band = BAND_CBAND; | ||
1229 | tune = dib0090_tuning_table_fm_vhf_on_cband; | ||
1230 | } | ||
1231 | } | ||
1232 | |||
1233 | pll = dib0090_pll_table; | ||
1234 | /* Look for the interval */ | ||
1235 | while (rf > tune->max_freq) | ||
1236 | tune++; | ||
1237 | while (rf > pll->max_freq) | ||
1238 | pll++; | ||
1239 | state->current_tune_table_index = tune; | ||
1240 | state->current_pll_table_index = pll; | ||
1241 | } | ||
1242 | |||
1243 | if (*tune_state == CT_TUNER_START) { | ||
1244 | |||
1245 | if (state->tuner_is_tuned == 0) | ||
1246 | state->current_rf = 0; | ||
1247 | |||
1248 | if (state->current_rf != rf) { | ||
1249 | |||
1250 | dib0090_write_reg(state, 0x0b, 0xb800 | (tune->switch_trim)); | ||
1251 | |||
1252 | /* external loop filter, otherwise: | ||
1253 | * lo5 = (0 << 15) | (0 << 12) | (0 << 11) | (3 << 9) | (4 << 6) | (3 << 4) | 4; | ||
1254 | * lo6 = 0x0e34 */ | ||
1255 | if (pll->vco_band) | ||
1256 | lo5 = 0x049e; | ||
1257 | else if (state->config->analog_output) | ||
1258 | lo5 = 0x041d; | ||
1259 | else | ||
1260 | lo5 = 0x041c; | ||
1261 | |||
1262 | lo5 |= (pll->hfdiv_code << 11) | (pll->vco_band << 7); /* bit 15 is the split to the slave, we do not do it here */ | ||
1263 | |||
1264 | if (!state->config->io.pll_int_loop_filt) | ||
1265 | lo6 = 0xff28; | ||
1266 | else | ||
1267 | lo6 = (state->config->io.pll_int_loop_filt << 3); | ||
1268 | |||
1269 | VCOF_kHz = (pll->hfdiv * rf) * 2; | ||
1270 | |||
1271 | FREF = state->config->io.clock_khz; | ||
1272 | |||
1273 | FBDiv = (VCOF_kHz / pll->topresc / FREF); | ||
1274 | Rest = (VCOF_kHz / pll->topresc) - FBDiv * FREF; | ||
1275 | |||
1276 | if (Rest < LPF) | ||
1277 | Rest = 0; | ||
1278 | else if (Rest < 2 * LPF) | ||
1279 | Rest = 2 * LPF; | ||
1280 | else if (Rest > (FREF - LPF)) { | ||
1281 | Rest = 0; | ||
1282 | FBDiv += 1; | ||
1283 | } else if (Rest > (FREF - 2 * LPF)) | ||
1284 | Rest = FREF - 2 * LPF; | ||
1285 | Rest = (Rest * 6528) / (FREF / 10); | ||
1286 | |||
1287 | Den = 1; | ||
1288 | |||
1289 | dprintk(" ***** ******* Rest value = %d", Rest); | ||
1290 | |||
1291 | if (Rest > 0) { | ||
1292 | if (state->config->analog_output) | ||
1293 | lo6 |= (1 << 2) | 2; | ||
1294 | else | ||
1295 | lo6 |= (1 << 2) | 1; | ||
1296 | Den = 255; | ||
1297 | } | ||
1298 | #ifdef CONFIG_BAND_SBAND | ||
1299 | if (state->current_band == BAND_SBAND) | ||
1300 | lo6 &= 0xfffb; | ||
1301 | #endif | ||
1302 | |||
1303 | dib0090_write_reg(state, 0x15, (u16) FBDiv); | ||
1304 | |||
1305 | dib0090_write_reg(state, 0x16, (Den << 8) | 1); | ||
1306 | |||
1307 | dib0090_write_reg(state, 0x17, (u16) Rest); | ||
1308 | |||
1309 | dib0090_write_reg(state, 0x19, lo5); | ||
1310 | |||
1311 | dib0090_write_reg(state, 0x1c, lo6); | ||
1312 | |||
1313 | lo6 = tune->tuner_enable; | ||
1314 | if (state->config->analog_output) | ||
1315 | lo6 = (lo6 & 0xff9f) | 0x2; | ||
1316 | |||
1317 | dib0090_write_reg(state, 0x24, lo6 | EN_LO | ||
1318 | #ifdef CONFIG_DIB0090_USE_PWM_AGC | ||
1319 | | state->config->use_pwm_agc * EN_CRYSTAL | ||
1320 | #endif | ||
1321 | ); | ||
1322 | |||
1323 | state->current_rf = rf; | ||
1324 | |||
1325 | /* prepare a complete captrim */ | ||
1326 | state->step = state->captrim = state->fcaptrim = 64; | ||
1327 | |||
1328 | } else { /* we are already tuned to this frequency - the configuration is correct */ | ||
1329 | |||
1330 | /* do a minimal captrim even if the frequency has not changed */ | ||
1331 | state->step = 4; | ||
1332 | state->captrim = state->fcaptrim = dib0090_read_reg(state, 0x18) & 0x7f; | ||
1333 | } | ||
1334 | state->adc_diff = 3000; | ||
1335 | |||
1336 | dib0090_write_reg(state, 0x10, 0x2B1); | ||
1337 | |||
1338 | dib0090_write_reg(state, 0x1e, 0x0032); | ||
1339 | |||
1340 | ret = 20; | ||
1341 | *tune_state = CT_TUNER_STEP_1; | ||
1342 | } else if (*tune_state == CT_TUNER_STEP_0) { | ||
1343 | /* nothing */ | ||
1344 | } else if (*tune_state == CT_TUNER_STEP_1) { | ||
1345 | state->step /= 2; | ||
1346 | dib0090_write_reg(state, 0x18, lo4 | state->captrim); | ||
1347 | *tune_state = CT_TUNER_STEP_2; | ||
1348 | } else if (*tune_state == CT_TUNER_STEP_2) { | ||
1349 | |||
1350 | adc = dib0090_read_reg(state, 0x1d); | ||
1351 | dprintk("FE %d CAPTRIM=%d; ADC = %d (ADC) & %dmV", (u32) fe->id, (u32) state->captrim, (u32) adc, | ||
1352 | (u32) (adc) * (u32) 1800 / (u32) 1024); | ||
1353 | |||
1354 | if (adc >= 400) { | ||
1355 | adc -= 400; | ||
1356 | step_sign = -1; | ||
1357 | } else { | ||
1358 | adc = 400 - adc; | ||
1359 | step_sign = 1; | ||
1360 | } | ||
1361 | |||
1362 | if (adc < state->adc_diff) { | ||
1363 | dprintk("FE %d CAPTRIM=%d is closer to target (%d/%d)", (u32) fe->id, (u32) state->captrim, (u32) adc, (u32) state->adc_diff); | ||
1364 | state->adc_diff = adc; | ||
1365 | state->fcaptrim = state->captrim; | ||
1366 | |||
1367 | } | ||
1368 | |||
1369 | state->captrim += step_sign * state->step; | ||
1370 | if (state->step >= 1) | ||
1371 | *tune_state = CT_TUNER_STEP_1; | ||
1372 | else | ||
1373 | *tune_state = CT_TUNER_STEP_3; | ||
1374 | |||
1375 | ret = 15; | ||
1376 | } else if (*tune_state == CT_TUNER_STEP_3) { | ||
1377 | /*write the final cptrim config */ | ||
1378 | dib0090_write_reg(state, 0x18, lo4 | state->fcaptrim); | ||
1379 | |||
1380 | #ifdef CONFIG_TUNER_DIB0090_CAPTRIM_MEMORY | ||
1381 | state->memory[state->memory_index].cap = state->fcaptrim; | ||
1382 | #endif | ||
1383 | |||
1384 | *tune_state = CT_TUNER_STEP_4; | ||
1385 | } else if (*tune_state == CT_TUNER_STEP_4) { | ||
1386 | dib0090_write_reg(state, 0x1e, 0x07ff); | ||
1387 | |||
1388 | dprintk("FE %d Final Captrim: %d", (u32) fe->id, (u32) state->fcaptrim); | ||
1389 | dprintk("FE %d HFDIV code: %d", (u32) fe->id, (u32) pll->hfdiv_code); | ||
1390 | dprintk("FE %d VCO = %d", (u32) fe->id, (u32) pll->vco_band); | ||
1391 | dprintk("FE %d VCOF in kHz: %d ((%d*%d) << 1))", (u32) fe->id, (u32) ((pll->hfdiv * rf) * 2), (u32) pll->hfdiv, (u32) rf); | ||
1392 | dprintk("FE %d REFDIV: %d, FREF: %d", (u32) fe->id, (u32) 1, (u32) state->config->io.clock_khz); | ||
1393 | dprintk("FE %d FBDIV: %d, Rest: %d", (u32) fe->id, (u32) dib0090_read_reg(state, 0x15), (u32) dib0090_read_reg(state, 0x17)); | ||
1394 | dprintk("FE %d Num: %d, Den: %d, SD: %d", (u32) fe->id, (u32) dib0090_read_reg(state, 0x17), | ||
1395 | (u32) (dib0090_read_reg(state, 0x16) >> 8), (u32) dib0090_read_reg(state, 0x1c) & 0x3); | ||
1396 | |||
1397 | c = 4; | ||
1398 | i = 3; | ||
1399 | #if defined(CONFIG_BAND_LBAND) || defined(CONFIG_BAND_SBAND) | ||
1400 | if ((state->current_band == BAND_LBAND) || (state->current_band == BAND_SBAND)) { | ||
1401 | c = 2; | ||
1402 | i = 2; | ||
1403 | } | ||
1404 | #endif | ||
1405 | dib0090_write_reg(state, 0x10, (c << 13) | (i << 11) | (WBD | ||
1406 | #ifdef CONFIG_DIB0090_USE_PWM_AGC | ||
1407 | | (state->config->use_pwm_agc << 1) | ||
1408 | #endif | ||
1409 | )); | ||
1410 | dib0090_write_reg(state, 0x09, (tune->lna_tune << 5) | (tune->lna_bias << 0)); | ||
1411 | dib0090_write_reg(state, 0x0c, tune->v2i); | ||
1412 | dib0090_write_reg(state, 0x0d, tune->mix); | ||
1413 | dib0090_write_reg(state, 0x0e, tune->load); | ||
1414 | |||
1415 | *tune_state = CT_TUNER_STEP_5; | ||
1416 | } else if (*tune_state == CT_TUNER_STEP_5) { | ||
1417 | |||
1418 | /* initialize the lt gain register */ | ||
1419 | state->rf_lt_def = 0x7c00; | ||
1420 | dib0090_write_reg(state, 0x0f, state->rf_lt_def); | ||
1421 | |||
1422 | dib0090_set_bandwidth(state); | ||
1423 | state->tuner_is_tuned = 1; | ||
1424 | *tune_state = CT_TUNER_STOP; | ||
1425 | } else | ||
1426 | ret = FE_CALLBACK_TIME_NEVER; | ||
1427 | return ret; | ||
1428 | } | ||
1429 | |||
1430 | static int dib0090_release(struct dvb_frontend *fe) | ||
1431 | { | ||
1432 | kfree(fe->tuner_priv); | ||
1433 | fe->tuner_priv = NULL; | ||
1434 | return 0; | ||
1435 | } | ||
1436 | |||
1437 | enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe) | ||
1438 | { | ||
1439 | struct dib0090_state *state = fe->tuner_priv; | ||
1440 | |||
1441 | return state->tune_state; | ||
1442 | } | ||
1443 | EXPORT_SYMBOL(dib0090_get_tune_state); | ||
1444 | |||
1445 | int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state) | ||
1446 | { | ||
1447 | struct dib0090_state *state = fe->tuner_priv; | ||
1448 | |||
1449 | state->tune_state = tune_state; | ||
1450 | return 0; | ||
1451 | } | ||
1452 | EXPORT_SYMBOL(dib0090_set_tune_state); | ||
1453 | |||
1454 | static int dib0090_get_frequency(struct dvb_frontend *fe, u32 * frequency) | ||
1455 | { | ||
1456 | struct dib0090_state *state = fe->tuner_priv; | ||
1457 | |||
1458 | *frequency = 1000 * state->current_rf; | ||
1459 | return 0; | ||
1460 | } | ||
1461 | |||
1462 | static int dib0090_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) | ||
1463 | { | ||
1464 | struct dib0090_state *state = fe->tuner_priv; | ||
1465 | uint32_t ret; | ||
1466 | |||
1467 | state->tune_state = CT_TUNER_START; | ||
1468 | |||
1469 | do { | ||
1470 | ret = dib0090_tune(fe); | ||
1471 | if (ret != FE_CALLBACK_TIME_NEVER) | ||
1472 | msleep(ret / 10); | ||
1473 | else | ||
1474 | break; | ||
1475 | } while (state->tune_state != CT_TUNER_STOP); | ||
1476 | |||
1477 | return 0; | ||
1478 | } | ||
1479 | |||
1480 | static const struct dvb_tuner_ops dib0090_ops = { | ||
1481 | .info = { | ||
1482 | .name = "DiBcom DiB0090", | ||
1483 | .frequency_min = 45000000, | ||
1484 | .frequency_max = 860000000, | ||
1485 | .frequency_step = 1000, | ||
1486 | }, | ||
1487 | .release = dib0090_release, | ||
1488 | |||
1489 | .init = dib0090_wakeup, | ||
1490 | .sleep = dib0090_sleep, | ||
1491 | .set_params = dib0090_set_params, | ||
1492 | .get_frequency = dib0090_get_frequency, | ||
1493 | }; | ||
1494 | |||
1495 | struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config) | ||
1496 | { | ||
1497 | struct dib0090_state *st = kzalloc(sizeof(struct dib0090_state), GFP_KERNEL); | ||
1498 | if (st == NULL) | ||
1499 | return NULL; | ||
1500 | |||
1501 | st->config = config; | ||
1502 | st->i2c = i2c; | ||
1503 | st->fe = fe; | ||
1504 | fe->tuner_priv = st; | ||
1505 | |||
1506 | if (dib0090_reset(fe) != 0) | ||
1507 | goto free_mem; | ||
1508 | |||
1509 | printk(KERN_INFO "DiB0090: successfully identified\n"); | ||
1510 | memcpy(&fe->ops.tuner_ops, &dib0090_ops, sizeof(struct dvb_tuner_ops)); | ||
1511 | |||
1512 | return fe; | ||
1513 | free_mem: | ||
1514 | kfree(st); | ||
1515 | fe->tuner_priv = NULL; | ||
1516 | return NULL; | ||
1517 | } | ||
1518 | EXPORT_SYMBOL(dib0090_register); | ||
1519 | |||
1520 | MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>"); | ||
1521 | MODULE_AUTHOR("Olivier Grenie <olivier.grenie@dibcom.fr>"); | ||
1522 | MODULE_DESCRIPTION("Driver for the DiBcom 0090 base-band RF Tuner"); | ||
1523 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/dib0090.h b/drivers/media/dvb/frontends/dib0090.h new file mode 100644 index 000000000000..aa7711e88776 --- /dev/null +++ b/drivers/media/dvb/frontends/dib0090.h | |||
@@ -0,0 +1,108 @@ | |||
1 | /* | ||
2 | * Linux-DVB Driver for DiBcom's DiB0090 base-band RF Tuner. | ||
3 | * | ||
4 | * Copyright (C) 2005-7 DiBcom (http://www.dibcom.fr/) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License as | ||
8 | * published by the Free Software Foundation, version 2. | ||
9 | */ | ||
10 | #ifndef DIB0090_H | ||
11 | #define DIB0090_H | ||
12 | |||
13 | struct dvb_frontend; | ||
14 | struct i2c_adapter; | ||
15 | |||
16 | #define DEFAULT_DIB0090_I2C_ADDRESS 0x60 | ||
17 | |||
18 | struct dib0090_io_config { | ||
19 | u32 clock_khz; | ||
20 | |||
21 | u8 pll_bypass:1; | ||
22 | u8 pll_range:1; | ||
23 | u8 pll_prediv:6; | ||
24 | u8 pll_loopdiv:6; | ||
25 | |||
26 | u8 adc_clock_ratio; /* valid is 8, 7 ,6 */ | ||
27 | u16 pll_int_loop_filt; | ||
28 | }; | ||
29 | |||
30 | struct dib0090_config { | ||
31 | struct dib0090_io_config io; | ||
32 | int (*reset) (struct dvb_frontend *, int); | ||
33 | int (*sleep) (struct dvb_frontend *, int); | ||
34 | |||
35 | /* offset in kHz */ | ||
36 | int freq_offset_khz_uhf; | ||
37 | int freq_offset_khz_vhf; | ||
38 | |||
39 | int (*get_adc_power) (struct dvb_frontend *); | ||
40 | |||
41 | u8 clkouttobamse:1; /* activate or deactivate clock output */ | ||
42 | u8 analog_output; | ||
43 | |||
44 | u8 i2c_address; | ||
45 | /* add drives and other things if necessary */ | ||
46 | u16 wbd_vhf_offset; | ||
47 | u16 wbd_cband_offset; | ||
48 | u8 use_pwm_agc; | ||
49 | u8 clkoutdrive; | ||
50 | }; | ||
51 | |||
52 | #if defined(CONFIG_DVB_TUNER_DIB0090) || (defined(CONFIG_DVB_TUNER_DIB0090_MODULE) && defined(MODULE)) | ||
53 | extern struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config); | ||
54 | extern void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast); | ||
55 | extern void dib0090_pwm_gain_reset(struct dvb_frontend *fe); | ||
56 | extern u16 dib0090_get_wbd_offset(struct dvb_frontend *tuner); | ||
57 | extern int dib0090_gain_control(struct dvb_frontend *fe); | ||
58 | extern enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe); | ||
59 | extern int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state); | ||
60 | extern void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt); | ||
61 | #else | ||
62 | static inline struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0090_config *config) | ||
63 | { | ||
64 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
65 | return NULL; | ||
66 | } | ||
67 | |||
68 | static inline void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast) | ||
69 | { | ||
70 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
71 | } | ||
72 | |||
73 | static inline void dib0090_pwm_gain_reset(struct dvb_frontend *fe) | ||
74 | { | ||
75 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
76 | } | ||
77 | |||
78 | static inline u16 dib0090_get_wbd_offset(struct dvb_frontend *tuner) | ||
79 | { | ||
80 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | static inline int dib0090_gain_control(struct dvb_frontend *fe) | ||
85 | { | ||
86 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
87 | return -ENODEV; | ||
88 | } | ||
89 | |||
90 | static inline enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe) | ||
91 | { | ||
92 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
93 | return CT_DONE; | ||
94 | } | ||
95 | |||
96 | static inline int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state) | ||
97 | { | ||
98 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
99 | return -ENODEV; | ||
100 | } | ||
101 | |||
102 | static inline void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt) | ||
103 | { | ||
104 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
105 | } | ||
106 | #endif | ||
107 | |||
108 | #endif | ||
diff --git a/drivers/media/dvb/frontends/dib3000mb.c b/drivers/media/dvb/frontends/dib3000mb.c index 136b9d2164d7..ad4c8cfd8090 100644 --- a/drivers/media/dvb/frontends/dib3000mb.c +++ b/drivers/media/dvb/frontends/dib3000mb.c | |||
@@ -154,7 +154,7 @@ static int dib3000mb_set_frontend(struct dvb_frontend* fe, | |||
154 | case BANDWIDTH_AUTO: | 154 | case BANDWIDTH_AUTO: |
155 | return -EOPNOTSUPP; | 155 | return -EOPNOTSUPP; |
156 | default: | 156 | default: |
157 | err("unkown bandwidth value."); | 157 | err("unknown bandwidth value."); |
158 | return -EINVAL; | 158 | return -EINVAL; |
159 | } | 159 | } |
160 | } | 160 | } |
diff --git a/drivers/media/dvb/frontends/dib3000mc.c b/drivers/media/dvb/frontends/dib3000mc.c index fa851601e7d4..40a099810279 100644 --- a/drivers/media/dvb/frontends/dib3000mc.c +++ b/drivers/media/dvb/frontends/dib3000mc.c | |||
@@ -12,6 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/slab.h> | ||
15 | #include <linux/i2c.h> | 16 | #include <linux/i2c.h> |
16 | 17 | ||
17 | #include "dvb_frontend.h" | 18 | #include "dvb_frontend.h" |
diff --git a/drivers/media/dvb/frontends/dib7000m.c b/drivers/media/dvb/frontends/dib7000m.c index 0109720353bd..0f09fd31cb29 100644 --- a/drivers/media/dvb/frontends/dib7000m.c +++ b/drivers/media/dvb/frontends/dib7000m.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * published by the Free Software Foundation, version 2. | 9 | * published by the Free Software Foundation, version 2. |
10 | */ | 10 | */ |
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/slab.h> | ||
12 | #include <linux/i2c.h> | 13 | #include <linux/i2c.h> |
13 | 14 | ||
14 | #include "dvb_frontend.h" | 15 | #include "dvb_frontend.h" |
diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c index 0781f94e05d2..85468a45c344 100644 --- a/drivers/media/dvb/frontends/dib7000p.c +++ b/drivers/media/dvb/frontends/dib7000p.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * published by the Free Software Foundation, version 2. | 8 | * published by the Free Software Foundation, version 2. |
9 | */ | 9 | */ |
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/slab.h> | ||
11 | #include <linux/i2c.h> | 12 | #include <linux/i2c.h> |
12 | 13 | ||
13 | #include "dvb_math.h" | 14 | #include "dvb_math.h" |
@@ -108,7 +109,7 @@ static int dib7000p_set_output_mode(struct dib7000p_state *state, int mode) | |||
108 | 109 | ||
109 | outreg = 0; | 110 | outreg = 0; |
110 | fifo_threshold = 1792; | 111 | fifo_threshold = 1792; |
111 | smo_mode = (dib7000p_read_word(state, 235) & 0x0010) | (1 << 1); | 112 | smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1); |
112 | 113 | ||
113 | dprintk( "setting output mode for demod %p to %d", | 114 | dprintk( "setting output mode for demod %p to %d", |
114 | &state->demod, mode); | 115 | &state->demod, mode); |
@@ -162,18 +163,19 @@ static int dib7000p_set_diversity_in(struct dvb_frontend *demod, int onoff) | |||
162 | if (state->div_force_off) { | 163 | if (state->div_force_off) { |
163 | dprintk( "diversity combination deactivated - forced by COFDM parameters"); | 164 | dprintk( "diversity combination deactivated - forced by COFDM parameters"); |
164 | onoff = 0; | 165 | onoff = 0; |
165 | } | 166 | dib7000p_write_word(state, 207, 0); |
167 | } else | ||
168 | dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0)); | ||
169 | |||
166 | state->div_state = (u8)onoff; | 170 | state->div_state = (u8)onoff; |
167 | 171 | ||
168 | if (onoff) { | 172 | if (onoff) { |
169 | dib7000p_write_word(state, 204, 6); | 173 | dib7000p_write_word(state, 204, 6); |
170 | dib7000p_write_word(state, 205, 16); | 174 | dib7000p_write_word(state, 205, 16); |
171 | /* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */ | 175 | /* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */ |
172 | dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0)); | ||
173 | } else { | 176 | } else { |
174 | dib7000p_write_word(state, 204, 1); | 177 | dib7000p_write_word(state, 204, 1); |
175 | dib7000p_write_word(state, 205, 0); | 178 | dib7000p_write_word(state, 205, 0); |
176 | dib7000p_write_word(state, 207, 0); | ||
177 | } | 179 | } |
178 | 180 | ||
179 | return 0; | 181 | return 0; |
@@ -1188,7 +1190,7 @@ static int dib7000p_read_status(struct dvb_frontend *fe, fe_status_t *stat) | |||
1188 | *stat |= FE_HAS_VITERBI; | 1190 | *stat |= FE_HAS_VITERBI; |
1189 | if (lock & 0x0010) | 1191 | if (lock & 0x0010) |
1190 | *stat |= FE_HAS_SYNC; | 1192 | *stat |= FE_HAS_SYNC; |
1191 | if (lock & 0x0008) | 1193 | if ((lock & 0x0038) == 0x38) |
1192 | *stat |= FE_HAS_LOCK; | 1194 | *stat |= FE_HAS_LOCK; |
1193 | 1195 | ||
1194 | return 0; | 1196 | return 0; |
@@ -1302,6 +1304,24 @@ struct i2c_adapter * dib7000p_get_i2c_master(struct dvb_frontend *demod, enum di | |||
1302 | } | 1304 | } |
1303 | EXPORT_SYMBOL(dib7000p_get_i2c_master); | 1305 | EXPORT_SYMBOL(dib7000p_get_i2c_master); |
1304 | 1306 | ||
1307 | int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff) | ||
1308 | { | ||
1309 | struct dib7000p_state *state = fe->demodulator_priv; | ||
1310 | u16 val = dib7000p_read_word(state, 235) & 0xffef; | ||
1311 | val |= (onoff & 0x1) << 4; | ||
1312 | dprintk("PID filter enabled %d", onoff); | ||
1313 | return dib7000p_write_word(state, 235, val); | ||
1314 | } | ||
1315 | EXPORT_SYMBOL(dib7000p_pid_filter_ctrl); | ||
1316 | |||
1317 | int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff) | ||
1318 | { | ||
1319 | struct dib7000p_state *state = fe->demodulator_priv; | ||
1320 | dprintk("PID filter: index %x, PID %d, OnOff %d", id, pid, onoff); | ||
1321 | return dib7000p_write_word(state, 241 + id, onoff ? (1 << 13) | pid : 0); | ||
1322 | } | ||
1323 | EXPORT_SYMBOL(dib7000p_pid_filter); | ||
1324 | |||
1305 | int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[]) | 1325 | int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[]) |
1306 | { | 1326 | { |
1307 | struct dib7000p_state st = { .i2c_adap = i2c }; | 1327 | struct dib7000p_state st = { .i2c_adap = i2c }; |
@@ -1314,8 +1334,10 @@ int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 defau | |||
1314 | /* designated i2c address */ | 1334 | /* designated i2c address */ |
1315 | new_addr = (0x40 + k) << 1; | 1335 | new_addr = (0x40 + k) << 1; |
1316 | st.i2c_addr = new_addr; | 1336 | st.i2c_addr = new_addr; |
1337 | dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */ | ||
1317 | if (dib7000p_identify(&st) != 0) { | 1338 | if (dib7000p_identify(&st) != 0) { |
1318 | st.i2c_addr = default_addr; | 1339 | st.i2c_addr = default_addr; |
1340 | dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */ | ||
1319 | if (dib7000p_identify(&st) != 0) { | 1341 | if (dib7000p_identify(&st) != 0) { |
1320 | dprintk("DiB7000P #%d: not identified\n", k); | 1342 | dprintk("DiB7000P #%d: not identified\n", k); |
1321 | return -EIO; | 1343 | return -EIO; |
@@ -1372,6 +1394,8 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, | |||
1372 | demod->demodulator_priv = st; | 1394 | demod->demodulator_priv = st; |
1373 | memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops)); | 1395 | memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops)); |
1374 | 1396 | ||
1397 | dib7000p_write_word(st, 1287, 0x0003); /* sram lead in, rdy */ | ||
1398 | |||
1375 | if (dib7000p_identify(st) != 0) | 1399 | if (dib7000p_identify(st) != 0) |
1376 | goto error; | 1400 | goto error; |
1377 | 1401 | ||
diff --git a/drivers/media/dvb/frontends/dib7000p.h b/drivers/media/dvb/frontends/dib7000p.h index 02a4c82f0c70..805dd13a97ee 100644 --- a/drivers/media/dvb/frontends/dib7000p.h +++ b/drivers/media/dvb/frontends/dib7000p.h | |||
@@ -51,6 +51,8 @@ extern int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, | |||
51 | extern int dib7000p_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); | 51 | extern int dib7000p_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); |
52 | extern int dib7000p_set_wbd_ref(struct dvb_frontend *, u16 value); | 52 | extern int dib7000p_set_wbd_ref(struct dvb_frontend *, u16 value); |
53 | extern int dib7000pc_detection(struct i2c_adapter *i2c_adap); | 53 | extern int dib7000pc_detection(struct i2c_adapter *i2c_adap); |
54 | extern int dib7000p_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff); | ||
55 | extern int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff); | ||
54 | #else | 56 | #else |
55 | static inline | 57 | static inline |
56 | struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, | 58 | struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, |
@@ -95,6 +97,17 @@ static inline int dib7000pc_detection(struct i2c_adapter *i2c_adap) | |||
95 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 97 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
96 | return -ENODEV; | 98 | return -ENODEV; |
97 | } | 99 | } |
100 | static inline int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff) | ||
101 | { | ||
102 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
103 | return -ENODEV; | ||
104 | } | ||
105 | |||
106 | static inline int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, uint8_t onoff) | ||
107 | { | ||
108 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
109 | return -ENODEV; | ||
110 | } | ||
98 | #endif | 111 | #endif |
99 | 112 | ||
100 | #endif | 113 | #endif |
diff --git a/drivers/media/dvb/frontends/dib8000.c b/drivers/media/dvb/frontends/dib8000.c index 852c790d09d9..df17b91b3250 100644 --- a/drivers/media/dvb/frontends/dib8000.c +++ b/drivers/media/dvb/frontends/dib8000.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * published by the Free Software Foundation, version 2. | 8 | * published by the Free Software Foundation, version 2. |
9 | */ | 9 | */ |
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/slab.h> | ||
11 | #include <linux/i2c.h> | 12 | #include <linux/i2c.h> |
12 | #include "dvb_math.h" | 13 | #include "dvb_math.h" |
13 | 14 | ||
@@ -28,18 +29,6 @@ MODULE_PARM_DESC(debug, "turn on debugging (default: 0)"); | |||
28 | 29 | ||
29 | #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB8000: "); printk(args); printk("\n"); } } while (0) | 30 | #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB8000: "); printk(args); printk("\n"); } } while (0) |
30 | 31 | ||
31 | enum frontend_tune_state { | ||
32 | CT_AGC_START = 20, | ||
33 | CT_AGC_STEP_0, | ||
34 | CT_AGC_STEP_1, | ||
35 | CT_AGC_STEP_2, | ||
36 | CT_AGC_STEP_3, | ||
37 | CT_AGC_STEP_4, | ||
38 | CT_AGC_STOP, | ||
39 | |||
40 | CT_DEMOD_START = 30, | ||
41 | }; | ||
42 | |||
43 | #define FE_STATUS_TUNE_FAILED 0 | 32 | #define FE_STATUS_TUNE_FAILED 0 |
44 | 33 | ||
45 | struct i2c_device { | 34 | struct i2c_device { |
@@ -133,104 +122,104 @@ static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val) | |||
133 | return dib8000_i2c_write16(&state->i2c, reg, val); | 122 | return dib8000_i2c_write16(&state->i2c, reg, val); |
134 | } | 123 | } |
135 | 124 | ||
136 | const int16_t coeff_2k_sb_1seg_dqpsk[8] = { | 125 | static const int16_t coeff_2k_sb_1seg_dqpsk[8] = { |
137 | (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c, | 126 | (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c, |
138 | (920 << 5) | 0x09 | 127 | (920 << 5) | 0x09 |
139 | }; | 128 | }; |
140 | 129 | ||
141 | const int16_t coeff_2k_sb_1seg[8] = { | 130 | static const int16_t coeff_2k_sb_1seg[8] = { |
142 | (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f | 131 | (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f |
143 | }; | 132 | }; |
144 | 133 | ||
145 | const int16_t coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = { | 134 | static const int16_t coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = { |
146 | (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11, | 135 | (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11, |
147 | (-931 << 5) | 0x0f | 136 | (-931 << 5) | 0x0f |
148 | }; | 137 | }; |
149 | 138 | ||
150 | const int16_t coeff_2k_sb_3seg_0dqpsk[8] = { | 139 | static const int16_t coeff_2k_sb_3seg_0dqpsk[8] = { |
151 | (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e, | 140 | (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e, |
152 | (982 << 5) | 0x0c | 141 | (982 << 5) | 0x0c |
153 | }; | 142 | }; |
154 | 143 | ||
155 | const int16_t coeff_2k_sb_3seg_1dqpsk[8] = { | 144 | static const int16_t coeff_2k_sb_3seg_1dqpsk[8] = { |
156 | (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12, | 145 | (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12, |
157 | (-720 << 5) | 0x0d | 146 | (-720 << 5) | 0x0d |
158 | }; | 147 | }; |
159 | 148 | ||
160 | const int16_t coeff_2k_sb_3seg[8] = { | 149 | static const int16_t coeff_2k_sb_3seg[8] = { |
161 | (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e, | 150 | (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e, |
162 | (-610 << 5) | 0x0a | 151 | (-610 << 5) | 0x0a |
163 | }; | 152 | }; |
164 | 153 | ||
165 | const int16_t coeff_4k_sb_1seg_dqpsk[8] = { | 154 | static const int16_t coeff_4k_sb_1seg_dqpsk[8] = { |
166 | (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f, | 155 | (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f, |
167 | (-922 << 5) | 0x0d | 156 | (-922 << 5) | 0x0d |
168 | }; | 157 | }; |
169 | 158 | ||
170 | const int16_t coeff_4k_sb_1seg[8] = { | 159 | static const int16_t coeff_4k_sb_1seg[8] = { |
171 | (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d, | 160 | (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d, |
172 | (-655 << 5) | 0x0a | 161 | (-655 << 5) | 0x0a |
173 | }; | 162 | }; |
174 | 163 | ||
175 | const int16_t coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = { | 164 | static const int16_t coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = { |
176 | (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14, | 165 | (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14, |
177 | (-958 << 5) | 0x13 | 166 | (-958 << 5) | 0x13 |
178 | }; | 167 | }; |
179 | 168 | ||
180 | const int16_t coeff_4k_sb_3seg_0dqpsk[8] = { | 169 | static const int16_t coeff_4k_sb_3seg_0dqpsk[8] = { |
181 | (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12, | 170 | (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12, |
182 | (-568 << 5) | 0x0f | 171 | (-568 << 5) | 0x0f |
183 | }; | 172 | }; |
184 | 173 | ||
185 | const int16_t coeff_4k_sb_3seg_1dqpsk[8] = { | 174 | static const int16_t coeff_4k_sb_3seg_1dqpsk[8] = { |
186 | (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14, | 175 | (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14, |
187 | (-848 << 5) | 0x13 | 176 | (-848 << 5) | 0x13 |
188 | }; | 177 | }; |
189 | 178 | ||
190 | const int16_t coeff_4k_sb_3seg[8] = { | 179 | static const int16_t coeff_4k_sb_3seg[8] = { |
191 | (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12, | 180 | (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12, |
192 | (-869 << 5) | 0x13 | 181 | (-869 << 5) | 0x13 |
193 | }; | 182 | }; |
194 | 183 | ||
195 | const int16_t coeff_8k_sb_1seg_dqpsk[8] = { | 184 | static const int16_t coeff_8k_sb_1seg_dqpsk[8] = { |
196 | (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13, | 185 | (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13, |
197 | (-598 << 5) | 0x10 | 186 | (-598 << 5) | 0x10 |
198 | }; | 187 | }; |
199 | 188 | ||
200 | const int16_t coeff_8k_sb_1seg[8] = { | 189 | static const int16_t coeff_8k_sb_1seg[8] = { |
201 | (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f, | 190 | (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f, |
202 | (585 << 5) | 0x0f | 191 | (585 << 5) | 0x0f |
203 | }; | 192 | }; |
204 | 193 | ||
205 | const int16_t coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = { | 194 | static const int16_t coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = { |
206 | (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18, | 195 | (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18, |
207 | (0 << 5) | 0x14 | 196 | (0 << 5) | 0x14 |
208 | }; | 197 | }; |
209 | 198 | ||
210 | const int16_t coeff_8k_sb_3seg_0dqpsk[8] = { | 199 | static const int16_t coeff_8k_sb_3seg_0dqpsk[8] = { |
211 | (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15, | 200 | (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15, |
212 | (-877 << 5) | 0x15 | 201 | (-877 << 5) | 0x15 |
213 | }; | 202 | }; |
214 | 203 | ||
215 | const int16_t coeff_8k_sb_3seg_1dqpsk[8] = { | 204 | static const int16_t coeff_8k_sb_3seg_1dqpsk[8] = { |
216 | (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18, | 205 | (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18, |
217 | (-921 << 5) | 0x14 | 206 | (-921 << 5) | 0x14 |
218 | }; | 207 | }; |
219 | 208 | ||
220 | const int16_t coeff_8k_sb_3seg[8] = { | 209 | static const int16_t coeff_8k_sb_3seg[8] = { |
221 | (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15, | 210 | (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15, |
222 | (690 << 5) | 0x14 | 211 | (690 << 5) | 0x14 |
223 | }; | 212 | }; |
224 | 213 | ||
225 | const int16_t ana_fe_coeff_3seg[24] = { | 214 | static const int16_t ana_fe_coeff_3seg[24] = { |
226 | 81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017 | 215 | 81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017 |
227 | }; | 216 | }; |
228 | 217 | ||
229 | const int16_t ana_fe_coeff_1seg[24] = { | 218 | static const int16_t ana_fe_coeff_1seg[24] = { |
230 | 249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003 | 219 | 249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003 |
231 | }; | 220 | }; |
232 | 221 | ||
233 | const int16_t ana_fe_coeff_13seg[24] = { | 222 | static const int16_t ana_fe_coeff_13seg[24] = { |
234 | 396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1 | 223 | 396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1 |
235 | }; | 224 | }; |
236 | 225 | ||
@@ -852,6 +841,14 @@ static int dib8000_set_agc_config(struct dib8000_state *state, u8 band) | |||
852 | return 0; | 841 | return 0; |
853 | } | 842 | } |
854 | 843 | ||
844 | void dib8000_pwm_agc_reset(struct dvb_frontend *fe) | ||
845 | { | ||
846 | struct dib8000_state *state = fe->demodulator_priv; | ||
847 | dib8000_set_adc_state(state, DIBX000_ADC_ON); | ||
848 | dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000))); | ||
849 | } | ||
850 | EXPORT_SYMBOL(dib8000_pwm_agc_reset); | ||
851 | |||
855 | static int dib8000_agc_soft_split(struct dib8000_state *state) | 852 | static int dib8000_agc_soft_split(struct dib8000_state *state) |
856 | { | 853 | { |
857 | u16 agc, split_offset; | 854 | u16 agc, split_offset; |
@@ -939,6 +936,32 @@ static int dib8000_agc_startup(struct dvb_frontend *fe) | |||
939 | 936 | ||
940 | } | 937 | } |
941 | 938 | ||
939 | static const int32_t lut_1000ln_mant[] = | ||
940 | { | ||
941 | 908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600 | ||
942 | }; | ||
943 | |||
944 | int32_t dib8000_get_adc_power(struct dvb_frontend *fe, uint8_t mode) | ||
945 | { | ||
946 | struct dib8000_state *state = fe->demodulator_priv; | ||
947 | uint32_t ix = 0, tmp_val = 0, exp = 0, mant = 0; | ||
948 | int32_t val; | ||
949 | |||
950 | val = dib8000_read32(state, 384); | ||
951 | /* mode = 1 : ln_agcpower calc using mant-exp conversion and mantis look up table */ | ||
952 | if (mode) { | ||
953 | tmp_val = val; | ||
954 | while (tmp_val >>= 1) | ||
955 | exp++; | ||
956 | mant = (val * 1000 / (1<<exp)); | ||
957 | ix = (uint8_t)((mant-1000)/100); /* index of the LUT */ | ||
958 | val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908); /* 1000 * ln(adcpower_real) ; 693 = 1000ln(2) ; 6908 = 1000*ln(1000) ; 20 comes from adc_real = adc_pow_int / 2**20 */ | ||
959 | val = (val*256)/1000; | ||
960 | } | ||
961 | return val; | ||
962 | } | ||
963 | EXPORT_SYMBOL(dib8000_get_adc_power); | ||
964 | |||
942 | static void dib8000_update_timf(struct dib8000_state *state) | 965 | static void dib8000_update_timf(struct dib8000_state *state) |
943 | { | 966 | { |
944 | u32 timf = state->timf = dib8000_read32(state, 435); | 967 | u32 timf = state->timf = dib8000_read32(state, 435); |
@@ -954,7 +977,7 @@ static void dib8000_set_channel(struct dib8000_state *state, u8 seq, u8 autosear | |||
954 | u8 guard, crate, constellation, timeI; | 977 | u8 guard, crate, constellation, timeI; |
955 | u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 }; | 978 | u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 }; |
956 | u16 i, coeff[4], P_cfr_left_edge = 0, P_cfr_right_edge = 0, seg_mask13 = 0x1fff; // All 13 segments enabled | 979 | u16 i, coeff[4], P_cfr_left_edge = 0, P_cfr_right_edge = 0, seg_mask13 = 0x1fff; // All 13 segments enabled |
957 | const s16 *ncoeff, *ana_fe; | 980 | const s16 *ncoeff = NULL, *ana_fe; |
958 | u16 tmcc_pow = 0; | 981 | u16 tmcc_pow = 0; |
959 | u16 coff_pow = 0x2800; | 982 | u16 coff_pow = 0x2800; |
960 | u16 init_prbs = 0xfff; | 983 | u16 init_prbs = 0xfff; |
@@ -1401,10 +1424,9 @@ static void dib8000_set_channel(struct dib8000_state *state, u8 seq, u8 autosear | |||
1401 | } | 1424 | } |
1402 | break; | 1425 | break; |
1403 | } | 1426 | } |
1404 | } | ||
1405 | if (state->fe.dtv_property_cache.isdbt_sb_mode == 1) | ||
1406 | for (i = 0; i < 8; i++) | 1427 | for (i = 0; i < 8; i++) |
1407 | dib8000_write_word(state, 343 + i, ncoeff[i]); | 1428 | dib8000_write_word(state, 343 + i, ncoeff[i]); |
1429 | } | ||
1408 | 1430 | ||
1409 | // P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5 | 1431 | // P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5 |
1410 | dib8000_write_word(state, 351, | 1432 | dib8000_write_word(state, 351, |
@@ -1854,6 +1876,24 @@ static int dib8000_sleep(struct dvb_frontend *fe) | |||
1854 | } | 1876 | } |
1855 | } | 1877 | } |
1856 | 1878 | ||
1879 | enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe) | ||
1880 | { | ||
1881 | struct dib8000_state *state = fe->demodulator_priv; | ||
1882 | return state->tune_state; | ||
1883 | } | ||
1884 | EXPORT_SYMBOL(dib8000_get_tune_state); | ||
1885 | |||
1886 | int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state) | ||
1887 | { | ||
1888 | struct dib8000_state *state = fe->demodulator_priv; | ||
1889 | state->tune_state = tune_state; | ||
1890 | return 0; | ||
1891 | } | ||
1892 | EXPORT_SYMBOL(dib8000_set_tune_state); | ||
1893 | |||
1894 | |||
1895 | |||
1896 | |||
1857 | static int dib8000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) | 1897 | static int dib8000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) |
1858 | { | 1898 | { |
1859 | struct dib8000_state *state = fe->demodulator_priv; | 1899 | struct dib8000_state *state = fe->demodulator_priv; |
@@ -1960,6 +2000,8 @@ static int dib8000_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par | |||
1960 | struct dib8000_state *state = fe->demodulator_priv; | 2000 | struct dib8000_state *state = fe->demodulator_priv; |
1961 | int time, ret; | 2001 | int time, ret; |
1962 | 2002 | ||
2003 | fe->dtv_property_cache.delivery_system = SYS_ISDBT; | ||
2004 | |||
1963 | dib8000_set_output_mode(state, OUTMODE_HIGH_Z); | 2005 | dib8000_set_output_mode(state, OUTMODE_HIGH_Z); |
1964 | 2006 | ||
1965 | if (fe->ops.tuner_ops.set_params) | 2007 | if (fe->ops.tuner_ops.set_params) |
@@ -2043,29 +2085,31 @@ static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat) | |||
2043 | 2085 | ||
2044 | *stat = 0; | 2086 | *stat = 0; |
2045 | 2087 | ||
2046 | if ((lock >> 14) & 1) // AGC | 2088 | if ((lock >> 13) & 1) |
2047 | *stat |= FE_HAS_SIGNAL; | 2089 | *stat |= FE_HAS_SIGNAL; |
2048 | 2090 | ||
2049 | if ((lock >> 8) & 1) // Equal | 2091 | if ((lock >> 8) & 1) /* Equal */ |
2050 | *stat |= FE_HAS_CARRIER; | 2092 | *stat |= FE_HAS_CARRIER; |
2051 | 2093 | ||
2052 | if ((lock >> 3) & 1) // TMCC_SYNC | 2094 | if (((lock >> 1) & 0xf) == 0xf) /* TMCC_SYNC */ |
2053 | *stat |= FE_HAS_SYNC; | 2095 | *stat |= FE_HAS_SYNC; |
2054 | 2096 | ||
2055 | if ((lock >> 5) & 7) // FEC MPEG | 2097 | if (((lock >> 12) & 1) && ((lock >> 5) & 7)) /* FEC MPEG */ |
2056 | *stat |= FE_HAS_LOCK; | 2098 | *stat |= FE_HAS_LOCK; |
2057 | 2099 | ||
2058 | lock = dib8000_read_word(state, 554); // Viterbi Layer A | 2100 | if ((lock >> 12) & 1) { |
2059 | if (lock & 0x01) | 2101 | lock = dib8000_read_word(state, 554); /* Viterbi Layer A */ |
2060 | *stat |= FE_HAS_VITERBI; | 2102 | if (lock & 0x01) |
2103 | *stat |= FE_HAS_VITERBI; | ||
2061 | 2104 | ||
2062 | lock = dib8000_read_word(state, 555); // Viterbi Layer B | 2105 | lock = dib8000_read_word(state, 555); /* Viterbi Layer B */ |
2063 | if (lock & 0x01) | 2106 | if (lock & 0x01) |
2064 | *stat |= FE_HAS_VITERBI; | 2107 | *stat |= FE_HAS_VITERBI; |
2065 | 2108 | ||
2066 | lock = dib8000_read_word(state, 556); // Viterbi Layer C | 2109 | lock = dib8000_read_word(state, 556); /* Viterbi Layer C */ |
2067 | if (lock & 0x01) | 2110 | if (lock & 0x01) |
2068 | *stat |= FE_HAS_VITERBI; | 2111 | *stat |= FE_HAS_VITERBI; |
2112 | } | ||
2069 | 2113 | ||
2070 | return 0; | 2114 | return 0; |
2071 | } | 2115 | } |
@@ -2121,7 +2165,7 @@ static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr) | |||
2121 | else | 2165 | else |
2122 | result -= intlog10(2) * 10 * noise_exp - 100; | 2166 | result -= intlog10(2) * 10 * noise_exp - 100; |
2123 | 2167 | ||
2124 | *snr = result / (1 << 24); | 2168 | *snr = result / ((1 << 24) / 10); |
2125 | return 0; | 2169 | return 0; |
2126 | } | 2170 | } |
2127 | 2171 | ||
@@ -2195,6 +2239,25 @@ struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000 | |||
2195 | 2239 | ||
2196 | EXPORT_SYMBOL(dib8000_get_i2c_master); | 2240 | EXPORT_SYMBOL(dib8000_get_i2c_master); |
2197 | 2241 | ||
2242 | int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff) | ||
2243 | { | ||
2244 | struct dib8000_state *st = fe->demodulator_priv; | ||
2245 | u16 val = dib8000_read_word(st, 299) & 0xffef; | ||
2246 | val |= (onoff & 0x1) << 4; | ||
2247 | |||
2248 | dprintk("pid filter enabled %d", onoff); | ||
2249 | return dib8000_write_word(st, 299, val); | ||
2250 | } | ||
2251 | EXPORT_SYMBOL(dib8000_pid_filter_ctrl); | ||
2252 | |||
2253 | int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff) | ||
2254 | { | ||
2255 | struct dib8000_state *st = fe->demodulator_priv; | ||
2256 | dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff); | ||
2257 | return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0); | ||
2258 | } | ||
2259 | EXPORT_SYMBOL(dib8000_pid_filter); | ||
2260 | |||
2198 | static const struct dvb_frontend_ops dib8000_ops = { | 2261 | static const struct dvb_frontend_ops dib8000_ops = { |
2199 | .info = { | 2262 | .info = { |
2200 | .name = "DiBcom 8000 ISDB-T", | 2263 | .name = "DiBcom 8000 ISDB-T", |
diff --git a/drivers/media/dvb/frontends/dib8000.h b/drivers/media/dvb/frontends/dib8000.h index a86de340dd54..b1ee20799639 100644 --- a/drivers/media/dvb/frontends/dib8000.h +++ b/drivers/media/dvb/frontends/dib8000.h | |||
@@ -44,6 +44,12 @@ extern int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u | |||
44 | 44 | ||
45 | extern int dib8000_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); | 45 | extern int dib8000_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); |
46 | extern int dib8000_set_wbd_ref(struct dvb_frontend *, u16 value); | 46 | extern int dib8000_set_wbd_ref(struct dvb_frontend *, u16 value); |
47 | extern int dib8000_pid_filter_ctrl(struct dvb_frontend *, u8 onoff); | ||
48 | extern int dib8000_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff); | ||
49 | extern int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state); | ||
50 | extern enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe); | ||
51 | extern void dib8000_pwm_agc_reset(struct dvb_frontend *fe); | ||
52 | extern s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode); | ||
47 | #else | 53 | #else |
48 | static inline struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg) | 54 | static inline struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg) |
49 | { | 55 | { |
@@ -57,23 +63,53 @@ static inline struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe | |||
57 | return NULL; | 63 | return NULL; |
58 | } | 64 | } |
59 | 65 | ||
60 | int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u8 default_addr, u8 first_addr) | 66 | static inline int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u8 default_addr, u8 first_addr) |
61 | { | 67 | { |
62 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 68 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
63 | return -ENODEV; | 69 | return -ENODEV; |
64 | } | 70 | } |
65 | 71 | ||
66 | int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val) | 72 | static inline int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val) |
67 | { | 73 | { |
68 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 74 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
69 | return -ENODEV; | 75 | return -ENODEV; |
70 | } | 76 | } |
71 | 77 | ||
72 | int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value) | 78 | static inline int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value) |
73 | { | 79 | { |
74 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 80 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
75 | return -ENODEV; | 81 | return -ENODEV; |
76 | } | 82 | } |
83 | |||
84 | static inline int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff) | ||
85 | { | ||
86 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
87 | return -ENODEV; | ||
88 | } | ||
89 | |||
90 | static inline int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff) | ||
91 | { | ||
92 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
93 | return -ENODEV; | ||
94 | } | ||
95 | static inline int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state) | ||
96 | { | ||
97 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
98 | return -ENODEV; | ||
99 | } | ||
100 | static inline enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe) | ||
101 | { | ||
102 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
103 | return CT_SHUTDOWN; | ||
104 | } | ||
105 | static inline void dib8000_pwm_agc_reset(struct dvb_frontend *fe) | ||
106 | { | ||
107 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
108 | } | ||
109 | static inline s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode) | ||
110 | { | ||
111 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
112 | } | ||
77 | #endif | 113 | #endif |
78 | 114 | ||
79 | #endif | 115 | #endif |
diff --git a/drivers/media/dvb/frontends/dibx000_common.c b/drivers/media/dvb/frontends/dibx000_common.c index 4efca30d2127..980e02f1575e 100644 --- a/drivers/media/dvb/frontends/dibx000_common.c +++ b/drivers/media/dvb/frontends/dibx000_common.c | |||
@@ -6,7 +6,7 @@ static int debug; | |||
6 | module_param(debug, int, 0644); | 6 | module_param(debug, int, 0644); |
7 | MODULE_PARM_DESC(debug, "turn on debugging (default: 0)"); | 7 | MODULE_PARM_DESC(debug, "turn on debugging (default: 0)"); |
8 | 8 | ||
9 | #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiBX000: "); printk(args); } } while (0) | 9 | #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiBX000: "); printk(args); printk("\n"); } } while (0) |
10 | 10 | ||
11 | static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val) | 11 | static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val) |
12 | { | 12 | { |
@@ -25,7 +25,7 @@ static int dibx000_i2c_select_interface(struct dibx000_i2c_master *mst, | |||
25 | enum dibx000_i2c_interface intf) | 25 | enum dibx000_i2c_interface intf) |
26 | { | 26 | { |
27 | if (mst->device_rev > DIB3000MC && mst->selected_interface != intf) { | 27 | if (mst->device_rev > DIB3000MC && mst->selected_interface != intf) { |
28 | dprintk("selecting interface: %d\n", intf); | 28 | dprintk("selecting interface: %d", intf); |
29 | mst->selected_interface = intf; | 29 | mst->selected_interface = intf; |
30 | return dibx000_write_word(mst, mst->base_reg + 4, intf); | 30 | return dibx000_write_word(mst, mst->base_reg + 4, intf); |
31 | } | 31 | } |
@@ -171,9 +171,18 @@ void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst) | |||
171 | { | 171 | { |
172 | i2c_del_adapter(&mst->gated_tuner_i2c_adap); | 172 | i2c_del_adapter(&mst->gated_tuner_i2c_adap); |
173 | } | 173 | } |
174 | |||
175 | EXPORT_SYMBOL(dibx000_exit_i2c_master); | 174 | EXPORT_SYMBOL(dibx000_exit_i2c_master); |
176 | 175 | ||
176 | |||
177 | u32 systime(void) | ||
178 | { | ||
179 | struct timespec t; | ||
180 | |||
181 | t = current_kernel_time(); | ||
182 | return (t.tv_sec * 10000) + (t.tv_nsec / 100000); | ||
183 | } | ||
184 | EXPORT_SYMBOL(systime); | ||
185 | |||
177 | MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>"); | 186 | MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>"); |
178 | MODULE_DESCRIPTION("Common function the DiBcom demodulator family"); | 187 | MODULE_DESCRIPTION("Common function the DiBcom demodulator family"); |
179 | MODULE_LICENSE("GPL"); | 188 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb/frontends/dibx000_common.h b/drivers/media/dvb/frontends/dibx000_common.h index 5be10eca07c0..4f5d141a308d 100644 --- a/drivers/media/dvb/frontends/dibx000_common.h +++ b/drivers/media/dvb/frontends/dibx000_common.h | |||
@@ -36,13 +36,17 @@ extern struct i2c_adapter *dibx000_get_i2c_adapter(struct dibx000_i2c_master | |||
36 | extern void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst); | 36 | extern void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst); |
37 | extern void dibx000_reset_i2c_master(struct dibx000_i2c_master *mst); | 37 | extern void dibx000_reset_i2c_master(struct dibx000_i2c_master *mst); |
38 | 38 | ||
39 | extern u32 systime(void); | ||
40 | |||
39 | #define BAND_LBAND 0x01 | 41 | #define BAND_LBAND 0x01 |
40 | #define BAND_UHF 0x02 | 42 | #define BAND_UHF 0x02 |
41 | #define BAND_VHF 0x04 | 43 | #define BAND_VHF 0x04 |
42 | #define BAND_SBAND 0x08 | 44 | #define BAND_SBAND 0x08 |
43 | #define BAND_FM 0x10 | 45 | #define BAND_FM 0x10 |
46 | #define BAND_CBAND 0x20 | ||
44 | 47 | ||
45 | #define BAND_OF_FREQUENCY(freq_kHz) ( (freq_kHz) <= 115000 ? BAND_FM : \ | 48 | #define BAND_OF_FREQUENCY(freq_kHz) ((freq_kHz) <= 170000 ? BAND_CBAND : \ |
49 | (freq_kHz) <= 115000 ? BAND_FM : \ | ||
46 | (freq_kHz) <= 250000 ? BAND_VHF : \ | 50 | (freq_kHz) <= 250000 ? BAND_VHF : \ |
47 | (freq_kHz) <= 863000 ? BAND_UHF : \ | 51 | (freq_kHz) <= 863000 ? BAND_UHF : \ |
48 | (freq_kHz) <= 2000000 ? BAND_LBAND : BAND_SBAND ) | 52 | (freq_kHz) <= 2000000 ? BAND_LBAND : BAND_SBAND ) |
@@ -149,4 +153,67 @@ enum dibx000_adc_states { | |||
149 | #define OUTMODE_MPEG2_FIFO 5 | 153 | #define OUTMODE_MPEG2_FIFO 5 |
150 | #define OUTMODE_ANALOG_ADC 6 | 154 | #define OUTMODE_ANALOG_ADC 6 |
151 | 155 | ||
156 | enum frontend_tune_state { | ||
157 | CT_TUNER_START = 10, | ||
158 | CT_TUNER_STEP_0, | ||
159 | CT_TUNER_STEP_1, | ||
160 | CT_TUNER_STEP_2, | ||
161 | CT_TUNER_STEP_3, | ||
162 | CT_TUNER_STEP_4, | ||
163 | CT_TUNER_STEP_5, | ||
164 | CT_TUNER_STEP_6, | ||
165 | CT_TUNER_STEP_7, | ||
166 | CT_TUNER_STOP, | ||
167 | |||
168 | CT_AGC_START = 20, | ||
169 | CT_AGC_STEP_0, | ||
170 | CT_AGC_STEP_1, | ||
171 | CT_AGC_STEP_2, | ||
172 | CT_AGC_STEP_3, | ||
173 | CT_AGC_STEP_4, | ||
174 | CT_AGC_STOP, | ||
175 | |||
176 | CT_DEMOD_START = 30, | ||
177 | CT_DEMOD_STEP_1, | ||
178 | CT_DEMOD_STEP_2, | ||
179 | CT_DEMOD_STEP_3, | ||
180 | CT_DEMOD_STEP_4, | ||
181 | CT_DEMOD_STEP_5, | ||
182 | CT_DEMOD_STEP_6, | ||
183 | CT_DEMOD_STEP_7, | ||
184 | CT_DEMOD_STEP_8, | ||
185 | CT_DEMOD_STEP_9, | ||
186 | CT_DEMOD_STEP_10, | ||
187 | CT_DEMOD_SEARCH_NEXT = 41, | ||
188 | CT_DEMOD_STEP_LOCKED, | ||
189 | CT_DEMOD_STOP, | ||
190 | |||
191 | CT_DONE = 100, | ||
192 | CT_SHUTDOWN, | ||
193 | |||
194 | }; | ||
195 | |||
196 | struct dvb_frontend_parametersContext { | ||
197 | #define CHANNEL_STATUS_PARAMETERS_UNKNOWN 0x01 | ||
198 | #define CHANNEL_STATUS_PARAMETERS_SET 0x02 | ||
199 | u8 status; | ||
200 | u32 tune_time_estimation[2]; | ||
201 | s32 tps_available; | ||
202 | u16 tps[9]; | ||
203 | }; | ||
204 | |||
205 | #define FE_STATUS_TUNE_FAILED 0 | ||
206 | #define FE_STATUS_TUNE_TIMED_OUT -1 | ||
207 | #define FE_STATUS_TUNE_TIME_TOO_SHORT -2 | ||
208 | #define FE_STATUS_TUNE_PENDING -3 | ||
209 | #define FE_STATUS_STD_SUCCESS -4 | ||
210 | #define FE_STATUS_FFT_SUCCESS -5 | ||
211 | #define FE_STATUS_DEMOD_SUCCESS -6 | ||
212 | #define FE_STATUS_LOCKED -7 | ||
213 | #define FE_STATUS_DATA_LOCKED -8 | ||
214 | |||
215 | #define FE_CALLBACK_TIME_NEVER 0xffffffff | ||
216 | |||
217 | #define ABS(x) ((x < 0) ? (-x) : (x)) | ||
218 | |||
152 | #endif | 219 | #endif |
diff --git a/drivers/media/dvb/frontends/drx397xD.c b/drivers/media/dvb/frontends/drx397xD.c index 010075535221..f74cca6dc26b 100644 --- a/drivers/media/dvb/frontends/drx397xD.c +++ b/drivers/media/dvb/frontends/drx397xD.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
27 | #include <linux/string.h> | 27 | #include <linux/string.h> |
28 | #include <linux/firmware.h> | 28 | #include <linux/firmware.h> |
29 | #include <linux/slab.h> | ||
29 | #include <asm/div64.h> | 30 | #include <asm/div64.h> |
30 | 31 | ||
31 | #include "dvb_frontend.h" | 32 | #include "dvb_frontend.h" |
@@ -81,7 +82,7 @@ static struct { | |||
81 | #include "drx397xD_fw.h" | 82 | #include "drx397xD_fw.h" |
82 | }; | 83 | }; |
83 | 84 | ||
84 | /* use only with writer lock aquired */ | 85 | /* use only with writer lock acquired */ |
85 | static void _drx_release_fw(struct drx397xD_state *s, enum fw_ix ix) | 86 | static void _drx_release_fw(struct drx397xD_state *s, enum fw_ix ix) |
86 | { | 87 | { |
87 | memset(&fw[ix].data[0], 0, sizeof(fw[0].data)); | 88 | memset(&fw[ix].data[0], 0, sizeof(fw[0].data)); |
diff --git a/drivers/media/dvb/frontends/ds3000.c b/drivers/media/dvb/frontends/ds3000.c new file mode 100644 index 000000000000..cff3535566fe --- /dev/null +++ b/drivers/media/dvb/frontends/ds3000.c | |||
@@ -0,0 +1,1367 @@ | |||
1 | /* | ||
2 | Montage Technology DS3000/TS2020 - DVBS/S2 Demodulator/Tuner driver | ||
3 | Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com> | ||
4 | |||
5 | Copyright (C) 2009 TurboSight.com | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/slab.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/module.h> | ||
25 | #include <linux/moduleparam.h> | ||
26 | #include <linux/init.h> | ||
27 | #include <linux/firmware.h> | ||
28 | |||
29 | #include "dvb_frontend.h" | ||
30 | #include "ds3000.h" | ||
31 | |||
32 | static int debug; | ||
33 | |||
34 | #define dprintk(args...) \ | ||
35 | do { \ | ||
36 | if (debug) \ | ||
37 | printk(args); \ | ||
38 | } while (0) | ||
39 | |||
40 | /* as of March 2009 current DS3000 firmware version is 1.78 */ | ||
41 | /* DS3000 FW v1.78 MD5: a32d17910c4f370073f9346e71d34b80 */ | ||
42 | #define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw" | ||
43 | |||
44 | #define DS3000_SAMPLE_RATE 96000 /* in kHz */ | ||
45 | #define DS3000_XTAL_FREQ 27000 /* in kHz */ | ||
46 | |||
47 | /* Register values to initialise the demod in DVB-S mode */ | ||
48 | static u8 ds3000_dvbs_init_tab[] = { | ||
49 | 0x23, 0x05, | ||
50 | 0x08, 0x03, | ||
51 | 0x0c, 0x00, | ||
52 | 0x21, 0x54, | ||
53 | 0x25, 0x82, | ||
54 | 0x27, 0x31, | ||
55 | 0x30, 0x08, | ||
56 | 0x31, 0x40, | ||
57 | 0x32, 0x32, | ||
58 | 0x33, 0x35, | ||
59 | 0x35, 0xff, | ||
60 | 0x3a, 0x00, | ||
61 | 0x37, 0x10, | ||
62 | 0x38, 0x10, | ||
63 | 0x39, 0x02, | ||
64 | 0x42, 0x60, | ||
65 | 0x4a, 0x40, | ||
66 | 0x4b, 0x04, | ||
67 | 0x4d, 0x91, | ||
68 | 0x5d, 0xc8, | ||
69 | 0x50, 0x77, | ||
70 | 0x51, 0x77, | ||
71 | 0x52, 0x36, | ||
72 | 0x53, 0x36, | ||
73 | 0x56, 0x01, | ||
74 | 0x63, 0x43, | ||
75 | 0x64, 0x30, | ||
76 | 0x65, 0x40, | ||
77 | 0x68, 0x26, | ||
78 | 0x69, 0x4c, | ||
79 | 0x70, 0x20, | ||
80 | 0x71, 0x70, | ||
81 | 0x72, 0x04, | ||
82 | 0x73, 0x00, | ||
83 | 0x70, 0x40, | ||
84 | 0x71, 0x70, | ||
85 | 0x72, 0x04, | ||
86 | 0x73, 0x00, | ||
87 | 0x70, 0x60, | ||
88 | 0x71, 0x70, | ||
89 | 0x72, 0x04, | ||
90 | 0x73, 0x00, | ||
91 | 0x70, 0x80, | ||
92 | 0x71, 0x70, | ||
93 | 0x72, 0x04, | ||
94 | 0x73, 0x00, | ||
95 | 0x70, 0xa0, | ||
96 | 0x71, 0x70, | ||
97 | 0x72, 0x04, | ||
98 | 0x73, 0x00, | ||
99 | 0x70, 0x1f, | ||
100 | 0x76, 0x00, | ||
101 | 0x77, 0xd1, | ||
102 | 0x78, 0x0c, | ||
103 | 0x79, 0x80, | ||
104 | 0x7f, 0x04, | ||
105 | 0x7c, 0x00, | ||
106 | 0x80, 0x86, | ||
107 | 0x81, 0xa6, | ||
108 | 0x85, 0x04, | ||
109 | 0xcd, 0xf4, | ||
110 | 0x90, 0x33, | ||
111 | 0xa0, 0x44, | ||
112 | 0xc0, 0x18, | ||
113 | 0xc3, 0x10, | ||
114 | 0xc4, 0x08, | ||
115 | 0xc5, 0x80, | ||
116 | 0xc6, 0x80, | ||
117 | 0xc7, 0x0a, | ||
118 | 0xc8, 0x1a, | ||
119 | 0xc9, 0x80, | ||
120 | 0xfe, 0x92, | ||
121 | 0xe0, 0xf8, | ||
122 | 0xe6, 0x8b, | ||
123 | 0xd0, 0x40, | ||
124 | 0xf8, 0x20, | ||
125 | 0xfa, 0x0f, | ||
126 | 0xfd, 0x20, | ||
127 | 0xad, 0x20, | ||
128 | 0xae, 0x07, | ||
129 | 0xb8, 0x00, | ||
130 | }; | ||
131 | |||
132 | /* Register values to initialise the demod in DVB-S2 mode */ | ||
133 | static u8 ds3000_dvbs2_init_tab[] = { | ||
134 | 0x23, 0x0f, | ||
135 | 0x08, 0x07, | ||
136 | 0x0c, 0x00, | ||
137 | 0x21, 0x54, | ||
138 | 0x25, 0x82, | ||
139 | 0x27, 0x31, | ||
140 | 0x30, 0x08, | ||
141 | 0x31, 0x32, | ||
142 | 0x32, 0x32, | ||
143 | 0x33, 0x35, | ||
144 | 0x35, 0xff, | ||
145 | 0x3a, 0x00, | ||
146 | 0x37, 0x10, | ||
147 | 0x38, 0x10, | ||
148 | 0x39, 0x02, | ||
149 | 0x42, 0x60, | ||
150 | 0x4a, 0x80, | ||
151 | 0x4b, 0x04, | ||
152 | 0x4d, 0x81, | ||
153 | 0x5d, 0x88, | ||
154 | 0x50, 0x36, | ||
155 | 0x51, 0x36, | ||
156 | 0x52, 0x36, | ||
157 | 0x53, 0x36, | ||
158 | 0x63, 0x60, | ||
159 | 0x64, 0x10, | ||
160 | 0x65, 0x10, | ||
161 | 0x68, 0x04, | ||
162 | 0x69, 0x29, | ||
163 | 0x70, 0x20, | ||
164 | 0x71, 0x70, | ||
165 | 0x72, 0x04, | ||
166 | 0x73, 0x00, | ||
167 | 0x70, 0x40, | ||
168 | 0x71, 0x70, | ||
169 | 0x72, 0x04, | ||
170 | 0x73, 0x00, | ||
171 | 0x70, 0x60, | ||
172 | 0x71, 0x70, | ||
173 | 0x72, 0x04, | ||
174 | 0x73, 0x00, | ||
175 | 0x70, 0x80, | ||
176 | 0x71, 0x70, | ||
177 | 0x72, 0x04, | ||
178 | 0x73, 0x00, | ||
179 | 0x70, 0xa0, | ||
180 | 0x71, 0x70, | ||
181 | 0x72, 0x04, | ||
182 | 0x73, 0x00, | ||
183 | 0x70, 0x1f, | ||
184 | 0xa0, 0x44, | ||
185 | 0xc0, 0x08, | ||
186 | 0xc1, 0x10, | ||
187 | 0xc2, 0x08, | ||
188 | 0xc3, 0x10, | ||
189 | 0xc4, 0x08, | ||
190 | 0xc5, 0xf0, | ||
191 | 0xc6, 0xf0, | ||
192 | 0xc7, 0x0a, | ||
193 | 0xc8, 0x1a, | ||
194 | 0xc9, 0x80, | ||
195 | 0xca, 0x23, | ||
196 | 0xcb, 0x24, | ||
197 | 0xce, 0x74, | ||
198 | 0x90, 0x03, | ||
199 | 0x76, 0x80, | ||
200 | 0x77, 0x42, | ||
201 | 0x78, 0x0a, | ||
202 | 0x79, 0x80, | ||
203 | 0xad, 0x40, | ||
204 | 0xae, 0x07, | ||
205 | 0x7f, 0xd4, | ||
206 | 0x7c, 0x00, | ||
207 | 0x80, 0xa8, | ||
208 | 0x81, 0xda, | ||
209 | 0x7c, 0x01, | ||
210 | 0x80, 0xda, | ||
211 | 0x81, 0xec, | ||
212 | 0x7c, 0x02, | ||
213 | 0x80, 0xca, | ||
214 | 0x81, 0xeb, | ||
215 | 0x7c, 0x03, | ||
216 | 0x80, 0xba, | ||
217 | 0x81, 0xdb, | ||
218 | 0x85, 0x08, | ||
219 | 0x86, 0x00, | ||
220 | 0x87, 0x02, | ||
221 | 0x89, 0x80, | ||
222 | 0x8b, 0x44, | ||
223 | 0x8c, 0xaa, | ||
224 | 0x8a, 0x10, | ||
225 | 0xba, 0x00, | ||
226 | 0xf5, 0x04, | ||
227 | 0xfe, 0x44, | ||
228 | 0xd2, 0x32, | ||
229 | 0xb8, 0x00, | ||
230 | }; | ||
231 | |||
232 | /* DS3000 doesn't need some parameters as input and auto-detects them */ | ||
233 | /* save input from the application of those parameters */ | ||
234 | struct ds3000_tuning { | ||
235 | u32 frequency; | ||
236 | u32 symbol_rate; | ||
237 | fe_spectral_inversion_t inversion; | ||
238 | enum fe_code_rate fec; | ||
239 | |||
240 | /* input values */ | ||
241 | u8 inversion_val; | ||
242 | fe_modulation_t delivery; | ||
243 | u8 rolloff; | ||
244 | }; | ||
245 | |||
246 | struct ds3000_state { | ||
247 | struct i2c_adapter *i2c; | ||
248 | const struct ds3000_config *config; | ||
249 | |||
250 | struct dvb_frontend frontend; | ||
251 | |||
252 | struct ds3000_tuning dcur; | ||
253 | struct ds3000_tuning dnxt; | ||
254 | |||
255 | u8 skip_fw_load; | ||
256 | |||
257 | /* previous uncorrected block counter for DVB-S2 */ | ||
258 | u16 prevUCBS2; | ||
259 | }; | ||
260 | |||
261 | static int ds3000_writereg(struct ds3000_state *state, int reg, int data) | ||
262 | { | ||
263 | u8 buf[] = { reg, data }; | ||
264 | struct i2c_msg msg = { .addr = state->config->demod_address, | ||
265 | .flags = 0, .buf = buf, .len = 2 }; | ||
266 | int err; | ||
267 | |||
268 | dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data); | ||
269 | |||
270 | err = i2c_transfer(state->i2c, &msg, 1); | ||
271 | if (err != 1) { | ||
272 | printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x," | ||
273 | " value == 0x%02x)\n", __func__, err, reg, data); | ||
274 | return -EREMOTEIO; | ||
275 | } | ||
276 | |||
277 | return 0; | ||
278 | } | ||
279 | |||
280 | static int ds3000_tuner_writereg(struct ds3000_state *state, int reg, int data) | ||
281 | { | ||
282 | u8 buf[] = { reg, data }; | ||
283 | struct i2c_msg msg = { .addr = 0x60, | ||
284 | .flags = 0, .buf = buf, .len = 2 }; | ||
285 | int err; | ||
286 | |||
287 | dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data); | ||
288 | |||
289 | ds3000_writereg(state, 0x03, 0x11); | ||
290 | err = i2c_transfer(state->i2c, &msg, 1); | ||
291 | if (err != 1) { | ||
292 | printk("%s: writereg error(err == %i, reg == 0x%02x," | ||
293 | " value == 0x%02x)\n", __func__, err, reg, data); | ||
294 | return -EREMOTEIO; | ||
295 | } | ||
296 | |||
297 | return 0; | ||
298 | } | ||
299 | |||
300 | /* I2C write for 8k firmware load */ | ||
301 | static int ds3000_writeFW(struct ds3000_state *state, int reg, | ||
302 | const u8 *data, u16 len) | ||
303 | { | ||
304 | int i, ret = -EREMOTEIO; | ||
305 | struct i2c_msg msg; | ||
306 | u8 *buf; | ||
307 | |||
308 | buf = kmalloc(3, GFP_KERNEL); | ||
309 | if (buf == NULL) { | ||
310 | printk(KERN_ERR "Unable to kmalloc\n"); | ||
311 | ret = -ENOMEM; | ||
312 | goto error; | ||
313 | } | ||
314 | |||
315 | *(buf) = reg; | ||
316 | |||
317 | msg.addr = state->config->demod_address; | ||
318 | msg.flags = 0; | ||
319 | msg.buf = buf; | ||
320 | msg.len = 3; | ||
321 | |||
322 | for (i = 0; i < len; i += 2) { | ||
323 | memcpy(buf + 1, data + i, 2); | ||
324 | |||
325 | dprintk("%s: write reg 0x%02x, len = %d\n", __func__, reg, len); | ||
326 | |||
327 | ret = i2c_transfer(state->i2c, &msg, 1); | ||
328 | if (ret != 1) { | ||
329 | printk(KERN_ERR "%s: write error(err == %i, " | ||
330 | "reg == 0x%02x\n", __func__, ret, reg); | ||
331 | ret = -EREMOTEIO; | ||
332 | } | ||
333 | } | ||
334 | |||
335 | error: | ||
336 | kfree(buf); | ||
337 | |||
338 | return ret; | ||
339 | } | ||
340 | |||
341 | static int ds3000_readreg(struct ds3000_state *state, u8 reg) | ||
342 | { | ||
343 | int ret; | ||
344 | u8 b0[] = { reg }; | ||
345 | u8 b1[] = { 0 }; | ||
346 | struct i2c_msg msg[] = { | ||
347 | { | ||
348 | .addr = state->config->demod_address, | ||
349 | .flags = 0, | ||
350 | .buf = b0, | ||
351 | .len = 1 | ||
352 | }, { | ||
353 | .addr = state->config->demod_address, | ||
354 | .flags = I2C_M_RD, | ||
355 | .buf = b1, | ||
356 | .len = 1 | ||
357 | } | ||
358 | }; | ||
359 | |||
360 | ret = i2c_transfer(state->i2c, msg, 2); | ||
361 | |||
362 | if (ret != 2) { | ||
363 | printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret); | ||
364 | return ret; | ||
365 | } | ||
366 | |||
367 | dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]); | ||
368 | |||
369 | return b1[0]; | ||
370 | } | ||
371 | |||
372 | static int ds3000_tuner_readreg(struct ds3000_state *state, u8 reg) | ||
373 | { | ||
374 | int ret; | ||
375 | u8 b0[] = { reg }; | ||
376 | u8 b1[] = { 0 }; | ||
377 | struct i2c_msg msg[] = { | ||
378 | { | ||
379 | .addr = 0x60, | ||
380 | .flags = 0, | ||
381 | .buf = b0, | ||
382 | .len = 1 | ||
383 | }, { | ||
384 | .addr = 0x60, | ||
385 | .flags = I2C_M_RD, | ||
386 | .buf = b1, | ||
387 | .len = 1 | ||
388 | } | ||
389 | }; | ||
390 | |||
391 | ds3000_writereg(state, 0x03, 0x12); | ||
392 | ret = i2c_transfer(state->i2c, msg, 2); | ||
393 | |||
394 | if (ret != 2) { | ||
395 | printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret); | ||
396 | return ret; | ||
397 | } | ||
398 | |||
399 | dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]); | ||
400 | |||
401 | return b1[0]; | ||
402 | } | ||
403 | |||
404 | static int ds3000_set_inversion(struct ds3000_state *state, | ||
405 | fe_spectral_inversion_t inversion) | ||
406 | { | ||
407 | dprintk("%s(%d)\n", __func__, inversion); | ||
408 | |||
409 | switch (inversion) { | ||
410 | case INVERSION_OFF: | ||
411 | case INVERSION_ON: | ||
412 | case INVERSION_AUTO: | ||
413 | break; | ||
414 | default: | ||
415 | return -EINVAL; | ||
416 | } | ||
417 | |||
418 | state->dnxt.inversion = inversion; | ||
419 | |||
420 | return 0; | ||
421 | } | ||
422 | |||
423 | static int ds3000_set_symbolrate(struct ds3000_state *state, u32 rate) | ||
424 | { | ||
425 | int ret = 0; | ||
426 | |||
427 | dprintk("%s()\n", __func__); | ||
428 | |||
429 | dprintk("%s() symbol_rate = %d\n", __func__, state->dnxt.symbol_rate); | ||
430 | |||
431 | /* check if symbol rate is within limits */ | ||
432 | if ((state->dnxt.symbol_rate > | ||
433 | state->frontend.ops.info.symbol_rate_max) || | ||
434 | (state->dnxt.symbol_rate < | ||
435 | state->frontend.ops.info.symbol_rate_min)) | ||
436 | ret = -EOPNOTSUPP; | ||
437 | |||
438 | state->dnxt.symbol_rate = rate; | ||
439 | |||
440 | return ret; | ||
441 | } | ||
442 | |||
443 | static int ds3000_load_firmware(struct dvb_frontend *fe, | ||
444 | const struct firmware *fw); | ||
445 | |||
446 | static int ds3000_firmware_ondemand(struct dvb_frontend *fe) | ||
447 | { | ||
448 | struct ds3000_state *state = fe->demodulator_priv; | ||
449 | const struct firmware *fw; | ||
450 | int ret = 0; | ||
451 | |||
452 | dprintk("%s()\n", __func__); | ||
453 | |||
454 | if (ds3000_readreg(state, 0xb2) <= 0) | ||
455 | return ret; | ||
456 | |||
457 | if (state->skip_fw_load) | ||
458 | return 0; | ||
459 | /* Load firmware */ | ||
460 | /* request the firmware, this will block until someone uploads it */ | ||
461 | printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__, | ||
462 | DS3000_DEFAULT_FIRMWARE); | ||
463 | ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE, | ||
464 | state->i2c->dev.parent); | ||
465 | printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__); | ||
466 | if (ret) { | ||
467 | printk(KERN_ERR "%s: No firmware uploaded (timeout or file not " | ||
468 | "found?)\n", __func__); | ||
469 | return ret; | ||
470 | } | ||
471 | |||
472 | /* Make sure we don't recurse back through here during loading */ | ||
473 | state->skip_fw_load = 1; | ||
474 | |||
475 | ret = ds3000_load_firmware(fe, fw); | ||
476 | if (ret) | ||
477 | printk("%s: Writing firmware to device failed\n", __func__); | ||
478 | |||
479 | release_firmware(fw); | ||
480 | |||
481 | dprintk("%s: Firmware upload %s\n", __func__, | ||
482 | ret == 0 ? "complete" : "failed"); | ||
483 | |||
484 | /* Ensure firmware is always loaded if required */ | ||
485 | state->skip_fw_load = 0; | ||
486 | |||
487 | return ret; | ||
488 | } | ||
489 | |||
490 | static int ds3000_load_firmware(struct dvb_frontend *fe, | ||
491 | const struct firmware *fw) | ||
492 | { | ||
493 | struct ds3000_state *state = fe->demodulator_priv; | ||
494 | |||
495 | dprintk("%s\n", __func__); | ||
496 | dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n", | ||
497 | fw->size, | ||
498 | fw->data[0], | ||
499 | fw->data[1], | ||
500 | fw->data[fw->size - 2], | ||
501 | fw->data[fw->size - 1]); | ||
502 | |||
503 | /* Begin the firmware load process */ | ||
504 | ds3000_writereg(state, 0xb2, 0x01); | ||
505 | /* write the entire firmware */ | ||
506 | ds3000_writeFW(state, 0xb0, fw->data, fw->size); | ||
507 | ds3000_writereg(state, 0xb2, 0x00); | ||
508 | |||
509 | return 0; | ||
510 | } | ||
511 | |||
512 | static void ds3000_dump_registers(struct dvb_frontend *fe) | ||
513 | { | ||
514 | struct ds3000_state *state = fe->demodulator_priv; | ||
515 | int x, y, reg = 0, val; | ||
516 | |||
517 | for (y = 0; y < 16; y++) { | ||
518 | dprintk("%s: %02x: ", __func__, y); | ||
519 | for (x = 0; x < 16; x++) { | ||
520 | reg = (y << 4) + x; | ||
521 | val = ds3000_readreg(state, reg); | ||
522 | if (x != 15) | ||
523 | dprintk("%02x ", val); | ||
524 | else | ||
525 | dprintk("%02x\n", val); | ||
526 | } | ||
527 | } | ||
528 | dprintk("%s: -- DS3000 DUMP DONE --\n", __func__); | ||
529 | } | ||
530 | |||
531 | static int ds3000_read_status(struct dvb_frontend *fe, fe_status_t* status) | ||
532 | { | ||
533 | struct ds3000_state *state = fe->demodulator_priv; | ||
534 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
535 | int lock; | ||
536 | |||
537 | *status = 0; | ||
538 | |||
539 | switch (c->delivery_system) { | ||
540 | case SYS_DVBS: | ||
541 | lock = ds3000_readreg(state, 0xd1); | ||
542 | if ((lock & 0x07) == 0x07) | ||
543 | *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | | ||
544 | FE_HAS_VITERBI | FE_HAS_SYNC | | ||
545 | FE_HAS_LOCK; | ||
546 | |||
547 | break; | ||
548 | case SYS_DVBS2: | ||
549 | lock = ds3000_readreg(state, 0x0d); | ||
550 | if ((lock & 0x8f) == 0x8f) | ||
551 | *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | | ||
552 | FE_HAS_VITERBI | FE_HAS_SYNC | | ||
553 | FE_HAS_LOCK; | ||
554 | |||
555 | break; | ||
556 | default: | ||
557 | return 1; | ||
558 | } | ||
559 | |||
560 | dprintk("%s: status = 0x%02x\n", __func__, lock); | ||
561 | |||
562 | return 0; | ||
563 | } | ||
564 | |||
565 | #define FE_IS_TUNED (FE_HAS_SIGNAL + FE_HAS_LOCK) | ||
566 | static int ds3000_is_tuned(struct dvb_frontend *fe) | ||
567 | { | ||
568 | fe_status_t tunerstat; | ||
569 | |||
570 | ds3000_read_status(fe, &tunerstat); | ||
571 | |||
572 | return ((tunerstat & FE_IS_TUNED) == FE_IS_TUNED); | ||
573 | } | ||
574 | |||
575 | /* read DS3000 BER value */ | ||
576 | static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber) | ||
577 | { | ||
578 | struct ds3000_state *state = fe->demodulator_priv; | ||
579 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
580 | u8 data; | ||
581 | u32 ber_reading, lpdc_frames; | ||
582 | |||
583 | dprintk("%s()\n", __func__); | ||
584 | |||
585 | switch (c->delivery_system) { | ||
586 | case SYS_DVBS: | ||
587 | /* set the number of bytes checked during | ||
588 | BER estimation */ | ||
589 | ds3000_writereg(state, 0xf9, 0x04); | ||
590 | /* read BER estimation status */ | ||
591 | data = ds3000_readreg(state, 0xf8); | ||
592 | /* check if BER estimation is ready */ | ||
593 | if ((data & 0x10) == 0) { | ||
594 | /* this is the number of error bits, | ||
595 | to calculate the bit error rate | ||
596 | divide to 8388608 */ | ||
597 | *ber = (ds3000_readreg(state, 0xf7) << 8) | | ||
598 | ds3000_readreg(state, 0xf6); | ||
599 | /* start counting error bits */ | ||
600 | /* need to be set twice | ||
601 | otherwise it fails sometimes */ | ||
602 | data |= 0x10; | ||
603 | ds3000_writereg(state, 0xf8, data); | ||
604 | ds3000_writereg(state, 0xf8, data); | ||
605 | } else | ||
606 | /* used to indicate that BER estimation | ||
607 | is not ready, i.e. BER is unknown */ | ||
608 | *ber = 0xffffffff; | ||
609 | break; | ||
610 | case SYS_DVBS2: | ||
611 | /* read the number of LPDC decoded frames */ | ||
612 | lpdc_frames = (ds3000_readreg(state, 0xd7) << 16) | | ||
613 | (ds3000_readreg(state, 0xd6) << 8) | | ||
614 | ds3000_readreg(state, 0xd5); | ||
615 | /* read the number of packets with bad CRC */ | ||
616 | ber_reading = (ds3000_readreg(state, 0xf8) << 8) | | ||
617 | ds3000_readreg(state, 0xf7); | ||
618 | if (lpdc_frames > 750) { | ||
619 | /* clear LPDC frame counters */ | ||
620 | ds3000_writereg(state, 0xd1, 0x01); | ||
621 | /* clear bad packets counter */ | ||
622 | ds3000_writereg(state, 0xf9, 0x01); | ||
623 | /* enable bad packets counter */ | ||
624 | ds3000_writereg(state, 0xf9, 0x00); | ||
625 | /* enable LPDC frame counters */ | ||
626 | ds3000_writereg(state, 0xd1, 0x00); | ||
627 | *ber = ber_reading; | ||
628 | } else | ||
629 | /* used to indicate that BER estimation is not ready, | ||
630 | i.e. BER is unknown */ | ||
631 | *ber = 0xffffffff; | ||
632 | break; | ||
633 | default: | ||
634 | return 1; | ||
635 | } | ||
636 | |||
637 | return 0; | ||
638 | } | ||
639 | |||
640 | /* read TS2020 signal strength */ | ||
641 | static int ds3000_read_signal_strength(struct dvb_frontend *fe, | ||
642 | u16 *signal_strength) | ||
643 | { | ||
644 | struct ds3000_state *state = fe->demodulator_priv; | ||
645 | u16 sig_reading, sig_strength; | ||
646 | u8 rfgain, bbgain; | ||
647 | |||
648 | dprintk("%s()\n", __func__); | ||
649 | |||
650 | rfgain = ds3000_tuner_readreg(state, 0x3d) & 0x1f; | ||
651 | bbgain = ds3000_tuner_readreg(state, 0x21) & 0x1f; | ||
652 | |||
653 | if (rfgain > 15) | ||
654 | rfgain = 15; | ||
655 | if (bbgain > 13) | ||
656 | bbgain = 13; | ||
657 | |||
658 | sig_reading = rfgain * 2 + bbgain * 3; | ||
659 | |||
660 | sig_strength = 40 + (64 - sig_reading) * 50 / 64 ; | ||
661 | |||
662 | /* cook the value to be suitable for szap-s2 human readable output */ | ||
663 | *signal_strength = sig_strength * 1000; | ||
664 | |||
665 | dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n", __func__, | ||
666 | sig_reading, *signal_strength); | ||
667 | |||
668 | return 0; | ||
669 | } | ||
670 | |||
671 | /* calculate DS3000 snr value in dB */ | ||
672 | static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr) | ||
673 | { | ||
674 | struct ds3000_state *state = fe->demodulator_priv; | ||
675 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
676 | u8 snr_reading, snr_value; | ||
677 | u32 dvbs2_signal_reading, dvbs2_noise_reading, tmp; | ||
678 | static const u16 dvbs_snr_tab[] = { /* 20 x Table (rounded up) */ | ||
679 | 0x0000, 0x1b13, 0x2aea, 0x3627, 0x3ede, 0x45fe, 0x4c03, | ||
680 | 0x513a, 0x55d4, 0x59f2, 0x5dab, 0x6111, 0x6431, 0x6717, | ||
681 | 0x69c9, 0x6c4e, 0x6eac, 0x70e8, 0x7304, 0x7505 | ||
682 | }; | ||
683 | static const u16 dvbs2_snr_tab[] = { /* 80 x Table (rounded up) */ | ||
684 | 0x0000, 0x0bc2, 0x12a3, 0x1785, 0x1b4e, 0x1e65, 0x2103, | ||
685 | 0x2347, 0x2546, 0x2710, 0x28ae, 0x2a28, 0x2b83, 0x2cc5, | ||
686 | 0x2df1, 0x2f09, 0x3010, 0x3109, 0x31f4, 0x32d2, 0x33a6, | ||
687 | 0x3470, 0x3531, 0x35ea, 0x369b, 0x3746, 0x37ea, 0x3888, | ||
688 | 0x3920, 0x39b3, 0x3a42, 0x3acc, 0x3b51, 0x3bd3, 0x3c51, | ||
689 | 0x3ccb, 0x3d42, 0x3db6, 0x3e27, 0x3e95, 0x3f00, 0x3f68, | ||
690 | 0x3fcf, 0x4033, 0x4094, 0x40f4, 0x4151, 0x41ac, 0x4206, | ||
691 | 0x425e, 0x42b4, 0x4308, 0x435b, 0x43ac, 0x43fc, 0x444a, | ||
692 | 0x4497, 0x44e2, 0x452d, 0x4576, 0x45bd, 0x4604, 0x4649, | ||
693 | 0x468e, 0x46d1, 0x4713, 0x4755, 0x4795, 0x47d4, 0x4813, | ||
694 | 0x4851, 0x488d, 0x48c9, 0x4904, 0x493f, 0x4978, 0x49b1, | ||
695 | 0x49e9, 0x4a20, 0x4a57 | ||
696 | }; | ||
697 | |||
698 | dprintk("%s()\n", __func__); | ||
699 | |||
700 | switch (c->delivery_system) { | ||
701 | case SYS_DVBS: | ||
702 | snr_reading = ds3000_readreg(state, 0xff); | ||
703 | snr_reading /= 8; | ||
704 | if (snr_reading == 0) | ||
705 | *snr = 0x0000; | ||
706 | else { | ||
707 | if (snr_reading > 20) | ||
708 | snr_reading = 20; | ||
709 | snr_value = dvbs_snr_tab[snr_reading - 1] * 10 / 23026; | ||
710 | /* cook the value to be suitable for szap-s2 | ||
711 | human readable output */ | ||
712 | *snr = snr_value * 8 * 655; | ||
713 | } | ||
714 | dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__, | ||
715 | snr_reading, *snr); | ||
716 | break; | ||
717 | case SYS_DVBS2: | ||
718 | dvbs2_noise_reading = (ds3000_readreg(state, 0x8c) & 0x3f) + | ||
719 | (ds3000_readreg(state, 0x8d) << 4); | ||
720 | dvbs2_signal_reading = ds3000_readreg(state, 0x8e); | ||
721 | tmp = dvbs2_signal_reading * dvbs2_signal_reading >> 1; | ||
722 | if (dvbs2_signal_reading == 0) { | ||
723 | *snr = 0x0000; | ||
724 | return 0; | ||
725 | } | ||
726 | if (dvbs2_noise_reading == 0) { | ||
727 | snr_value = 0x0013; | ||
728 | /* cook the value to be suitable for szap-s2 | ||
729 | human readable output */ | ||
730 | *snr = 0xffff; | ||
731 | return 0; | ||
732 | } | ||
733 | if (tmp > dvbs2_noise_reading) { | ||
734 | snr_reading = tmp / dvbs2_noise_reading; | ||
735 | if (snr_reading > 80) | ||
736 | snr_reading = 80; | ||
737 | snr_value = dvbs2_snr_tab[snr_reading - 1] / 1000; | ||
738 | /* cook the value to be suitable for szap-s2 | ||
739 | human readable output */ | ||
740 | *snr = snr_value * 5 * 655; | ||
741 | } else { | ||
742 | snr_reading = dvbs2_noise_reading / tmp; | ||
743 | if (snr_reading > 80) | ||
744 | snr_reading = 80; | ||
745 | *snr = -(dvbs2_snr_tab[snr_reading] / 1000); | ||
746 | } | ||
747 | dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__, | ||
748 | snr_reading, *snr); | ||
749 | break; | ||
750 | default: | ||
751 | return 1; | ||
752 | } | ||
753 | |||
754 | return 0; | ||
755 | } | ||
756 | |||
757 | /* read DS3000 uncorrected blocks */ | ||
758 | static int ds3000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | ||
759 | { | ||
760 | struct ds3000_state *state = fe->demodulator_priv; | ||
761 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
762 | u8 data; | ||
763 | u16 _ucblocks; | ||
764 | |||
765 | dprintk("%s()\n", __func__); | ||
766 | |||
767 | switch (c->delivery_system) { | ||
768 | case SYS_DVBS: | ||
769 | *ucblocks = (ds3000_readreg(state, 0xf5) << 8) | | ||
770 | ds3000_readreg(state, 0xf4); | ||
771 | data = ds3000_readreg(state, 0xf8); | ||
772 | /* clear packet counters */ | ||
773 | data &= ~0x20; | ||
774 | ds3000_writereg(state, 0xf8, data); | ||
775 | /* enable packet counters */ | ||
776 | data |= 0x20; | ||
777 | ds3000_writereg(state, 0xf8, data); | ||
778 | break; | ||
779 | case SYS_DVBS2: | ||
780 | _ucblocks = (ds3000_readreg(state, 0xe2) << 8) | | ||
781 | ds3000_readreg(state, 0xe1); | ||
782 | if (_ucblocks > state->prevUCBS2) | ||
783 | *ucblocks = _ucblocks - state->prevUCBS2; | ||
784 | else | ||
785 | *ucblocks = state->prevUCBS2 - _ucblocks; | ||
786 | state->prevUCBS2 = _ucblocks; | ||
787 | break; | ||
788 | default: | ||
789 | return 1; | ||
790 | } | ||
791 | |||
792 | return 0; | ||
793 | } | ||
794 | |||
795 | /* Overwrite the current tuning params, we are about to tune */ | ||
796 | static void ds3000_clone_params(struct dvb_frontend *fe) | ||
797 | { | ||
798 | struct ds3000_state *state = fe->demodulator_priv; | ||
799 | memcpy(&state->dcur, &state->dnxt, sizeof(state->dcur)); | ||
800 | } | ||
801 | |||
802 | static int ds3000_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | ||
803 | { | ||
804 | struct ds3000_state *state = fe->demodulator_priv; | ||
805 | u8 data; | ||
806 | |||
807 | dprintk("%s(%d)\n", __func__, tone); | ||
808 | if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) { | ||
809 | printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone); | ||
810 | return -EINVAL; | ||
811 | } | ||
812 | |||
813 | data = ds3000_readreg(state, 0xa2); | ||
814 | data &= ~0xc0; | ||
815 | ds3000_writereg(state, 0xa2, data); | ||
816 | |||
817 | switch (tone) { | ||
818 | case SEC_TONE_ON: | ||
819 | dprintk("%s: setting tone on\n", __func__); | ||
820 | data = ds3000_readreg(state, 0xa1); | ||
821 | data &= ~0x43; | ||
822 | data |= 0x04; | ||
823 | ds3000_writereg(state, 0xa1, data); | ||
824 | break; | ||
825 | case SEC_TONE_OFF: | ||
826 | dprintk("%s: setting tone off\n", __func__); | ||
827 | data = ds3000_readreg(state, 0xa2); | ||
828 | data |= 0x80; | ||
829 | ds3000_writereg(state, 0xa2, data); | ||
830 | break; | ||
831 | } | ||
832 | |||
833 | return 0; | ||
834 | } | ||
835 | |||
836 | static int ds3000_send_diseqc_msg(struct dvb_frontend *fe, | ||
837 | struct dvb_diseqc_master_cmd *d) | ||
838 | { | ||
839 | struct ds3000_state *state = fe->demodulator_priv; | ||
840 | int i; | ||
841 | u8 data; | ||
842 | |||
843 | /* Dump DiSEqC message */ | ||
844 | dprintk("%s(", __func__); | ||
845 | for (i = 0 ; i < d->msg_len;) { | ||
846 | dprintk("0x%02x", d->msg[i]); | ||
847 | if (++i < d->msg_len) | ||
848 | dprintk(", "); | ||
849 | } | ||
850 | |||
851 | /* enable DiSEqC message send pin */ | ||
852 | data = ds3000_readreg(state, 0xa2); | ||
853 | data &= ~0xc0; | ||
854 | ds3000_writereg(state, 0xa2, data); | ||
855 | |||
856 | /* DiSEqC message */ | ||
857 | for (i = 0; i < d->msg_len; i++) | ||
858 | ds3000_writereg(state, 0xa3 + i, d->msg[i]); | ||
859 | |||
860 | data = ds3000_readreg(state, 0xa1); | ||
861 | /* clear DiSEqC message length and status, | ||
862 | enable DiSEqC message send */ | ||
863 | data &= ~0xf8; | ||
864 | /* set DiSEqC mode, modulation active during 33 pulses, | ||
865 | set DiSEqC message length */ | ||
866 | data |= ((d->msg_len - 1) << 3) | 0x07; | ||
867 | ds3000_writereg(state, 0xa1, data); | ||
868 | |||
869 | /* wait up to 150ms for DiSEqC transmission to complete */ | ||
870 | for (i = 0; i < 15; i++) { | ||
871 | data = ds3000_readreg(state, 0xa1); | ||
872 | if ((data & 0x40) == 0) | ||
873 | break; | ||
874 | msleep(10); | ||
875 | } | ||
876 | |||
877 | /* DiSEqC timeout after 150ms */ | ||
878 | if (i == 15) { | ||
879 | data = ds3000_readreg(state, 0xa1); | ||
880 | data &= ~0x80; | ||
881 | data |= 0x40; | ||
882 | ds3000_writereg(state, 0xa1, data); | ||
883 | |||
884 | data = ds3000_readreg(state, 0xa2); | ||
885 | data &= ~0xc0; | ||
886 | data |= 0x80; | ||
887 | ds3000_writereg(state, 0xa2, data); | ||
888 | |||
889 | return 1; | ||
890 | } | ||
891 | |||
892 | data = ds3000_readreg(state, 0xa2); | ||
893 | data &= ~0xc0; | ||
894 | data |= 0x80; | ||
895 | ds3000_writereg(state, 0xa2, data); | ||
896 | |||
897 | return 0; | ||
898 | } | ||
899 | |||
900 | /* Send DiSEqC burst */ | ||
901 | static int ds3000_diseqc_send_burst(struct dvb_frontend *fe, | ||
902 | fe_sec_mini_cmd_t burst) | ||
903 | { | ||
904 | struct ds3000_state *state = fe->demodulator_priv; | ||
905 | int i; | ||
906 | u8 data; | ||
907 | |||
908 | dprintk("%s()\n", __func__); | ||
909 | |||
910 | data = ds3000_readreg(state, 0xa2); | ||
911 | data &= ~0xc0; | ||
912 | ds3000_writereg(state, 0xa2, data); | ||
913 | |||
914 | /* DiSEqC burst */ | ||
915 | if (burst == SEC_MINI_A) | ||
916 | /* Unmodulated tone burst */ | ||
917 | ds3000_writereg(state, 0xa1, 0x02); | ||
918 | else if (burst == SEC_MINI_B) | ||
919 | /* Modulated tone burst */ | ||
920 | ds3000_writereg(state, 0xa1, 0x01); | ||
921 | else | ||
922 | return -EINVAL; | ||
923 | |||
924 | msleep(13); | ||
925 | for (i = 0; i < 5; i++) { | ||
926 | data = ds3000_readreg(state, 0xa1); | ||
927 | if ((data & 0x40) == 0) | ||
928 | break; | ||
929 | msleep(1); | ||
930 | } | ||
931 | |||
932 | if (i == 5) { | ||
933 | data = ds3000_readreg(state, 0xa1); | ||
934 | data &= ~0x80; | ||
935 | data |= 0x40; | ||
936 | ds3000_writereg(state, 0xa1, data); | ||
937 | |||
938 | data = ds3000_readreg(state, 0xa2); | ||
939 | data &= ~0xc0; | ||
940 | data |= 0x80; | ||
941 | ds3000_writereg(state, 0xa2, data); | ||
942 | |||
943 | return 1; | ||
944 | } | ||
945 | |||
946 | data = ds3000_readreg(state, 0xa2); | ||
947 | data &= ~0xc0; | ||
948 | data |= 0x80; | ||
949 | ds3000_writereg(state, 0xa2, data); | ||
950 | |||
951 | return 0; | ||
952 | } | ||
953 | |||
954 | static void ds3000_release(struct dvb_frontend *fe) | ||
955 | { | ||
956 | struct ds3000_state *state = fe->demodulator_priv; | ||
957 | dprintk("%s\n", __func__); | ||
958 | kfree(state); | ||
959 | } | ||
960 | |||
961 | static struct dvb_frontend_ops ds3000_ops; | ||
962 | |||
963 | struct dvb_frontend *ds3000_attach(const struct ds3000_config *config, | ||
964 | struct i2c_adapter *i2c) | ||
965 | { | ||
966 | struct ds3000_state *state = NULL; | ||
967 | int ret; | ||
968 | |||
969 | dprintk("%s\n", __func__); | ||
970 | |||
971 | /* allocate memory for the internal state */ | ||
972 | state = kmalloc(sizeof(struct ds3000_state), GFP_KERNEL); | ||
973 | if (state == NULL) { | ||
974 | printk(KERN_ERR "Unable to kmalloc\n"); | ||
975 | goto error2; | ||
976 | } | ||
977 | |||
978 | /* setup the state */ | ||
979 | memset(state, 0, sizeof(struct ds3000_state)); | ||
980 | |||
981 | state->config = config; | ||
982 | state->i2c = i2c; | ||
983 | state->prevUCBS2 = 0; | ||
984 | |||
985 | /* check if the demod is present */ | ||
986 | ret = ds3000_readreg(state, 0x00) & 0xfe; | ||
987 | if (ret != 0xe0) { | ||
988 | printk(KERN_ERR "Invalid probe, probably not a DS3000\n"); | ||
989 | goto error3; | ||
990 | } | ||
991 | |||
992 | printk(KERN_INFO "DS3000 chip version: %d.%d attached.\n", | ||
993 | ds3000_readreg(state, 0x02), | ||
994 | ds3000_readreg(state, 0x01)); | ||
995 | |||
996 | memcpy(&state->frontend.ops, &ds3000_ops, | ||
997 | sizeof(struct dvb_frontend_ops)); | ||
998 | state->frontend.demodulator_priv = state; | ||
999 | return &state->frontend; | ||
1000 | |||
1001 | error3: | ||
1002 | kfree(state); | ||
1003 | error2: | ||
1004 | return NULL; | ||
1005 | } | ||
1006 | EXPORT_SYMBOL(ds3000_attach); | ||
1007 | |||
1008 | static int ds3000_set_property(struct dvb_frontend *fe, | ||
1009 | struct dtv_property *tvp) | ||
1010 | { | ||
1011 | dprintk("%s(..)\n", __func__); | ||
1012 | return 0; | ||
1013 | } | ||
1014 | |||
1015 | static int ds3000_get_property(struct dvb_frontend *fe, | ||
1016 | struct dtv_property *tvp) | ||
1017 | { | ||
1018 | dprintk("%s(..)\n", __func__); | ||
1019 | return 0; | ||
1020 | } | ||
1021 | |||
1022 | static int ds3000_tune(struct dvb_frontend *fe, | ||
1023 | struct dvb_frontend_parameters *p) | ||
1024 | { | ||
1025 | struct ds3000_state *state = fe->demodulator_priv; | ||
1026 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
1027 | |||
1028 | int ret = 0, retune, i; | ||
1029 | u8 status, mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf; | ||
1030 | u16 value, ndiv; | ||
1031 | u32 f3db; | ||
1032 | |||
1033 | dprintk("%s() ", __func__); | ||
1034 | |||
1035 | /* Load the firmware if required */ | ||
1036 | ret = ds3000_firmware_ondemand(fe); | ||
1037 | if (ret != 0) { | ||
1038 | printk(KERN_ERR "%s: Unable initialise the firmware\n", | ||
1039 | __func__); | ||
1040 | return ret; | ||
1041 | } | ||
1042 | |||
1043 | state->dnxt.delivery = c->modulation; | ||
1044 | state->dnxt.frequency = c->frequency; | ||
1045 | state->dnxt.rolloff = 2; /* fixme */ | ||
1046 | state->dnxt.fec = c->fec_inner; | ||
1047 | |||
1048 | ret = ds3000_set_inversion(state, p->inversion); | ||
1049 | if (ret != 0) | ||
1050 | return ret; | ||
1051 | |||
1052 | ret = ds3000_set_symbolrate(state, c->symbol_rate); | ||
1053 | if (ret != 0) | ||
1054 | return ret; | ||
1055 | |||
1056 | /* discard the 'current' tuning parameters and prepare to tune */ | ||
1057 | ds3000_clone_params(fe); | ||
1058 | |||
1059 | retune = 1; /* try 1 times */ | ||
1060 | dprintk("%s: retune = %d\n", __func__, retune); | ||
1061 | dprintk("%s: frequency = %d\n", __func__, state->dcur.frequency); | ||
1062 | dprintk("%s: symbol_rate = %d\n", __func__, state->dcur.symbol_rate); | ||
1063 | dprintk("%s: FEC = %d \n", __func__, | ||
1064 | state->dcur.fec); | ||
1065 | dprintk("%s: Inversion = %d\n", __func__, state->dcur.inversion); | ||
1066 | |||
1067 | do { | ||
1068 | /* Reset status register */ | ||
1069 | status = 0; | ||
1070 | /* Tune */ | ||
1071 | /* TS2020 init */ | ||
1072 | ds3000_tuner_writereg(state, 0x42, 0x73); | ||
1073 | ds3000_tuner_writereg(state, 0x05, 0x01); | ||
1074 | ds3000_tuner_writereg(state, 0x62, 0xf5); | ||
1075 | /* unknown */ | ||
1076 | ds3000_tuner_writereg(state, 0x07, 0x02); | ||
1077 | ds3000_tuner_writereg(state, 0x10, 0x00); | ||
1078 | ds3000_tuner_writereg(state, 0x60, 0x79); | ||
1079 | ds3000_tuner_writereg(state, 0x08, 0x01); | ||
1080 | ds3000_tuner_writereg(state, 0x00, 0x01); | ||
1081 | /* calculate and set freq divider */ | ||
1082 | if (state->dcur.frequency < 1146000) { | ||
1083 | ds3000_tuner_writereg(state, 0x10, 0x11); | ||
1084 | ndiv = ((state->dcur.frequency * (6 + 8) * 4) + | ||
1085 | (DS3000_XTAL_FREQ / 2)) / | ||
1086 | DS3000_XTAL_FREQ - 1024; | ||
1087 | } else { | ||
1088 | ds3000_tuner_writereg(state, 0x10, 0x01); | ||
1089 | ndiv = ((state->dcur.frequency * (6 + 8) * 2) + | ||
1090 | (DS3000_XTAL_FREQ / 2)) / | ||
1091 | DS3000_XTAL_FREQ - 1024; | ||
1092 | } | ||
1093 | |||
1094 | ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8); | ||
1095 | ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff); | ||
1096 | |||
1097 | /* set pll */ | ||
1098 | ds3000_tuner_writereg(state, 0x03, 0x06); | ||
1099 | ds3000_tuner_writereg(state, 0x51, 0x0f); | ||
1100 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1101 | ds3000_tuner_writereg(state, 0x50, 0x10); | ||
1102 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1103 | msleep(5); | ||
1104 | |||
1105 | /* unknown */ | ||
1106 | ds3000_tuner_writereg(state, 0x51, 0x17); | ||
1107 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1108 | ds3000_tuner_writereg(state, 0x50, 0x08); | ||
1109 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1110 | msleep(5); | ||
1111 | |||
1112 | value = ds3000_tuner_readreg(state, 0x3d); | ||
1113 | value &= 0x0f; | ||
1114 | if ((value > 4) && (value < 15)) { | ||
1115 | value -= 3; | ||
1116 | if (value < 4) | ||
1117 | value = 4; | ||
1118 | value = ((value << 3) | 0x01) & 0x79; | ||
1119 | } | ||
1120 | |||
1121 | ds3000_tuner_writereg(state, 0x60, value); | ||
1122 | ds3000_tuner_writereg(state, 0x51, 0x17); | ||
1123 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1124 | ds3000_tuner_writereg(state, 0x50, 0x08); | ||
1125 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1126 | |||
1127 | /* set low-pass filter period */ | ||
1128 | ds3000_tuner_writereg(state, 0x04, 0x2e); | ||
1129 | ds3000_tuner_writereg(state, 0x51, 0x1b); | ||
1130 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1131 | ds3000_tuner_writereg(state, 0x50, 0x04); | ||
1132 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1133 | msleep(5); | ||
1134 | |||
1135 | f3db = ((state->dcur.symbol_rate / 1000) << 2) / 5 + 2000; | ||
1136 | if ((state->dcur.symbol_rate / 1000) < 5000) | ||
1137 | f3db += 3000; | ||
1138 | if (f3db < 7000) | ||
1139 | f3db = 7000; | ||
1140 | if (f3db > 40000) | ||
1141 | f3db = 40000; | ||
1142 | |||
1143 | /* set low-pass filter baseband */ | ||
1144 | value = ds3000_tuner_readreg(state, 0x26); | ||
1145 | mlpf = 0x2e * 207 / ((value << 1) + 151); | ||
1146 | mlpf_max = mlpf * 135 / 100; | ||
1147 | mlpf_min = mlpf * 78 / 100; | ||
1148 | if (mlpf_max > 63) | ||
1149 | mlpf_max = 63; | ||
1150 | |||
1151 | /* rounded to the closest integer */ | ||
1152 | nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2)) | ||
1153 | / (2766 * DS3000_XTAL_FREQ); | ||
1154 | if (nlpf > 23) | ||
1155 | nlpf = 23; | ||
1156 | if (nlpf < 1) | ||
1157 | nlpf = 1; | ||
1158 | |||
1159 | /* rounded to the closest integer */ | ||
1160 | mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + | ||
1161 | (1000 * f3db / 2)) / (1000 * f3db); | ||
1162 | |||
1163 | if (mlpf_new < mlpf_min) { | ||
1164 | nlpf++; | ||
1165 | mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + | ||
1166 | (1000 * f3db / 2)) / (1000 * f3db); | ||
1167 | } | ||
1168 | |||
1169 | if (mlpf_new > mlpf_max) | ||
1170 | mlpf_new = mlpf_max; | ||
1171 | |||
1172 | ds3000_tuner_writereg(state, 0x04, mlpf_new); | ||
1173 | ds3000_tuner_writereg(state, 0x06, nlpf); | ||
1174 | ds3000_tuner_writereg(state, 0x51, 0x1b); | ||
1175 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1176 | ds3000_tuner_writereg(state, 0x50, 0x04); | ||
1177 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1178 | msleep(5); | ||
1179 | |||
1180 | /* unknown */ | ||
1181 | ds3000_tuner_writereg(state, 0x51, 0x1e); | ||
1182 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1183 | ds3000_tuner_writereg(state, 0x50, 0x01); | ||
1184 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1185 | msleep(60); | ||
1186 | |||
1187 | /* ds3000 global reset */ | ||
1188 | ds3000_writereg(state, 0x07, 0x80); | ||
1189 | ds3000_writereg(state, 0x07, 0x00); | ||
1190 | /* ds3000 build-in uC reset */ | ||
1191 | ds3000_writereg(state, 0xb2, 0x01); | ||
1192 | /* ds3000 software reset */ | ||
1193 | ds3000_writereg(state, 0x00, 0x01); | ||
1194 | |||
1195 | switch (c->delivery_system) { | ||
1196 | case SYS_DVBS: | ||
1197 | /* initialise the demod in DVB-S mode */ | ||
1198 | for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2) | ||
1199 | ds3000_writereg(state, | ||
1200 | ds3000_dvbs_init_tab[i], | ||
1201 | ds3000_dvbs_init_tab[i + 1]); | ||
1202 | value = ds3000_readreg(state, 0xfe); | ||
1203 | value &= 0xc0; | ||
1204 | value |= 0x1b; | ||
1205 | ds3000_writereg(state, 0xfe, value); | ||
1206 | break; | ||
1207 | case SYS_DVBS2: | ||
1208 | /* initialise the demod in DVB-S2 mode */ | ||
1209 | for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2) | ||
1210 | ds3000_writereg(state, | ||
1211 | ds3000_dvbs2_init_tab[i], | ||
1212 | ds3000_dvbs2_init_tab[i + 1]); | ||
1213 | ds3000_writereg(state, 0xfe, 0x54); | ||
1214 | break; | ||
1215 | default: | ||
1216 | return 1; | ||
1217 | } | ||
1218 | |||
1219 | /* enable 27MHz clock output */ | ||
1220 | ds3000_writereg(state, 0x29, 0x80); | ||
1221 | /* enable ac coupling */ | ||
1222 | ds3000_writereg(state, 0x25, 0x8a); | ||
1223 | |||
1224 | /* enhance symbol rate performance */ | ||
1225 | if ((state->dcur.symbol_rate / 1000) <= 5000) { | ||
1226 | value = 29777 / (state->dcur.symbol_rate / 1000) + 1; | ||
1227 | if (value % 2 != 0) | ||
1228 | value++; | ||
1229 | ds3000_writereg(state, 0xc3, 0x0d); | ||
1230 | ds3000_writereg(state, 0xc8, value); | ||
1231 | ds3000_writereg(state, 0xc4, 0x10); | ||
1232 | ds3000_writereg(state, 0xc7, 0x0e); | ||
1233 | } else if ((state->dcur.symbol_rate / 1000) <= 10000) { | ||
1234 | value = 92166 / (state->dcur.symbol_rate / 1000) + 1; | ||
1235 | if (value % 2 != 0) | ||
1236 | value++; | ||
1237 | ds3000_writereg(state, 0xc3, 0x07); | ||
1238 | ds3000_writereg(state, 0xc8, value); | ||
1239 | ds3000_writereg(state, 0xc4, 0x09); | ||
1240 | ds3000_writereg(state, 0xc7, 0x12); | ||
1241 | } else if ((state->dcur.symbol_rate / 1000) <= 20000) { | ||
1242 | value = 64516 / (state->dcur.symbol_rate / 1000) + 1; | ||
1243 | ds3000_writereg(state, 0xc3, value); | ||
1244 | ds3000_writereg(state, 0xc8, 0x0e); | ||
1245 | ds3000_writereg(state, 0xc4, 0x07); | ||
1246 | ds3000_writereg(state, 0xc7, 0x18); | ||
1247 | } else { | ||
1248 | value = 129032 / (state->dcur.symbol_rate / 1000) + 1; | ||
1249 | ds3000_writereg(state, 0xc3, value); | ||
1250 | ds3000_writereg(state, 0xc8, 0x0a); | ||
1251 | ds3000_writereg(state, 0xc4, 0x05); | ||
1252 | ds3000_writereg(state, 0xc7, 0x24); | ||
1253 | } | ||
1254 | |||
1255 | /* normalized symbol rate rounded to the closest integer */ | ||
1256 | value = (((state->dcur.symbol_rate / 1000) << 16) + | ||
1257 | (DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE; | ||
1258 | ds3000_writereg(state, 0x61, value & 0x00ff); | ||
1259 | ds3000_writereg(state, 0x62, (value & 0xff00) >> 8); | ||
1260 | |||
1261 | /* co-channel interference cancellation disabled */ | ||
1262 | ds3000_writereg(state, 0x56, 0x00); | ||
1263 | |||
1264 | /* equalizer disabled */ | ||
1265 | ds3000_writereg(state, 0x76, 0x00); | ||
1266 | |||
1267 | /*ds3000_writereg(state, 0x08, 0x03); | ||
1268 | ds3000_writereg(state, 0xfd, 0x22); | ||
1269 | ds3000_writereg(state, 0x08, 0x07); | ||
1270 | ds3000_writereg(state, 0xfd, 0x42); | ||
1271 | ds3000_writereg(state, 0x08, 0x07);*/ | ||
1272 | |||
1273 | /* ds3000 out of software reset */ | ||
1274 | ds3000_writereg(state, 0x00, 0x00); | ||
1275 | /* start ds3000 build-in uC */ | ||
1276 | ds3000_writereg(state, 0xb2, 0x00); | ||
1277 | |||
1278 | /* TODO: calculate and set carrier offset */ | ||
1279 | |||
1280 | /* wait before retrying */ | ||
1281 | for (i = 0; i < 30 ; i++) { | ||
1282 | if (ds3000_is_tuned(fe)) { | ||
1283 | dprintk("%s: Tuned\n", __func__); | ||
1284 | ds3000_dump_registers(fe); | ||
1285 | goto tuned; | ||
1286 | } | ||
1287 | msleep(1); | ||
1288 | } | ||
1289 | |||
1290 | dprintk("%s: Not tuned\n", __func__); | ||
1291 | ds3000_dump_registers(fe); | ||
1292 | |||
1293 | } while (--retune); | ||
1294 | |||
1295 | tuned: | ||
1296 | return ret; | ||
1297 | } | ||
1298 | |||
1299 | static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe) | ||
1300 | { | ||
1301 | dprintk("%s()\n", __func__); | ||
1302 | return DVBFE_ALGO_SW; | ||
1303 | } | ||
1304 | |||
1305 | /* | ||
1306 | * Initialise or wake up device | ||
1307 | * | ||
1308 | * Power config will reset and load initial firmware if required | ||
1309 | */ | ||
1310 | static int ds3000_initfe(struct dvb_frontend *fe) | ||
1311 | { | ||
1312 | dprintk("%s()\n", __func__); | ||
1313 | return 0; | ||
1314 | } | ||
1315 | |||
1316 | /* Put device to sleep */ | ||
1317 | static int ds3000_sleep(struct dvb_frontend *fe) | ||
1318 | { | ||
1319 | dprintk("%s()\n", __func__); | ||
1320 | return 0; | ||
1321 | } | ||
1322 | |||
1323 | static struct dvb_frontend_ops ds3000_ops = { | ||
1324 | |||
1325 | .info = { | ||
1326 | .name = "Montage Technology DS3000/TS2020", | ||
1327 | .type = FE_QPSK, | ||
1328 | .frequency_min = 950000, | ||
1329 | .frequency_max = 2150000, | ||
1330 | .frequency_stepsize = 1011, /* kHz for QPSK frontends */ | ||
1331 | .frequency_tolerance = 5000, | ||
1332 | .symbol_rate_min = 1000000, | ||
1333 | .symbol_rate_max = 45000000, | ||
1334 | .caps = FE_CAN_INVERSION_AUTO | | ||
1335 | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | | ||
1336 | FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | | ||
1337 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | | ||
1338 | FE_CAN_2G_MODULATION | | ||
1339 | FE_CAN_QPSK | FE_CAN_RECOVER | ||
1340 | }, | ||
1341 | |||
1342 | .release = ds3000_release, | ||
1343 | |||
1344 | .init = ds3000_initfe, | ||
1345 | .sleep = ds3000_sleep, | ||
1346 | .read_status = ds3000_read_status, | ||
1347 | .read_ber = ds3000_read_ber, | ||
1348 | .read_signal_strength = ds3000_read_signal_strength, | ||
1349 | .read_snr = ds3000_read_snr, | ||
1350 | .read_ucblocks = ds3000_read_ucblocks, | ||
1351 | .set_tone = ds3000_set_tone, | ||
1352 | .diseqc_send_master_cmd = ds3000_send_diseqc_msg, | ||
1353 | .diseqc_send_burst = ds3000_diseqc_send_burst, | ||
1354 | .get_frontend_algo = ds3000_get_algo, | ||
1355 | |||
1356 | .set_property = ds3000_set_property, | ||
1357 | .get_property = ds3000_get_property, | ||
1358 | .set_frontend = ds3000_tune, | ||
1359 | }; | ||
1360 | |||
1361 | module_param(debug, int, 0644); | ||
1362 | MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); | ||
1363 | |||
1364 | MODULE_DESCRIPTION("DVB Frontend module for Montage Technology " | ||
1365 | "DS3000/TS2020 hardware"); | ||
1366 | MODULE_AUTHOR("Konstantin Dimitrov"); | ||
1367 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/ds3000.h b/drivers/media/dvb/frontends/ds3000.h new file mode 100644 index 000000000000..67f67038740a --- /dev/null +++ b/drivers/media/dvb/frontends/ds3000.h | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | Montage Technology DS3000/TS2020 - DVBS/S2 Satellite demod/tuner driver | ||
3 | Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com> | ||
4 | |||
5 | Copyright (C) 2009 TurboSight.com | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #ifndef DS3000_H | ||
23 | #define DS3000_H | ||
24 | |||
25 | #include <linux/dvb/frontend.h> | ||
26 | |||
27 | struct ds3000_config { | ||
28 | /* the demodulator's i2c address */ | ||
29 | u8 demod_address; | ||
30 | }; | ||
31 | |||
32 | #if defined(CONFIG_DVB_DS3000) || \ | ||
33 | (defined(CONFIG_DVB_DS3000_MODULE) && defined(MODULE)) | ||
34 | extern struct dvb_frontend *ds3000_attach(const struct ds3000_config *config, | ||
35 | struct i2c_adapter *i2c); | ||
36 | #else | ||
37 | static inline | ||
38 | struct dvb_frontend *ds3000_attach(const struct ds3000_config *config, | ||
39 | struct i2c_adapter *i2c) | ||
40 | { | ||
41 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
42 | return NULL; | ||
43 | } | ||
44 | #endif /* CONFIG_DVB_DS3000 */ | ||
45 | #endif /* DS3000_H */ | ||
diff --git a/drivers/media/dvb/frontends/dvb-pll.c b/drivers/media/dvb/frontends/dvb-pll.c index 6d865d6161d7..4d4d0bb5920a 100644 --- a/drivers/media/dvb/frontends/dvb-pll.c +++ b/drivers/media/dvb/frontends/dvb-pll.c | |||
@@ -18,6 +18,7 @@ | |||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <linux/slab.h> | ||
21 | #include <linux/module.h> | 22 | #include <linux/module.h> |
22 | #include <linux/dvb/frontend.h> | 23 | #include <linux/dvb/frontend.h> |
23 | #include <asm/types.h> | 24 | #include <asm/types.h> |
diff --git a/drivers/media/dvb/frontends/ec100.c b/drivers/media/dvb/frontends/ec100.c new file mode 100644 index 000000000000..2414dc6ee5d9 --- /dev/null +++ b/drivers/media/dvb/frontends/ec100.c | |||
@@ -0,0 +1,335 @@ | |||
1 | /* | ||
2 | * E3C EC100 demodulator driver | ||
3 | * | ||
4 | * Copyright (C) 2009 Antti Palosaari <crope@iki.fi> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include "dvb_frontend.h" | ||
23 | #include "ec100_priv.h" | ||
24 | #include "ec100.h" | ||
25 | |||
26 | int ec100_debug; | ||
27 | module_param_named(debug, ec100_debug, int, 0644); | ||
28 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); | ||
29 | |||
30 | struct ec100_state { | ||
31 | struct i2c_adapter *i2c; | ||
32 | struct dvb_frontend frontend; | ||
33 | struct ec100_config config; | ||
34 | |||
35 | u16 ber; | ||
36 | }; | ||
37 | |||
38 | /* write single register */ | ||
39 | static int ec100_write_reg(struct ec100_state *state, u8 reg, u8 val) | ||
40 | { | ||
41 | u8 buf[2] = {reg, val}; | ||
42 | struct i2c_msg msg = { | ||
43 | .addr = state->config.demod_address, | ||
44 | .flags = 0, | ||
45 | .len = 2, | ||
46 | .buf = buf}; | ||
47 | |||
48 | if (i2c_transfer(state->i2c, &msg, 1) != 1) { | ||
49 | warn("I2C write failed reg:%02x", reg); | ||
50 | return -EREMOTEIO; | ||
51 | } | ||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | /* read single register */ | ||
56 | static int ec100_read_reg(struct ec100_state *state, u8 reg, u8 *val) | ||
57 | { | ||
58 | struct i2c_msg msg[2] = { | ||
59 | { | ||
60 | .addr = state->config.demod_address, | ||
61 | .flags = 0, | ||
62 | .len = 1, | ||
63 | .buf = ® | ||
64 | }, { | ||
65 | .addr = state->config.demod_address, | ||
66 | .flags = I2C_M_RD, | ||
67 | .len = 1, | ||
68 | .buf = val | ||
69 | } | ||
70 | }; | ||
71 | |||
72 | if (i2c_transfer(state->i2c, msg, 2) != 2) { | ||
73 | warn("I2C read failed reg:%02x", reg); | ||
74 | return -EREMOTEIO; | ||
75 | } | ||
76 | return 0; | ||
77 | } | ||
78 | |||
79 | static int ec100_set_frontend(struct dvb_frontend *fe, | ||
80 | struct dvb_frontend_parameters *params) | ||
81 | { | ||
82 | struct ec100_state *state = fe->demodulator_priv; | ||
83 | int ret; | ||
84 | u8 tmp, tmp2; | ||
85 | |||
86 | deb_info("%s: freq:%d bw:%d\n", __func__, params->frequency, | ||
87 | params->u.ofdm.bandwidth); | ||
88 | |||
89 | /* program tuner */ | ||
90 | if (fe->ops.tuner_ops.set_params) | ||
91 | fe->ops.tuner_ops.set_params(fe, params); | ||
92 | |||
93 | ret = ec100_write_reg(state, 0x04, 0x06); | ||
94 | if (ret) | ||
95 | goto error; | ||
96 | ret = ec100_write_reg(state, 0x67, 0x58); | ||
97 | if (ret) | ||
98 | goto error; | ||
99 | ret = ec100_write_reg(state, 0x05, 0x18); | ||
100 | if (ret) | ||
101 | goto error; | ||
102 | |||
103 | /* reg/bw | 6 | 7 | 8 | ||
104 | -------+------+------+------ | ||
105 | A 0x1b | 0xa1 | 0xe7 | 0x2c | ||
106 | A 0x1c | 0x55 | 0x63 | 0x72 | ||
107 | -------+------+------+------ | ||
108 | B 0x1b | 0xb7 | 0x00 | 0x49 | ||
109 | B 0x1c | 0x55 | 0x64 | 0x72 */ | ||
110 | |||
111 | switch (params->u.ofdm.bandwidth) { | ||
112 | case BANDWIDTH_6_MHZ: | ||
113 | tmp = 0xb7; | ||
114 | tmp2 = 0x55; | ||
115 | break; | ||
116 | case BANDWIDTH_7_MHZ: | ||
117 | tmp = 0x00; | ||
118 | tmp2 = 0x64; | ||
119 | break; | ||
120 | case BANDWIDTH_8_MHZ: | ||
121 | default: | ||
122 | tmp = 0x49; | ||
123 | tmp2 = 0x72; | ||
124 | } | ||
125 | |||
126 | ret = ec100_write_reg(state, 0x1b, tmp); | ||
127 | if (ret) | ||
128 | goto error; | ||
129 | ret = ec100_write_reg(state, 0x1c, tmp2); | ||
130 | if (ret) | ||
131 | goto error; | ||
132 | |||
133 | ret = ec100_write_reg(state, 0x0c, 0xbb); /* if freq */ | ||
134 | if (ret) | ||
135 | goto error; | ||
136 | ret = ec100_write_reg(state, 0x0d, 0x31); /* if freq */ | ||
137 | if (ret) | ||
138 | goto error; | ||
139 | |||
140 | ret = ec100_write_reg(state, 0x08, 0x24); | ||
141 | if (ret) | ||
142 | goto error; | ||
143 | |||
144 | ret = ec100_write_reg(state, 0x00, 0x00); /* go */ | ||
145 | if (ret) | ||
146 | goto error; | ||
147 | ret = ec100_write_reg(state, 0x00, 0x20); /* go */ | ||
148 | if (ret) | ||
149 | goto error; | ||
150 | |||
151 | return ret; | ||
152 | error: | ||
153 | deb_info("%s: failed:%d\n", __func__, ret); | ||
154 | return ret; | ||
155 | } | ||
156 | |||
157 | static int ec100_get_tune_settings(struct dvb_frontend *fe, | ||
158 | struct dvb_frontend_tune_settings *fesettings) | ||
159 | { | ||
160 | fesettings->min_delay_ms = 300; | ||
161 | fesettings->step_size = 0; | ||
162 | fesettings->max_drift = 0; | ||
163 | |||
164 | return 0; | ||
165 | } | ||
166 | |||
167 | static int ec100_read_status(struct dvb_frontend *fe, fe_status_t *status) | ||
168 | { | ||
169 | struct ec100_state *state = fe->demodulator_priv; | ||
170 | int ret; | ||
171 | u8 tmp; | ||
172 | *status = 0; | ||
173 | |||
174 | ret = ec100_read_reg(state, 0x42, &tmp); | ||
175 | if (ret) | ||
176 | goto error; | ||
177 | |||
178 | if (tmp & 0x80) { | ||
179 | /* bit7 set - have lock */ | ||
180 | *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | | ||
181 | FE_HAS_SYNC | FE_HAS_LOCK; | ||
182 | } else { | ||
183 | ret = ec100_read_reg(state, 0x01, &tmp); | ||
184 | if (ret) | ||
185 | goto error; | ||
186 | |||
187 | if (tmp & 0x10) { | ||
188 | /* bit4 set - have signal */ | ||
189 | *status |= FE_HAS_SIGNAL; | ||
190 | if (!(tmp & 0x01)) { | ||
191 | /* bit0 clear - have ~valid signal */ | ||
192 | *status |= FE_HAS_CARRIER | FE_HAS_VITERBI; | ||
193 | } | ||
194 | } | ||
195 | } | ||
196 | |||
197 | return ret; | ||
198 | error: | ||
199 | deb_info("%s: failed:%d\n", __func__, ret); | ||
200 | return ret; | ||
201 | } | ||
202 | |||
203 | static int ec100_read_ber(struct dvb_frontend *fe, u32 *ber) | ||
204 | { | ||
205 | struct ec100_state *state = fe->demodulator_priv; | ||
206 | int ret; | ||
207 | u8 tmp, tmp2; | ||
208 | u16 ber2; | ||
209 | |||
210 | *ber = 0; | ||
211 | |||
212 | ret = ec100_read_reg(state, 0x65, &tmp); | ||
213 | if (ret) | ||
214 | goto error; | ||
215 | ret = ec100_read_reg(state, 0x66, &tmp2); | ||
216 | if (ret) | ||
217 | goto error; | ||
218 | |||
219 | ber2 = (tmp2 << 8) | tmp; | ||
220 | |||
221 | /* if counter overflow or clear */ | ||
222 | if (ber2 < state->ber) | ||
223 | *ber = ber2; | ||
224 | else | ||
225 | *ber = ber2 - state->ber; | ||
226 | |||
227 | state->ber = ber2; | ||
228 | |||
229 | return ret; | ||
230 | error: | ||
231 | deb_info("%s: failed:%d\n", __func__, ret); | ||
232 | return ret; | ||
233 | } | ||
234 | |||
235 | static int ec100_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | ||
236 | { | ||
237 | struct ec100_state *state = fe->demodulator_priv; | ||
238 | int ret; | ||
239 | u8 tmp; | ||
240 | |||
241 | ret = ec100_read_reg(state, 0x24, &tmp); | ||
242 | if (ret) { | ||
243 | *strength = 0; | ||
244 | goto error; | ||
245 | } | ||
246 | |||
247 | *strength = ((tmp << 8) | tmp); | ||
248 | |||
249 | return ret; | ||
250 | error: | ||
251 | deb_info("%s: failed:%d\n", __func__, ret); | ||
252 | return ret; | ||
253 | } | ||
254 | |||
255 | static int ec100_read_snr(struct dvb_frontend *fe, u16 *snr) | ||
256 | { | ||
257 | *snr = 0; | ||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | static int ec100_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | ||
262 | { | ||
263 | *ucblocks = 0; | ||
264 | return 0; | ||
265 | } | ||
266 | |||
267 | static void ec100_release(struct dvb_frontend *fe) | ||
268 | { | ||
269 | struct ec100_state *state = fe->demodulator_priv; | ||
270 | kfree(state); | ||
271 | } | ||
272 | |||
273 | static struct dvb_frontend_ops ec100_ops; | ||
274 | |||
275 | struct dvb_frontend *ec100_attach(const struct ec100_config *config, | ||
276 | struct i2c_adapter *i2c) | ||
277 | { | ||
278 | int ret; | ||
279 | struct ec100_state *state = NULL; | ||
280 | u8 tmp; | ||
281 | |||
282 | /* allocate memory for the internal state */ | ||
283 | state = kzalloc(sizeof(struct ec100_state), GFP_KERNEL); | ||
284 | if (state == NULL) | ||
285 | goto error; | ||
286 | |||
287 | /* setup the state */ | ||
288 | state->i2c = i2c; | ||
289 | memcpy(&state->config, config, sizeof(struct ec100_config)); | ||
290 | |||
291 | /* check if the demod is there */ | ||
292 | ret = ec100_read_reg(state, 0x33, &tmp); | ||
293 | if (ret || tmp != 0x0b) | ||
294 | goto error; | ||
295 | |||
296 | /* create dvb_frontend */ | ||
297 | memcpy(&state->frontend.ops, &ec100_ops, | ||
298 | sizeof(struct dvb_frontend_ops)); | ||
299 | state->frontend.demodulator_priv = state; | ||
300 | |||
301 | return &state->frontend; | ||
302 | error: | ||
303 | kfree(state); | ||
304 | return NULL; | ||
305 | } | ||
306 | EXPORT_SYMBOL(ec100_attach); | ||
307 | |||
308 | static struct dvb_frontend_ops ec100_ops = { | ||
309 | .info = { | ||
310 | .name = "E3C EC100 DVB-T", | ||
311 | .type = FE_OFDM, | ||
312 | .caps = | ||
313 | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | | ||
314 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | | ||
315 | FE_CAN_QPSK | FE_CAN_QAM_16 | | ||
316 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | | ||
317 | FE_CAN_TRANSMISSION_MODE_AUTO | | ||
318 | FE_CAN_GUARD_INTERVAL_AUTO | | ||
319 | FE_CAN_HIERARCHY_AUTO | | ||
320 | FE_CAN_MUTE_TS | ||
321 | }, | ||
322 | |||
323 | .release = ec100_release, | ||
324 | .set_frontend = ec100_set_frontend, | ||
325 | .get_tune_settings = ec100_get_tune_settings, | ||
326 | .read_status = ec100_read_status, | ||
327 | .read_ber = ec100_read_ber, | ||
328 | .read_signal_strength = ec100_read_signal_strength, | ||
329 | .read_snr = ec100_read_snr, | ||
330 | .read_ucblocks = ec100_read_ucblocks, | ||
331 | }; | ||
332 | |||
333 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); | ||
334 | MODULE_DESCRIPTION("E3C EC100 DVB-T demodulator driver"); | ||
335 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/ec100.h b/drivers/media/dvb/frontends/ec100.h new file mode 100644 index 000000000000..ee8e52417958 --- /dev/null +++ b/drivers/media/dvb/frontends/ec100.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * E3C EC100 demodulator driver | ||
3 | * | ||
4 | * Copyright (C) 2009 Antti Palosaari <crope@iki.fi> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #ifndef EC100_H | ||
23 | #define EC100_H | ||
24 | |||
25 | #include <linux/dvb/frontend.h> | ||
26 | |||
27 | struct ec100_config { | ||
28 | /* demodulator's I2C address */ | ||
29 | u8 demod_address; | ||
30 | }; | ||
31 | |||
32 | |||
33 | #if defined(CONFIG_DVB_EC100) || \ | ||
34 | (defined(CONFIG_DVB_EC100_MODULE) && defined(MODULE)) | ||
35 | extern struct dvb_frontend *ec100_attach(const struct ec100_config *config, | ||
36 | struct i2c_adapter *i2c); | ||
37 | #else | ||
38 | static inline struct dvb_frontend *ec100_attach( | ||
39 | const struct ec100_config *config, struct i2c_adapter *i2c) | ||
40 | { | ||
41 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
42 | return NULL; | ||
43 | } | ||
44 | #endif | ||
45 | |||
46 | #endif /* EC100_H */ | ||
diff --git a/drivers/media/dvb/frontends/ec100_priv.h b/drivers/media/dvb/frontends/ec100_priv.h new file mode 100644 index 000000000000..5c990144bc47 --- /dev/null +++ b/drivers/media/dvb/frontends/ec100_priv.h | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * E3C EC100 demodulator driver | ||
3 | * | ||
4 | * Copyright (C) 2009 Antti Palosaari <crope@iki.fi> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #ifndef EC100_PRIV | ||
23 | #define EC100_PRIV | ||
24 | |||
25 | #define LOG_PREFIX "ec100" | ||
26 | |||
27 | #define dprintk(var, level, args...) \ | ||
28 | do { if ((var & level)) printk(args); } while (0) | ||
29 | |||
30 | #define deb_info(args...) dprintk(ec100_debug, 0x01, args) | ||
31 | |||
32 | #undef err | ||
33 | #define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg) | ||
34 | #undef info | ||
35 | #define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg) | ||
36 | #undef warn | ||
37 | #define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg) | ||
38 | |||
39 | #endif /* EC100_PRIV */ | ||
diff --git a/drivers/media/dvb/frontends/itd1000.c b/drivers/media/dvb/frontends/itd1000.c index 600dad6b41ea..f7a40a18777a 100644 --- a/drivers/media/dvb/frontends/itd1000.c +++ b/drivers/media/dvb/frontends/itd1000.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/dvb/frontend.h> | 25 | #include <linux/dvb/frontend.h> |
26 | #include <linux/i2c.h> | 26 | #include <linux/i2c.h> |
27 | #include <linux/slab.h> | ||
27 | 28 | ||
28 | #include "dvb_frontend.h" | 29 | #include "dvb_frontend.h" |
29 | 30 | ||
diff --git a/drivers/media/dvb/frontends/l64781.c b/drivers/media/dvb/frontends/l64781.c index 3051b64aa17c..445fa1068064 100644 --- a/drivers/media/dvb/frontends/l64781.c +++ b/drivers/media/dvb/frontends/l64781.c | |||
@@ -192,8 +192,8 @@ static int apply_frontend_param (struct dvb_frontend* fe, struct dvb_frontend_pa | |||
192 | spi_bias *= qam_tab[p->constellation]; | 192 | spi_bias *= qam_tab[p->constellation]; |
193 | spi_bias /= p->code_rate_HP + 1; | 193 | spi_bias /= p->code_rate_HP + 1; |
194 | spi_bias /= (guard_tab[p->guard_interval] + 32); | 194 | spi_bias /= (guard_tab[p->guard_interval] + 32); |
195 | spi_bias *= 1000ULL; | 195 | spi_bias *= 1000; |
196 | spi_bias /= 1000ULL + ppm/1000; | 196 | spi_bias /= 1000 + ppm/1000; |
197 | spi_bias *= p->code_rate_HP; | 197 | spi_bias *= p->code_rate_HP; |
198 | 198 | ||
199 | val0x04 = (p->transmission_mode << 2) | p->guard_interval; | 199 | val0x04 = (p->transmission_mode << 2) | p->guard_interval; |
diff --git a/drivers/media/dvb/frontends/lgdt3304.c b/drivers/media/dvb/frontends/lgdt3304.c index e334b5d4e578..45a529b06b9d 100644 --- a/drivers/media/dvb/frontends/lgdt3304.c +++ b/drivers/media/dvb/frontends/lgdt3304.c | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <linux/slab.h> | ||
10 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
11 | #include "dvb_frontend.h" | 12 | #include "dvb_frontend.h" |
12 | #include "lgdt3304.h" | 13 | #include "lgdt3304.h" |
diff --git a/drivers/media/dvb/frontends/lgdt3305.c b/drivers/media/dvb/frontends/lgdt3305.c index fde8c59700fb..d69c775f8645 100644 --- a/drivers/media/dvb/frontends/lgdt3305.c +++ b/drivers/media/dvb/frontends/lgdt3305.c | |||
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | #include <asm/div64.h> | 22 | #include <asm/div64.h> |
23 | #include <linux/dvb/frontend.h> | 23 | #include <linux/dvb/frontend.h> |
24 | #include <linux/slab.h> | ||
24 | #include "dvb_math.h" | 25 | #include "dvb_math.h" |
25 | #include "lgdt3305.h" | 26 | #include "lgdt3305.h" |
26 | 27 | ||
diff --git a/drivers/media/dvb/frontends/lgdt3305.h b/drivers/media/dvb/frontends/lgdt3305.h index 4fa6e52d1fe8..9cb11c9cae53 100644 --- a/drivers/media/dvb/frontends/lgdt3305.h +++ b/drivers/media/dvb/frontends/lgdt3305.h | |||
@@ -54,13 +54,13 @@ struct lgdt3305_config { | |||
54 | u16 usref_qam256; /* default: 0x2a80 */ | 54 | u16 usref_qam256; /* default: 0x2a80 */ |
55 | 55 | ||
56 | /* disable i2c repeater - 0:repeater enabled 1:repeater disabled */ | 56 | /* disable i2c repeater - 0:repeater enabled 1:repeater disabled */ |
57 | int deny_i2c_rptr:1; | 57 | unsigned int deny_i2c_rptr:1; |
58 | 58 | ||
59 | /* spectral inversion - 0:disabled 1:enabled */ | 59 | /* spectral inversion - 0:disabled 1:enabled */ |
60 | int spectral_inversion:1; | 60 | unsigned int spectral_inversion:1; |
61 | 61 | ||
62 | /* use RF AGC loop - 0:disabled 1:enabled */ | 62 | /* use RF AGC loop - 0:disabled 1:enabled */ |
63 | int rf_agc_loop:1; | 63 | unsigned int rf_agc_loop:1; |
64 | 64 | ||
65 | enum lgdt3305_mpeg_mode mpeg_mode; | 65 | enum lgdt3305_mpeg_mode mpeg_mode; |
66 | enum lgdt3305_tp_clock_edge tpclk_edge; | 66 | enum lgdt3305_tp_clock_edge tpclk_edge; |
diff --git a/drivers/media/dvb/frontends/lgdt330x.c b/drivers/media/dvb/frontends/lgdt330x.c index 056387b41a8f..43971e63baa7 100644 --- a/drivers/media/dvb/frontends/lgdt330x.c +++ b/drivers/media/dvb/frontends/lgdt330x.c | |||
@@ -479,7 +479,7 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status) | |||
479 | switch (state->current_modulation) { | 479 | switch (state->current_modulation) { |
480 | case QAM_256: | 480 | case QAM_256: |
481 | case QAM_64: | 481 | case QAM_64: |
482 | /* Need to undestand why there are 3 lock levels here */ | 482 | /* Need to understand why there are 3 lock levels here */ |
483 | if ((buf[0] & 0x07) == 0x07) | 483 | if ((buf[0] & 0x07) == 0x07) |
484 | *status |= FE_HAS_CARRIER; | 484 | *status |= FE_HAS_CARRIER; |
485 | break; | 485 | break; |
@@ -520,7 +520,7 @@ static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status) | |||
520 | switch (state->current_modulation) { | 520 | switch (state->current_modulation) { |
521 | case QAM_256: | 521 | case QAM_256: |
522 | case QAM_64: | 522 | case QAM_64: |
523 | /* Need to undestand why there are 3 lock levels here */ | 523 | /* Need to understand why there are 3 lock levels here */ |
524 | if ((buf[0] & 0x07) == 0x07) | 524 | if ((buf[0] & 0x07) == 0x07) |
525 | *status |= FE_HAS_CARRIER; | 525 | *status |= FE_HAS_CARRIER; |
526 | else | 526 | else |
diff --git a/drivers/media/dvb/frontends/lgs8gxx.c b/drivers/media/dvb/frontends/lgs8gxx.c index eabcadc425d5..dee53960e7e8 100644 --- a/drivers/media/dvb/frontends/lgs8gxx.c +++ b/drivers/media/dvb/frontends/lgs8gxx.c | |||
@@ -199,7 +199,7 @@ static int lgs8gxx_set_if_freq(struct lgs8gxx_state *priv, u32 freq /*in kHz*/) | |||
199 | 199 | ||
200 | val = freq; | 200 | val = freq; |
201 | if (freq != 0) { | 201 | if (freq != 0) { |
202 | val *= (u64)1 << 32; | 202 | val <<= 32; |
203 | if (if_clk != 0) | 203 | if (if_clk != 0) |
204 | do_div(val, if_clk); | 204 | do_div(val, if_clk); |
205 | v32 = val & 0xFFFFFFFF; | 205 | v32 = val & 0xFFFFFFFF; |
@@ -246,7 +246,7 @@ static int lgs8gxx_get_afc_phase(struct lgs8gxx_state *priv) | |||
246 | 246 | ||
247 | val = v32; | 247 | val = v32; |
248 | val *= priv->config->if_clk_freq; | 248 | val *= priv->config->if_clk_freq; |
249 | val /= (u64)1 << 32; | 249 | val >>= 32; |
250 | dprintk("AFC = %u kHz\n", (u32)val); | 250 | dprintk("AFC = %u kHz\n", (u32)val); |
251 | return 0; | 251 | return 0; |
252 | } | 252 | } |
diff --git a/drivers/media/dvb/frontends/lnbp21.c b/drivers/media/dvb/frontends/lnbp21.c index 71f607fe8fc7..13437259eeac 100644 --- a/drivers/media/dvb/frontends/lnbp21.c +++ b/drivers/media/dvb/frontends/lnbp21.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * lnbp21.c - driver for lnb supply and control ic lnbp21 | 2 | * lnbp21.c - driver for lnb supply and control ic lnbp21 |
3 | * | 3 | * |
4 | * Copyright (C) 2006 Oliver Endriss | 4 | * Copyright (C) 2006, 2009 Oliver Endriss <o.endriss@gmx.de> |
5 | * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru> | 5 | * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
@@ -91,6 +91,31 @@ static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg) | |||
91 | return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; | 91 | return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; |
92 | } | 92 | } |
93 | 93 | ||
94 | static int lnbp21_set_tone(struct dvb_frontend *fe, | ||
95 | fe_sec_tone_mode_t tone) | ||
96 | { | ||
97 | struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->sec_priv; | ||
98 | struct i2c_msg msg = { .addr = lnbp21->i2c_addr, .flags = 0, | ||
99 | .buf = &lnbp21->config, | ||
100 | .len = sizeof(lnbp21->config) }; | ||
101 | |||
102 | switch (tone) { | ||
103 | case SEC_TONE_OFF: | ||
104 | lnbp21->config &= ~LNBP21_TEN; | ||
105 | break; | ||
106 | case SEC_TONE_ON: | ||
107 | lnbp21->config |= LNBP21_TEN; | ||
108 | break; | ||
109 | default: | ||
110 | return -EINVAL; | ||
111 | }; | ||
112 | |||
113 | lnbp21->config |= lnbp21->override_or; | ||
114 | lnbp21->config &= lnbp21->override_and; | ||
115 | |||
116 | return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; | ||
117 | } | ||
118 | |||
94 | static void lnbp21_release(struct dvb_frontend *fe) | 119 | static void lnbp21_release(struct dvb_frontend *fe) |
95 | { | 120 | { |
96 | /* LNBP power off */ | 121 | /* LNBP power off */ |
@@ -133,6 +158,8 @@ static struct dvb_frontend *lnbx2x_attach(struct dvb_frontend *fe, | |||
133 | /* override frontend ops */ | 158 | /* override frontend ops */ |
134 | fe->ops.set_voltage = lnbp21_set_voltage; | 159 | fe->ops.set_voltage = lnbp21_set_voltage; |
135 | fe->ops.enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; | 160 | fe->ops.enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; |
161 | if (!(override_clear & LNBH24_TEN)) /*22kHz logic controlled by demod*/ | ||
162 | fe->ops.set_tone = lnbp21_set_tone; | ||
136 | printk(KERN_INFO "LNBx2x attached on addr=%x\n", lnbp21->i2c_addr); | 163 | printk(KERN_INFO "LNBx2x attached on addr=%x\n", lnbp21->i2c_addr); |
137 | 164 | ||
138 | return fe; | 165 | return fe; |
diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c new file mode 100644 index 000000000000..599d1aa519a3 --- /dev/null +++ b/drivers/media/dvb/frontends/mb86a16.c | |||
@@ -0,0 +1,1879 @@ | |||
1 | /* | ||
2 | Fujitsu MB86A16 DVB-S/DSS DC Receiver driver | ||
3 | |||
4 | Copyright (C) Manu Abraham (abraham.manu@gmail.com) | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/moduleparam.h> | ||
25 | #include <linux/slab.h> | ||
26 | |||
27 | #include "dvb_frontend.h" | ||
28 | #include "mb86a16.h" | ||
29 | #include "mb86a16_priv.h" | ||
30 | |||
31 | unsigned int verbose = 5; | ||
32 | module_param(verbose, int, 0644); | ||
33 | |||
34 | #define ABS(x) ((x) < 0 ? (-x) : (x)) | ||
35 | |||
36 | struct mb86a16_state { | ||
37 | struct i2c_adapter *i2c_adap; | ||
38 | const struct mb86a16_config *config; | ||
39 | struct dvb_frontend frontend; | ||
40 | |||
41 | /* tuning parameters */ | ||
42 | int frequency; | ||
43 | int srate; | ||
44 | |||
45 | /* Internal stuff */ | ||
46 | int master_clk; | ||
47 | int deci; | ||
48 | int csel; | ||
49 | int rsel; | ||
50 | }; | ||
51 | |||
52 | #define MB86A16_ERROR 0 | ||
53 | #define MB86A16_NOTICE 1 | ||
54 | #define MB86A16_INFO 2 | ||
55 | #define MB86A16_DEBUG 3 | ||
56 | |||
57 | #define dprintk(x, y, z, format, arg...) do { \ | ||
58 | if (z) { \ | ||
59 | if ((x > MB86A16_ERROR) && (x > y)) \ | ||
60 | printk(KERN_ERR "%s: " format "\n", __func__, ##arg); \ | ||
61 | else if ((x > MB86A16_NOTICE) && (x > y)) \ | ||
62 | printk(KERN_NOTICE "%s: " format "\n", __func__, ##arg); \ | ||
63 | else if ((x > MB86A16_INFO) && (x > y)) \ | ||
64 | printk(KERN_INFO "%s: " format "\n", __func__, ##arg); \ | ||
65 | else if ((x > MB86A16_DEBUG) && (x > y)) \ | ||
66 | printk(KERN_DEBUG "%s: " format "\n", __func__, ##arg); \ | ||
67 | } else { \ | ||
68 | if (x > y) \ | ||
69 | printk(format, ##arg); \ | ||
70 | } \ | ||
71 | } while (0) | ||
72 | |||
73 | #define TRACE_IN dprintk(verbose, MB86A16_DEBUG, 1, "-->()") | ||
74 | #define TRACE_OUT dprintk(verbose, MB86A16_DEBUG, 1, "()-->") | ||
75 | |||
76 | static int mb86a16_write(struct mb86a16_state *state, u8 reg, u8 val) | ||
77 | { | ||
78 | int ret; | ||
79 | u8 buf[] = { reg, val }; | ||
80 | |||
81 | struct i2c_msg msg = { | ||
82 | .addr = state->config->demod_address, | ||
83 | .flags = 0, | ||
84 | .buf = buf, | ||
85 | .len = 2 | ||
86 | }; | ||
87 | |||
88 | dprintk(verbose, MB86A16_DEBUG, 1, | ||
89 | "writing to [0x%02x],Reg[0x%02x],Data[0x%02x]", | ||
90 | state->config->demod_address, buf[0], buf[1]); | ||
91 | |||
92 | ret = i2c_transfer(state->i2c_adap, &msg, 1); | ||
93 | |||
94 | return (ret != 1) ? -EREMOTEIO : 0; | ||
95 | } | ||
96 | |||
97 | static int mb86a16_read(struct mb86a16_state *state, u8 reg, u8 *val) | ||
98 | { | ||
99 | int ret; | ||
100 | u8 b0[] = { reg }; | ||
101 | u8 b1[] = { 0 }; | ||
102 | |||
103 | struct i2c_msg msg[] = { | ||
104 | { | ||
105 | .addr = state->config->demod_address, | ||
106 | .flags = 0, | ||
107 | .buf = b0, | ||
108 | .len = 1 | ||
109 | }, { | ||
110 | .addr = state->config->demod_address, | ||
111 | .flags = I2C_M_RD, | ||
112 | .buf = b1, | ||
113 | .len = 1 | ||
114 | } | ||
115 | }; | ||
116 | ret = i2c_transfer(state->i2c_adap, msg, 2); | ||
117 | if (ret != 2) { | ||
118 | dprintk(verbose, MB86A16_ERROR, 1, "read error(reg=0x%02x, ret=0x%i)", | ||
119 | reg, ret); | ||
120 | |||
121 | return -EREMOTEIO; | ||
122 | } | ||
123 | *val = b1[0]; | ||
124 | |||
125 | return ret; | ||
126 | } | ||
127 | |||
128 | static int CNTM_set(struct mb86a16_state *state, | ||
129 | unsigned char timint1, | ||
130 | unsigned char timint2, | ||
131 | unsigned char cnext) | ||
132 | { | ||
133 | unsigned char val; | ||
134 | |||
135 | val = (timint1 << 4) | (timint2 << 2) | cnext; | ||
136 | if (mb86a16_write(state, MB86A16_CNTMR, val) < 0) | ||
137 | goto err; | ||
138 | |||
139 | return 0; | ||
140 | |||
141 | err: | ||
142 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
143 | return -EREMOTEIO; | ||
144 | } | ||
145 | |||
146 | static int smrt_set(struct mb86a16_state *state, int rate) | ||
147 | { | ||
148 | int tmp ; | ||
149 | int m ; | ||
150 | unsigned char STOFS0, STOFS1; | ||
151 | |||
152 | m = 1 << state->deci; | ||
153 | tmp = (8192 * state->master_clk - 2 * m * rate * 8192 + state->master_clk / 2) / state->master_clk; | ||
154 | |||
155 | STOFS0 = tmp & 0x0ff; | ||
156 | STOFS1 = (tmp & 0xf00) >> 8; | ||
157 | |||
158 | if (mb86a16_write(state, MB86A16_SRATE1, (state->deci << 2) | | ||
159 | (state->csel << 1) | | ||
160 | state->rsel) < 0) | ||
161 | goto err; | ||
162 | if (mb86a16_write(state, MB86A16_SRATE2, STOFS0) < 0) | ||
163 | goto err; | ||
164 | if (mb86a16_write(state, MB86A16_SRATE3, STOFS1) < 0) | ||
165 | goto err; | ||
166 | |||
167 | return 0; | ||
168 | err: | ||
169 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
170 | return -1; | ||
171 | } | ||
172 | |||
173 | static int srst(struct mb86a16_state *state) | ||
174 | { | ||
175 | if (mb86a16_write(state, MB86A16_RESET, 0x04) < 0) | ||
176 | goto err; | ||
177 | |||
178 | return 0; | ||
179 | err: | ||
180 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
181 | return -EREMOTEIO; | ||
182 | |||
183 | } | ||
184 | |||
185 | static int afcex_data_set(struct mb86a16_state *state, | ||
186 | unsigned char AFCEX_L, | ||
187 | unsigned char AFCEX_H) | ||
188 | { | ||
189 | if (mb86a16_write(state, MB86A16_AFCEXL, AFCEX_L) < 0) | ||
190 | goto err; | ||
191 | if (mb86a16_write(state, MB86A16_AFCEXH, AFCEX_H) < 0) | ||
192 | goto err; | ||
193 | |||
194 | return 0; | ||
195 | err: | ||
196 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
197 | |||
198 | return -1; | ||
199 | } | ||
200 | |||
201 | static int afcofs_data_set(struct mb86a16_state *state, | ||
202 | unsigned char AFCEX_L, | ||
203 | unsigned char AFCEX_H) | ||
204 | { | ||
205 | if (mb86a16_write(state, 0x58, AFCEX_L) < 0) | ||
206 | goto err; | ||
207 | if (mb86a16_write(state, 0x59, AFCEX_H) < 0) | ||
208 | goto err; | ||
209 | |||
210 | return 0; | ||
211 | err: | ||
212 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
213 | return -EREMOTEIO; | ||
214 | } | ||
215 | |||
216 | static int stlp_set(struct mb86a16_state *state, | ||
217 | unsigned char STRAS, | ||
218 | unsigned char STRBS) | ||
219 | { | ||
220 | if (mb86a16_write(state, MB86A16_STRFILTCOEF1, (STRBS << 3) | (STRAS)) < 0) | ||
221 | goto err; | ||
222 | |||
223 | return 0; | ||
224 | err: | ||
225 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
226 | return -EREMOTEIO; | ||
227 | } | ||
228 | |||
229 | static int Vi_set(struct mb86a16_state *state, unsigned char ETH, unsigned char VIA) | ||
230 | { | ||
231 | if (mb86a16_write(state, MB86A16_VISET2, 0x04) < 0) | ||
232 | goto err; | ||
233 | if (mb86a16_write(state, MB86A16_VISET3, 0xf5) < 0) | ||
234 | goto err; | ||
235 | |||
236 | return 0; | ||
237 | err: | ||
238 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
239 | return -EREMOTEIO; | ||
240 | } | ||
241 | |||
242 | static int initial_set(struct mb86a16_state *state) | ||
243 | { | ||
244 | if (stlp_set(state, 5, 7)) | ||
245 | goto err; | ||
246 | |||
247 | udelay(100); | ||
248 | if (afcex_data_set(state, 0, 0)) | ||
249 | goto err; | ||
250 | |||
251 | udelay(100); | ||
252 | if (afcofs_data_set(state, 0, 0)) | ||
253 | goto err; | ||
254 | |||
255 | udelay(100); | ||
256 | if (mb86a16_write(state, MB86A16_CRLFILTCOEF1, 0x16) < 0) | ||
257 | goto err; | ||
258 | if (mb86a16_write(state, 0x2f, 0x21) < 0) | ||
259 | goto err; | ||
260 | if (mb86a16_write(state, MB86A16_VIMAG, 0x38) < 0) | ||
261 | goto err; | ||
262 | if (mb86a16_write(state, MB86A16_FAGCS1, 0x00) < 0) | ||
263 | goto err; | ||
264 | if (mb86a16_write(state, MB86A16_FAGCS2, 0x1c) < 0) | ||
265 | goto err; | ||
266 | if (mb86a16_write(state, MB86A16_FAGCS3, 0x20) < 0) | ||
267 | goto err; | ||
268 | if (mb86a16_write(state, MB86A16_FAGCS4, 0x1e) < 0) | ||
269 | goto err; | ||
270 | if (mb86a16_write(state, MB86A16_FAGCS5, 0x23) < 0) | ||
271 | goto err; | ||
272 | if (mb86a16_write(state, 0x54, 0xff) < 0) | ||
273 | goto err; | ||
274 | if (mb86a16_write(state, MB86A16_TSOUT, 0x00) < 0) | ||
275 | goto err; | ||
276 | |||
277 | return 0; | ||
278 | |||
279 | err: | ||
280 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
281 | return -EREMOTEIO; | ||
282 | } | ||
283 | |||
284 | static int S01T_set(struct mb86a16_state *state, | ||
285 | unsigned char s1t, | ||
286 | unsigned s0t) | ||
287 | { | ||
288 | if (mb86a16_write(state, 0x33, (s1t << 3) | s0t) < 0) | ||
289 | goto err; | ||
290 | |||
291 | return 0; | ||
292 | err: | ||
293 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
294 | return -EREMOTEIO; | ||
295 | } | ||
296 | |||
297 | |||
298 | static int EN_set(struct mb86a16_state *state, | ||
299 | int cren, | ||
300 | int afcen) | ||
301 | { | ||
302 | unsigned char val; | ||
303 | |||
304 | val = 0x7a | (cren << 7) | (afcen << 2); | ||
305 | if (mb86a16_write(state, 0x49, val) < 0) | ||
306 | goto err; | ||
307 | |||
308 | return 0; | ||
309 | err: | ||
310 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
311 | return -EREMOTEIO; | ||
312 | } | ||
313 | |||
314 | static int AFCEXEN_set(struct mb86a16_state *state, | ||
315 | int afcexen, | ||
316 | int smrt) | ||
317 | { | ||
318 | unsigned char AFCA ; | ||
319 | |||
320 | if (smrt > 18875) | ||
321 | AFCA = 4; | ||
322 | else if (smrt > 9375) | ||
323 | AFCA = 3; | ||
324 | else if (smrt > 2250) | ||
325 | AFCA = 2; | ||
326 | else | ||
327 | AFCA = 1; | ||
328 | |||
329 | if (mb86a16_write(state, 0x2a, 0x02 | (afcexen << 5) | (AFCA << 2)) < 0) | ||
330 | goto err; | ||
331 | |||
332 | return 0; | ||
333 | |||
334 | err: | ||
335 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
336 | return -EREMOTEIO; | ||
337 | } | ||
338 | |||
339 | static int DAGC_data_set(struct mb86a16_state *state, | ||
340 | unsigned char DAGCA, | ||
341 | unsigned char DAGCW) | ||
342 | { | ||
343 | if (mb86a16_write(state, 0x2d, (DAGCA << 3) | DAGCW) < 0) | ||
344 | goto err; | ||
345 | |||
346 | return 0; | ||
347 | |||
348 | err: | ||
349 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
350 | return -EREMOTEIO; | ||
351 | } | ||
352 | |||
353 | static void smrt_info_get(struct mb86a16_state *state, int rate) | ||
354 | { | ||
355 | if (rate >= 37501) { | ||
356 | state->deci = 0; state->csel = 0; state->rsel = 0; | ||
357 | } else if (rate >= 30001) { | ||
358 | state->deci = 0; state->csel = 0; state->rsel = 1; | ||
359 | } else if (rate >= 26251) { | ||
360 | state->deci = 0; state->csel = 1; state->rsel = 0; | ||
361 | } else if (rate >= 22501) { | ||
362 | state->deci = 0; state->csel = 1; state->rsel = 1; | ||
363 | } else if (rate >= 18751) { | ||
364 | state->deci = 1; state->csel = 0; state->rsel = 0; | ||
365 | } else if (rate >= 15001) { | ||
366 | state->deci = 1; state->csel = 0; state->rsel = 1; | ||
367 | } else if (rate >= 13126) { | ||
368 | state->deci = 1; state->csel = 1; state->rsel = 0; | ||
369 | } else if (rate >= 11251) { | ||
370 | state->deci = 1; state->csel = 1; state->rsel = 1; | ||
371 | } else if (rate >= 9376) { | ||
372 | state->deci = 2; state->csel = 0; state->rsel = 0; | ||
373 | } else if (rate >= 7501) { | ||
374 | state->deci = 2; state->csel = 0; state->rsel = 1; | ||
375 | } else if (rate >= 6563) { | ||
376 | state->deci = 2; state->csel = 1; state->rsel = 0; | ||
377 | } else if (rate >= 5626) { | ||
378 | state->deci = 2; state->csel = 1; state->rsel = 1; | ||
379 | } else if (rate >= 4688) { | ||
380 | state->deci = 3; state->csel = 0; state->rsel = 0; | ||
381 | } else if (rate >= 3751) { | ||
382 | state->deci = 3; state->csel = 0; state->rsel = 1; | ||
383 | } else if (rate >= 3282) { | ||
384 | state->deci = 3; state->csel = 1; state->rsel = 0; | ||
385 | } else if (rate >= 2814) { | ||
386 | state->deci = 3; state->csel = 1; state->rsel = 1; | ||
387 | } else if (rate >= 2344) { | ||
388 | state->deci = 4; state->csel = 0; state->rsel = 0; | ||
389 | } else if (rate >= 1876) { | ||
390 | state->deci = 4; state->csel = 0; state->rsel = 1; | ||
391 | } else if (rate >= 1641) { | ||
392 | state->deci = 4; state->csel = 1; state->rsel = 0; | ||
393 | } else if (rate >= 1407) { | ||
394 | state->deci = 4; state->csel = 1; state->rsel = 1; | ||
395 | } else if (rate >= 1172) { | ||
396 | state->deci = 5; state->csel = 0; state->rsel = 0; | ||
397 | } else if (rate >= 939) { | ||
398 | state->deci = 5; state->csel = 0; state->rsel = 1; | ||
399 | } else if (rate >= 821) { | ||
400 | state->deci = 5; state->csel = 1; state->rsel = 0; | ||
401 | } else { | ||
402 | state->deci = 5; state->csel = 1; state->rsel = 1; | ||
403 | } | ||
404 | |||
405 | if (state->csel == 0) | ||
406 | state->master_clk = 92000; | ||
407 | else | ||
408 | state->master_clk = 61333; | ||
409 | |||
410 | } | ||
411 | |||
412 | static int signal_det(struct mb86a16_state *state, | ||
413 | int smrt, | ||
414 | unsigned char *SIG) | ||
415 | { | ||
416 | |||
417 | int ret ; | ||
418 | int smrtd ; | ||
419 | int wait_sym ; | ||
420 | |||
421 | u32 wait_t; | ||
422 | unsigned char S[3] ; | ||
423 | int i ; | ||
424 | |||
425 | if (*SIG > 45) { | ||
426 | if (CNTM_set(state, 2, 1, 2) < 0) { | ||
427 | dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error"); | ||
428 | return -1; | ||
429 | } | ||
430 | wait_sym = 40000; | ||
431 | } else { | ||
432 | if (CNTM_set(state, 3, 1, 2) < 0) { | ||
433 | dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error"); | ||
434 | return -1; | ||
435 | } | ||
436 | wait_sym = 80000; | ||
437 | } | ||
438 | for (i = 0; i < 3; i++) { | ||
439 | if (i == 0) | ||
440 | smrtd = smrt * 98 / 100; | ||
441 | else if (i == 1) | ||
442 | smrtd = smrt; | ||
443 | else | ||
444 | smrtd = smrt * 102 / 100; | ||
445 | smrt_info_get(state, smrtd); | ||
446 | smrt_set(state, smrtd); | ||
447 | srst(state); | ||
448 | wait_t = (wait_sym + 99 * smrtd / 100) / smrtd; | ||
449 | if (wait_t == 0) | ||
450 | wait_t = 1; | ||
451 | msleep_interruptible(10); | ||
452 | if (mb86a16_read(state, 0x37, &(S[i])) != 2) { | ||
453 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
454 | return -EREMOTEIO; | ||
455 | } | ||
456 | } | ||
457 | if ((S[1] > S[0] * 112 / 100) && | ||
458 | (S[1] > S[2] * 112 / 100)) { | ||
459 | |||
460 | ret = 1; | ||
461 | } else { | ||
462 | ret = 0; | ||
463 | } | ||
464 | *SIG = S[1]; | ||
465 | |||
466 | if (CNTM_set(state, 0, 1, 2) < 0) { | ||
467 | dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error"); | ||
468 | return -1; | ||
469 | } | ||
470 | |||
471 | return ret; | ||
472 | } | ||
473 | |||
474 | static int rf_val_set(struct mb86a16_state *state, | ||
475 | int f, | ||
476 | int smrt, | ||
477 | unsigned char R) | ||
478 | { | ||
479 | unsigned char C, F, B; | ||
480 | int M; | ||
481 | unsigned char rf_val[5]; | ||
482 | int ack = -1; | ||
483 | |||
484 | if (smrt > 37750) | ||
485 | C = 1; | ||
486 | else if (smrt > 18875) | ||
487 | C = 2; | ||
488 | else if (smrt > 5500) | ||
489 | C = 3; | ||
490 | else | ||
491 | C = 4; | ||
492 | |||
493 | if (smrt > 30500) | ||
494 | F = 3; | ||
495 | else if (smrt > 9375) | ||
496 | F = 1; | ||
497 | else if (smrt > 4625) | ||
498 | F = 0; | ||
499 | else | ||
500 | F = 2; | ||
501 | |||
502 | if (f < 1060) | ||
503 | B = 0; | ||
504 | else if (f < 1175) | ||
505 | B = 1; | ||
506 | else if (f < 1305) | ||
507 | B = 2; | ||
508 | else if (f < 1435) | ||
509 | B = 3; | ||
510 | else if (f < 1570) | ||
511 | B = 4; | ||
512 | else if (f < 1715) | ||
513 | B = 5; | ||
514 | else if (f < 1845) | ||
515 | B = 6; | ||
516 | else if (f < 1980) | ||
517 | B = 7; | ||
518 | else if (f < 2080) | ||
519 | B = 8; | ||
520 | else | ||
521 | B = 9; | ||
522 | |||
523 | M = f * (1 << R) / 2; | ||
524 | |||
525 | rf_val[0] = 0x01 | (C << 3) | (F << 1); | ||
526 | rf_val[1] = (R << 5) | ((M & 0x1f000) >> 12); | ||
527 | rf_val[2] = (M & 0x00ff0) >> 4; | ||
528 | rf_val[3] = ((M & 0x0000f) << 4) | B; | ||
529 | |||
530 | /* Frequency Set */ | ||
531 | if (mb86a16_write(state, 0x21, rf_val[0]) < 0) | ||
532 | ack = 0; | ||
533 | if (mb86a16_write(state, 0x22, rf_val[1]) < 0) | ||
534 | ack = 0; | ||
535 | if (mb86a16_write(state, 0x23, rf_val[2]) < 0) | ||
536 | ack = 0; | ||
537 | if (mb86a16_write(state, 0x24, rf_val[3]) < 0) | ||
538 | ack = 0; | ||
539 | if (mb86a16_write(state, 0x25, 0x01) < 0) | ||
540 | ack = 0; | ||
541 | if (ack == 0) { | ||
542 | dprintk(verbose, MB86A16_ERROR, 1, "RF Setup - I2C transfer error"); | ||
543 | return -EREMOTEIO; | ||
544 | } | ||
545 | |||
546 | return 0; | ||
547 | } | ||
548 | |||
549 | static int afcerr_chk(struct mb86a16_state *state) | ||
550 | { | ||
551 | unsigned char AFCM_L, AFCM_H ; | ||
552 | int AFCM ; | ||
553 | int afcm, afcerr ; | ||
554 | |||
555 | if (mb86a16_read(state, 0x0e, &AFCM_L) != 2) | ||
556 | goto err; | ||
557 | if (mb86a16_read(state, 0x0f, &AFCM_H) != 2) | ||
558 | goto err; | ||
559 | |||
560 | AFCM = (AFCM_H << 8) + AFCM_L; | ||
561 | |||
562 | if (AFCM > 2048) | ||
563 | afcm = AFCM - 4096; | ||
564 | else | ||
565 | afcm = AFCM; | ||
566 | afcerr = afcm * state->master_clk / 8192; | ||
567 | |||
568 | return afcerr; | ||
569 | |||
570 | err: | ||
571 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
572 | return -EREMOTEIO; | ||
573 | } | ||
574 | |||
575 | static int dagcm_val_get(struct mb86a16_state *state) | ||
576 | { | ||
577 | int DAGCM; | ||
578 | unsigned char DAGCM_H, DAGCM_L; | ||
579 | |||
580 | if (mb86a16_read(state, 0x45, &DAGCM_L) != 2) | ||
581 | goto err; | ||
582 | if (mb86a16_read(state, 0x46, &DAGCM_H) != 2) | ||
583 | goto err; | ||
584 | |||
585 | DAGCM = (DAGCM_H << 8) + DAGCM_L; | ||
586 | |||
587 | return DAGCM; | ||
588 | |||
589 | err: | ||
590 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
591 | return -EREMOTEIO; | ||
592 | } | ||
593 | |||
594 | static int mb86a16_read_status(struct dvb_frontend *fe, fe_status_t *status) | ||
595 | { | ||
596 | u8 stat, stat2; | ||
597 | struct mb86a16_state *state = fe->demodulator_priv; | ||
598 | |||
599 | *status = 0; | ||
600 | |||
601 | if (mb86a16_read(state, MB86A16_SIG1, &stat) != 2) | ||
602 | goto err; | ||
603 | if (mb86a16_read(state, MB86A16_SIG2, &stat2) != 2) | ||
604 | goto err; | ||
605 | if ((stat > 25) && (stat2 > 25)) | ||
606 | *status |= FE_HAS_SIGNAL; | ||
607 | if ((stat > 45) && (stat2 > 45)) | ||
608 | *status |= FE_HAS_CARRIER; | ||
609 | |||
610 | if (mb86a16_read(state, MB86A16_STATUS, &stat) != 2) | ||
611 | goto err; | ||
612 | |||
613 | if (stat & 0x01) | ||
614 | *status |= FE_HAS_SYNC; | ||
615 | if (stat & 0x01) | ||
616 | *status |= FE_HAS_VITERBI; | ||
617 | |||
618 | if (mb86a16_read(state, MB86A16_FRAMESYNC, &stat) != 2) | ||
619 | goto err; | ||
620 | |||
621 | if ((stat & 0x0f) && (*status & FE_HAS_VITERBI)) | ||
622 | *status |= FE_HAS_LOCK; | ||
623 | |||
624 | return 0; | ||
625 | |||
626 | err: | ||
627 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
628 | return -EREMOTEIO; | ||
629 | } | ||
630 | |||
631 | static int sync_chk(struct mb86a16_state *state, | ||
632 | unsigned char *VIRM) | ||
633 | { | ||
634 | unsigned char val; | ||
635 | int sync; | ||
636 | |||
637 | if (mb86a16_read(state, 0x0d, &val) != 2) | ||
638 | goto err; | ||
639 | |||
640 | dprintk(verbose, MB86A16_INFO, 1, "Status = %02x,", val); | ||
641 | sync = val & 0x01; | ||
642 | *VIRM = (val & 0x1c) >> 2; | ||
643 | |||
644 | return sync; | ||
645 | err: | ||
646 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
647 | return -EREMOTEIO; | ||
648 | |||
649 | } | ||
650 | |||
651 | static int freqerr_chk(struct mb86a16_state *state, | ||
652 | int fTP, | ||
653 | int smrt, | ||
654 | int unit) | ||
655 | { | ||
656 | unsigned char CRM, AFCML, AFCMH; | ||
657 | unsigned char temp1, temp2, temp3; | ||
658 | int crm, afcm, AFCM; | ||
659 | int crrerr, afcerr; /* kHz */ | ||
660 | int frqerr; /* MHz */ | ||
661 | int afcen, afcexen = 0; | ||
662 | int R, M, fOSC, fOSC_OFS; | ||
663 | |||
664 | if (mb86a16_read(state, 0x43, &CRM) != 2) | ||
665 | goto err; | ||
666 | |||
667 | if (CRM > 127) | ||
668 | crm = CRM - 256; | ||
669 | else | ||
670 | crm = CRM; | ||
671 | |||
672 | crrerr = smrt * crm / 256; | ||
673 | if (mb86a16_read(state, 0x49, &temp1) != 2) | ||
674 | goto err; | ||
675 | |||
676 | afcen = (temp1 & 0x04) >> 2; | ||
677 | if (afcen == 0) { | ||
678 | if (mb86a16_read(state, 0x2a, &temp1) != 2) | ||
679 | goto err; | ||
680 | afcexen = (temp1 & 0x20) >> 5; | ||
681 | } | ||
682 | |||
683 | if (afcen == 1) { | ||
684 | if (mb86a16_read(state, 0x0e, &AFCML) != 2) | ||
685 | goto err; | ||
686 | if (mb86a16_read(state, 0x0f, &AFCMH) != 2) | ||
687 | goto err; | ||
688 | } else if (afcexen == 1) { | ||
689 | if (mb86a16_read(state, 0x2b, &AFCML) != 2) | ||
690 | goto err; | ||
691 | if (mb86a16_read(state, 0x2c, &AFCMH) != 2) | ||
692 | goto err; | ||
693 | } | ||
694 | if ((afcen == 1) || (afcexen == 1)) { | ||
695 | smrt_info_get(state, smrt); | ||
696 | AFCM = ((AFCMH & 0x01) << 8) + AFCML; | ||
697 | if (AFCM > 255) | ||
698 | afcm = AFCM - 512; | ||
699 | else | ||
700 | afcm = AFCM; | ||
701 | |||
702 | afcerr = afcm * state->master_clk / 8192; | ||
703 | } else | ||
704 | afcerr = 0; | ||
705 | |||
706 | if (mb86a16_read(state, 0x22, &temp1) != 2) | ||
707 | goto err; | ||
708 | if (mb86a16_read(state, 0x23, &temp2) != 2) | ||
709 | goto err; | ||
710 | if (mb86a16_read(state, 0x24, &temp3) != 2) | ||
711 | goto err; | ||
712 | |||
713 | R = (temp1 & 0xe0) >> 5; | ||
714 | M = ((temp1 & 0x1f) << 12) + (temp2 << 4) + (temp3 >> 4); | ||
715 | if (R == 0) | ||
716 | fOSC = 2 * M; | ||
717 | else | ||
718 | fOSC = M; | ||
719 | |||
720 | fOSC_OFS = fOSC - fTP; | ||
721 | |||
722 | if (unit == 0) { /* MHz */ | ||
723 | if (crrerr + afcerr + fOSC_OFS * 1000 >= 0) | ||
724 | frqerr = (crrerr + afcerr + fOSC_OFS * 1000 + 500) / 1000; | ||
725 | else | ||
726 | frqerr = (crrerr + afcerr + fOSC_OFS * 1000 - 500) / 1000; | ||
727 | } else { /* kHz */ | ||
728 | frqerr = crrerr + afcerr + fOSC_OFS * 1000; | ||
729 | } | ||
730 | |||
731 | return frqerr; | ||
732 | err: | ||
733 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
734 | return -EREMOTEIO; | ||
735 | } | ||
736 | |||
737 | static unsigned char vco_dev_get(struct mb86a16_state *state, int smrt) | ||
738 | { | ||
739 | unsigned char R; | ||
740 | |||
741 | if (smrt > 9375) | ||
742 | R = 0; | ||
743 | else | ||
744 | R = 1; | ||
745 | |||
746 | return R; | ||
747 | } | ||
748 | |||
749 | static void swp_info_get(struct mb86a16_state *state, | ||
750 | int fOSC_start, | ||
751 | int smrt, | ||
752 | int v, int R, | ||
753 | int swp_ofs, | ||
754 | int *fOSC, | ||
755 | int *afcex_freq, | ||
756 | unsigned char *AFCEX_L, | ||
757 | unsigned char *AFCEX_H) | ||
758 | { | ||
759 | int AFCEX ; | ||
760 | int crnt_swp_freq ; | ||
761 | |||
762 | crnt_swp_freq = fOSC_start * 1000 + v * swp_ofs; | ||
763 | |||
764 | if (R == 0) | ||
765 | *fOSC = (crnt_swp_freq + 1000) / 2000 * 2; | ||
766 | else | ||
767 | *fOSC = (crnt_swp_freq + 500) / 1000; | ||
768 | |||
769 | if (*fOSC >= crnt_swp_freq) | ||
770 | *afcex_freq = *fOSC * 1000 - crnt_swp_freq; | ||
771 | else | ||
772 | *afcex_freq = crnt_swp_freq - *fOSC * 1000; | ||
773 | |||
774 | AFCEX = *afcex_freq * 8192 / state->master_clk; | ||
775 | *AFCEX_L = AFCEX & 0x00ff; | ||
776 | *AFCEX_H = (AFCEX & 0x0f00) >> 8; | ||
777 | } | ||
778 | |||
779 | |||
780 | static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V, int vmax, int vmin, | ||
781 | int SIGMIN, int fOSC, int afcex_freq, int swp_ofs, unsigned char *SIG1) | ||
782 | { | ||
783 | int swp_freq ; | ||
784 | |||
785 | if ((i % 2 == 1) && (v <= vmax)) { | ||
786 | /* positive v (case 1) */ | ||
787 | if ((v - 1 == vmin) && | ||
788 | (*(V + 30 + v) >= 0) && | ||
789 | (*(V + 30 + v - 1) >= 0) && | ||
790 | (*(V + 30 + v - 1) > *(V + 30 + v)) && | ||
791 | (*(V + 30 + v - 1) > SIGMIN)) { | ||
792 | |||
793 | swp_freq = fOSC * 1000 + afcex_freq - swp_ofs; | ||
794 | *SIG1 = *(V + 30 + v - 1); | ||
795 | } else if ((v == vmax) && | ||
796 | (*(V + 30 + v) >= 0) && | ||
797 | (*(V + 30 + v - 1) >= 0) && | ||
798 | (*(V + 30 + v) > *(V + 30 + v - 1)) && | ||
799 | (*(V + 30 + v) > SIGMIN)) { | ||
800 | /* (case 2) */ | ||
801 | swp_freq = fOSC * 1000 + afcex_freq; | ||
802 | *SIG1 = *(V + 30 + v); | ||
803 | } else if ((*(V + 30 + v) > 0) && | ||
804 | (*(V + 30 + v - 1) > 0) && | ||
805 | (*(V + 30 + v - 2) > 0) && | ||
806 | (*(V + 30 + v - 3) > 0) && | ||
807 | (*(V + 30 + v - 1) > *(V + 30 + v)) && | ||
808 | (*(V + 30 + v - 2) > *(V + 30 + v - 3)) && | ||
809 | ((*(V + 30 + v - 1) > SIGMIN) || | ||
810 | (*(V + 30 + v - 2) > SIGMIN))) { | ||
811 | /* (case 3) */ | ||
812 | if (*(V + 30 + v - 1) >= *(V + 30 + v - 2)) { | ||
813 | swp_freq = fOSC * 1000 + afcex_freq - swp_ofs; | ||
814 | *SIG1 = *(V + 30 + v - 1); | ||
815 | } else { | ||
816 | swp_freq = fOSC * 1000 + afcex_freq - swp_ofs * 2; | ||
817 | *SIG1 = *(V + 30 + v - 2); | ||
818 | } | ||
819 | } else if ((v == vmax) && | ||
820 | (*(V + 30 + v) >= 0) && | ||
821 | (*(V + 30 + v - 1) >= 0) && | ||
822 | (*(V + 30 + v - 2) >= 0) && | ||
823 | (*(V + 30 + v) > *(V + 30 + v - 2)) && | ||
824 | (*(V + 30 + v - 1) > *(V + 30 + v - 2)) && | ||
825 | ((*(V + 30 + v) > SIGMIN) || | ||
826 | (*(V + 30 + v - 1) > SIGMIN))) { | ||
827 | /* (case 4) */ | ||
828 | if (*(V + 30 + v) >= *(V + 30 + v - 1)) { | ||
829 | swp_freq = fOSC * 1000 + afcex_freq; | ||
830 | *SIG1 = *(V + 30 + v); | ||
831 | } else { | ||
832 | swp_freq = fOSC * 1000 + afcex_freq - swp_ofs; | ||
833 | *SIG1 = *(V + 30 + v - 1); | ||
834 | } | ||
835 | } else { | ||
836 | swp_freq = -1 ; | ||
837 | } | ||
838 | } else if ((i % 2 == 0) && (v >= vmin)) { | ||
839 | /* Negative v (case 1) */ | ||
840 | if ((*(V + 30 + v) > 0) && | ||
841 | (*(V + 30 + v + 1) > 0) && | ||
842 | (*(V + 30 + v + 2) > 0) && | ||
843 | (*(V + 30 + v + 1) > *(V + 30 + v)) && | ||
844 | (*(V + 30 + v + 1) > *(V + 30 + v + 2)) && | ||
845 | (*(V + 30 + v + 1) > SIGMIN)) { | ||
846 | |||
847 | swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; | ||
848 | *SIG1 = *(V + 30 + v + 1); | ||
849 | } else if ((v + 1 == vmax) && | ||
850 | (*(V + 30 + v) >= 0) && | ||
851 | (*(V + 30 + v + 1) >= 0) && | ||
852 | (*(V + 30 + v + 1) > *(V + 30 + v)) && | ||
853 | (*(V + 30 + v + 1) > SIGMIN)) { | ||
854 | /* (case 2) */ | ||
855 | swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; | ||
856 | *SIG1 = *(V + 30 + v); | ||
857 | } else if ((v == vmin) && | ||
858 | (*(V + 30 + v) > 0) && | ||
859 | (*(V + 30 + v + 1) > 0) && | ||
860 | (*(V + 30 + v + 2) > 0) && | ||
861 | (*(V + 30 + v) > *(V + 30 + v + 1)) && | ||
862 | (*(V + 30 + v) > *(V + 30 + v + 2)) && | ||
863 | (*(V + 30 + v) > SIGMIN)) { | ||
864 | /* (case 3) */ | ||
865 | swp_freq = fOSC * 1000 + afcex_freq; | ||
866 | *SIG1 = *(V + 30 + v); | ||
867 | } else if ((*(V + 30 + v) >= 0) && | ||
868 | (*(V + 30 + v + 1) >= 0) && | ||
869 | (*(V + 30 + v + 2) >= 0) && | ||
870 | (*(V + 30 + v + 3) >= 0) && | ||
871 | (*(V + 30 + v + 1) > *(V + 30 + v)) && | ||
872 | (*(V + 30 + v + 2) > *(V + 30 + v + 3)) && | ||
873 | ((*(V + 30 + v + 1) > SIGMIN) || | ||
874 | (*(V + 30 + v + 2) > SIGMIN))) { | ||
875 | /* (case 4) */ | ||
876 | if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) { | ||
877 | swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; | ||
878 | *SIG1 = *(V + 30 + v + 1); | ||
879 | } else { | ||
880 | swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2; | ||
881 | *SIG1 = *(V + 30 + v + 2); | ||
882 | } | ||
883 | } else if ((*(V + 30 + v) >= 0) && | ||
884 | (*(V + 30 + v + 1) >= 0) && | ||
885 | (*(V + 30 + v + 2) >= 0) && | ||
886 | (*(V + 30 + v + 3) >= 0) && | ||
887 | (*(V + 30 + v) > *(V + 30 + v + 2)) && | ||
888 | (*(V + 30 + v + 1) > *(V + 30 + v + 2)) && | ||
889 | (*(V + 30 + v) > *(V + 30 + v + 3)) && | ||
890 | (*(V + 30 + v + 1) > *(V + 30 + v + 3)) && | ||
891 | ((*(V + 30 + v) > SIGMIN) || | ||
892 | (*(V + 30 + v + 1) > SIGMIN))) { | ||
893 | /* (case 5) */ | ||
894 | if (*(V + 30 + v) >= *(V + 30 + v + 1)) { | ||
895 | swp_freq = fOSC * 1000 + afcex_freq; | ||
896 | *SIG1 = *(V + 30 + v); | ||
897 | } else { | ||
898 | swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; | ||
899 | *SIG1 = *(V + 30 + v + 1); | ||
900 | } | ||
901 | } else if ((v + 2 == vmin) && | ||
902 | (*(V + 30 + v) >= 0) && | ||
903 | (*(V + 30 + v + 1) >= 0) && | ||
904 | (*(V + 30 + v + 2) >= 0) && | ||
905 | (*(V + 30 + v + 1) > *(V + 30 + v)) && | ||
906 | (*(V + 30 + v + 2) > *(V + 30 + v)) && | ||
907 | ((*(V + 30 + v + 1) > SIGMIN) || | ||
908 | (*(V + 30 + v + 2) > SIGMIN))) { | ||
909 | /* (case 6) */ | ||
910 | if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) { | ||
911 | swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; | ||
912 | *SIG1 = *(V + 30 + v + 1); | ||
913 | } else { | ||
914 | swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2; | ||
915 | *SIG1 = *(V + 30 + v + 2); | ||
916 | } | ||
917 | } else if ((vmax == 0) && (vmin == 0) && (*(V + 30 + v) > SIGMIN)) { | ||
918 | swp_freq = fOSC * 1000; | ||
919 | *SIG1 = *(V + 30 + v); | ||
920 | } else | ||
921 | swp_freq = -1; | ||
922 | } else | ||
923 | swp_freq = -1; | ||
924 | |||
925 | return swp_freq; | ||
926 | } | ||
927 | |||
928 | static void swp_info_get2(struct mb86a16_state *state, | ||
929 | int smrt, | ||
930 | int R, | ||
931 | int swp_freq, | ||
932 | int *afcex_freq, | ||
933 | int *fOSC, | ||
934 | unsigned char *AFCEX_L, | ||
935 | unsigned char *AFCEX_H) | ||
936 | { | ||
937 | int AFCEX ; | ||
938 | |||
939 | if (R == 0) | ||
940 | *fOSC = (swp_freq + 1000) / 2000 * 2; | ||
941 | else | ||
942 | *fOSC = (swp_freq + 500) / 1000; | ||
943 | |||
944 | if (*fOSC >= swp_freq) | ||
945 | *afcex_freq = *fOSC * 1000 - swp_freq; | ||
946 | else | ||
947 | *afcex_freq = swp_freq - *fOSC * 1000; | ||
948 | |||
949 | AFCEX = *afcex_freq * 8192 / state->master_clk; | ||
950 | *AFCEX_L = AFCEX & 0x00ff; | ||
951 | *AFCEX_H = (AFCEX & 0x0f00) >> 8; | ||
952 | } | ||
953 | |||
954 | static void afcex_info_get(struct mb86a16_state *state, | ||
955 | int afcex_freq, | ||
956 | unsigned char *AFCEX_L, | ||
957 | unsigned char *AFCEX_H) | ||
958 | { | ||
959 | int AFCEX ; | ||
960 | |||
961 | AFCEX = afcex_freq * 8192 / state->master_clk; | ||
962 | *AFCEX_L = AFCEX & 0x00ff; | ||
963 | *AFCEX_H = (AFCEX & 0x0f00) >> 8; | ||
964 | } | ||
965 | |||
966 | static int SEQ_set(struct mb86a16_state *state, unsigned char loop) | ||
967 | { | ||
968 | /* SLOCK0 = 0 */ | ||
969 | if (mb86a16_write(state, 0x32, 0x02 | (loop << 2)) < 0) { | ||
970 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
971 | return -EREMOTEIO; | ||
972 | } | ||
973 | |||
974 | return 0; | ||
975 | } | ||
976 | |||
977 | static int iq_vt_set(struct mb86a16_state *state, unsigned char IQINV) | ||
978 | { | ||
979 | /* Viterbi Rate, IQ Settings */ | ||
980 | if (mb86a16_write(state, 0x06, 0xdf | (IQINV << 5)) < 0) { | ||
981 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
982 | return -EREMOTEIO; | ||
983 | } | ||
984 | |||
985 | return 0; | ||
986 | } | ||
987 | |||
988 | static int FEC_srst(struct mb86a16_state *state) | ||
989 | { | ||
990 | if (mb86a16_write(state, MB86A16_RESET, 0x02) < 0) { | ||
991 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
992 | return -EREMOTEIO; | ||
993 | } | ||
994 | |||
995 | return 0; | ||
996 | } | ||
997 | |||
998 | static int S2T_set(struct mb86a16_state *state, unsigned char S2T) | ||
999 | { | ||
1000 | if (mb86a16_write(state, 0x34, 0x70 | S2T) < 0) { | ||
1001 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1002 | return -EREMOTEIO; | ||
1003 | } | ||
1004 | |||
1005 | return 0; | ||
1006 | } | ||
1007 | |||
1008 | static int S45T_set(struct mb86a16_state *state, unsigned char S4T, unsigned char S5T) | ||
1009 | { | ||
1010 | if (mb86a16_write(state, 0x35, 0x00 | (S5T << 4) | S4T) < 0) { | ||
1011 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1012 | return -EREMOTEIO; | ||
1013 | } | ||
1014 | |||
1015 | return 0; | ||
1016 | } | ||
1017 | |||
1018 | |||
1019 | static int mb86a16_set_fe(struct mb86a16_state *state) | ||
1020 | { | ||
1021 | u8 agcval, cnmval; | ||
1022 | |||
1023 | int i, j; | ||
1024 | int fOSC = 0; | ||
1025 | int fOSC_start = 0; | ||
1026 | int wait_t; | ||
1027 | int fcp; | ||
1028 | int swp_ofs; | ||
1029 | int V[60]; | ||
1030 | u8 SIG1MIN; | ||
1031 | |||
1032 | unsigned char CREN, AFCEN, AFCEXEN; | ||
1033 | unsigned char SIG1; | ||
1034 | unsigned char TIMINT1, TIMINT2, TIMEXT; | ||
1035 | unsigned char S0T, S1T; | ||
1036 | unsigned char S2T; | ||
1037 | /* unsigned char S2T, S3T; */ | ||
1038 | unsigned char S4T, S5T; | ||
1039 | unsigned char AFCEX_L, AFCEX_H; | ||
1040 | unsigned char R; | ||
1041 | unsigned char VIRM; | ||
1042 | unsigned char ETH, VIA; | ||
1043 | unsigned char junk; | ||
1044 | |||
1045 | int loop; | ||
1046 | int ftemp; | ||
1047 | int v, vmax, vmin; | ||
1048 | int vmax_his, vmin_his; | ||
1049 | int swp_freq, prev_swp_freq[20]; | ||
1050 | int prev_freq_num; | ||
1051 | int signal_dupl; | ||
1052 | int afcex_freq; | ||
1053 | int signal; | ||
1054 | int afcerr; | ||
1055 | int temp_freq, delta_freq; | ||
1056 | int dagcm[4]; | ||
1057 | int smrt_d; | ||
1058 | /* int freq_err; */ | ||
1059 | int n; | ||
1060 | int ret = -1; | ||
1061 | int sync; | ||
1062 | |||
1063 | dprintk(verbose, MB86A16_INFO, 1, "freq=%d Mhz, symbrt=%d Ksps", state->frequency, state->srate); | ||
1064 | |||
1065 | fcp = 3000; | ||
1066 | swp_ofs = state->srate / 4; | ||
1067 | |||
1068 | for (i = 0; i < 60; i++) | ||
1069 | V[i] = -1; | ||
1070 | |||
1071 | for (i = 0; i < 20; i++) | ||
1072 | prev_swp_freq[i] = 0; | ||
1073 | |||
1074 | SIG1MIN = 25; | ||
1075 | |||
1076 | for (n = 0; ((n < 3) && (ret == -1)); n++) { | ||
1077 | SEQ_set(state, 0); | ||
1078 | iq_vt_set(state, 0); | ||
1079 | |||
1080 | CREN = 0; | ||
1081 | AFCEN = 0; | ||
1082 | AFCEXEN = 1; | ||
1083 | TIMINT1 = 0; | ||
1084 | TIMINT2 = 1; | ||
1085 | TIMEXT = 2; | ||
1086 | S1T = 0; | ||
1087 | S0T = 0; | ||
1088 | |||
1089 | if (initial_set(state) < 0) { | ||
1090 | dprintk(verbose, MB86A16_ERROR, 1, "initial set failed"); | ||
1091 | return -1; | ||
1092 | } | ||
1093 | if (DAGC_data_set(state, 3, 2) < 0) { | ||
1094 | dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error"); | ||
1095 | return -1; | ||
1096 | } | ||
1097 | if (EN_set(state, CREN, AFCEN) < 0) { | ||
1098 | dprintk(verbose, MB86A16_ERROR, 1, "EN set error"); | ||
1099 | return -1; /* (0, 0) */ | ||
1100 | } | ||
1101 | if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) { | ||
1102 | dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); | ||
1103 | return -1; /* (1, smrt) = (1, symbolrate) */ | ||
1104 | } | ||
1105 | if (CNTM_set(state, TIMINT1, TIMINT2, TIMEXT) < 0) { | ||
1106 | dprintk(verbose, MB86A16_ERROR, 1, "CNTM set error"); | ||
1107 | return -1; /* (0, 1, 2) */ | ||
1108 | } | ||
1109 | if (S01T_set(state, S1T, S0T) < 0) { | ||
1110 | dprintk(verbose, MB86A16_ERROR, 1, "S01T set error"); | ||
1111 | return -1; /* (0, 0) */ | ||
1112 | } | ||
1113 | smrt_info_get(state, state->srate); | ||
1114 | if (smrt_set(state, state->srate) < 0) { | ||
1115 | dprintk(verbose, MB86A16_ERROR, 1, "smrt info get error"); | ||
1116 | return -1; | ||
1117 | } | ||
1118 | |||
1119 | R = vco_dev_get(state, state->srate); | ||
1120 | if (R == 1) | ||
1121 | fOSC_start = state->frequency; | ||
1122 | |||
1123 | else if (R == 0) { | ||
1124 | if (state->frequency % 2 == 0) { | ||
1125 | fOSC_start = state->frequency; | ||
1126 | } else { | ||
1127 | fOSC_start = state->frequency + 1; | ||
1128 | if (fOSC_start > 2150) | ||
1129 | fOSC_start = state->frequency - 1; | ||
1130 | } | ||
1131 | } | ||
1132 | loop = 1; | ||
1133 | ftemp = fOSC_start * 1000; | ||
1134 | vmax = 0 ; | ||
1135 | while (loop == 1) { | ||
1136 | ftemp = ftemp + swp_ofs; | ||
1137 | vmax++; | ||
1138 | |||
1139 | /* Upper bound */ | ||
1140 | if (ftemp > 2150000) { | ||
1141 | loop = 0; | ||
1142 | vmax--; | ||
1143 | } else { | ||
1144 | if ((ftemp == 2150000) || | ||
1145 | (ftemp - state->frequency * 1000 >= fcp + state->srate / 4)) | ||
1146 | loop = 0; | ||
1147 | } | ||
1148 | } | ||
1149 | |||
1150 | loop = 1; | ||
1151 | ftemp = fOSC_start * 1000; | ||
1152 | vmin = 0 ; | ||
1153 | while (loop == 1) { | ||
1154 | ftemp = ftemp - swp_ofs; | ||
1155 | vmin--; | ||
1156 | |||
1157 | /* Lower bound */ | ||
1158 | if (ftemp < 950000) { | ||
1159 | loop = 0; | ||
1160 | vmin++; | ||
1161 | } else { | ||
1162 | if ((ftemp == 950000) || | ||
1163 | (state->frequency * 1000 - ftemp >= fcp + state->srate / 4)) | ||
1164 | loop = 0; | ||
1165 | } | ||
1166 | } | ||
1167 | |||
1168 | wait_t = (8000 + state->srate / 2) / state->srate; | ||
1169 | if (wait_t == 0) | ||
1170 | wait_t = 1; | ||
1171 | |||
1172 | i = 0; | ||
1173 | j = 0; | ||
1174 | prev_freq_num = 0; | ||
1175 | loop = 1; | ||
1176 | signal = 0; | ||
1177 | vmax_his = 0; | ||
1178 | vmin_his = 0; | ||
1179 | v = 0; | ||
1180 | |||
1181 | while (loop == 1) { | ||
1182 | swp_info_get(state, fOSC_start, state->srate, | ||
1183 | v, R, swp_ofs, &fOSC, | ||
1184 | &afcex_freq, &AFCEX_L, &AFCEX_H); | ||
1185 | |||
1186 | udelay(100); | ||
1187 | if (rf_val_set(state, fOSC, state->srate, R) < 0) { | ||
1188 | dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); | ||
1189 | return -1; | ||
1190 | } | ||
1191 | udelay(100); | ||
1192 | if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { | ||
1193 | dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); | ||
1194 | return -1; | ||
1195 | } | ||
1196 | if (srst(state) < 0) { | ||
1197 | dprintk(verbose, MB86A16_ERROR, 1, "srst error"); | ||
1198 | return -1; | ||
1199 | } | ||
1200 | msleep_interruptible(wait_t); | ||
1201 | |||
1202 | if (mb86a16_read(state, 0x37, &SIG1) != 2) { | ||
1203 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1204 | return -1; | ||
1205 | } | ||
1206 | V[30 + v] = SIG1 ; | ||
1207 | swp_freq = swp_freq_calcuation(state, i, v, V, vmax, vmin, | ||
1208 | SIG1MIN, fOSC, afcex_freq, | ||
1209 | swp_ofs, &SIG1); /* changed */ | ||
1210 | |||
1211 | signal_dupl = 0; | ||
1212 | for (j = 0; j < prev_freq_num; j++) { | ||
1213 | if ((ABS(prev_swp_freq[j] - swp_freq)) < (swp_ofs * 3 / 2)) { | ||
1214 | signal_dupl = 1; | ||
1215 | dprintk(verbose, MB86A16_INFO, 1, "Probably Duplicate Signal, j = %d", j); | ||
1216 | } | ||
1217 | } | ||
1218 | if ((signal_dupl == 0) && (swp_freq > 0) && (ABS(swp_freq - state->frequency * 1000) < fcp + state->srate / 6)) { | ||
1219 | dprintk(verbose, MB86A16_DEBUG, 1, "------ Signal detect ------ [swp_freq=[%07d, srate=%05d]]", swp_freq, state->srate); | ||
1220 | prev_swp_freq[prev_freq_num] = swp_freq; | ||
1221 | prev_freq_num++; | ||
1222 | swp_info_get2(state, state->srate, R, swp_freq, | ||
1223 | &afcex_freq, &fOSC, | ||
1224 | &AFCEX_L, &AFCEX_H); | ||
1225 | |||
1226 | if (rf_val_set(state, fOSC, state->srate, R) < 0) { | ||
1227 | dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); | ||
1228 | return -1; | ||
1229 | } | ||
1230 | if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { | ||
1231 | dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); | ||
1232 | return -1; | ||
1233 | } | ||
1234 | signal = signal_det(state, state->srate, &SIG1); | ||
1235 | if (signal == 1) { | ||
1236 | dprintk(verbose, MB86A16_ERROR, 1, "***** Signal Found *****"); | ||
1237 | loop = 0; | ||
1238 | } else { | ||
1239 | dprintk(verbose, MB86A16_ERROR, 1, "!!!!! No signal !!!!!, try again..."); | ||
1240 | smrt_info_get(state, state->srate); | ||
1241 | if (smrt_set(state, state->srate) < 0) { | ||
1242 | dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); | ||
1243 | return -1; | ||
1244 | } | ||
1245 | } | ||
1246 | } | ||
1247 | if (v > vmax) | ||
1248 | vmax_his = 1 ; | ||
1249 | if (v < vmin) | ||
1250 | vmin_his = 1 ; | ||
1251 | i++; | ||
1252 | |||
1253 | if ((i % 2 == 1) && (vmax_his == 1)) | ||
1254 | i++; | ||
1255 | if ((i % 2 == 0) && (vmin_his == 1)) | ||
1256 | i++; | ||
1257 | |||
1258 | if (i % 2 == 1) | ||
1259 | v = (i + 1) / 2; | ||
1260 | else | ||
1261 | v = -i / 2; | ||
1262 | |||
1263 | if ((vmax_his == 1) && (vmin_his == 1)) | ||
1264 | loop = 0 ; | ||
1265 | } | ||
1266 | |||
1267 | if (signal == 1) { | ||
1268 | dprintk(verbose, MB86A16_INFO, 1, " Start Freq Error Check"); | ||
1269 | S1T = 7 ; | ||
1270 | S0T = 1 ; | ||
1271 | CREN = 0 ; | ||
1272 | AFCEN = 1 ; | ||
1273 | AFCEXEN = 0 ; | ||
1274 | |||
1275 | if (S01T_set(state, S1T, S0T) < 0) { | ||
1276 | dprintk(verbose, MB86A16_ERROR, 1, "S01T set error"); | ||
1277 | return -1; | ||
1278 | } | ||
1279 | smrt_info_get(state, state->srate); | ||
1280 | if (smrt_set(state, state->srate) < 0) { | ||
1281 | dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); | ||
1282 | return -1; | ||
1283 | } | ||
1284 | if (EN_set(state, CREN, AFCEN) < 0) { | ||
1285 | dprintk(verbose, MB86A16_ERROR, 1, "EN set error"); | ||
1286 | return -1; | ||
1287 | } | ||
1288 | if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) { | ||
1289 | dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); | ||
1290 | return -1; | ||
1291 | } | ||
1292 | afcex_info_get(state, afcex_freq, &AFCEX_L, &AFCEX_H); | ||
1293 | if (afcofs_data_set(state, AFCEX_L, AFCEX_H) < 0) { | ||
1294 | dprintk(verbose, MB86A16_ERROR, 1, "AFCOFS data set error"); | ||
1295 | return -1; | ||
1296 | } | ||
1297 | if (srst(state) < 0) { | ||
1298 | dprintk(verbose, MB86A16_ERROR, 1, "srst error"); | ||
1299 | return -1; | ||
1300 | } | ||
1301 | /* delay 4~200 */ | ||
1302 | wait_t = 200000 / state->master_clk + 200000 / state->srate; | ||
1303 | msleep(wait_t); | ||
1304 | afcerr = afcerr_chk(state); | ||
1305 | if (afcerr == -1) | ||
1306 | return -1; | ||
1307 | |||
1308 | swp_freq = fOSC * 1000 + afcerr ; | ||
1309 | AFCEXEN = 1 ; | ||
1310 | if (state->srate >= 1500) | ||
1311 | smrt_d = state->srate / 3; | ||
1312 | else | ||
1313 | smrt_d = state->srate / 2; | ||
1314 | smrt_info_get(state, smrt_d); | ||
1315 | if (smrt_set(state, smrt_d) < 0) { | ||
1316 | dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); | ||
1317 | return -1; | ||
1318 | } | ||
1319 | if (AFCEXEN_set(state, AFCEXEN, smrt_d) < 0) { | ||
1320 | dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); | ||
1321 | return -1; | ||
1322 | } | ||
1323 | R = vco_dev_get(state, smrt_d); | ||
1324 | if (DAGC_data_set(state, 2, 0) < 0) { | ||
1325 | dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error"); | ||
1326 | return -1; | ||
1327 | } | ||
1328 | for (i = 0; i < 3; i++) { | ||
1329 | temp_freq = swp_freq + (i - 1) * state->srate / 8; | ||
1330 | swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); | ||
1331 | if (rf_val_set(state, fOSC, smrt_d, R) < 0) { | ||
1332 | dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); | ||
1333 | return -1; | ||
1334 | } | ||
1335 | if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { | ||
1336 | dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); | ||
1337 | return -1; | ||
1338 | } | ||
1339 | wait_t = 200000 / state->master_clk + 40000 / smrt_d; | ||
1340 | msleep(wait_t); | ||
1341 | dagcm[i] = dagcm_val_get(state); | ||
1342 | } | ||
1343 | if ((dagcm[0] > dagcm[1]) && | ||
1344 | (dagcm[0] > dagcm[2]) && | ||
1345 | (dagcm[0] - dagcm[1] > 2 * (dagcm[2] - dagcm[1]))) { | ||
1346 | |||
1347 | temp_freq = swp_freq - 2 * state->srate / 8; | ||
1348 | swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); | ||
1349 | if (rf_val_set(state, fOSC, smrt_d, R) < 0) { | ||
1350 | dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); | ||
1351 | return -1; | ||
1352 | } | ||
1353 | if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { | ||
1354 | dprintk(verbose, MB86A16_ERROR, 1, "afcex data set"); | ||
1355 | return -1; | ||
1356 | } | ||
1357 | wait_t = 200000 / state->master_clk + 40000 / smrt_d; | ||
1358 | msleep(wait_t); | ||
1359 | dagcm[3] = dagcm_val_get(state); | ||
1360 | if (dagcm[3] > dagcm[1]) | ||
1361 | delta_freq = (dagcm[2] - dagcm[0] + dagcm[1] - dagcm[3]) * state->srate / 300; | ||
1362 | else | ||
1363 | delta_freq = 0; | ||
1364 | } else if ((dagcm[2] > dagcm[1]) && | ||
1365 | (dagcm[2] > dagcm[0]) && | ||
1366 | (dagcm[2] - dagcm[1] > 2 * (dagcm[0] - dagcm[1]))) { | ||
1367 | |||
1368 | temp_freq = swp_freq + 2 * state->srate / 8; | ||
1369 | swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); | ||
1370 | if (rf_val_set(state, fOSC, smrt_d, R) < 0) { | ||
1371 | dprintk(verbose, MB86A16_ERROR, 1, "rf val set"); | ||
1372 | return -1; | ||
1373 | } | ||
1374 | if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { | ||
1375 | dprintk(verbose, MB86A16_ERROR, 1, "afcex data set"); | ||
1376 | return -1; | ||
1377 | } | ||
1378 | wait_t = 200000 / state->master_clk + 40000 / smrt_d; | ||
1379 | msleep(wait_t); | ||
1380 | dagcm[3] = dagcm_val_get(state); | ||
1381 | if (dagcm[3] > dagcm[1]) | ||
1382 | delta_freq = (dagcm[2] - dagcm[0] + dagcm[3] - dagcm[1]) * state->srate / 300; | ||
1383 | else | ||
1384 | delta_freq = 0 ; | ||
1385 | |||
1386 | } else { | ||
1387 | delta_freq = 0 ; | ||
1388 | } | ||
1389 | dprintk(verbose, MB86A16_INFO, 1, "SWEEP Frequency = %d", swp_freq); | ||
1390 | swp_freq += delta_freq; | ||
1391 | dprintk(verbose, MB86A16_INFO, 1, "Adjusting .., DELTA Freq = %d, SWEEP Freq=%d", delta_freq, swp_freq); | ||
1392 | if (ABS(state->frequency * 1000 - swp_freq) > 3800) { | ||
1393 | dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL !"); | ||
1394 | } else { | ||
1395 | |||
1396 | S1T = 0; | ||
1397 | S0T = 3; | ||
1398 | CREN = 1; | ||
1399 | AFCEN = 0; | ||
1400 | AFCEXEN = 1; | ||
1401 | |||
1402 | if (S01T_set(state, S1T, S0T) < 0) { | ||
1403 | dprintk(verbose, MB86A16_ERROR, 1, "S01T set error"); | ||
1404 | return -1; | ||
1405 | } | ||
1406 | if (DAGC_data_set(state, 0, 0) < 0) { | ||
1407 | dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error"); | ||
1408 | return -1; | ||
1409 | } | ||
1410 | R = vco_dev_get(state, state->srate); | ||
1411 | smrt_info_get(state, state->srate); | ||
1412 | if (smrt_set(state, state->srate) < 0) { | ||
1413 | dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); | ||
1414 | return -1; | ||
1415 | } | ||
1416 | if (EN_set(state, CREN, AFCEN) < 0) { | ||
1417 | dprintk(verbose, MB86A16_ERROR, 1, "EN set error"); | ||
1418 | return -1; | ||
1419 | } | ||
1420 | if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) { | ||
1421 | dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); | ||
1422 | return -1; | ||
1423 | } | ||
1424 | swp_info_get2(state, state->srate, R, swp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); | ||
1425 | if (rf_val_set(state, fOSC, state->srate, R) < 0) { | ||
1426 | dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); | ||
1427 | return -1; | ||
1428 | } | ||
1429 | if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { | ||
1430 | dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); | ||
1431 | return -1; | ||
1432 | } | ||
1433 | if (srst(state) < 0) { | ||
1434 | dprintk(verbose, MB86A16_ERROR, 1, "srst error"); | ||
1435 | return -1; | ||
1436 | } | ||
1437 | wait_t = 7 + (10000 + state->srate / 2) / state->srate; | ||
1438 | if (wait_t == 0) | ||
1439 | wait_t = 1; | ||
1440 | msleep_interruptible(wait_t); | ||
1441 | if (mb86a16_read(state, 0x37, &SIG1) != 2) { | ||
1442 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1443 | return -EREMOTEIO; | ||
1444 | } | ||
1445 | |||
1446 | if (SIG1 > 110) { | ||
1447 | S2T = 4; S4T = 1; S5T = 6; ETH = 4; VIA = 6; | ||
1448 | wait_t = 7 + (917504 + state->srate / 2) / state->srate; | ||
1449 | } else if (SIG1 > 105) { | ||
1450 | S2T = 4; S4T = 2; S5T = 8; ETH = 7; VIA = 2; | ||
1451 | wait_t = 7 + (1048576 + state->srate / 2) / state->srate; | ||
1452 | } else if (SIG1 > 85) { | ||
1453 | S2T = 5; S4T = 2; S5T = 8; ETH = 7; VIA = 2; | ||
1454 | wait_t = 7 + (1310720 + state->srate / 2) / state->srate; | ||
1455 | } else if (SIG1 > 65) { | ||
1456 | S2T = 6; S4T = 2; S5T = 8; ETH = 7; VIA = 2; | ||
1457 | wait_t = 7 + (1572864 + state->srate / 2) / state->srate; | ||
1458 | } else { | ||
1459 | S2T = 7; S4T = 2; S5T = 8; ETH = 7; VIA = 2; | ||
1460 | wait_t = 7 + (2097152 + state->srate / 2) / state->srate; | ||
1461 | } | ||
1462 | wait_t *= 2; /* FOS */ | ||
1463 | S2T_set(state, S2T); | ||
1464 | S45T_set(state, S4T, S5T); | ||
1465 | Vi_set(state, ETH, VIA); | ||
1466 | srst(state); | ||
1467 | msleep_interruptible(wait_t); | ||
1468 | sync = sync_chk(state, &VIRM); | ||
1469 | dprintk(verbose, MB86A16_INFO, 1, "-------- Viterbi=[%d] SYNC=[%d] ---------", VIRM, sync); | ||
1470 | if (VIRM) { | ||
1471 | if (VIRM == 4) { | ||
1472 | /* 5/6 */ | ||
1473 | if (SIG1 > 110) | ||
1474 | wait_t = (786432 + state->srate / 2) / state->srate; | ||
1475 | else | ||
1476 | wait_t = (1572864 + state->srate / 2) / state->srate; | ||
1477 | if (state->srate < 5000) | ||
1478 | /* FIXME ! , should be a long wait ! */ | ||
1479 | msleep_interruptible(wait_t); | ||
1480 | else | ||
1481 | msleep_interruptible(wait_t); | ||
1482 | |||
1483 | if (sync_chk(state, &junk) == 0) { | ||
1484 | iq_vt_set(state, 1); | ||
1485 | FEC_srst(state); | ||
1486 | } | ||
1487 | } | ||
1488 | /* 1/2, 2/3, 3/4, 7/8 */ | ||
1489 | if (SIG1 > 110) | ||
1490 | wait_t = (786432 + state->srate / 2) / state->srate; | ||
1491 | else | ||
1492 | wait_t = (1572864 + state->srate / 2) / state->srate; | ||
1493 | msleep_interruptible(wait_t); | ||
1494 | SEQ_set(state, 1); | ||
1495 | } else { | ||
1496 | dprintk(verbose, MB86A16_INFO, 1, "NO -- SYNC"); | ||
1497 | SEQ_set(state, 1); | ||
1498 | ret = -1; | ||
1499 | } | ||
1500 | } | ||
1501 | } else { | ||
1502 | dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL"); | ||
1503 | ret = -1; | ||
1504 | } | ||
1505 | |||
1506 | sync = sync_chk(state, &junk); | ||
1507 | if (sync) { | ||
1508 | dprintk(verbose, MB86A16_INFO, 1, "******* SYNC *******"); | ||
1509 | freqerr_chk(state, state->frequency, state->srate, 1); | ||
1510 | ret = 0; | ||
1511 | break; | ||
1512 | } | ||
1513 | } | ||
1514 | |||
1515 | mb86a16_read(state, 0x15, &agcval); | ||
1516 | mb86a16_read(state, 0x26, &cnmval); | ||
1517 | dprintk(verbose, MB86A16_INFO, 1, "AGC = %02x CNM = %02x", agcval, cnmval); | ||
1518 | |||
1519 | return ret; | ||
1520 | } | ||
1521 | |||
1522 | static int mb86a16_send_diseqc_msg(struct dvb_frontend *fe, | ||
1523 | struct dvb_diseqc_master_cmd *cmd) | ||
1524 | { | ||
1525 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1526 | int i; | ||
1527 | u8 regs; | ||
1528 | |||
1529 | if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0) | ||
1530 | goto err; | ||
1531 | if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0) | ||
1532 | goto err; | ||
1533 | if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0) | ||
1534 | goto err; | ||
1535 | |||
1536 | regs = 0x18; | ||
1537 | |||
1538 | if (cmd->msg_len > 5 || cmd->msg_len < 4) | ||
1539 | return -EINVAL; | ||
1540 | |||
1541 | for (i = 0; i < cmd->msg_len; i++) { | ||
1542 | if (mb86a16_write(state, regs, cmd->msg[i]) < 0) | ||
1543 | goto err; | ||
1544 | |||
1545 | regs++; | ||
1546 | } | ||
1547 | i += 0x90; | ||
1548 | |||
1549 | msleep_interruptible(10); | ||
1550 | |||
1551 | if (mb86a16_write(state, MB86A16_DCC1, i) < 0) | ||
1552 | goto err; | ||
1553 | if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) | ||
1554 | goto err; | ||
1555 | |||
1556 | return 0; | ||
1557 | |||
1558 | err: | ||
1559 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1560 | return -EREMOTEIO; | ||
1561 | } | ||
1562 | |||
1563 | static int mb86a16_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) | ||
1564 | { | ||
1565 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1566 | |||
1567 | switch (burst) { | ||
1568 | case SEC_MINI_A: | ||
1569 | if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA | | ||
1570 | MB86A16_DCC1_TBEN | | ||
1571 | MB86A16_DCC1_TBO) < 0) | ||
1572 | goto err; | ||
1573 | if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) | ||
1574 | goto err; | ||
1575 | break; | ||
1576 | case SEC_MINI_B: | ||
1577 | if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA | | ||
1578 | MB86A16_DCC1_TBEN) < 0) | ||
1579 | goto err; | ||
1580 | if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) | ||
1581 | goto err; | ||
1582 | break; | ||
1583 | } | ||
1584 | |||
1585 | return 0; | ||
1586 | err: | ||
1587 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1588 | return -EREMOTEIO; | ||
1589 | } | ||
1590 | |||
1591 | static int mb86a16_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | ||
1592 | { | ||
1593 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1594 | |||
1595 | switch (tone) { | ||
1596 | case SEC_TONE_ON: | ||
1597 | if (mb86a16_write(state, MB86A16_TONEOUT2, 0x00) < 0) | ||
1598 | goto err; | ||
1599 | if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA | | ||
1600 | MB86A16_DCC1_CTOE) < 0) | ||
1601 | |||
1602 | goto err; | ||
1603 | if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) | ||
1604 | goto err; | ||
1605 | break; | ||
1606 | case SEC_TONE_OFF: | ||
1607 | if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0) | ||
1608 | goto err; | ||
1609 | if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0) | ||
1610 | goto err; | ||
1611 | if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0) | ||
1612 | goto err; | ||
1613 | break; | ||
1614 | default: | ||
1615 | return -EINVAL; | ||
1616 | } | ||
1617 | return 0; | ||
1618 | |||
1619 | err: | ||
1620 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1621 | return -EREMOTEIO; | ||
1622 | } | ||
1623 | |||
1624 | static enum dvbfe_search mb86a16_search(struct dvb_frontend *fe, | ||
1625 | struct dvb_frontend_parameters *p) | ||
1626 | { | ||
1627 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1628 | |||
1629 | state->frequency = p->frequency / 1000; | ||
1630 | state->srate = p->u.qpsk.symbol_rate / 1000; | ||
1631 | |||
1632 | if (!mb86a16_set_fe(state)) { | ||
1633 | dprintk(verbose, MB86A16_ERROR, 1, "Succesfully acquired LOCK"); | ||
1634 | return DVBFE_ALGO_SEARCH_SUCCESS; | ||
1635 | } | ||
1636 | |||
1637 | dprintk(verbose, MB86A16_ERROR, 1, "Lock acquisition failed!"); | ||
1638 | return DVBFE_ALGO_SEARCH_FAILED; | ||
1639 | } | ||
1640 | |||
1641 | static void mb86a16_release(struct dvb_frontend *fe) | ||
1642 | { | ||
1643 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1644 | kfree(state); | ||
1645 | } | ||
1646 | |||
1647 | static int mb86a16_init(struct dvb_frontend *fe) | ||
1648 | { | ||
1649 | return 0; | ||
1650 | } | ||
1651 | |||
1652 | static int mb86a16_sleep(struct dvb_frontend *fe) | ||
1653 | { | ||
1654 | return 0; | ||
1655 | } | ||
1656 | |||
1657 | static int mb86a16_read_ber(struct dvb_frontend *fe, u32 *ber) | ||
1658 | { | ||
1659 | u8 ber_mon, ber_tab, ber_lsb, ber_mid, ber_msb, ber_tim, ber_rst; | ||
1660 | u32 timer; | ||
1661 | |||
1662 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1663 | |||
1664 | *ber = 0; | ||
1665 | if (mb86a16_read(state, MB86A16_BERMON, &ber_mon) != 2) | ||
1666 | goto err; | ||
1667 | if (mb86a16_read(state, MB86A16_BERTAB, &ber_tab) != 2) | ||
1668 | goto err; | ||
1669 | if (mb86a16_read(state, MB86A16_BERLSB, &ber_lsb) != 2) | ||
1670 | goto err; | ||
1671 | if (mb86a16_read(state, MB86A16_BERMID, &ber_mid) != 2) | ||
1672 | goto err; | ||
1673 | if (mb86a16_read(state, MB86A16_BERMSB, &ber_msb) != 2) | ||
1674 | goto err; | ||
1675 | /* BER monitor invalid when BER_EN = 0 */ | ||
1676 | if (ber_mon & 0x04) { | ||
1677 | /* coarse, fast calculation */ | ||
1678 | *ber = ber_tab & 0x1f; | ||
1679 | dprintk(verbose, MB86A16_DEBUG, 1, "BER coarse=[0x%02x]", *ber); | ||
1680 | if (ber_mon & 0x01) { | ||
1681 | /* | ||
1682 | * BER_SEL = 1, The monitored BER is the estimated | ||
1683 | * value with a Reed-Solomon decoder error amount at | ||
1684 | * the deinterleaver output. | ||
1685 | * monitored BER is expressed as a 20 bit output in total | ||
1686 | */ | ||
1687 | ber_rst = ber_mon >> 3; | ||
1688 | *ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb; | ||
1689 | if (ber_rst == 0) | ||
1690 | timer = 12500000; | ||
1691 | if (ber_rst == 1) | ||
1692 | timer = 25000000; | ||
1693 | if (ber_rst == 2) | ||
1694 | timer = 50000000; | ||
1695 | if (ber_rst == 3) | ||
1696 | timer = 100000000; | ||
1697 | |||
1698 | *ber /= timer; | ||
1699 | dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber); | ||
1700 | } else { | ||
1701 | /* | ||
1702 | * BER_SEL = 0, The monitored BER is the estimated | ||
1703 | * value with a Viterbi decoder error amount at the | ||
1704 | * QPSK demodulator output. | ||
1705 | * monitored BER is expressed as a 24 bit output in total | ||
1706 | */ | ||
1707 | ber_tim = ber_mon >> 1; | ||
1708 | *ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb; | ||
1709 | if (ber_tim == 0) | ||
1710 | timer = 16; | ||
1711 | if (ber_tim == 1) | ||
1712 | timer = 24; | ||
1713 | |||
1714 | *ber /= 2 ^ timer; | ||
1715 | dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber); | ||
1716 | } | ||
1717 | } | ||
1718 | return 0; | ||
1719 | err: | ||
1720 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1721 | return -EREMOTEIO; | ||
1722 | } | ||
1723 | |||
1724 | static int mb86a16_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | ||
1725 | { | ||
1726 | u8 agcm = 0; | ||
1727 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1728 | |||
1729 | *strength = 0; | ||
1730 | if (mb86a16_read(state, MB86A16_AGCM, &agcm) != 2) { | ||
1731 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1732 | return -EREMOTEIO; | ||
1733 | } | ||
1734 | |||
1735 | *strength = ((0xff - agcm) * 100) / 256; | ||
1736 | dprintk(verbose, MB86A16_DEBUG, 1, "Signal strength=[%d %%]", (u8) *strength); | ||
1737 | *strength = (0xffff - 0xff) + agcm; | ||
1738 | |||
1739 | return 0; | ||
1740 | } | ||
1741 | |||
1742 | struct cnr { | ||
1743 | u8 cn_reg; | ||
1744 | u8 cn_val; | ||
1745 | }; | ||
1746 | |||
1747 | static const struct cnr cnr_tab[] = { | ||
1748 | { 35, 2 }, | ||
1749 | { 40, 3 }, | ||
1750 | { 50, 4 }, | ||
1751 | { 60, 5 }, | ||
1752 | { 70, 6 }, | ||
1753 | { 80, 7 }, | ||
1754 | { 92, 8 }, | ||
1755 | { 103, 9 }, | ||
1756 | { 115, 10 }, | ||
1757 | { 138, 12 }, | ||
1758 | { 162, 15 }, | ||
1759 | { 180, 18 }, | ||
1760 | { 185, 19 }, | ||
1761 | { 189, 20 }, | ||
1762 | { 195, 22 }, | ||
1763 | { 199, 24 }, | ||
1764 | { 201, 25 }, | ||
1765 | { 202, 26 }, | ||
1766 | { 203, 27 }, | ||
1767 | { 205, 28 }, | ||
1768 | { 208, 30 } | ||
1769 | }; | ||
1770 | |||
1771 | static int mb86a16_read_snr(struct dvb_frontend *fe, u16 *snr) | ||
1772 | { | ||
1773 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1774 | int i = 0; | ||
1775 | int low_tide = 2, high_tide = 30, q_level; | ||
1776 | u8 cn; | ||
1777 | |||
1778 | *snr = 0; | ||
1779 | if (mb86a16_read(state, 0x26, &cn) != 2) { | ||
1780 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1781 | return -EREMOTEIO; | ||
1782 | } | ||
1783 | |||
1784 | for (i = 0; i < ARRAY_SIZE(cnr_tab); i++) { | ||
1785 | if (cn < cnr_tab[i].cn_reg) { | ||
1786 | *snr = cnr_tab[i].cn_val; | ||
1787 | break; | ||
1788 | } | ||
1789 | } | ||
1790 | q_level = (*snr * 100) / (high_tide - low_tide); | ||
1791 | dprintk(verbose, MB86A16_ERROR, 1, "SNR (Quality) = [%d dB], Level=%d %%", *snr, q_level); | ||
1792 | *snr = (0xffff - 0xff) + *snr; | ||
1793 | |||
1794 | return 0; | ||
1795 | } | ||
1796 | |||
1797 | static int mb86a16_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | ||
1798 | { | ||
1799 | u8 dist; | ||
1800 | struct mb86a16_state *state = fe->demodulator_priv; | ||
1801 | |||
1802 | if (mb86a16_read(state, MB86A16_DISTMON, &dist) != 2) { | ||
1803 | dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); | ||
1804 | return -EREMOTEIO; | ||
1805 | } | ||
1806 | *ucblocks = dist; | ||
1807 | |||
1808 | return 0; | ||
1809 | } | ||
1810 | |||
1811 | static enum dvbfe_algo mb86a16_frontend_algo(struct dvb_frontend *fe) | ||
1812 | { | ||
1813 | return DVBFE_ALGO_CUSTOM; | ||
1814 | } | ||
1815 | |||
1816 | static struct dvb_frontend_ops mb86a16_ops = { | ||
1817 | .info = { | ||
1818 | .name = "Fujitsu MB86A16 DVB-S", | ||
1819 | .type = FE_QPSK, | ||
1820 | .frequency_min = 950000, | ||
1821 | .frequency_max = 2150000, | ||
1822 | .frequency_stepsize = 3000, | ||
1823 | .frequency_tolerance = 0, | ||
1824 | .symbol_rate_min = 1000000, | ||
1825 | .symbol_rate_max = 45000000, | ||
1826 | .symbol_rate_tolerance = 500, | ||
1827 | .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | | ||
1828 | FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | | ||
1829 | FE_CAN_FEC_7_8 | FE_CAN_QPSK | | ||
1830 | FE_CAN_FEC_AUTO | ||
1831 | }, | ||
1832 | .release = mb86a16_release, | ||
1833 | |||
1834 | .get_frontend_algo = mb86a16_frontend_algo, | ||
1835 | .search = mb86a16_search, | ||
1836 | .read_status = mb86a16_read_status, | ||
1837 | .init = mb86a16_init, | ||
1838 | .sleep = mb86a16_sleep, | ||
1839 | .read_status = mb86a16_read_status, | ||
1840 | |||
1841 | .read_ber = mb86a16_read_ber, | ||
1842 | .read_signal_strength = mb86a16_read_signal_strength, | ||
1843 | .read_snr = mb86a16_read_snr, | ||
1844 | .read_ucblocks = mb86a16_read_ucblocks, | ||
1845 | |||
1846 | .diseqc_send_master_cmd = mb86a16_send_diseqc_msg, | ||
1847 | .diseqc_send_burst = mb86a16_send_diseqc_burst, | ||
1848 | .set_tone = mb86a16_set_tone, | ||
1849 | }; | ||
1850 | |||
1851 | struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config, | ||
1852 | struct i2c_adapter *i2c_adap) | ||
1853 | { | ||
1854 | u8 dev_id = 0; | ||
1855 | struct mb86a16_state *state = NULL; | ||
1856 | |||
1857 | state = kmalloc(sizeof(struct mb86a16_state), GFP_KERNEL); | ||
1858 | if (state == NULL) | ||
1859 | goto error; | ||
1860 | |||
1861 | state->config = config; | ||
1862 | state->i2c_adap = i2c_adap; | ||
1863 | |||
1864 | mb86a16_read(state, 0x7f, &dev_id); | ||
1865 | if (dev_id != 0xfe) | ||
1866 | goto error; | ||
1867 | |||
1868 | memcpy(&state->frontend.ops, &mb86a16_ops, sizeof(struct dvb_frontend_ops)); | ||
1869 | state->frontend.demodulator_priv = state; | ||
1870 | state->frontend.ops.set_voltage = state->config->set_voltage; | ||
1871 | |||
1872 | return &state->frontend; | ||
1873 | error: | ||
1874 | kfree(state); | ||
1875 | return NULL; | ||
1876 | } | ||
1877 | EXPORT_SYMBOL(mb86a16_attach); | ||
1878 | MODULE_LICENSE("GPL"); | ||
1879 | MODULE_AUTHOR("Manu Abraham"); | ||
diff --git a/drivers/media/dvb/frontends/mb86a16.h b/drivers/media/dvb/frontends/mb86a16.h new file mode 100644 index 000000000000..6ea8c376394f --- /dev/null +++ b/drivers/media/dvb/frontends/mb86a16.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | Fujitsu MB86A16 DVB-S/DSS DC Receiver driver | ||
3 | |||
4 | Copyright (C) Manu Abraham (abraham.manu@gmail.com) | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef __MB86A16_H | ||
22 | #define __MB86A16_H | ||
23 | |||
24 | #include <linux/dvb/frontend.h> | ||
25 | #include "dvb_frontend.h" | ||
26 | |||
27 | |||
28 | struct mb86a16_config { | ||
29 | u8 demod_address; | ||
30 | |||
31 | int (*set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage); | ||
32 | }; | ||
33 | |||
34 | |||
35 | |||
36 | #if defined(CONFIG_DVB_MB86A16) || (defined(CONFIG_DVB_MB86A16_MODULE) && defined(MODULE)) | ||
37 | |||
38 | extern struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config, | ||
39 | struct i2c_adapter *i2c_adap); | ||
40 | |||
41 | #else | ||
42 | |||
43 | static inline struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config, | ||
44 | struct i2c_adapter *i2c_adap) | ||
45 | { | ||
46 | printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__); | ||
47 | return NULL; | ||
48 | } | ||
49 | |||
50 | #endif /* CONFIG_DVB_MB86A16 */ | ||
51 | |||
52 | #endif /* __MB86A16_H */ | ||
diff --git a/drivers/media/dvb/frontends/mb86a16_priv.h b/drivers/media/dvb/frontends/mb86a16_priv.h new file mode 100644 index 000000000000..360a35acfe84 --- /dev/null +++ b/drivers/media/dvb/frontends/mb86a16_priv.h | |||
@@ -0,0 +1,151 @@ | |||
1 | /* | ||
2 | Fujitsu MB86A16 DVB-S/DSS DC Receiver driver | ||
3 | |||
4 | Copyright (C) Manu Abraham (abraham.manu@gmail.com) | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef __MB86A16_PRIV_H | ||
22 | #define __MB86A16_PRIV_H | ||
23 | |||
24 | #define MB86A16_TSOUT 0x00 | ||
25 | #define MB86A16_TSOUT_HIZSEL (0x01 << 5) | ||
26 | #define MB86A16_TSOUT_HIZCNTI (0x01 << 4) | ||
27 | #define MB86A16_TSOUT_MODE (0x01 << 3) | ||
28 | #define MB86A16_TSOUT_ORDER (0x01 << 2) | ||
29 | #define MB86A16_TSOUT_ERROR (0x01 << 1) | ||
30 | #define Mb86A16_TSOUT_EDGE (0x01 << 0) | ||
31 | |||
32 | #define MB86A16_FEC 0x01 | ||
33 | #define MB86A16_FEC_FSYNC (0x01 << 5) | ||
34 | #define MB86A16_FEC_PCKB8 (0x01 << 4) | ||
35 | #define MB86A16_FEC_DVDS (0x01 << 3) | ||
36 | #define MB86A16_FEC_EREN (0x01 << 2) | ||
37 | #define Mb86A16_FEC_RSEN (0x01 << 1) | ||
38 | #define MB86A16_FEC_DIEN (0x01 << 0) | ||
39 | |||
40 | #define MB86A16_AGC 0x02 | ||
41 | #define MB86A16_AGC_AGMD (0x01 << 6) | ||
42 | #define MB86A16_AGC_AGCW (0x0f << 2) | ||
43 | #define MB86A16_AGC_AGCP (0x01 << 1) | ||
44 | #define MB86A16_AGC_AGCR (0x01 << 0) | ||
45 | |||
46 | #define MB86A16_SRATE1 0x03 | ||
47 | #define MB86A16_SRATE1_DECI (0x07 << 2) | ||
48 | #define MB86A16_SRATE1_CSEL (0x01 << 1) | ||
49 | #define MB86A16_SRATE1_RSEL (0x01 << 0) | ||
50 | |||
51 | #define MB86A16_SRATE2 0x04 | ||
52 | #define MB86A16_SRATE2_STOFSL (0xff << 0) | ||
53 | |||
54 | #define MB86A16_SRATE3 0x05 | ||
55 | #define MB86A16_SRATE2_STOFSH (0xff << 0) | ||
56 | |||
57 | #define MB86A16_VITERBI 0x06 | ||
58 | #define MB86A16_FRAMESYNC 0x07 | ||
59 | #define MB86A16_CRLFILTCOEF1 0x08 | ||
60 | #define MB86A16_CRLFILTCOEF2 0x09 | ||
61 | #define MB86A16_STRFILTCOEF1 0x0a | ||
62 | #define MB86A16_STRFILTCOEF2 0x0b | ||
63 | #define MB86A16_RESET 0x0c | ||
64 | #define MB86A16_STATUS 0x0d | ||
65 | #define MB86A16_AFCML 0x0e | ||
66 | #define MB86A16_AFCMH 0x0f | ||
67 | #define MB86A16_BERMON 0x10 | ||
68 | #define MB86A16_BERTAB 0x11 | ||
69 | #define MB86A16_BERLSB 0x12 | ||
70 | #define MB86A16_BERMID 0x13 | ||
71 | #define MB86A16_BERMSB 0x14 | ||
72 | #define MB86A16_AGCM 0x15 | ||
73 | |||
74 | #define MB86A16_DCC1 0x16 | ||
75 | #define MB86A16_DCC1_DISTA (0x01 << 7) | ||
76 | #define MB86A16_DCC1_PRTY (0x01 << 6) | ||
77 | #define MB86A16_DCC1_CTOE (0x01 << 5) | ||
78 | #define MB86A16_DCC1_TBEN (0x01 << 4) | ||
79 | #define MB86A16_DCC1_TBO (0x01 << 3) | ||
80 | #define MB86A16_DCC1_NUM (0x07 << 0) | ||
81 | |||
82 | #define MB86A16_DCC2 0x17 | ||
83 | #define MB86A16_DCC2_DCBST (0x01 << 0) | ||
84 | |||
85 | #define MB86A16_DCC3 0x18 | ||
86 | #define MB86A16_DCC3_CODE0 (0xff << 0) | ||
87 | |||
88 | #define MB86A16_DCC4 0x19 | ||
89 | #define MB86A16_DCC4_CODE1 (0xff << 0) | ||
90 | |||
91 | #define MB86A16_DCC5 0x1a | ||
92 | #define MB86A16_DCC5_CODE2 (0xff << 0) | ||
93 | |||
94 | #define MB86A16_DCC6 0x1b | ||
95 | #define MB86A16_DCC6_CODE3 (0xff << 0) | ||
96 | |||
97 | #define MB86A16_DCC7 0x1c | ||
98 | #define MB86A16_DCC7_CODE4 (0xff << 0) | ||
99 | |||
100 | #define MB86A16_DCC8 0x1d | ||
101 | #define MB86A16_DCC8_CODE5 (0xff << 0) | ||
102 | |||
103 | #define MB86A16_DCCOUT 0x1e | ||
104 | #define MB86A16_DCCOUT_DISEN (0x01 << 0) | ||
105 | |||
106 | #define MB86A16_TONEOUT1 0x1f | ||
107 | #define MB86A16_TONE_TDIVL (0xff << 0) | ||
108 | |||
109 | #define MB86A16_TONEOUT2 0x20 | ||
110 | #define MB86A16_TONE_TMD (0x03 << 2) | ||
111 | #define MB86A16_TONE_TDIVH (0x03 << 0) | ||
112 | |||
113 | #define MB86A16_FREQ1 0x21 | ||
114 | #define MB86A16_FREQ2 0x22 | ||
115 | #define MB86A16_FREQ3 0x23 | ||
116 | #define MB86A16_FREQ4 0x24 | ||
117 | #define MB86A16_FREQSET 0x25 | ||
118 | #define MB86A16_CNM 0x26 | ||
119 | #define MB86A16_PORT0 0x27 | ||
120 | #define MB86A16_PORT1 0x28 | ||
121 | #define MB86A16_DRCFILT 0x29 | ||
122 | #define MB86A16_AFC 0x2a | ||
123 | #define MB86A16_AFCEXL 0x2b | ||
124 | #define MB86A16_AFCEXH 0x2c | ||
125 | #define MB86A16_DAGC 0x2d | ||
126 | #define MB86A16_SEQMODE 0x32 | ||
127 | #define MB86A16_S0S1T 0x33 | ||
128 | #define MB86A16_S2S3T 0x34 | ||
129 | #define MB86A16_S4S5T 0x35 | ||
130 | #define MB86A16_CNTMR 0x36 | ||
131 | #define MB86A16_SIG1 0x37 | ||
132 | #define MB86A16_SIG2 0x38 | ||
133 | #define MB86A16_VIMAG 0x39 | ||
134 | #define MB86A16_VISET1 0x3a | ||
135 | #define MB86A16_VISET2 0x3b | ||
136 | #define MB86A16_VISET3 0x3c | ||
137 | #define MB86A16_FAGCS1 0x3d | ||
138 | #define MB86A16_FAGCS2 0x3e | ||
139 | #define MB86A16_FAGCS3 0x3f | ||
140 | #define MB86A16_FAGCS4 0x40 | ||
141 | #define MB86A16_FAGCS5 0x41 | ||
142 | #define MB86A16_FAGCS6 0x42 | ||
143 | #define MB86A16_CRM 0x43 | ||
144 | #define MB86A16_STRM 0x44 | ||
145 | #define MB86A16_DAGCML 0x45 | ||
146 | #define MB86A16_DAGCMH 0x46 | ||
147 | #define MB86A16_QPSKTST 0x49 | ||
148 | #define MB86A16_DISTMON 0x52 | ||
149 | #define MB86A16_VERSION 0x7f | ||
150 | |||
151 | #endif /* __MB86A16_PRIV_H */ | ||
diff --git a/drivers/media/dvb/frontends/s5h1409.c b/drivers/media/dvb/frontends/s5h1409.c index fb3011518427..0e2f61a8978f 100644 --- a/drivers/media/dvb/frontends/s5h1409.c +++ b/drivers/media/dvb/frontends/s5h1409.c | |||
@@ -44,7 +44,15 @@ struct s5h1409_state { | |||
44 | int if_freq; | 44 | int if_freq; |
45 | 45 | ||
46 | u32 is_qam_locked; | 46 | u32 is_qam_locked; |
47 | u32 qam_state; | 47 | |
48 | /* QAM tuning state goes through the following state transitions */ | ||
49 | #define QAM_STATE_UNTUNED 0 | ||
50 | #define QAM_STATE_TUNING_STARTED 1 | ||
51 | #define QAM_STATE_INTERLEAVE_SET 2 | ||
52 | #define QAM_STATE_QAM_OPTIMIZED_L1 3 | ||
53 | #define QAM_STATE_QAM_OPTIMIZED_L2 4 | ||
54 | #define QAM_STATE_QAM_OPTIMIZED_L3 5 | ||
55 | u8 qam_state; | ||
48 | }; | 56 | }; |
49 | 57 | ||
50 | static int debug; | 58 | static int debug; |
@@ -347,7 +355,7 @@ static int s5h1409_softreset(struct dvb_frontend *fe) | |||
347 | s5h1409_writereg(state, 0xf5, 0); | 355 | s5h1409_writereg(state, 0xf5, 0); |
348 | s5h1409_writereg(state, 0xf5, 1); | 356 | s5h1409_writereg(state, 0xf5, 1); |
349 | state->is_qam_locked = 0; | 357 | state->is_qam_locked = 0; |
350 | state->qam_state = 0; | 358 | state->qam_state = QAM_STATE_UNTUNED; |
351 | return 0; | 359 | return 0; |
352 | } | 360 | } |
353 | 361 | ||
@@ -474,6 +482,59 @@ static void s5h1409_set_qam_amhum_mode(struct dvb_frontend *fe) | |||
474 | struct s5h1409_state *state = fe->demodulator_priv; | 482 | struct s5h1409_state *state = fe->demodulator_priv; |
475 | u16 reg; | 483 | u16 reg; |
476 | 484 | ||
485 | if (state->qam_state < QAM_STATE_INTERLEAVE_SET) { | ||
486 | /* We should not perform amhum optimization until | ||
487 | the interleave mode has been configured */ | ||
488 | return; | ||
489 | } | ||
490 | |||
491 | if (state->qam_state == QAM_STATE_QAM_OPTIMIZED_L3) { | ||
492 | /* We've already reached the maximum optimization level, so | ||
493 | dont bother banging on the status registers */ | ||
494 | return; | ||
495 | } | ||
496 | |||
497 | /* QAM EQ lock check */ | ||
498 | reg = s5h1409_readreg(state, 0xf0); | ||
499 | |||
500 | if ((reg >> 13) & 0x1) { | ||
501 | reg &= 0xff; | ||
502 | |||
503 | s5h1409_writereg(state, 0x96, 0x000c); | ||
504 | if (reg < 0x68) { | ||
505 | if (state->qam_state < QAM_STATE_QAM_OPTIMIZED_L3) { | ||
506 | dprintk("%s() setting QAM state to OPT_L3\n", | ||
507 | __func__); | ||
508 | s5h1409_writereg(state, 0x93, 0x3130); | ||
509 | s5h1409_writereg(state, 0x9e, 0x2836); | ||
510 | state->qam_state = QAM_STATE_QAM_OPTIMIZED_L3; | ||
511 | } | ||
512 | } else { | ||
513 | if (state->qam_state < QAM_STATE_QAM_OPTIMIZED_L2) { | ||
514 | dprintk("%s() setting QAM state to OPT_L2\n", | ||
515 | __func__); | ||
516 | s5h1409_writereg(state, 0x93, 0x3332); | ||
517 | s5h1409_writereg(state, 0x9e, 0x2c37); | ||
518 | state->qam_state = QAM_STATE_QAM_OPTIMIZED_L2; | ||
519 | } | ||
520 | } | ||
521 | |||
522 | } else { | ||
523 | if (state->qam_state < QAM_STATE_QAM_OPTIMIZED_L1) { | ||
524 | dprintk("%s() setting QAM state to OPT_L1\n", __func__); | ||
525 | s5h1409_writereg(state, 0x96, 0x0008); | ||
526 | s5h1409_writereg(state, 0x93, 0x3332); | ||
527 | s5h1409_writereg(state, 0x9e, 0x2c37); | ||
528 | state->qam_state = QAM_STATE_QAM_OPTIMIZED_L1; | ||
529 | } | ||
530 | } | ||
531 | } | ||
532 | |||
533 | static void s5h1409_set_qam_amhum_mode_legacy(struct dvb_frontend *fe) | ||
534 | { | ||
535 | struct s5h1409_state *state = fe->demodulator_priv; | ||
536 | u16 reg; | ||
537 | |||
477 | if (state->is_qam_locked) | 538 | if (state->is_qam_locked) |
478 | return; | 539 | return; |
479 | 540 | ||
@@ -506,6 +567,44 @@ static void s5h1409_set_qam_interleave_mode(struct dvb_frontend *fe) | |||
506 | struct s5h1409_state *state = fe->demodulator_priv; | 567 | struct s5h1409_state *state = fe->demodulator_priv; |
507 | u16 reg, reg1, reg2; | 568 | u16 reg, reg1, reg2; |
508 | 569 | ||
570 | if (state->qam_state >= QAM_STATE_INTERLEAVE_SET) { | ||
571 | /* We've done the optimization already */ | ||
572 | return; | ||
573 | } | ||
574 | |||
575 | reg = s5h1409_readreg(state, 0xf1); | ||
576 | |||
577 | /* Master lock */ | ||
578 | if ((reg >> 15) & 0x1) { | ||
579 | if (state->qam_state == QAM_STATE_UNTUNED || | ||
580 | state->qam_state == QAM_STATE_TUNING_STARTED) { | ||
581 | dprintk("%s() setting QAM state to INTERLEAVE_SET\n", | ||
582 | __func__); | ||
583 | reg1 = s5h1409_readreg(state, 0xb2); | ||
584 | reg2 = s5h1409_readreg(state, 0xad); | ||
585 | |||
586 | s5h1409_writereg(state, 0x96, 0x0020); | ||
587 | s5h1409_writereg(state, 0xad, | ||
588 | (((reg1 & 0xf000) >> 4) | (reg2 & 0xf0ff))); | ||
589 | state->qam_state = QAM_STATE_INTERLEAVE_SET; | ||
590 | } | ||
591 | } else { | ||
592 | if (state->qam_state == QAM_STATE_UNTUNED) { | ||
593 | dprintk("%s() setting QAM state to TUNING_STARTED\n", | ||
594 | __func__); | ||
595 | s5h1409_writereg(state, 0x96, 0x08); | ||
596 | s5h1409_writereg(state, 0xab, | ||
597 | s5h1409_readreg(state, 0xab) | 0x1001); | ||
598 | state->qam_state = QAM_STATE_TUNING_STARTED; | ||
599 | } | ||
600 | } | ||
601 | } | ||
602 | |||
603 | static void s5h1409_set_qam_interleave_mode_legacy(struct dvb_frontend *fe) | ||
604 | { | ||
605 | struct s5h1409_state *state = fe->demodulator_priv; | ||
606 | u16 reg, reg1, reg2; | ||
607 | |||
509 | reg = s5h1409_readreg(state, 0xf1); | 608 | reg = s5h1409_readreg(state, 0xf1); |
510 | 609 | ||
511 | /* Master lock */ | 610 | /* Master lock */ |
@@ -553,16 +652,24 @@ static int s5h1409_set_frontend(struct dvb_frontend *fe, | |||
553 | fe->ops.i2c_gate_ctrl(fe, 0); | 652 | fe->ops.i2c_gate_ctrl(fe, 0); |
554 | } | 653 | } |
555 | 654 | ||
556 | /* Optimize the demod for QAM */ | ||
557 | if (p->u.vsb.modulation != VSB_8) { | ||
558 | s5h1409_set_qam_amhum_mode(fe); | ||
559 | s5h1409_set_qam_interleave_mode(fe); | ||
560 | } | ||
561 | |||
562 | /* Issue a reset to the demod so it knows to resync against the | 655 | /* Issue a reset to the demod so it knows to resync against the |
563 | newly tuned frequency */ | 656 | newly tuned frequency */ |
564 | s5h1409_softreset(fe); | 657 | s5h1409_softreset(fe); |
565 | 658 | ||
659 | /* Optimize the demod for QAM */ | ||
660 | if (state->current_modulation != VSB_8) { | ||
661 | /* This almost certainly applies to all boards, but for now | ||
662 | only do it for the HVR-1600. Once the other boards are | ||
663 | tested, the "legacy" versions can just go away */ | ||
664 | if (state->config->hvr1600_opt == S5H1409_HVR1600_OPTIMIZE) { | ||
665 | s5h1409_set_qam_interleave_mode(fe); | ||
666 | s5h1409_set_qam_amhum_mode(fe); | ||
667 | } else { | ||
668 | s5h1409_set_qam_amhum_mode_legacy(fe); | ||
669 | s5h1409_set_qam_interleave_mode_legacy(fe); | ||
670 | } | ||
671 | } | ||
672 | |||
566 | return 0; | 673 | return 0; |
567 | } | 674 | } |
568 | 675 | ||
@@ -614,6 +721,21 @@ static int s5h1409_init(struct dvb_frontend *fe) | |||
614 | /* The datasheet says that after initialisation, VSB is default */ | 721 | /* The datasheet says that after initialisation, VSB is default */ |
615 | state->current_modulation = VSB_8; | 722 | state->current_modulation = VSB_8; |
616 | 723 | ||
724 | /* Optimize for the HVR-1600 if appropriate. Note that some of these | ||
725 | may get folded into the generic case after testing with other | ||
726 | devices */ | ||
727 | if (state->config->hvr1600_opt == S5H1409_HVR1600_OPTIMIZE) { | ||
728 | /* VSB AGC REF */ | ||
729 | s5h1409_writereg(state, 0x09, 0x0050); | ||
730 | |||
731 | /* Unknown but Windows driver does it... */ | ||
732 | s5h1409_writereg(state, 0x21, 0x0001); | ||
733 | s5h1409_writereg(state, 0x50, 0x030e); | ||
734 | |||
735 | /* QAM AGC REF */ | ||
736 | s5h1409_writereg(state, 0x82, 0x0800); | ||
737 | } | ||
738 | |||
617 | if (state->config->output_mode == S5H1409_SERIAL_OUTPUT) | 739 | if (state->config->output_mode == S5H1409_SERIAL_OUTPUT) |
618 | s5h1409_writereg(state, 0xab, | 740 | s5h1409_writereg(state, 0xab, |
619 | s5h1409_readreg(state, 0xab) | 0x100); /* Serial */ | 741 | s5h1409_readreg(state, 0xab) | 0x100); /* Serial */ |
@@ -641,6 +763,17 @@ static int s5h1409_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
641 | 763 | ||
642 | *status = 0; | 764 | *status = 0; |
643 | 765 | ||
766 | /* Optimize the demod for QAM */ | ||
767 | if (state->current_modulation != VSB_8) { | ||
768 | /* This almost certainly applies to all boards, but for now | ||
769 | only do it for the HVR-1600. Once the other boards are | ||
770 | tested, the "legacy" versions can just go away */ | ||
771 | if (state->config->hvr1600_opt == S5H1409_HVR1600_OPTIMIZE) { | ||
772 | s5h1409_set_qam_interleave_mode(fe); | ||
773 | s5h1409_set_qam_amhum_mode(fe); | ||
774 | } | ||
775 | } | ||
776 | |||
644 | /* Get the demodulator status */ | 777 | /* Get the demodulator status */ |
645 | reg = s5h1409_readreg(state, 0xf1); | 778 | reg = s5h1409_readreg(state, 0xf1); |
646 | if (reg & 0x1000) | 779 | if (reg & 0x1000) |
diff --git a/drivers/media/dvb/frontends/s5h1409.h b/drivers/media/dvb/frontends/s5h1409.h index 070d9743e330..91f2ebd1a534 100644 --- a/drivers/media/dvb/frontends/s5h1409.h +++ b/drivers/media/dvb/frontends/s5h1409.h | |||
@@ -57,6 +57,13 @@ struct s5h1409_config { | |||
57 | #define S5H1409_MPEGTIMING_NONCONTINOUS_INVERTING_CLOCK 2 | 57 | #define S5H1409_MPEGTIMING_NONCONTINOUS_INVERTING_CLOCK 2 |
58 | #define S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK 3 | 58 | #define S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK 3 |
59 | u16 mpeg_timing; | 59 | u16 mpeg_timing; |
60 | |||
61 | /* HVR-1600 optimizations (to better work with MXL5005s) | ||
62 | Note: some of these are likely to be folded into the generic driver | ||
63 | after being regression tested with other boards */ | ||
64 | #define S5H1409_HVR1600_NOOPTIMIZE 0 | ||
65 | #define S5H1409_HVR1600_OPTIMIZE 1 | ||
66 | u8 hvr1600_opt; | ||
60 | }; | 67 | }; |
61 | 68 | ||
62 | #if defined(CONFIG_DVB_S5H1409) || (defined(CONFIG_DVB_S5H1409_MODULE) \ | 69 | #if defined(CONFIG_DVB_S5H1409) || (defined(CONFIG_DVB_S5H1409_MODULE) \ |
diff --git a/drivers/media/dvb/frontends/s921_module.c b/drivers/media/dvb/frontends/s921_module.c index 3156b64cfc96..0eefff61cc50 100644 --- a/drivers/media/dvb/frontends/s921_module.c +++ b/drivers/media/dvb/frontends/s921_module.c | |||
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/slab.h> | ||
12 | #include <linux/delay.h> | 13 | #include <linux/delay.h> |
13 | #include "dvb_frontend.h" | 14 | #include "dvb_frontend.h" |
14 | #include "s921_module.h" | 15 | #include "s921_module.h" |
diff --git a/drivers/media/dvb/frontends/si21xx.c b/drivers/media/dvb/frontends/si21xx.c index 9552a22ccffb..d21a327db629 100644 --- a/drivers/media/dvb/frontends/si21xx.c +++ b/drivers/media/dvb/frontends/si21xx.c | |||
@@ -97,8 +97,6 @@ | |||
97 | #define LNB_SUPPLY_CTRL_REG_4 0xce | 97 | #define LNB_SUPPLY_CTRL_REG_4 0xce |
98 | #define LNB_SUPPLY_STATUS_REG 0xcf | 98 | #define LNB_SUPPLY_STATUS_REG 0xcf |
99 | 99 | ||
100 | #define FALSE 0 | ||
101 | #define TRUE 1 | ||
102 | #define FAIL -1 | 100 | #define FAIL -1 |
103 | #define PASS 0 | 101 | #define PASS 0 |
104 | 102 | ||
@@ -718,7 +716,7 @@ static int si21xx_set_frontend(struct dvb_frontend *fe, | |||
718 | int fine_tune_freq; | 716 | int fine_tune_freq; |
719 | unsigned char sample_rate = 0; | 717 | unsigned char sample_rate = 0; |
720 | /* boolean */ | 718 | /* boolean */ |
721 | unsigned int inband_interferer_ind; | 719 | bool inband_interferer_ind; |
722 | 720 | ||
723 | /* INTERMEDIATE VALUES */ | 721 | /* INTERMEDIATE VALUES */ |
724 | int icoarse_tune_freq; /* MHz */ | 722 | int icoarse_tune_freq; /* MHz */ |
@@ -728,15 +726,8 @@ static int si21xx_set_frontend(struct dvb_frontend *fe, | |||
728 | unsigned int x1; | 726 | unsigned int x1; |
729 | unsigned int x2; | 727 | unsigned int x2; |
730 | int i; | 728 | int i; |
731 | unsigned int inband_interferer_div2[ALLOWABLE_FS_COUNT] = { | 729 | bool inband_interferer_div2[ALLOWABLE_FS_COUNT]; |
732 | FALSE, FALSE, FALSE, FALSE, FALSE, | 730 | bool inband_interferer_div4[ALLOWABLE_FS_COUNT]; |
733 | FALSE, FALSE, FALSE, FALSE, FALSE | ||
734 | }; | ||
735 | unsigned int inband_interferer_div4[ALLOWABLE_FS_COUNT] = { | ||
736 | FALSE, FALSE, FALSE, FALSE, FALSE, | ||
737 | FALSE, FALSE, FALSE, FALSE, FALSE | ||
738 | }; | ||
739 | |||
740 | int status; | 731 | int status; |
741 | 732 | ||
742 | /* allowable sample rates for ADC in MHz */ | 733 | /* allowable sample rates for ADC in MHz */ |
@@ -762,7 +753,7 @@ static int si21xx_set_frontend(struct dvb_frontend *fe, | |||
762 | } | 753 | } |
763 | 754 | ||
764 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) | 755 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) |
765 | inband_interferer_div2[i] = inband_interferer_div4[i] = FALSE; | 756 | inband_interferer_div2[i] = inband_interferer_div4[i] = false; |
766 | 757 | ||
767 | if_limit_high = -700000; | 758 | if_limit_high = -700000; |
768 | if_limit_low = -100000; | 759 | if_limit_low = -100000; |
@@ -798,7 +789,7 @@ static int si21xx_set_frontend(struct dvb_frontend *fe, | |||
798 | 789 | ||
799 | if (((band_low < x1) && (x1 < band_high)) || | 790 | if (((band_low < x1) && (x1 < band_high)) || |
800 | ((band_low < x2) && (x2 < band_high))) | 791 | ((band_low < x2) && (x2 < band_high))) |
801 | inband_interferer_div4[i] = TRUE; | 792 | inband_interferer_div4[i] = true; |
802 | 793 | ||
803 | } | 794 | } |
804 | 795 | ||
@@ -811,25 +802,28 @@ static int si21xx_set_frontend(struct dvb_frontend *fe, | |||
811 | 802 | ||
812 | if (((band_low < x1) && (x1 < band_high)) || | 803 | if (((band_low < x1) && (x1 < band_high)) || |
813 | ((band_low < x2) && (x2 < band_high))) | 804 | ((band_low < x2) && (x2 < band_high))) |
814 | inband_interferer_div2[i] = TRUE; | 805 | inband_interferer_div2[i] = true; |
815 | } | 806 | } |
816 | 807 | ||
817 | inband_interferer_ind = TRUE; | 808 | inband_interferer_ind = true; |
818 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) | 809 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) { |
819 | inband_interferer_ind &= inband_interferer_div2[i] | | 810 | if (inband_interferer_div2[i] || inband_interferer_div4[i]) { |
820 | inband_interferer_div4[i]; | 811 | inband_interferer_ind = false; |
812 | break; | ||
813 | } | ||
814 | } | ||
821 | 815 | ||
822 | if (inband_interferer_ind) { | 816 | if (inband_interferer_ind) { |
823 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) { | 817 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) { |
824 | if (inband_interferer_div2[i] == FALSE) { | 818 | if (!inband_interferer_div2[i]) { |
825 | sample_rate = (u8) afs[i]; | 819 | sample_rate = (u8) afs[i]; |
826 | break; | 820 | break; |
827 | } | 821 | } |
828 | } | 822 | } |
829 | } else { | 823 | } else { |
830 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) { | 824 | for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) { |
831 | if ((inband_interferer_div2[i] | | 825 | if ((inband_interferer_div2[i] || |
832 | inband_interferer_div4[i]) == FALSE) { | 826 | !inband_interferer_div4[i])) { |
833 | sample_rate = (u8) afs[i]; | 827 | sample_rate = (u8) afs[i]; |
834 | break; | 828 | break; |
835 | } | 829 | } |
diff --git a/drivers/media/dvb/frontends/stb0899_drv.c b/drivers/media/dvb/frontends/stb0899_drv.c index a04c782fff8d..8e38fcee564e 100644 --- a/drivers/media/dvb/frontends/stb0899_drv.c +++ b/drivers/media/dvb/frontends/stb0899_drv.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/slab.h> | ||
25 | #include <linux/string.h> | 26 | #include <linux/string.h> |
26 | 27 | ||
27 | #include <linux/dvb/frontend.h> | 28 | #include <linux/dvb/frontend.h> |
@@ -1571,7 +1572,7 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvb_fron | |||
1571 | * stb0899_track | 1572 | * stb0899_track |
1572 | * periodically check the signal level against a specified | 1573 | * periodically check the signal level against a specified |
1573 | * threshold level and perform derotator centering. | 1574 | * threshold level and perform derotator centering. |
1574 | * called once we have a lock from a succesful search | 1575 | * called once we have a lock from a successful search |
1575 | * event. | 1576 | * event. |
1576 | * | 1577 | * |
1577 | * Will be called periodically called to maintain the | 1578 | * Will be called periodically called to maintain the |
diff --git a/drivers/media/dvb/frontends/stb6000.c b/drivers/media/dvb/frontends/stb6000.c index 0e2cb0df1441..ed699647050e 100644 --- a/drivers/media/dvb/frontends/stb6000.c +++ b/drivers/media/dvb/frontends/stb6000.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/slab.h> | ||
23 | #include <linux/module.h> | 24 | #include <linux/module.h> |
24 | #include <linux/dvb/frontend.h> | 25 | #include <linux/dvb/frontend.h> |
25 | #include <asm/types.h> | 26 | #include <asm/types.h> |
diff --git a/drivers/media/dvb/frontends/stb6100.c b/drivers/media/dvb/frontends/stb6100.c index 60ee18a94f43..f73c13323e90 100644 --- a/drivers/media/dvb/frontends/stb6100.c +++ b/drivers/media/dvb/frontends/stb6100.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/slab.h> | ||
25 | #include <linux/string.h> | 26 | #include <linux/string.h> |
26 | 27 | ||
27 | #include "dvb_frontend.h" | 28 | #include "dvb_frontend.h" |
diff --git a/drivers/media/dvb/frontends/stb6100_proc.h b/drivers/media/dvb/frontends/stb6100_proc.h new file mode 100644 index 000000000000..112163a48622 --- /dev/null +++ b/drivers/media/dvb/frontends/stb6100_proc.h | |||
@@ -0,0 +1,138 @@ | |||
1 | /* | ||
2 | STB6100 Silicon Tuner wrapper | ||
3 | Copyright (C)2009 Igor M. Liplianin (liplianin@me.by) | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 2 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | ||
19 | |||
20 | static int stb6100_get_freq(struct dvb_frontend *fe, u32 *frequency) | ||
21 | { | ||
22 | struct dvb_frontend_ops *frontend_ops = NULL; | ||
23 | struct dvb_tuner_ops *tuner_ops = NULL; | ||
24 | struct tuner_state state; | ||
25 | int err = 0; | ||
26 | |||
27 | if (&fe->ops) | ||
28 | frontend_ops = &fe->ops; | ||
29 | if (&frontend_ops->tuner_ops) | ||
30 | tuner_ops = &frontend_ops->tuner_ops; | ||
31 | if (tuner_ops->get_state) { | ||
32 | if (frontend_ops->i2c_gate_ctrl) | ||
33 | frontend_ops->i2c_gate_ctrl(fe, 1); | ||
34 | |||
35 | err = tuner_ops->get_state(fe, DVBFE_TUNER_FREQUENCY, &state); | ||
36 | if (err < 0) { | ||
37 | printk(KERN_ERR "%s: Invalid parameter\n", __func__); | ||
38 | return err; | ||
39 | } | ||
40 | |||
41 | if (frontend_ops->i2c_gate_ctrl) | ||
42 | frontend_ops->i2c_gate_ctrl(fe, 0); | ||
43 | |||
44 | *frequency = state.frequency; | ||
45 | } | ||
46 | |||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | static int stb6100_set_freq(struct dvb_frontend *fe, u32 frequency) | ||
51 | { | ||
52 | struct dvb_frontend_ops *frontend_ops = NULL; | ||
53 | struct dvb_tuner_ops *tuner_ops = NULL; | ||
54 | struct tuner_state state; | ||
55 | int err = 0; | ||
56 | |||
57 | state.frequency = frequency; | ||
58 | if (&fe->ops) | ||
59 | frontend_ops = &fe->ops; | ||
60 | if (&frontend_ops->tuner_ops) | ||
61 | tuner_ops = &frontend_ops->tuner_ops; | ||
62 | if (tuner_ops->set_state) { | ||
63 | if (frontend_ops->i2c_gate_ctrl) | ||
64 | frontend_ops->i2c_gate_ctrl(fe, 1); | ||
65 | |||
66 | err = tuner_ops->set_state(fe, DVBFE_TUNER_FREQUENCY, &state); | ||
67 | if (err < 0) { | ||
68 | printk(KERN_ERR "%s: Invalid parameter\n", __func__); | ||
69 | return err; | ||
70 | } | ||
71 | |||
72 | if (frontend_ops->i2c_gate_ctrl) | ||
73 | frontend_ops->i2c_gate_ctrl(fe, 0); | ||
74 | |||
75 | } | ||
76 | |||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static int stb6100_get_bandw(struct dvb_frontend *fe, u32 *bandwidth) | ||
81 | { | ||
82 | struct dvb_frontend_ops *frontend_ops = NULL; | ||
83 | struct dvb_tuner_ops *tuner_ops = NULL; | ||
84 | struct tuner_state state; | ||
85 | int err = 0; | ||
86 | |||
87 | if (&fe->ops) | ||
88 | frontend_ops = &fe->ops; | ||
89 | if (&frontend_ops->tuner_ops) | ||
90 | tuner_ops = &frontend_ops->tuner_ops; | ||
91 | if (tuner_ops->get_state) { | ||
92 | if (frontend_ops->i2c_gate_ctrl) | ||
93 | frontend_ops->i2c_gate_ctrl(fe, 1); | ||
94 | |||
95 | err = tuner_ops->get_state(fe, DVBFE_TUNER_BANDWIDTH, &state); | ||
96 | if (err < 0) { | ||
97 | printk(KERN_ERR "%s: Invalid parameter\n", __func__); | ||
98 | return err; | ||
99 | } | ||
100 | |||
101 | if (frontend_ops->i2c_gate_ctrl) | ||
102 | frontend_ops->i2c_gate_ctrl(fe, 0); | ||
103 | |||
104 | *bandwidth = state.bandwidth; | ||
105 | } | ||
106 | |||
107 | return 0; | ||
108 | } | ||
109 | |||
110 | static int stb6100_set_bandw(struct dvb_frontend *fe, u32 bandwidth) | ||
111 | { | ||
112 | struct dvb_frontend_ops *frontend_ops = NULL; | ||
113 | struct dvb_tuner_ops *tuner_ops = NULL; | ||
114 | struct tuner_state state; | ||
115 | int err = 0; | ||
116 | |||
117 | state.bandwidth = bandwidth; | ||
118 | if (&fe->ops) | ||
119 | frontend_ops = &fe->ops; | ||
120 | if (&frontend_ops->tuner_ops) | ||
121 | tuner_ops = &frontend_ops->tuner_ops; | ||
122 | if (tuner_ops->set_state) { | ||
123 | if (frontend_ops->i2c_gate_ctrl) | ||
124 | frontend_ops->i2c_gate_ctrl(fe, 1); | ||
125 | |||
126 | err = tuner_ops->set_state(fe, DVBFE_TUNER_BANDWIDTH, &state); | ||
127 | if (err < 0) { | ||
128 | printk(KERN_ERR "%s: Invalid parameter\n", __func__); | ||
129 | return err; | ||
130 | } | ||
131 | |||
132 | if (frontend_ops->i2c_gate_ctrl) | ||
133 | frontend_ops->i2c_gate_ctrl(fe, 0); | ||
134 | |||
135 | } | ||
136 | |||
137 | return 0; | ||
138 | } | ||
diff --git a/drivers/media/dvb/frontends/stv0900.h b/drivers/media/dvb/frontends/stv0900.h index bf4e9b633044..e3e35d1ce838 100644 --- a/drivers/media/dvb/frontends/stv0900.h +++ b/drivers/media/dvb/frontends/stv0900.h | |||
@@ -36,6 +36,7 @@ struct stv0900_reg { | |||
36 | 36 | ||
37 | struct stv0900_config { | 37 | struct stv0900_config { |
38 | u8 demod_address; | 38 | u8 demod_address; |
39 | u8 demod_mode; | ||
39 | u32 xtal; | 40 | u32 xtal; |
40 | u8 clkmode;/* 0 for CLKI, 2 for XTALI */ | 41 | u8 clkmode;/* 0 for CLKI, 2 for XTALI */ |
41 | 42 | ||
@@ -48,6 +49,10 @@ struct stv0900_config { | |||
48 | u8 tun2_maddress; | 49 | u8 tun2_maddress; |
49 | u8 tun1_adc;/* 1 for stv6110, 2 for stb6100 */ | 50 | u8 tun1_adc;/* 1 for stv6110, 2 for stb6100 */ |
50 | u8 tun2_adc; | 51 | u8 tun2_adc; |
52 | u8 tun1_type;/* for now 3 for stb6100 auto, else - software */ | ||
53 | u8 tun2_type; | ||
54 | /* Set device param to start dma */ | ||
55 | int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured); | ||
51 | }; | 56 | }; |
52 | 57 | ||
53 | #if defined(CONFIG_DVB_STV0900) || (defined(CONFIG_DVB_STV0900_MODULE) \ | 58 | #if defined(CONFIG_DVB_STV0900) || (defined(CONFIG_DVB_STV0900_MODULE) \ |
diff --git a/drivers/media/dvb/frontends/stv0900_core.c b/drivers/media/dvb/frontends/stv0900_core.c index 3bde3324a032..01f8f1f802fd 100644 --- a/drivers/media/dvb/frontends/stv0900_core.c +++ b/drivers/media/dvb/frontends/stv0900_core.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include "stv0900_priv.h" | 34 | #include "stv0900_priv.h" |
35 | #include "stv0900_init.h" | 35 | #include "stv0900_init.h" |
36 | 36 | ||
37 | static int stvdebug = 1; | 37 | int stvdebug = 1; |
38 | module_param_named(debug, stvdebug, int, 0644); | 38 | module_param_named(debug, stvdebug, int, 0644); |
39 | 39 | ||
40 | /* internal params node */ | 40 | /* internal params node */ |
@@ -105,7 +105,8 @@ static struct stv0900_inode *append_internal(struct stv0900_internal *internal) | |||
105 | while (new_node->next_inode != NULL) | 105 | while (new_node->next_inode != NULL) |
106 | new_node = new_node->next_inode; | 106 | new_node = new_node->next_inode; |
107 | 107 | ||
108 | new_node->next_inode = kmalloc(sizeof(struct stv0900_inode), GFP_KERNEL); | 108 | new_node->next_inode = kmalloc(sizeof(struct stv0900_inode), |
109 | GFP_KERNEL); | ||
109 | if (new_node->next_inode != NULL) | 110 | if (new_node->next_inode != NULL) |
110 | new_node = new_node->next_inode; | 111 | new_node = new_node->next_inode; |
111 | else | 112 | else |
@@ -128,13 +129,13 @@ s32 ge2comp(s32 a, s32 width) | |||
128 | return (a >= (1 << (width - 1))) ? (a - (1 << width)) : a; | 129 | return (a >= (1 << (width - 1))) ? (a - (1 << width)) : a; |
129 | } | 130 | } |
130 | 131 | ||
131 | void stv0900_write_reg(struct stv0900_internal *i_params, u16 reg_addr, | 132 | void stv0900_write_reg(struct stv0900_internal *intp, u16 reg_addr, |
132 | u8 reg_data) | 133 | u8 reg_data) |
133 | { | 134 | { |
134 | u8 data[3]; | 135 | u8 data[3]; |
135 | int ret; | 136 | int ret; |
136 | struct i2c_msg i2cmsg = { | 137 | struct i2c_msg i2cmsg = { |
137 | .addr = i_params->i2c_addr, | 138 | .addr = intp->i2c_addr, |
138 | .flags = 0, | 139 | .flags = 0, |
139 | .len = 3, | 140 | .len = 3, |
140 | .buf = data, | 141 | .buf = data, |
@@ -144,39 +145,39 @@ void stv0900_write_reg(struct stv0900_internal *i_params, u16 reg_addr, | |||
144 | data[1] = LSB(reg_addr); | 145 | data[1] = LSB(reg_addr); |
145 | data[2] = reg_data; | 146 | data[2] = reg_data; |
146 | 147 | ||
147 | ret = i2c_transfer(i_params->i2c_adap, &i2cmsg, 1); | 148 | ret = i2c_transfer(intp->i2c_adap, &i2cmsg, 1); |
148 | if (ret != 1) | 149 | if (ret != 1) |
149 | dprintk(KERN_ERR "%s: i2c error %d\n", __func__, ret); | 150 | dprintk("%s: i2c error %d\n", __func__, ret); |
150 | } | 151 | } |
151 | 152 | ||
152 | u8 stv0900_read_reg(struct stv0900_internal *i_params, u16 reg) | 153 | u8 stv0900_read_reg(struct stv0900_internal *intp, u16 reg) |
153 | { | 154 | { |
154 | int ret; | 155 | int ret; |
155 | u8 b0[] = { MSB(reg), LSB(reg) }; | 156 | u8 b0[] = { MSB(reg), LSB(reg) }; |
156 | u8 buf = 0; | 157 | u8 buf = 0; |
157 | struct i2c_msg msg[] = { | 158 | struct i2c_msg msg[] = { |
158 | { | 159 | { |
159 | .addr = i_params->i2c_addr, | 160 | .addr = intp->i2c_addr, |
160 | .flags = 0, | 161 | .flags = 0, |
161 | .buf = b0, | 162 | .buf = b0, |
162 | .len = 2, | 163 | .len = 2, |
163 | }, { | 164 | }, { |
164 | .addr = i_params->i2c_addr, | 165 | .addr = intp->i2c_addr, |
165 | .flags = I2C_M_RD, | 166 | .flags = I2C_M_RD, |
166 | .buf = &buf, | 167 | .buf = &buf, |
167 | .len = 1, | 168 | .len = 1, |
168 | }, | 169 | }, |
169 | }; | 170 | }; |
170 | 171 | ||
171 | ret = i2c_transfer(i_params->i2c_adap, msg, 2); | 172 | ret = i2c_transfer(intp->i2c_adap, msg, 2); |
172 | if (ret != 2) | 173 | if (ret != 2) |
173 | dprintk(KERN_ERR "%s: i2c error %d, reg[0x%02x]\n", | 174 | dprintk("%s: i2c error %d, reg[0x%02x]\n", |
174 | __func__, ret, reg); | 175 | __func__, ret, reg); |
175 | 176 | ||
176 | return buf; | 177 | return buf; |
177 | } | 178 | } |
178 | 179 | ||
179 | void extract_mask_pos(u32 label, u8 *mask, u8 *pos) | 180 | static void extract_mask_pos(u32 label, u8 *mask, u8 *pos) |
180 | { | 181 | { |
181 | u8 position = 0, i = 0; | 182 | u8 position = 0, i = 0; |
182 | 183 | ||
@@ -190,169 +191,165 @@ void extract_mask_pos(u32 label, u8 *mask, u8 *pos) | |||
190 | (*pos) = (i - 1); | 191 | (*pos) = (i - 1); |
191 | } | 192 | } |
192 | 193 | ||
193 | void stv0900_write_bits(struct stv0900_internal *i_params, u32 label, u8 val) | 194 | void stv0900_write_bits(struct stv0900_internal *intp, u32 label, u8 val) |
194 | { | 195 | { |
195 | u8 reg, mask, pos; | 196 | u8 reg, mask, pos; |
196 | 197 | ||
197 | reg = stv0900_read_reg(i_params, (label >> 16) & 0xffff); | 198 | reg = stv0900_read_reg(intp, (label >> 16) & 0xffff); |
198 | extract_mask_pos(label, &mask, &pos); | 199 | extract_mask_pos(label, &mask, &pos); |
199 | 200 | ||
200 | val = mask & (val << pos); | 201 | val = mask & (val << pos); |
201 | 202 | ||
202 | reg = (reg & (~mask)) | val; | 203 | reg = (reg & (~mask)) | val; |
203 | stv0900_write_reg(i_params, (label >> 16) & 0xffff, reg); | 204 | stv0900_write_reg(intp, (label >> 16) & 0xffff, reg); |
204 | 205 | ||
205 | } | 206 | } |
206 | 207 | ||
207 | u8 stv0900_get_bits(struct stv0900_internal *i_params, u32 label) | 208 | u8 stv0900_get_bits(struct stv0900_internal *intp, u32 label) |
208 | { | 209 | { |
209 | u8 val = 0xff; | 210 | u8 val = 0xff; |
210 | u8 mask, pos; | 211 | u8 mask, pos; |
211 | 212 | ||
212 | extract_mask_pos(label, &mask, &pos); | 213 | extract_mask_pos(label, &mask, &pos); |
213 | 214 | ||
214 | val = stv0900_read_reg(i_params, label >> 16); | 215 | val = stv0900_read_reg(intp, label >> 16); |
215 | val = (val & mask) >> pos; | 216 | val = (val & mask) >> pos; |
216 | 217 | ||
217 | return val; | 218 | return val; |
218 | } | 219 | } |
219 | 220 | ||
220 | enum fe_stv0900_error stv0900_initialize(struct stv0900_internal *i_params) | 221 | static enum fe_stv0900_error stv0900_initialize(struct stv0900_internal *intp) |
221 | { | 222 | { |
222 | s32 i; | 223 | s32 i; |
223 | enum fe_stv0900_error error; | ||
224 | |||
225 | if (i_params != NULL) { | ||
226 | i_params->chip_id = stv0900_read_reg(i_params, R0900_MID); | ||
227 | if (i_params->errs == STV0900_NO_ERROR) { | ||
228 | /*Startup sequence*/ | ||
229 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5c); | ||
230 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5c); | ||
231 | stv0900_write_reg(i_params, R0900_P1_TNRCFG, 0x6c); | ||
232 | stv0900_write_reg(i_params, R0900_P2_TNRCFG, 0x6f); | ||
233 | stv0900_write_reg(i_params, R0900_P1_I2CRPT, 0x20); | ||
234 | stv0900_write_reg(i_params, R0900_P2_I2CRPT, 0x20); | ||
235 | stv0900_write_reg(i_params, R0900_NCOARSE, 0x13); | ||
236 | msleep(3); | ||
237 | stv0900_write_reg(i_params, R0900_I2CCFG, 0x08); | ||
238 | |||
239 | switch (i_params->clkmode) { | ||
240 | case 0: | ||
241 | case 2: | ||
242 | stv0900_write_reg(i_params, R0900_SYNTCTRL, 0x20 | ||
243 | | i_params->clkmode); | ||
244 | break; | ||
245 | default: | ||
246 | /* preserve SELOSCI bit */ | ||
247 | i = 0x02 & stv0900_read_reg(i_params, R0900_SYNTCTRL); | ||
248 | stv0900_write_reg(i_params, R0900_SYNTCTRL, 0x20 | i); | ||
249 | break; | ||
250 | } | ||
251 | 224 | ||
252 | msleep(3); | 225 | if (intp == NULL) |
253 | for (i = 0; i < 182; i++) | 226 | return STV0900_INVALID_HANDLE; |
254 | stv0900_write_reg(i_params, STV0900_InitVal[i][0], STV0900_InitVal[i][1]); | ||
255 | 227 | ||
256 | if (stv0900_read_reg(i_params, R0900_MID) >= 0x20) { | 228 | intp->chip_id = stv0900_read_reg(intp, R0900_MID); |
257 | stv0900_write_reg(i_params, R0900_TSGENERAL, 0x0c); | ||
258 | for (i = 0; i < 32; i++) | ||
259 | stv0900_write_reg(i_params, STV0900_Cut20_AddOnVal[i][0], STV0900_Cut20_AddOnVal[i][1]); | ||
260 | } | ||
261 | 229 | ||
262 | stv0900_write_reg(i_params, R0900_P1_FSPYCFG, 0x6c); | 230 | if (intp->errs != STV0900_NO_ERROR) |
263 | stv0900_write_reg(i_params, R0900_P2_FSPYCFG, 0x6c); | 231 | return intp->errs; |
264 | stv0900_write_reg(i_params, R0900_TSTRES0, 0x80); | ||
265 | stv0900_write_reg(i_params, R0900_TSTRES0, 0x00); | ||
266 | } | ||
267 | error = i_params->errs; | ||
268 | } else | ||
269 | error = STV0900_INVALID_HANDLE; | ||
270 | 232 | ||
271 | return error; | 233 | /*Startup sequence*/ |
234 | stv0900_write_reg(intp, R0900_P1_DMDISTATE, 0x5c); | ||
235 | stv0900_write_reg(intp, R0900_P2_DMDISTATE, 0x5c); | ||
236 | msleep(3); | ||
237 | stv0900_write_reg(intp, R0900_P1_TNRCFG, 0x6c); | ||
238 | stv0900_write_reg(intp, R0900_P2_TNRCFG, 0x6f); | ||
239 | stv0900_write_reg(intp, R0900_P1_I2CRPT, 0x20); | ||
240 | stv0900_write_reg(intp, R0900_P2_I2CRPT, 0x20); | ||
241 | stv0900_write_reg(intp, R0900_NCOARSE, 0x13); | ||
242 | msleep(3); | ||
243 | stv0900_write_reg(intp, R0900_I2CCFG, 0x08); | ||
244 | |||
245 | switch (intp->clkmode) { | ||
246 | case 0: | ||
247 | case 2: | ||
248 | stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20 | ||
249 | | intp->clkmode); | ||
250 | break; | ||
251 | default: | ||
252 | /* preserve SELOSCI bit */ | ||
253 | i = 0x02 & stv0900_read_reg(intp, R0900_SYNTCTRL); | ||
254 | stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20 | i); | ||
255 | break; | ||
256 | } | ||
257 | |||
258 | msleep(3); | ||
259 | for (i = 0; i < 181; i++) | ||
260 | stv0900_write_reg(intp, STV0900_InitVal[i][0], | ||
261 | STV0900_InitVal[i][1]); | ||
262 | |||
263 | if (stv0900_read_reg(intp, R0900_MID) >= 0x20) { | ||
264 | stv0900_write_reg(intp, R0900_TSGENERAL, 0x0c); | ||
265 | for (i = 0; i < 32; i++) | ||
266 | stv0900_write_reg(intp, STV0900_Cut20_AddOnVal[i][0], | ||
267 | STV0900_Cut20_AddOnVal[i][1]); | ||
268 | } | ||
272 | 269 | ||
270 | stv0900_write_reg(intp, R0900_P1_FSPYCFG, 0x6c); | ||
271 | stv0900_write_reg(intp, R0900_P2_FSPYCFG, 0x6c); | ||
272 | |||
273 | stv0900_write_reg(intp, R0900_P1_PDELCTRL2, 0x01); | ||
274 | stv0900_write_reg(intp, R0900_P2_PDELCTRL2, 0x21); | ||
275 | |||
276 | stv0900_write_reg(intp, R0900_P1_PDELCTRL3, 0x20); | ||
277 | stv0900_write_reg(intp, R0900_P2_PDELCTRL3, 0x20); | ||
278 | |||
279 | stv0900_write_reg(intp, R0900_TSTRES0, 0x80); | ||
280 | stv0900_write_reg(intp, R0900_TSTRES0, 0x00); | ||
281 | |||
282 | return STV0900_NO_ERROR; | ||
273 | } | 283 | } |
274 | 284 | ||
275 | u32 stv0900_get_mclk_freq(struct stv0900_internal *i_params, u32 ext_clk) | 285 | static u32 stv0900_get_mclk_freq(struct stv0900_internal *intp, u32 ext_clk) |
276 | { | 286 | { |
277 | u32 mclk = 90000000, div = 0, ad_div = 0; | 287 | u32 mclk = 90000000, div = 0, ad_div = 0; |
278 | 288 | ||
279 | div = stv0900_get_bits(i_params, F0900_M_DIV); | 289 | div = stv0900_get_bits(intp, F0900_M_DIV); |
280 | ad_div = ((stv0900_get_bits(i_params, F0900_SELX1RATIO) == 1) ? 4 : 6); | 290 | ad_div = ((stv0900_get_bits(intp, F0900_SELX1RATIO) == 1) ? 4 : 6); |
281 | 291 | ||
282 | mclk = (div + 1) * ext_clk / ad_div; | 292 | mclk = (div + 1) * ext_clk / ad_div; |
283 | 293 | ||
284 | dprintk(KERN_INFO "%s: Calculated Mclk = %d\n", __func__, mclk); | 294 | dprintk("%s: Calculated Mclk = %d\n", __func__, mclk); |
285 | 295 | ||
286 | return mclk; | 296 | return mclk; |
287 | } | 297 | } |
288 | 298 | ||
289 | enum fe_stv0900_error stv0900_set_mclk(struct stv0900_internal *i_params, u32 mclk) | 299 | static enum fe_stv0900_error stv0900_set_mclk(struct stv0900_internal *intp, u32 mclk) |
290 | { | 300 | { |
291 | enum fe_stv0900_error error = STV0900_NO_ERROR; | ||
292 | u32 m_div, clk_sel; | 301 | u32 m_div, clk_sel; |
293 | 302 | ||
294 | dprintk(KERN_INFO "%s: Mclk set to %d, Quartz = %d\n", __func__, mclk, | 303 | dprintk("%s: Mclk set to %d, Quartz = %d\n", __func__, mclk, |
295 | i_params->quartz); | 304 | intp->quartz); |
296 | 305 | ||
297 | if (i_params == NULL) | 306 | if (intp == NULL) |
298 | error = STV0900_INVALID_HANDLE; | 307 | return STV0900_INVALID_HANDLE; |
299 | else { | ||
300 | if (i_params->errs) | ||
301 | error = STV0900_I2C_ERROR; | ||
302 | else { | ||
303 | clk_sel = ((stv0900_get_bits(i_params, F0900_SELX1RATIO) == 1) ? 4 : 6); | ||
304 | m_div = ((clk_sel * mclk) / i_params->quartz) - 1; | ||
305 | stv0900_write_bits(i_params, F0900_M_DIV, m_div); | ||
306 | i_params->mclk = stv0900_get_mclk_freq(i_params, | ||
307 | i_params->quartz); | ||
308 | |||
309 | /*Set the DiseqC frequency to 22KHz */ | ||
310 | /* | ||
311 | Formula: | ||
312 | DiseqC_TX_Freq= MasterClock/(32*F22TX_Reg) | ||
313 | DiseqC_RX_Freq= MasterClock/(32*F22RX_Reg) | ||
314 | */ | ||
315 | m_div = i_params->mclk / 704000; | ||
316 | stv0900_write_reg(i_params, R0900_P1_F22TX, m_div); | ||
317 | stv0900_write_reg(i_params, R0900_P1_F22RX, m_div); | ||
318 | |||
319 | stv0900_write_reg(i_params, R0900_P2_F22TX, m_div); | ||
320 | stv0900_write_reg(i_params, R0900_P2_F22RX, m_div); | ||
321 | |||
322 | if ((i_params->errs)) | ||
323 | error = STV0900_I2C_ERROR; | ||
324 | } | ||
325 | } | ||
326 | 308 | ||
327 | return error; | 309 | if (intp->errs) |
310 | return STV0900_I2C_ERROR; | ||
311 | |||
312 | clk_sel = ((stv0900_get_bits(intp, F0900_SELX1RATIO) == 1) ? 4 : 6); | ||
313 | m_div = ((clk_sel * mclk) / intp->quartz) - 1; | ||
314 | stv0900_write_bits(intp, F0900_M_DIV, m_div); | ||
315 | intp->mclk = stv0900_get_mclk_freq(intp, | ||
316 | intp->quartz); | ||
317 | |||
318 | /*Set the DiseqC frequency to 22KHz */ | ||
319 | /* | ||
320 | Formula: | ||
321 | DiseqC_TX_Freq= MasterClock/(32*F22TX_Reg) | ||
322 | DiseqC_RX_Freq= MasterClock/(32*F22RX_Reg) | ||
323 | */ | ||
324 | m_div = intp->mclk / 704000; | ||
325 | stv0900_write_reg(intp, R0900_P1_F22TX, m_div); | ||
326 | stv0900_write_reg(intp, R0900_P1_F22RX, m_div); | ||
327 | |||
328 | stv0900_write_reg(intp, R0900_P2_F22TX, m_div); | ||
329 | stv0900_write_reg(intp, R0900_P2_F22RX, m_div); | ||
330 | |||
331 | if ((intp->errs)) | ||
332 | return STV0900_I2C_ERROR; | ||
333 | |||
334 | return STV0900_NO_ERROR; | ||
328 | } | 335 | } |
329 | 336 | ||
330 | u32 stv0900_get_err_count(struct stv0900_internal *i_params, int cntr, | 337 | static u32 stv0900_get_err_count(struct stv0900_internal *intp, int cntr, |
331 | enum fe_stv0900_demod_num demod) | 338 | enum fe_stv0900_demod_num demod) |
332 | { | 339 | { |
333 | u32 lsb, msb, hsb, err_val; | 340 | u32 lsb, msb, hsb, err_val; |
334 | s32 err1field_hsb, err1field_msb, err1field_lsb; | ||
335 | s32 err2field_hsb, err2field_msb, err2field_lsb; | ||
336 | |||
337 | dmd_reg(err1field_hsb, F0900_P1_ERR_CNT12, F0900_P2_ERR_CNT12); | ||
338 | dmd_reg(err1field_msb, F0900_P1_ERR_CNT11, F0900_P2_ERR_CNT11); | ||
339 | dmd_reg(err1field_lsb, F0900_P1_ERR_CNT10, F0900_P2_ERR_CNT10); | ||
340 | |||
341 | dmd_reg(err2field_hsb, F0900_P1_ERR_CNT22, F0900_P2_ERR_CNT22); | ||
342 | dmd_reg(err2field_msb, F0900_P1_ERR_CNT21, F0900_P2_ERR_CNT21); | ||
343 | dmd_reg(err2field_lsb, F0900_P1_ERR_CNT20, F0900_P2_ERR_CNT20); | ||
344 | 341 | ||
345 | switch (cntr) { | 342 | switch (cntr) { |
346 | case 0: | 343 | case 0: |
347 | default: | 344 | default: |
348 | hsb = stv0900_get_bits(i_params, err1field_hsb); | 345 | hsb = stv0900_get_bits(intp, ERR_CNT12); |
349 | msb = stv0900_get_bits(i_params, err1field_msb); | 346 | msb = stv0900_get_bits(intp, ERR_CNT11); |
350 | lsb = stv0900_get_bits(i_params, err1field_lsb); | 347 | lsb = stv0900_get_bits(intp, ERR_CNT10); |
351 | break; | 348 | break; |
352 | case 1: | 349 | case 1: |
353 | hsb = stv0900_get_bits(i_params, err2field_hsb); | 350 | hsb = stv0900_get_bits(intp, ERR_CNT22); |
354 | msb = stv0900_get_bits(i_params, err2field_msb); | 351 | msb = stv0900_get_bits(intp, ERR_CNT21); |
355 | lsb = stv0900_get_bits(i_params, err2field_lsb); | 352 | lsb = stv0900_get_bits(intp, ERR_CNT20); |
356 | break; | 353 | break; |
357 | } | 354 | } |
358 | 355 | ||
@@ -364,26 +361,22 @@ u32 stv0900_get_err_count(struct stv0900_internal *i_params, int cntr, | |||
364 | static int stv0900_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | 361 | static int stv0900_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) |
365 | { | 362 | { |
366 | struct stv0900_state *state = fe->demodulator_priv; | 363 | struct stv0900_state *state = fe->demodulator_priv; |
367 | struct stv0900_internal *i_params = state->internal; | 364 | struct stv0900_internal *intp = state->internal; |
368 | enum fe_stv0900_demod_num demod = state->demod; | 365 | enum fe_stv0900_demod_num demod = state->demod; |
369 | 366 | ||
370 | u32 fi2c; | 367 | stv0900_write_bits(intp, I2CT_ON, enable); |
371 | |||
372 | dmd_reg(fi2c, F0900_P1_I2CT_ON, F0900_P2_I2CT_ON); | ||
373 | |||
374 | stv0900_write_bits(i_params, fi2c, enable); | ||
375 | 368 | ||
376 | return 0; | 369 | return 0; |
377 | } | 370 | } |
378 | 371 | ||
379 | static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, | 372 | static void stv0900_set_ts_parallel_serial(struct stv0900_internal *intp, |
380 | enum fe_stv0900_clock_type path1_ts, | 373 | enum fe_stv0900_clock_type path1_ts, |
381 | enum fe_stv0900_clock_type path2_ts) | 374 | enum fe_stv0900_clock_type path2_ts) |
382 | { | 375 | { |
383 | 376 | ||
384 | dprintk(KERN_INFO "%s\n", __func__); | 377 | dprintk("%s\n", __func__); |
385 | 378 | ||
386 | if (i_params->chip_id >= 0x20) { | 379 | if (intp->chip_id >= 0x20) { |
387 | switch (path1_ts) { | 380 | switch (path1_ts) { |
388 | case STV0900_PARALLEL_PUNCT_CLOCK: | 381 | case STV0900_PARALLEL_PUNCT_CLOCK: |
389 | case STV0900_DVBCI_CLOCK: | 382 | case STV0900_DVBCI_CLOCK: |
@@ -391,20 +384,20 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, | |||
391 | case STV0900_SERIAL_PUNCT_CLOCK: | 384 | case STV0900_SERIAL_PUNCT_CLOCK: |
392 | case STV0900_SERIAL_CONT_CLOCK: | 385 | case STV0900_SERIAL_CONT_CLOCK: |
393 | default: | 386 | default: |
394 | stv0900_write_reg(i_params, R0900_TSGENERAL, | 387 | stv0900_write_reg(intp, R0900_TSGENERAL, |
395 | 0x00); | 388 | 0x00); |
396 | break; | 389 | break; |
397 | case STV0900_PARALLEL_PUNCT_CLOCK: | 390 | case STV0900_PARALLEL_PUNCT_CLOCK: |
398 | case STV0900_DVBCI_CLOCK: | 391 | case STV0900_DVBCI_CLOCK: |
399 | stv0900_write_reg(i_params, R0900_TSGENERAL, | 392 | stv0900_write_reg(intp, R0900_TSGENERAL, |
400 | 0x06); | 393 | 0x06); |
401 | stv0900_write_bits(i_params, | 394 | stv0900_write_bits(intp, |
402 | F0900_P1_TSFIFO_MANSPEED, 3); | 395 | F0900_P1_TSFIFO_MANSPEED, 3); |
403 | stv0900_write_bits(i_params, | 396 | stv0900_write_bits(intp, |
404 | F0900_P2_TSFIFO_MANSPEED, 0); | 397 | F0900_P2_TSFIFO_MANSPEED, 0); |
405 | stv0900_write_reg(i_params, | 398 | stv0900_write_reg(intp, |
406 | R0900_P1_TSSPEED, 0x14); | 399 | R0900_P1_TSSPEED, 0x14); |
407 | stv0900_write_reg(i_params, | 400 | stv0900_write_reg(intp, |
408 | R0900_P2_TSSPEED, 0x28); | 401 | R0900_P2_TSSPEED, 0x28); |
409 | break; | 402 | break; |
410 | } | 403 | } |
@@ -416,14 +409,14 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, | |||
416 | case STV0900_SERIAL_PUNCT_CLOCK: | 409 | case STV0900_SERIAL_PUNCT_CLOCK: |
417 | case STV0900_SERIAL_CONT_CLOCK: | 410 | case STV0900_SERIAL_CONT_CLOCK: |
418 | default: | 411 | default: |
419 | stv0900_write_reg(i_params, | 412 | stv0900_write_reg(intp, |
420 | R0900_TSGENERAL, 0x0C); | 413 | R0900_TSGENERAL, 0x0C); |
421 | break; | 414 | break; |
422 | case STV0900_PARALLEL_PUNCT_CLOCK: | 415 | case STV0900_PARALLEL_PUNCT_CLOCK: |
423 | case STV0900_DVBCI_CLOCK: | 416 | case STV0900_DVBCI_CLOCK: |
424 | stv0900_write_reg(i_params, | 417 | stv0900_write_reg(intp, |
425 | R0900_TSGENERAL, 0x0A); | 418 | R0900_TSGENERAL, 0x0A); |
426 | dprintk(KERN_INFO "%s: 0x0a\n", __func__); | 419 | dprintk("%s: 0x0a\n", __func__); |
427 | break; | 420 | break; |
428 | } | 421 | } |
429 | break; | 422 | break; |
@@ -436,20 +429,20 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, | |||
436 | case STV0900_SERIAL_PUNCT_CLOCK: | 429 | case STV0900_SERIAL_PUNCT_CLOCK: |
437 | case STV0900_SERIAL_CONT_CLOCK: | 430 | case STV0900_SERIAL_CONT_CLOCK: |
438 | default: | 431 | default: |
439 | stv0900_write_reg(i_params, R0900_TSGENERAL1X, | 432 | stv0900_write_reg(intp, R0900_TSGENERAL1X, |
440 | 0x10); | 433 | 0x10); |
441 | break; | 434 | break; |
442 | case STV0900_PARALLEL_PUNCT_CLOCK: | 435 | case STV0900_PARALLEL_PUNCT_CLOCK: |
443 | case STV0900_DVBCI_CLOCK: | 436 | case STV0900_DVBCI_CLOCK: |
444 | stv0900_write_reg(i_params, R0900_TSGENERAL1X, | 437 | stv0900_write_reg(intp, R0900_TSGENERAL1X, |
445 | 0x16); | 438 | 0x16); |
446 | stv0900_write_bits(i_params, | 439 | stv0900_write_bits(intp, |
447 | F0900_P1_TSFIFO_MANSPEED, 3); | 440 | F0900_P1_TSFIFO_MANSPEED, 3); |
448 | stv0900_write_bits(i_params, | 441 | stv0900_write_bits(intp, |
449 | F0900_P2_TSFIFO_MANSPEED, 0); | 442 | F0900_P2_TSFIFO_MANSPEED, 0); |
450 | stv0900_write_reg(i_params, R0900_P1_TSSPEED, | 443 | stv0900_write_reg(intp, R0900_P1_TSSPEED, |
451 | 0x14); | 444 | 0x14); |
452 | stv0900_write_reg(i_params, R0900_P2_TSSPEED, | 445 | stv0900_write_reg(intp, R0900_P2_TSSPEED, |
453 | 0x28); | 446 | 0x28); |
454 | break; | 447 | break; |
455 | } | 448 | } |
@@ -462,14 +455,14 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, | |||
462 | case STV0900_SERIAL_PUNCT_CLOCK: | 455 | case STV0900_SERIAL_PUNCT_CLOCK: |
463 | case STV0900_SERIAL_CONT_CLOCK: | 456 | case STV0900_SERIAL_CONT_CLOCK: |
464 | default: | 457 | default: |
465 | stv0900_write_reg(i_params, R0900_TSGENERAL1X, | 458 | stv0900_write_reg(intp, R0900_TSGENERAL1X, |
466 | 0x14); | 459 | 0x14); |
467 | break; | 460 | break; |
468 | case STV0900_PARALLEL_PUNCT_CLOCK: | 461 | case STV0900_PARALLEL_PUNCT_CLOCK: |
469 | case STV0900_DVBCI_CLOCK: | 462 | case STV0900_DVBCI_CLOCK: |
470 | stv0900_write_reg(i_params, R0900_TSGENERAL1X, | 463 | stv0900_write_reg(intp, R0900_TSGENERAL1X, |
471 | 0x12); | 464 | 0x12); |
472 | dprintk(KERN_INFO "%s: 0x12\n", __func__); | 465 | dprintk("%s: 0x12\n", __func__); |
473 | break; | 466 | break; |
474 | } | 467 | } |
475 | 468 | ||
@@ -479,20 +472,20 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, | |||
479 | 472 | ||
480 | switch (path1_ts) { | 473 | switch (path1_ts) { |
481 | case STV0900_PARALLEL_PUNCT_CLOCK: | 474 | case STV0900_PARALLEL_PUNCT_CLOCK: |
482 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x00); | 475 | stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x00); |
483 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x00); | 476 | stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x00); |
484 | break; | 477 | break; |
485 | case STV0900_DVBCI_CLOCK: | 478 | case STV0900_DVBCI_CLOCK: |
486 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x00); | 479 | stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x00); |
487 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x01); | 480 | stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x01); |
488 | break; | 481 | break; |
489 | case STV0900_SERIAL_PUNCT_CLOCK: | 482 | case STV0900_SERIAL_PUNCT_CLOCK: |
490 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x01); | 483 | stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x01); |
491 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x00); | 484 | stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x00); |
492 | break; | 485 | break; |
493 | case STV0900_SERIAL_CONT_CLOCK: | 486 | case STV0900_SERIAL_CONT_CLOCK: |
494 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x01); | 487 | stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x01); |
495 | stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x01); | 488 | stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x01); |
496 | break; | 489 | break; |
497 | default: | 490 | default: |
498 | break; | 491 | break; |
@@ -500,29 +493,29 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, | |||
500 | 493 | ||
501 | switch (path2_ts) { | 494 | switch (path2_ts) { |
502 | case STV0900_PARALLEL_PUNCT_CLOCK: | 495 | case STV0900_PARALLEL_PUNCT_CLOCK: |
503 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x00); | 496 | stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x00); |
504 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x00); | 497 | stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x00); |
505 | break; | 498 | break; |
506 | case STV0900_DVBCI_CLOCK: | 499 | case STV0900_DVBCI_CLOCK: |
507 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x00); | 500 | stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x00); |
508 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x01); | 501 | stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x01); |
509 | break; | 502 | break; |
510 | case STV0900_SERIAL_PUNCT_CLOCK: | 503 | case STV0900_SERIAL_PUNCT_CLOCK: |
511 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x01); | 504 | stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x01); |
512 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x00); | 505 | stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x00); |
513 | break; | 506 | break; |
514 | case STV0900_SERIAL_CONT_CLOCK: | 507 | case STV0900_SERIAL_CONT_CLOCK: |
515 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x01); | 508 | stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x01); |
516 | stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x01); | 509 | stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x01); |
517 | break; | 510 | break; |
518 | default: | 511 | default: |
519 | break; | 512 | break; |
520 | } | 513 | } |
521 | 514 | ||
522 | stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 1); | 515 | stv0900_write_bits(intp, F0900_P2_RST_HWARE, 1); |
523 | stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 0); | 516 | stv0900_write_bits(intp, F0900_P2_RST_HWARE, 0); |
524 | stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 1); | 517 | stv0900_write_bits(intp, F0900_P1_RST_HWARE, 1); |
525 | stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 0); | 518 | stv0900_write_bits(intp, F0900_P1_RST_HWARE, 0); |
526 | } | 519 | } |
527 | 520 | ||
528 | void stv0900_set_tuner(struct dvb_frontend *fe, u32 frequency, | 521 | void stv0900_set_tuner(struct dvb_frontend *fe, u32 frequency, |
@@ -574,7 +567,47 @@ void stv0900_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth) | |||
574 | } | 567 | } |
575 | } | 568 | } |
576 | 569 | ||
577 | static s32 stv0900_get_rf_level(struct stv0900_internal *i_params, | 570 | u32 stv0900_get_freq_auto(struct stv0900_internal *intp, int demod) |
571 | { | ||
572 | u32 freq, round; | ||
573 | /* Formulat : | ||
574 | Tuner_Frequency(MHz) = Regs / 64 | ||
575 | Tuner_granularity(MHz) = Regs / 2048 | ||
576 | real_Tuner_Frequency = Tuner_Frequency(MHz) - Tuner_granularity(MHz) | ||
577 | */ | ||
578 | freq = (stv0900_get_bits(intp, TUN_RFFREQ2) << 10) + | ||
579 | (stv0900_get_bits(intp, TUN_RFFREQ1) << 2) + | ||
580 | stv0900_get_bits(intp, TUN_RFFREQ0); | ||
581 | |||
582 | freq = (freq * 1000) / 64; | ||
583 | |||
584 | round = (stv0900_get_bits(intp, TUN_RFRESTE1) >> 2) + | ||
585 | stv0900_get_bits(intp, TUN_RFRESTE0); | ||
586 | |||
587 | round = (round * 1000) / 2048; | ||
588 | |||
589 | return freq + round; | ||
590 | } | ||
591 | |||
592 | void stv0900_set_tuner_auto(struct stv0900_internal *intp, u32 Frequency, | ||
593 | u32 Bandwidth, int demod) | ||
594 | { | ||
595 | u32 tunerFrequency; | ||
596 | /* Formulat: | ||
597 | Tuner_frequency_reg= Frequency(MHz)*64 | ||
598 | */ | ||
599 | tunerFrequency = (Frequency * 64) / 1000; | ||
600 | |||
601 | stv0900_write_bits(intp, TUN_RFFREQ2, (tunerFrequency >> 10)); | ||
602 | stv0900_write_bits(intp, TUN_RFFREQ1, (tunerFrequency >> 2) & 0xff); | ||
603 | stv0900_write_bits(intp, TUN_RFFREQ0, (tunerFrequency & 0x03)); | ||
604 | /* Low Pass Filter = BW /2 (MHz)*/ | ||
605 | stv0900_write_bits(intp, TUN_BW, Bandwidth / 2000000); | ||
606 | /* Tuner Write trig */ | ||
607 | stv0900_write_reg(intp, TNRLD, 1); | ||
608 | } | ||
609 | |||
610 | static s32 stv0900_get_rf_level(struct stv0900_internal *intp, | ||
578 | const struct stv0900_table *lookup, | 611 | const struct stv0900_table *lookup, |
579 | enum fe_stv0900_demod_num demod) | 612 | enum fe_stv0900_demod_num demod) |
580 | { | 613 | { |
@@ -584,45 +617,41 @@ static s32 stv0900_get_rf_level(struct stv0900_internal *i_params, | |||
584 | i, | 617 | i, |
585 | rf_lvl = 0; | 618 | rf_lvl = 0; |
586 | 619 | ||
587 | dprintk(KERN_INFO "%s\n", __func__); | 620 | dprintk("%s\n", __func__); |
588 | 621 | ||
589 | if ((lookup != NULL) && lookup->size) { | 622 | if ((lookup == NULL) || (lookup->size <= 0)) |
590 | switch (demod) { | 623 | return 0; |
591 | case STV0900_DEMOD_1: | ||
592 | default: | ||
593 | agc_gain = MAKEWORD(stv0900_get_bits(i_params, F0900_P1_AGCIQ_VALUE1), | ||
594 | stv0900_get_bits(i_params, F0900_P1_AGCIQ_VALUE0)); | ||
595 | break; | ||
596 | case STV0900_DEMOD_2: | ||
597 | agc_gain = MAKEWORD(stv0900_get_bits(i_params, F0900_P2_AGCIQ_VALUE1), | ||
598 | stv0900_get_bits(i_params, F0900_P2_AGCIQ_VALUE0)); | ||
599 | break; | ||
600 | } | ||
601 | 624 | ||
602 | imin = 0; | 625 | agc_gain = MAKEWORD(stv0900_get_bits(intp, AGCIQ_VALUE1), |
603 | imax = lookup->size - 1; | 626 | stv0900_get_bits(intp, AGCIQ_VALUE0)); |
604 | if (INRANGE(lookup->table[imin].regval, agc_gain, lookup->table[imax].regval)) { | ||
605 | while ((imax - imin) > 1) { | ||
606 | i = (imax + imin) >> 1; | ||
607 | 627 | ||
608 | if (INRANGE(lookup->table[imin].regval, agc_gain, lookup->table[i].regval)) | 628 | imin = 0; |
609 | imax = i; | 629 | imax = lookup->size - 1; |
610 | else | 630 | if (INRANGE(lookup->table[imin].regval, agc_gain, |
611 | imin = i; | 631 | lookup->table[imax].regval)) { |
612 | } | 632 | while ((imax - imin) > 1) { |
633 | i = (imax + imin) >> 1; | ||
613 | 634 | ||
614 | rf_lvl = (((s32)agc_gain - lookup->table[imin].regval) | 635 | if (INRANGE(lookup->table[imin].regval, |
615 | * (lookup->table[imax].realval - lookup->table[imin].realval) | 636 | agc_gain, |
616 | / (lookup->table[imax].regval - lookup->table[imin].regval)) | 637 | lookup->table[i].regval)) |
617 | + lookup->table[imin].realval; | 638 | imax = i; |
618 | } else if (agc_gain > lookup->table[0].regval) | 639 | else |
619 | rf_lvl = 5; | 640 | imin = i; |
620 | else if (agc_gain < lookup->table[lookup->size-1].regval) | 641 | } |
621 | rf_lvl = -100; | ||
622 | 642 | ||
623 | } | 643 | rf_lvl = (s32)agc_gain - lookup->table[imin].regval; |
644 | rf_lvl *= (lookup->table[imax].realval - | ||
645 | lookup->table[imin].realval); | ||
646 | rf_lvl /= (lookup->table[imax].regval - | ||
647 | lookup->table[imin].regval); | ||
648 | rf_lvl += lookup->table[imin].realval; | ||
649 | } else if (agc_gain > lookup->table[0].regval) | ||
650 | rf_lvl = 5; | ||
651 | else if (agc_gain < lookup->table[lookup->size-1].regval) | ||
652 | rf_lvl = -100; | ||
624 | 653 | ||
625 | dprintk(KERN_INFO "%s: RFLevel = %d\n", __func__, rf_lvl); | 654 | dprintk("%s: RFLevel = %d\n", __func__, rf_lvl); |
626 | 655 | ||
627 | return rf_lvl; | 656 | return rf_lvl; |
628 | } | 657 | } |
@@ -634,50 +663,51 @@ static int stv0900_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
634 | s32 rflevel = stv0900_get_rf_level(internal, &stv0900_rf, | 663 | s32 rflevel = stv0900_get_rf_level(internal, &stv0900_rf, |
635 | state->demod); | 664 | state->demod); |
636 | 665 | ||
637 | *strength = (rflevel + 100) * (16383 / 105); | 666 | rflevel = (rflevel + 100) * (65535 / 70); |
667 | if (rflevel < 0) | ||
668 | rflevel = 0; | ||
669 | |||
670 | if (rflevel > 65535) | ||
671 | rflevel = 65535; | ||
672 | |||
673 | *strength = rflevel; | ||
638 | 674 | ||
639 | return 0; | 675 | return 0; |
640 | } | 676 | } |
641 | 677 | ||
642 | |||
643 | static s32 stv0900_carr_get_quality(struct dvb_frontend *fe, | 678 | static s32 stv0900_carr_get_quality(struct dvb_frontend *fe, |
644 | const struct stv0900_table *lookup) | 679 | const struct stv0900_table *lookup) |
645 | { | 680 | { |
646 | struct stv0900_state *state = fe->demodulator_priv; | 681 | struct stv0900_state *state = fe->demodulator_priv; |
647 | struct stv0900_internal *i_params = state->internal; | 682 | struct stv0900_internal *intp = state->internal; |
648 | enum fe_stv0900_demod_num demod = state->demod; | 683 | enum fe_stv0900_demod_num demod = state->demod; |
649 | 684 | ||
650 | s32 c_n = -100, | 685 | s32 c_n = -100, |
651 | regval, imin, imax, | 686 | regval, |
687 | imin, | ||
688 | imax, | ||
652 | i, | 689 | i, |
653 | lock_flag_field, | ||
654 | noise_field1, | 690 | noise_field1, |
655 | noise_field0; | 691 | noise_field0; |
656 | 692 | ||
657 | dprintk(KERN_INFO "%s\n", __func__); | 693 | dprintk("%s\n", __func__); |
658 | 694 | ||
659 | dmd_reg(lock_flag_field, F0900_P1_LOCK_DEFINITIF, | ||
660 | F0900_P2_LOCK_DEFINITIF); | ||
661 | if (stv0900_get_standard(fe, demod) == STV0900_DVBS2_STANDARD) { | 695 | if (stv0900_get_standard(fe, demod) == STV0900_DVBS2_STANDARD) { |
662 | dmd_reg(noise_field1, F0900_P1_NOSPLHT_NORMED1, | 696 | noise_field1 = NOSPLHT_NORMED1; |
663 | F0900_P2_NOSPLHT_NORMED1); | 697 | noise_field0 = NOSPLHT_NORMED0; |
664 | dmd_reg(noise_field0, F0900_P1_NOSPLHT_NORMED0, | ||
665 | F0900_P2_NOSPLHT_NORMED0); | ||
666 | } else { | 698 | } else { |
667 | dmd_reg(noise_field1, F0900_P1_NOSDATAT_NORMED1, | 699 | noise_field1 = NOSDATAT_NORMED1; |
668 | F0900_P2_NOSDATAT_NORMED1); | 700 | noise_field0 = NOSDATAT_NORMED0; |
669 | dmd_reg(noise_field0, F0900_P1_NOSDATAT_NORMED0, | ||
670 | F0900_P2_NOSDATAT_NORMED0); | ||
671 | } | 701 | } |
672 | 702 | ||
673 | if (stv0900_get_bits(i_params, lock_flag_field)) { | 703 | if (stv0900_get_bits(intp, LOCK_DEFINITIF)) { |
674 | if ((lookup != NULL) && lookup->size) { | 704 | if ((lookup != NULL) && lookup->size) { |
675 | regval = 0; | 705 | regval = 0; |
676 | msleep(5); | 706 | msleep(5); |
677 | for (i = 0; i < 16; i++) { | 707 | for (i = 0; i < 16; i++) { |
678 | regval += MAKEWORD(stv0900_get_bits(i_params, | 708 | regval += MAKEWORD(stv0900_get_bits(intp, |
679 | noise_field1), | 709 | noise_field1), |
680 | stv0900_get_bits(i_params, | 710 | stv0900_get_bits(intp, |
681 | noise_field0)); | 711 | noise_field0)); |
682 | msleep(1); | 712 | msleep(1); |
683 | } | 713 | } |
@@ -715,10 +745,9 @@ static s32 stv0900_carr_get_quality(struct dvb_frontend *fe, | |||
715 | static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks) | 745 | static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks) |
716 | { | 746 | { |
717 | struct stv0900_state *state = fe->demodulator_priv; | 747 | struct stv0900_state *state = fe->demodulator_priv; |
718 | struct stv0900_internal *i_params = state->internal; | 748 | struct stv0900_internal *intp = state->internal; |
719 | enum fe_stv0900_demod_num demod = state->demod; | 749 | enum fe_stv0900_demod_num demod = state->demod; |
720 | u8 err_val1, err_val0; | 750 | u8 err_val1, err_val0; |
721 | s32 err_field1, err_field0; | ||
722 | u32 header_err_val = 0; | 751 | u32 header_err_val = 0; |
723 | 752 | ||
724 | *ucblocks = 0x0; | 753 | *ucblocks = 0x0; |
@@ -726,24 +755,14 @@ static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks) | |||
726 | /* DVB-S2 delineator errors count */ | 755 | /* DVB-S2 delineator errors count */ |
727 | 756 | ||
728 | /* retreiving number for errnous headers */ | 757 | /* retreiving number for errnous headers */ |
729 | dmd_reg(err_field0, R0900_P1_BBFCRCKO0, | 758 | err_val1 = stv0900_read_reg(intp, BBFCRCKO1); |
730 | R0900_P2_BBFCRCKO0); | 759 | err_val0 = stv0900_read_reg(intp, BBFCRCKO0); |
731 | dmd_reg(err_field1, R0900_P1_BBFCRCKO1, | 760 | header_err_val = (err_val1 << 8) | err_val0; |
732 | R0900_P2_BBFCRCKO1); | ||
733 | |||
734 | err_val1 = stv0900_read_reg(i_params, err_field1); | ||
735 | err_val0 = stv0900_read_reg(i_params, err_field0); | ||
736 | header_err_val = (err_val1<<8) | err_val0; | ||
737 | 761 | ||
738 | /* retreiving number for errnous packets */ | 762 | /* retreiving number for errnous packets */ |
739 | dmd_reg(err_field0, R0900_P1_UPCRCKO0, | 763 | err_val1 = stv0900_read_reg(intp, UPCRCKO1); |
740 | R0900_P2_UPCRCKO0); | 764 | err_val0 = stv0900_read_reg(intp, UPCRCKO0); |
741 | dmd_reg(err_field1, R0900_P1_UPCRCKO1, | 765 | *ucblocks = (err_val1 << 8) | err_val0; |
742 | R0900_P2_UPCRCKO1); | ||
743 | |||
744 | err_val1 = stv0900_read_reg(i_params, err_field1); | ||
745 | err_val0 = stv0900_read_reg(i_params, err_field0); | ||
746 | *ucblocks = (err_val1<<8) | err_val0; | ||
747 | *ucblocks += header_err_val; | 766 | *ucblocks += header_err_val; |
748 | } | 767 | } |
749 | 768 | ||
@@ -752,33 +771,27 @@ static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks) | |||
752 | 771 | ||
753 | static int stv0900_read_snr(struct dvb_frontend *fe, u16 *snr) | 772 | static int stv0900_read_snr(struct dvb_frontend *fe, u16 *snr) |
754 | { | 773 | { |
755 | *snr = stv0900_carr_get_quality(fe, | 774 | s32 snrlcl = stv0900_carr_get_quality(fe, |
756 | (const struct stv0900_table *)&stv0900_s2_cn); | 775 | (const struct stv0900_table *)&stv0900_s2_cn); |
757 | *snr += 30; | 776 | snrlcl = (snrlcl + 30) * 384; |
758 | *snr *= (16383 / 1030); | 777 | if (snrlcl < 0) |
778 | snrlcl = 0; | ||
779 | |||
780 | if (snrlcl > 65535) | ||
781 | snrlcl = 65535; | ||
782 | |||
783 | *snr = snrlcl; | ||
759 | 784 | ||
760 | return 0; | 785 | return 0; |
761 | } | 786 | } |
762 | 787 | ||
763 | static u32 stv0900_get_ber(struct stv0900_internal *i_params, | 788 | static u32 stv0900_get_ber(struct stv0900_internal *intp, |
764 | enum fe_stv0900_demod_num demod) | 789 | enum fe_stv0900_demod_num demod) |
765 | { | 790 | { |
766 | u32 ber = 10000000, i; | 791 | u32 ber = 10000000, i; |
767 | s32 dmd_state_reg; | ||
768 | s32 demod_state; | 792 | s32 demod_state; |
769 | s32 vstatus_reg; | ||
770 | s32 prvit_field; | ||
771 | s32 pdel_status_reg; | ||
772 | s32 pdel_lock_field; | ||
773 | 793 | ||
774 | dmd_reg(dmd_state_reg, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); | 794 | demod_state = stv0900_get_bits(intp, HEADER_MODE); |
775 | dmd_reg(vstatus_reg, R0900_P1_VSTATUSVIT, R0900_P2_VSTATUSVIT); | ||
776 | dmd_reg(prvit_field, F0900_P1_PRFVIT, F0900_P2_PRFVIT); | ||
777 | dmd_reg(pdel_status_reg, R0900_P1_PDELSTATUS1, R0900_P2_PDELSTATUS1); | ||
778 | dmd_reg(pdel_lock_field, F0900_P1_PKTDELIN_LOCK, | ||
779 | F0900_P2_PKTDELIN_LOCK); | ||
780 | |||
781 | demod_state = stv0900_get_bits(i_params, dmd_state_reg); | ||
782 | 795 | ||
783 | switch (demod_state) { | 796 | switch (demod_state) { |
784 | case STV0900_SEARCH: | 797 | case STV0900_SEARCH: |
@@ -790,11 +803,11 @@ static u32 stv0900_get_ber(struct stv0900_internal *i_params, | |||
790 | ber = 0; | 803 | ber = 0; |
791 | for (i = 0; i < 5; i++) { | 804 | for (i = 0; i < 5; i++) { |
792 | msleep(5); | 805 | msleep(5); |
793 | ber += stv0900_get_err_count(i_params, 0, demod); | 806 | ber += stv0900_get_err_count(intp, 0, demod); |
794 | } | 807 | } |
795 | 808 | ||
796 | ber /= 5; | 809 | ber /= 5; |
797 | if (stv0900_get_bits(i_params, prvit_field)) { | 810 | if (stv0900_get_bits(intp, PRFVIT)) { |
798 | ber *= 9766; | 811 | ber *= 9766; |
799 | ber = ber >> 13; | 812 | ber = ber >> 13; |
800 | } | 813 | } |
@@ -804,11 +817,11 @@ static u32 stv0900_get_ber(struct stv0900_internal *i_params, | |||
804 | ber = 0; | 817 | ber = 0; |
805 | for (i = 0; i < 5; i++) { | 818 | for (i = 0; i < 5; i++) { |
806 | msleep(5); | 819 | msleep(5); |
807 | ber += stv0900_get_err_count(i_params, 0, demod); | 820 | ber += stv0900_get_err_count(intp, 0, demod); |
808 | } | 821 | } |
809 | 822 | ||
810 | ber /= 5; | 823 | ber /= 5; |
811 | if (stv0900_get_bits(i_params, pdel_lock_field)) { | 824 | if (stv0900_get_bits(intp, PKTDELIN_LOCK)) { |
812 | ber *= 9766; | 825 | ber *= 9766; |
813 | ber = ber >> 13; | 826 | ber = ber >> 13; |
814 | } | 827 | } |
@@ -829,20 +842,16 @@ static int stv0900_read_ber(struct dvb_frontend *fe, u32 *ber) | |||
829 | return 0; | 842 | return 0; |
830 | } | 843 | } |
831 | 844 | ||
832 | int stv0900_get_demod_lock(struct stv0900_internal *i_params, | 845 | int stv0900_get_demod_lock(struct stv0900_internal *intp, |
833 | enum fe_stv0900_demod_num demod, s32 time_out) | 846 | enum fe_stv0900_demod_num demod, s32 time_out) |
834 | { | 847 | { |
835 | s32 timer = 0, | 848 | s32 timer = 0, |
836 | lock = 0, | 849 | lock = 0; |
837 | header_field, | ||
838 | lock_field; | ||
839 | 850 | ||
840 | enum fe_stv0900_search_state dmd_state; | 851 | enum fe_stv0900_search_state dmd_state; |
841 | 852 | ||
842 | dmd_reg(header_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); | ||
843 | dmd_reg(lock_field, F0900_P1_LOCK_DEFINITIF, F0900_P2_LOCK_DEFINITIF); | ||
844 | while ((timer < time_out) && (lock == 0)) { | 853 | while ((timer < time_out) && (lock == 0)) { |
845 | dmd_state = stv0900_get_bits(i_params, header_field); | 854 | dmd_state = stv0900_get_bits(intp, HEADER_MODE); |
846 | dprintk("Demod State = %d\n", dmd_state); | 855 | dprintk("Demod State = %d\n", dmd_state); |
847 | switch (dmd_state) { | 856 | switch (dmd_state) { |
848 | case STV0900_SEARCH: | 857 | case STV0900_SEARCH: |
@@ -852,7 +861,7 @@ int stv0900_get_demod_lock(struct stv0900_internal *i_params, | |||
852 | break; | 861 | break; |
853 | case STV0900_DVBS2_FOUND: | 862 | case STV0900_DVBS2_FOUND: |
854 | case STV0900_DVBS_FOUND: | 863 | case STV0900_DVBS_FOUND: |
855 | lock = stv0900_get_bits(i_params, lock_field); | 864 | lock = stv0900_get_bits(intp, LOCK_DEFINITIF); |
856 | break; | 865 | break; |
857 | } | 866 | } |
858 | 867 | ||
@@ -870,56 +879,40 @@ int stv0900_get_demod_lock(struct stv0900_internal *i_params, | |||
870 | return lock; | 879 | return lock; |
871 | } | 880 | } |
872 | 881 | ||
873 | void stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params, | 882 | void stv0900_stop_all_s2_modcod(struct stv0900_internal *intp, |
874 | enum fe_stv0900_demod_num demod) | 883 | enum fe_stv0900_demod_num demod) |
875 | { | 884 | { |
876 | s32 regflist, | 885 | s32 regflist, |
877 | i; | 886 | i; |
878 | 887 | ||
879 | dprintk(KERN_INFO "%s\n", __func__); | 888 | dprintk("%s\n", __func__); |
880 | 889 | ||
881 | dmd_reg(regflist, R0900_P1_MODCODLST0, R0900_P2_MODCODLST0); | 890 | regflist = MODCODLST0; |
882 | 891 | ||
883 | for (i = 0; i < 16; i++) | 892 | for (i = 0; i < 16; i++) |
884 | stv0900_write_reg(i_params, regflist + i, 0xff); | 893 | stv0900_write_reg(intp, regflist + i, 0xff); |
885 | } | 894 | } |
886 | 895 | ||
887 | void stv0900_activate_s2_modcode(struct stv0900_internal *i_params, | 896 | void stv0900_activate_s2_modcod(struct stv0900_internal *intp, |
888 | enum fe_stv0900_demod_num demod) | 897 | enum fe_stv0900_demod_num demod) |
889 | { | 898 | { |
890 | u32 matype, | 899 | u32 matype, |
891 | mod_code, | 900 | mod_code, |
892 | fmod, | 901 | fmod, |
893 | reg_index, | 902 | reg_index, |
894 | field_index; | 903 | field_index; |
895 | 904 | ||
896 | dprintk(KERN_INFO "%s\n", __func__); | 905 | dprintk("%s\n", __func__); |
897 | 906 | ||
898 | if (i_params->chip_id <= 0x11) { | 907 | if (intp->chip_id <= 0x11) { |
899 | msleep(5); | 908 | msleep(5); |
900 | 909 | ||
901 | switch (demod) { | 910 | mod_code = stv0900_read_reg(intp, PLHMODCOD); |
902 | case STV0900_DEMOD_1: | 911 | matype = mod_code & 0x3; |
903 | default: | 912 | mod_code = (mod_code & 0x7f) >> 2; |
904 | mod_code = stv0900_read_reg(i_params, | ||
905 | R0900_P1_PLHMODCOD); | ||
906 | matype = mod_code & 0x3; | ||
907 | mod_code = (mod_code & 0x7f) >> 2; | ||
908 | |||
909 | reg_index = R0900_P1_MODCODLSTF - mod_code / 2; | ||
910 | field_index = mod_code % 2; | ||
911 | break; | ||
912 | case STV0900_DEMOD_2: | ||
913 | mod_code = stv0900_read_reg(i_params, | ||
914 | R0900_P2_PLHMODCOD); | ||
915 | matype = mod_code & 0x3; | ||
916 | mod_code = (mod_code & 0x7f) >> 2; | ||
917 | |||
918 | reg_index = R0900_P2_MODCODLSTF - mod_code / 2; | ||
919 | field_index = mod_code % 2; | ||
920 | break; | ||
921 | } | ||
922 | 913 | ||
914 | reg_index = MODCODLSTF - mod_code / 2; | ||
915 | field_index = mod_code % 2; | ||
923 | 916 | ||
924 | switch (matype) { | 917 | switch (matype) { |
925 | case 0: | 918 | case 0: |
@@ -938,70 +931,41 @@ void stv0900_activate_s2_modcode(struct stv0900_internal *i_params, | |||
938 | } | 931 | } |
939 | 932 | ||
940 | if ((INRANGE(STV0900_QPSK_12, mod_code, STV0900_8PSK_910)) | 933 | if ((INRANGE(STV0900_QPSK_12, mod_code, STV0900_8PSK_910)) |
941 | && (matype <= 1)) { | 934 | && (matype <= 1)) { |
942 | if (field_index == 0) | 935 | if (field_index == 0) |
943 | stv0900_write_reg(i_params, reg_index, | 936 | stv0900_write_reg(intp, reg_index, |
944 | 0xf0 | fmod); | 937 | 0xf0 | fmod); |
945 | else | 938 | else |
946 | stv0900_write_reg(i_params, reg_index, | 939 | stv0900_write_reg(intp, reg_index, |
947 | (fmod << 4) | 0xf); | 940 | (fmod << 4) | 0xf); |
948 | } | 941 | } |
949 | } else if (i_params->chip_id >= 0x12) { | ||
950 | switch (demod) { | ||
951 | case STV0900_DEMOD_1: | ||
952 | default: | ||
953 | for (reg_index = 0; reg_index < 7; reg_index++) | ||
954 | stv0900_write_reg(i_params, R0900_P1_MODCODLST0 + reg_index, 0xff); | ||
955 | 942 | ||
956 | stv0900_write_reg(i_params, R0900_P1_MODCODLSTE, 0xff); | 943 | } else if (intp->chip_id >= 0x12) { |
957 | stv0900_write_reg(i_params, R0900_P1_MODCODLSTF, 0xcf); | 944 | for (reg_index = 0; reg_index < 7; reg_index++) |
958 | for (reg_index = 0; reg_index < 8; reg_index++) | 945 | stv0900_write_reg(intp, MODCODLST0 + reg_index, 0xff); |
959 | stv0900_write_reg(i_params, R0900_P1_MODCODLST7 + reg_index, 0xcc); | ||
960 | 946 | ||
961 | break; | 947 | stv0900_write_reg(intp, MODCODLSTE, 0xff); |
962 | case STV0900_DEMOD_2: | 948 | stv0900_write_reg(intp, MODCODLSTF, 0xcf); |
963 | for (reg_index = 0; reg_index < 7; reg_index++) | 949 | for (reg_index = 0; reg_index < 8; reg_index++) |
964 | stv0900_write_reg(i_params, R0900_P2_MODCODLST0 + reg_index, 0xff); | 950 | stv0900_write_reg(intp, MODCODLST7 + reg_index, 0xcc); |
965 | 951 | ||
966 | stv0900_write_reg(i_params, R0900_P2_MODCODLSTE, 0xff); | ||
967 | stv0900_write_reg(i_params, R0900_P2_MODCODLSTF, 0xcf); | ||
968 | for (reg_index = 0; reg_index < 8; reg_index++) | ||
969 | stv0900_write_reg(i_params, R0900_P2_MODCODLST7 + reg_index, 0xcc); | ||
970 | |||
971 | break; | ||
972 | } | ||
973 | 952 | ||
974 | } | 953 | } |
975 | } | 954 | } |
976 | 955 | ||
977 | void stv0900_activate_s2_modcode_single(struct stv0900_internal *i_params, | 956 | void stv0900_activate_s2_modcod_single(struct stv0900_internal *intp, |
978 | enum fe_stv0900_demod_num demod) | 957 | enum fe_stv0900_demod_num demod) |
979 | { | 958 | { |
980 | u32 reg_index; | 959 | u32 reg_index; |
981 | 960 | ||
982 | dprintk(KERN_INFO "%s\n", __func__); | 961 | dprintk("%s\n", __func__); |
983 | |||
984 | switch (demod) { | ||
985 | case STV0900_DEMOD_1: | ||
986 | default: | ||
987 | stv0900_write_reg(i_params, R0900_P1_MODCODLST0, 0xff); | ||
988 | stv0900_write_reg(i_params, R0900_P1_MODCODLST1, 0xf0); | ||
989 | stv0900_write_reg(i_params, R0900_P1_MODCODLSTF, 0x0f); | ||
990 | for (reg_index = 0; reg_index < 13; reg_index++) | ||
991 | stv0900_write_reg(i_params, | ||
992 | R0900_P1_MODCODLST2 + reg_index, 0); | ||
993 | 962 | ||
994 | break; | 963 | stv0900_write_reg(intp, MODCODLST0, 0xff); |
995 | case STV0900_DEMOD_2: | 964 | stv0900_write_reg(intp, MODCODLST1, 0xf0); |
996 | stv0900_write_reg(i_params, R0900_P2_MODCODLST0, 0xff); | 965 | stv0900_write_reg(intp, MODCODLSTF, 0x0f); |
997 | stv0900_write_reg(i_params, R0900_P2_MODCODLST1, 0xf0); | 966 | for (reg_index = 0; reg_index < 13; reg_index++) |
998 | stv0900_write_reg(i_params, R0900_P2_MODCODLSTF, 0x0f); | 967 | stv0900_write_reg(intp, MODCODLST2 + reg_index, 0); |
999 | for (reg_index = 0; reg_index < 13; reg_index++) | ||
1000 | stv0900_write_reg(i_params, | ||
1001 | R0900_P2_MODCODLST2 + reg_index, 0); | ||
1002 | 968 | ||
1003 | break; | ||
1004 | } | ||
1005 | } | 969 | } |
1006 | 970 | ||
1007 | static enum dvbfe_algo stv0900_frontend_algo(struct dvb_frontend *fe) | 971 | static enum dvbfe_algo stv0900_frontend_algo(struct dvb_frontend *fe) |
@@ -1012,7 +976,7 @@ static enum dvbfe_algo stv0900_frontend_algo(struct dvb_frontend *fe) | |||
1012 | static int stb0900_set_property(struct dvb_frontend *fe, | 976 | static int stb0900_set_property(struct dvb_frontend *fe, |
1013 | struct dtv_property *tvp) | 977 | struct dtv_property *tvp) |
1014 | { | 978 | { |
1015 | dprintk(KERN_INFO "%s(..)\n", __func__); | 979 | dprintk("%s(..)\n", __func__); |
1016 | 980 | ||
1017 | return 0; | 981 | return 0; |
1018 | } | 982 | } |
@@ -1020,166 +984,123 @@ static int stb0900_set_property(struct dvb_frontend *fe, | |||
1020 | static int stb0900_get_property(struct dvb_frontend *fe, | 984 | static int stb0900_get_property(struct dvb_frontend *fe, |
1021 | struct dtv_property *tvp) | 985 | struct dtv_property *tvp) |
1022 | { | 986 | { |
1023 | dprintk(KERN_INFO "%s(..)\n", __func__); | 987 | dprintk("%s(..)\n", __func__); |
1024 | 988 | ||
1025 | return 0; | 989 | return 0; |
1026 | } | 990 | } |
1027 | 991 | ||
1028 | void stv0900_start_search(struct stv0900_internal *i_params, | 992 | void stv0900_start_search(struct stv0900_internal *intp, |
1029 | enum fe_stv0900_demod_num demod) | 993 | enum fe_stv0900_demod_num demod) |
1030 | { | 994 | { |
1031 | 995 | u32 freq; | |
1032 | switch (demod) { | 996 | s16 freq_s16 ; |
1033 | case STV0900_DEMOD_1: | 997 | |
1034 | default: | 998 | stv0900_write_bits(intp, DEMOD_MODE, 0x1f); |
1035 | stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x1f); | 999 | if (intp->chip_id == 0x10) |
1036 | 1000 | stv0900_write_reg(intp, CORRELEXP, 0xaa); | |
1037 | if (i_params->chip_id == 0x10) | 1001 | |
1038 | stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0xaa); | 1002 | if (intp->chip_id < 0x20) |
1039 | 1003 | stv0900_write_reg(intp, CARHDR, 0x55); | |
1040 | if (i_params->chip_id < 0x20) | 1004 | |
1041 | stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x55); | 1005 | if (intp->chip_id <= 0x20) { |
1042 | 1006 | if (intp->symbol_rate[0] <= 5000000) { | |
1043 | if (i_params->dmd1_symbol_rate <= 5000000) { | 1007 | stv0900_write_reg(intp, CARCFG, 0x44); |
1044 | stv0900_write_reg(i_params, R0900_P1_CARCFG, 0x44); | 1008 | stv0900_write_reg(intp, CFRUP1, 0x0f); |
1045 | stv0900_write_reg(i_params, R0900_P1_CFRUP1, 0x0f); | 1009 | stv0900_write_reg(intp, CFRUP0, 0xff); |
1046 | stv0900_write_reg(i_params, R0900_P1_CFRUP0, 0xff); | 1010 | stv0900_write_reg(intp, CFRLOW1, 0xf0); |
1047 | stv0900_write_reg(i_params, R0900_P1_CFRLOW1, 0xf0); | 1011 | stv0900_write_reg(intp, CFRLOW0, 0x00); |
1048 | stv0900_write_reg(i_params, R0900_P1_CFRLOW0, 0x00); | 1012 | stv0900_write_reg(intp, RTCS2, 0x68); |
1049 | stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x68); | ||
1050 | } else { | 1013 | } else { |
1051 | stv0900_write_reg(i_params, R0900_P1_CARCFG, 0xc4); | 1014 | stv0900_write_reg(intp, CARCFG, 0xc4); |
1052 | stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x44); | 1015 | stv0900_write_reg(intp, RTCS2, 0x44); |
1053 | } | 1016 | } |
1054 | 1017 | ||
1055 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0); | 1018 | } else { /*cut 3.0 above*/ |
1056 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0); | 1019 | if (intp->symbol_rate[demod] <= 5000000) |
1057 | 1020 | stv0900_write_reg(intp, RTCS2, 0x68); | |
1058 | if (i_params->chip_id >= 0x20) { | 1021 | else |
1059 | stv0900_write_reg(i_params, R0900_P1_EQUALCFG, 0x41); | 1022 | stv0900_write_reg(intp, RTCS2, 0x44); |
1060 | stv0900_write_reg(i_params, R0900_P1_FFECFG, 0x41); | ||
1061 | |||
1062 | if ((i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS1) || (i_params->dmd1_srch_standard == STV0900_SEARCH_DSS) || (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH)) { | ||
1063 | stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x82); | ||
1064 | stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0); | ||
1065 | } | ||
1066 | } | ||
1067 | |||
1068 | stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x00); | ||
1069 | stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0xe0); | ||
1070 | stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0xc0); | ||
1071 | stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 0); | ||
1072 | stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); | ||
1073 | stv0900_write_bits(i_params, F0900_P1_S1S2_SEQUENTIAL, 0); | ||
1074 | stv0900_write_reg(i_params, R0900_P1_RTC, 0x88); | ||
1075 | if (i_params->chip_id >= 0x20) { | ||
1076 | if (i_params->dmd1_symbol_rate < 2000000) { | ||
1077 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x39); | ||
1078 | stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x40); | ||
1079 | } | ||
1080 | |||
1081 | if (i_params->dmd1_symbol_rate < 10000000) { | ||
1082 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x4c); | ||
1083 | stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x20); | ||
1084 | } else { | ||
1085 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x4b); | ||
1086 | stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x20); | ||
1087 | } | ||
1088 | 1023 | ||
1024 | stv0900_write_reg(intp, CARCFG, 0x46); | ||
1025 | if (intp->srch_algo[demod] == STV0900_WARM_START) { | ||
1026 | freq = 1000 << 16; | ||
1027 | freq /= (intp->mclk / 1000); | ||
1028 | freq_s16 = (s16)freq; | ||
1089 | } else { | 1029 | } else { |
1090 | if (i_params->dmd1_symbol_rate < 10000000) | 1030 | freq = (intp->srch_range[demod] / 2000); |
1091 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xef); | 1031 | if (intp->symbol_rate[demod] <= 5000000) |
1032 | freq += 80; | ||
1092 | else | 1033 | else |
1093 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed); | 1034 | freq += 600; |
1094 | } | ||
1095 | 1035 | ||
1096 | switch (i_params->dmd1_srch_algo) { | 1036 | freq = freq << 16; |
1097 | case STV0900_WARM_START: | 1037 | freq /= (intp->mclk / 1000); |
1098 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f); | 1038 | freq_s16 = (s16)freq; |
1099 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); | ||
1100 | break; | ||
1101 | case STV0900_COLD_START: | ||
1102 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f); | ||
1103 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15); | ||
1104 | break; | ||
1105 | default: | ||
1106 | break; | ||
1107 | } | 1039 | } |
1108 | 1040 | ||
1109 | break; | 1041 | stv0900_write_bits(intp, CFR_UP1, MSB(freq_s16)); |
1110 | case STV0900_DEMOD_2: | 1042 | stv0900_write_bits(intp, CFR_UP0, LSB(freq_s16)); |
1111 | stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x1f); | 1043 | freq_s16 *= (-1); |
1112 | if (i_params->chip_id == 0x10) | 1044 | stv0900_write_bits(intp, CFR_LOW1, MSB(freq_s16)); |
1113 | stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0xaa); | 1045 | stv0900_write_bits(intp, CFR_LOW0, LSB(freq_s16)); |
1114 | 1046 | } | |
1115 | if (i_params->chip_id < 0x20) | ||
1116 | stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x55); | ||
1117 | |||
1118 | if (i_params->dmd2_symbol_rate <= 5000000) { | ||
1119 | stv0900_write_reg(i_params, R0900_P2_CARCFG, 0x44); | ||
1120 | stv0900_write_reg(i_params, R0900_P2_CFRUP1, 0x0f); | ||
1121 | stv0900_write_reg(i_params, R0900_P2_CFRUP0, 0xff); | ||
1122 | stv0900_write_reg(i_params, R0900_P2_CFRLOW1, 0xf0); | ||
1123 | stv0900_write_reg(i_params, R0900_P2_CFRLOW0, 0x00); | ||
1124 | stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x68); | ||
1125 | } else { | ||
1126 | stv0900_write_reg(i_params, R0900_P2_CARCFG, 0xc4); | ||
1127 | stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x44); | ||
1128 | } | ||
1129 | 1047 | ||
1130 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0); | 1048 | stv0900_write_reg(intp, CFRINIT1, 0); |
1131 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0); | 1049 | stv0900_write_reg(intp, CFRINIT0, 0); |
1132 | 1050 | ||
1133 | if (i_params->chip_id >= 0x20) { | 1051 | if (intp->chip_id >= 0x20) { |
1134 | stv0900_write_reg(i_params, R0900_P2_EQUALCFG, 0x41); | 1052 | stv0900_write_reg(intp, EQUALCFG, 0x41); |
1135 | stv0900_write_reg(i_params, R0900_P2_FFECFG, 0x41); | 1053 | stv0900_write_reg(intp, FFECFG, 0x41); |
1136 | if ((i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS1) || (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DSS) || (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH)) { | ||
1137 | stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x82); | ||
1138 | stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0); | ||
1139 | } | ||
1140 | } | ||
1141 | 1054 | ||
1142 | stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x00); | 1055 | if ((intp->srch_standard[demod] == STV0900_SEARCH_DVBS1) || |
1143 | stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0xe0); | 1056 | (intp->srch_standard[demod] == STV0900_SEARCH_DSS) || |
1144 | stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0xc0); | 1057 | (intp->srch_standard[demod] == STV0900_AUTO_SEARCH)) { |
1145 | stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 0); | 1058 | stv0900_write_reg(intp, VITSCALE, |
1146 | stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); | 1059 | 0x82); |
1147 | stv0900_write_bits(i_params, F0900_P2_S1S2_SEQUENTIAL, 0); | 1060 | stv0900_write_reg(intp, VAVSRVIT, 0x0); |
1148 | stv0900_write_reg(i_params, R0900_P2_RTC, 0x88); | 1061 | } |
1149 | if (i_params->chip_id >= 0x20) { | 1062 | } |
1150 | if (i_params->dmd2_symbol_rate < 2000000) { | ||
1151 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x39); | ||
1152 | stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x40); | ||
1153 | } | ||
1154 | |||
1155 | if (i_params->dmd2_symbol_rate < 10000000) { | ||
1156 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x4c); | ||
1157 | stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x20); | ||
1158 | } else { | ||
1159 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x4b); | ||
1160 | stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x20); | ||
1161 | } | ||
1162 | 1063 | ||
1064 | stv0900_write_reg(intp, SFRSTEP, 0x00); | ||
1065 | stv0900_write_reg(intp, TMGTHRISE, 0xe0); | ||
1066 | stv0900_write_reg(intp, TMGTHFALL, 0xc0); | ||
1067 | stv0900_write_bits(intp, SCAN_ENABLE, 0); | ||
1068 | stv0900_write_bits(intp, CFR_AUTOSCAN, 0); | ||
1069 | stv0900_write_bits(intp, S1S2_SEQUENTIAL, 0); | ||
1070 | stv0900_write_reg(intp, RTC, 0x88); | ||
1071 | if (intp->chip_id >= 0x20) { | ||
1072 | if (intp->symbol_rate[demod] < 2000000) { | ||
1073 | if (intp->chip_id <= 0x20) | ||
1074 | stv0900_write_reg(intp, CARFREQ, 0x39); | ||
1075 | else /*cut 3.0*/ | ||
1076 | stv0900_write_reg(intp, CARFREQ, 0x89); | ||
1077 | |||
1078 | stv0900_write_reg(intp, CARHDR, 0x40); | ||
1079 | } else if (intp->symbol_rate[demod] < 10000000) { | ||
1080 | stv0900_write_reg(intp, CARFREQ, 0x4c); | ||
1081 | stv0900_write_reg(intp, CARHDR, 0x20); | ||
1163 | } else { | 1082 | } else { |
1164 | if (i_params->dmd2_symbol_rate < 10000000) | 1083 | stv0900_write_reg(intp, CARFREQ, 0x4b); |
1165 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xef); | 1084 | stv0900_write_reg(intp, CARHDR, 0x20); |
1166 | else | ||
1167 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed); | ||
1168 | } | 1085 | } |
1169 | 1086 | ||
1170 | switch (i_params->dmd2_srch_algo) { | 1087 | } else { |
1171 | case STV0900_WARM_START: | 1088 | if (intp->symbol_rate[demod] < 10000000) |
1172 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f); | 1089 | stv0900_write_reg(intp, CARFREQ, 0xef); |
1173 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); | 1090 | else |
1174 | break; | 1091 | stv0900_write_reg(intp, CARFREQ, 0xed); |
1175 | case STV0900_COLD_START: | 1092 | } |
1176 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f); | ||
1177 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15); | ||
1178 | break; | ||
1179 | default: | ||
1180 | break; | ||
1181 | } | ||
1182 | 1093 | ||
1094 | switch (intp->srch_algo[demod]) { | ||
1095 | case STV0900_WARM_START: | ||
1096 | stv0900_write_reg(intp, DMDISTATE, 0x1f); | ||
1097 | stv0900_write_reg(intp, DMDISTATE, 0x18); | ||
1098 | break; | ||
1099 | case STV0900_COLD_START: | ||
1100 | stv0900_write_reg(intp, DMDISTATE, 0x1f); | ||
1101 | stv0900_write_reg(intp, DMDISTATE, 0x15); | ||
1102 | break; | ||
1103 | default: | ||
1183 | break; | 1104 | break; |
1184 | } | 1105 | } |
1185 | } | 1106 | } |
@@ -1188,33 +1109,40 @@ u8 stv0900_get_optim_carr_loop(s32 srate, enum fe_stv0900_modcode modcode, | |||
1188 | s32 pilot, u8 chip_id) | 1109 | s32 pilot, u8 chip_id) |
1189 | { | 1110 | { |
1190 | u8 aclc_value = 0x29; | 1111 | u8 aclc_value = 0x29; |
1191 | s32 i; | 1112 | s32 i; |
1192 | const struct stv0900_car_loop_optim *car_loop_s2; | 1113 | const struct stv0900_car_loop_optim *cls2, *cllqs2, *cllas2; |
1193 | 1114 | ||
1194 | dprintk(KERN_INFO "%s\n", __func__); | 1115 | dprintk("%s\n", __func__); |
1195 | 1116 | ||
1196 | if (chip_id <= 0x12) | 1117 | if (chip_id <= 0x12) { |
1197 | car_loop_s2 = FE_STV0900_S2CarLoop; | 1118 | cls2 = FE_STV0900_S2CarLoop; |
1198 | else if (chip_id == 0x20) | 1119 | cllqs2 = FE_STV0900_S2LowQPCarLoopCut30; |
1199 | car_loop_s2 = FE_STV0900_S2CarLoopCut20; | 1120 | cllas2 = FE_STV0900_S2APSKCarLoopCut30; |
1200 | else | 1121 | } else if (chip_id == 0x20) { |
1201 | car_loop_s2 = FE_STV0900_S2CarLoop; | 1122 | cls2 = FE_STV0900_S2CarLoopCut20; |
1123 | cllqs2 = FE_STV0900_S2LowQPCarLoopCut20; | ||
1124 | cllas2 = FE_STV0900_S2APSKCarLoopCut20; | ||
1125 | } else { | ||
1126 | cls2 = FE_STV0900_S2CarLoopCut30; | ||
1127 | cllqs2 = FE_STV0900_S2LowQPCarLoopCut30; | ||
1128 | cllas2 = FE_STV0900_S2APSKCarLoopCut30; | ||
1129 | } | ||
1202 | 1130 | ||
1203 | if (modcode < STV0900_QPSK_12) { | 1131 | if (modcode < STV0900_QPSK_12) { |
1204 | i = 0; | 1132 | i = 0; |
1205 | while ((i < 3) && (modcode != FE_STV0900_S2LowQPCarLoopCut20[i].modcode)) | 1133 | while ((i < 3) && (modcode != cllqs2[i].modcode)) |
1206 | i++; | 1134 | i++; |
1207 | 1135 | ||
1208 | if (i >= 3) | 1136 | if (i >= 3) |
1209 | i = 2; | 1137 | i = 2; |
1210 | } else { | 1138 | } else { |
1211 | i = 0; | 1139 | i = 0; |
1212 | while ((i < 14) && (modcode != car_loop_s2[i].modcode)) | 1140 | while ((i < 14) && (modcode != cls2[i].modcode)) |
1213 | i++; | 1141 | i++; |
1214 | 1142 | ||
1215 | if (i >= 14) { | 1143 | if (i >= 14) { |
1216 | i = 0; | 1144 | i = 0; |
1217 | while ((i < 11) && (modcode != FE_STV0900_S2APSKCarLoopCut20[i].modcode)) | 1145 | while ((i < 11) && (modcode != cllas2[i].modcode)) |
1218 | i++; | 1146 | i++; |
1219 | 1147 | ||
1220 | if (i >= 11) | 1148 | if (i >= 11) |
@@ -1225,76 +1153,82 @@ u8 stv0900_get_optim_carr_loop(s32 srate, enum fe_stv0900_modcode modcode, | |||
1225 | if (modcode <= STV0900_QPSK_25) { | 1153 | if (modcode <= STV0900_QPSK_25) { |
1226 | if (pilot) { | 1154 | if (pilot) { |
1227 | if (srate <= 3000000) | 1155 | if (srate <= 3000000) |
1228 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_2; | 1156 | aclc_value = cllqs2[i].car_loop_pilots_on_2; |
1229 | else if (srate <= 7000000) | 1157 | else if (srate <= 7000000) |
1230 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_5; | 1158 | aclc_value = cllqs2[i].car_loop_pilots_on_5; |
1231 | else if (srate <= 15000000) | 1159 | else if (srate <= 15000000) |
1232 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_10; | 1160 | aclc_value = cllqs2[i].car_loop_pilots_on_10; |
1233 | else if (srate <= 25000000) | 1161 | else if (srate <= 25000000) |
1234 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_20; | 1162 | aclc_value = cllqs2[i].car_loop_pilots_on_20; |
1235 | else | 1163 | else |
1236 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_30; | 1164 | aclc_value = cllqs2[i].car_loop_pilots_on_30; |
1237 | } else { | 1165 | } else { |
1238 | if (srate <= 3000000) | 1166 | if (srate <= 3000000) |
1239 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_2; | 1167 | aclc_value = cllqs2[i].car_loop_pilots_off_2; |
1240 | else if (srate <= 7000000) | 1168 | else if (srate <= 7000000) |
1241 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_5; | 1169 | aclc_value = cllqs2[i].car_loop_pilots_off_5; |
1242 | else if (srate <= 15000000) | 1170 | else if (srate <= 15000000) |
1243 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_10; | 1171 | aclc_value = cllqs2[i].car_loop_pilots_off_10; |
1244 | else if (srate <= 25000000) | 1172 | else if (srate <= 25000000) |
1245 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_20; | 1173 | aclc_value = cllqs2[i].car_loop_pilots_off_20; |
1246 | else | 1174 | else |
1247 | aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_30; | 1175 | aclc_value = cllqs2[i].car_loop_pilots_off_30; |
1248 | } | 1176 | } |
1249 | 1177 | ||
1250 | } else if (modcode <= STV0900_8PSK_910) { | 1178 | } else if (modcode <= STV0900_8PSK_910) { |
1251 | if (pilot) { | 1179 | if (pilot) { |
1252 | if (srate <= 3000000) | 1180 | if (srate <= 3000000) |
1253 | aclc_value = car_loop_s2[i].car_loop_pilots_on_2; | 1181 | aclc_value = cls2[i].car_loop_pilots_on_2; |
1254 | else if (srate <= 7000000) | 1182 | else if (srate <= 7000000) |
1255 | aclc_value = car_loop_s2[i].car_loop_pilots_on_5; | 1183 | aclc_value = cls2[i].car_loop_pilots_on_5; |
1256 | else if (srate <= 15000000) | 1184 | else if (srate <= 15000000) |
1257 | aclc_value = car_loop_s2[i].car_loop_pilots_on_10; | 1185 | aclc_value = cls2[i].car_loop_pilots_on_10; |
1258 | else if (srate <= 25000000) | 1186 | else if (srate <= 25000000) |
1259 | aclc_value = car_loop_s2[i].car_loop_pilots_on_20; | 1187 | aclc_value = cls2[i].car_loop_pilots_on_20; |
1260 | else | 1188 | else |
1261 | aclc_value = car_loop_s2[i].car_loop_pilots_on_30; | 1189 | aclc_value = cls2[i].car_loop_pilots_on_30; |
1262 | } else { | 1190 | } else { |
1263 | if (srate <= 3000000) | 1191 | if (srate <= 3000000) |
1264 | aclc_value = car_loop_s2[i].car_loop_pilots_off_2; | 1192 | aclc_value = cls2[i].car_loop_pilots_off_2; |
1265 | else if (srate <= 7000000) | 1193 | else if (srate <= 7000000) |
1266 | aclc_value = car_loop_s2[i].car_loop_pilots_off_5; | 1194 | aclc_value = cls2[i].car_loop_pilots_off_5; |
1267 | else if (srate <= 15000000) | 1195 | else if (srate <= 15000000) |
1268 | aclc_value = car_loop_s2[i].car_loop_pilots_off_10; | 1196 | aclc_value = cls2[i].car_loop_pilots_off_10; |
1269 | else if (srate <= 25000000) | 1197 | else if (srate <= 25000000) |
1270 | aclc_value = car_loop_s2[i].car_loop_pilots_off_20; | 1198 | aclc_value = cls2[i].car_loop_pilots_off_20; |
1271 | else | 1199 | else |
1272 | aclc_value = car_loop_s2[i].car_loop_pilots_off_30; | 1200 | aclc_value = cls2[i].car_loop_pilots_off_30; |
1273 | } | 1201 | } |
1274 | 1202 | ||
1275 | } else { | 1203 | } else { |
1276 | if (srate <= 3000000) | 1204 | if (srate <= 3000000) |
1277 | aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_2; | 1205 | aclc_value = cllas2[i].car_loop_pilots_on_2; |
1278 | else if (srate <= 7000000) | 1206 | else if (srate <= 7000000) |
1279 | aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_5; | 1207 | aclc_value = cllas2[i].car_loop_pilots_on_5; |
1280 | else if (srate <= 15000000) | 1208 | else if (srate <= 15000000) |
1281 | aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_10; | 1209 | aclc_value = cllas2[i].car_loop_pilots_on_10; |
1282 | else if (srate <= 25000000) | 1210 | else if (srate <= 25000000) |
1283 | aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_20; | 1211 | aclc_value = cllas2[i].car_loop_pilots_on_20; |
1284 | else | 1212 | else |
1285 | aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_30; | 1213 | aclc_value = cllas2[i].car_loop_pilots_on_30; |
1286 | } | 1214 | } |
1287 | 1215 | ||
1288 | return aclc_value; | 1216 | return aclc_value; |
1289 | } | 1217 | } |
1290 | 1218 | ||
1291 | u8 stv0900_get_optim_short_carr_loop(s32 srate, enum fe_stv0900_modulation modulation, u8 chip_id) | 1219 | u8 stv0900_get_optim_short_carr_loop(s32 srate, |
1220 | enum fe_stv0900_modulation modulation, | ||
1221 | u8 chip_id) | ||
1292 | { | 1222 | { |
1223 | const struct stv0900_short_frames_car_loop_optim *s2scl; | ||
1224 | const struct stv0900_short_frames_car_loop_optim_vs_mod *s2sclc30; | ||
1293 | s32 mod_index = 0; | 1225 | s32 mod_index = 0; |
1294 | |||
1295 | u8 aclc_value = 0x0b; | 1226 | u8 aclc_value = 0x0b; |
1296 | 1227 | ||
1297 | dprintk(KERN_INFO "%s\n", __func__); | 1228 | dprintk("%s\n", __func__); |
1229 | |||
1230 | s2scl = FE_STV0900_S2ShortCarLoop; | ||
1231 | s2sclc30 = FE_STV0900_S2ShortCarLoopCut30; | ||
1298 | 1232 | ||
1299 | switch (modulation) { | 1233 | switch (modulation) { |
1300 | case STV0900_QPSK: | 1234 | case STV0900_QPSK: |
@@ -1312,75 +1246,116 @@ u8 stv0900_get_optim_short_carr_loop(s32 srate, enum fe_stv0900_modulation modul | |||
1312 | break; | 1246 | break; |
1313 | } | 1247 | } |
1314 | 1248 | ||
1315 | switch (chip_id) { | 1249 | if (chip_id >= 0x30) { |
1316 | case 0x20: | ||
1317 | if (srate <= 3000000) | 1250 | if (srate <= 3000000) |
1318 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_2; | 1251 | aclc_value = s2sclc30[mod_index].car_loop_2; |
1319 | else if (srate <= 7000000) | 1252 | else if (srate <= 7000000) |
1320 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_5; | 1253 | aclc_value = s2sclc30[mod_index].car_loop_5; |
1321 | else if (srate <= 15000000) | 1254 | else if (srate <= 15000000) |
1322 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_10; | 1255 | aclc_value = s2sclc30[mod_index].car_loop_10; |
1323 | else if (srate <= 25000000) | 1256 | else if (srate <= 25000000) |
1324 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_20; | 1257 | aclc_value = s2sclc30[mod_index].car_loop_20; |
1325 | else | 1258 | else |
1326 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_30; | 1259 | aclc_value = s2sclc30[mod_index].car_loop_30; |
1327 | 1260 | ||
1328 | break; | 1261 | } else if (chip_id >= 0x20) { |
1329 | case 0x12: | ||
1330 | default: | ||
1331 | if (srate <= 3000000) | 1262 | if (srate <= 3000000) |
1332 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_2; | 1263 | aclc_value = s2scl[mod_index].car_loop_cut20_2; |
1333 | else if (srate <= 7000000) | 1264 | else if (srate <= 7000000) |
1334 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_5; | 1265 | aclc_value = s2scl[mod_index].car_loop_cut20_5; |
1335 | else if (srate <= 15000000) | 1266 | else if (srate <= 15000000) |
1336 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_10; | 1267 | aclc_value = s2scl[mod_index].car_loop_cut20_10; |
1337 | else if (srate <= 25000000) | 1268 | else if (srate <= 25000000) |
1338 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_20; | 1269 | aclc_value = s2scl[mod_index].car_loop_cut20_20; |
1339 | else | 1270 | else |
1340 | aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_30; | 1271 | aclc_value = s2scl[mod_index].car_loop_cut20_30; |
1272 | |||
1273 | } else { | ||
1274 | if (srate <= 3000000) | ||
1275 | aclc_value = s2scl[mod_index].car_loop_cut12_2; | ||
1276 | else if (srate <= 7000000) | ||
1277 | aclc_value = s2scl[mod_index].car_loop_cut12_5; | ||
1278 | else if (srate <= 15000000) | ||
1279 | aclc_value = s2scl[mod_index].car_loop_cut12_10; | ||
1280 | else if (srate <= 25000000) | ||
1281 | aclc_value = s2scl[mod_index].car_loop_cut12_20; | ||
1282 | else | ||
1283 | aclc_value = s2scl[mod_index].car_loop_cut12_30; | ||
1341 | 1284 | ||
1342 | break; | ||
1343 | } | 1285 | } |
1344 | 1286 | ||
1345 | return aclc_value; | 1287 | return aclc_value; |
1346 | } | 1288 | } |
1347 | 1289 | ||
1348 | static enum fe_stv0900_error stv0900_st_dvbs2_single(struct stv0900_internal *i_params, | 1290 | static |
1291 | enum fe_stv0900_error stv0900_st_dvbs2_single(struct stv0900_internal *intp, | ||
1349 | enum fe_stv0900_demod_mode LDPC_Mode, | 1292 | enum fe_stv0900_demod_mode LDPC_Mode, |
1350 | enum fe_stv0900_demod_num demod) | 1293 | enum fe_stv0900_demod_num demod) |
1351 | { | 1294 | { |
1352 | enum fe_stv0900_error error = STV0900_NO_ERROR; | 1295 | enum fe_stv0900_error error = STV0900_NO_ERROR; |
1296 | s32 reg_ind; | ||
1353 | 1297 | ||
1354 | dprintk(KERN_INFO "%s\n", __func__); | 1298 | dprintk("%s\n", __func__); |
1355 | 1299 | ||
1356 | switch (LDPC_Mode) { | 1300 | switch (LDPC_Mode) { |
1357 | case STV0900_DUAL: | 1301 | case STV0900_DUAL: |
1358 | default: | 1302 | default: |
1359 | if ((i_params->demod_mode != STV0900_DUAL) | 1303 | if ((intp->demod_mode != STV0900_DUAL) |
1360 | || (stv0900_get_bits(i_params, F0900_DDEMOD) != 1)) { | 1304 | || (stv0900_get_bits(intp, F0900_DDEMOD) != 1)) { |
1361 | stv0900_write_reg(i_params, R0900_GENCFG, 0x1d); | 1305 | stv0900_write_reg(intp, R0900_GENCFG, 0x1d); |
1362 | 1306 | ||
1363 | i_params->demod_mode = STV0900_DUAL; | 1307 | intp->demod_mode = STV0900_DUAL; |
1364 | 1308 | ||
1365 | stv0900_write_bits(i_params, F0900_FRESFEC, 1); | 1309 | stv0900_write_bits(intp, F0900_FRESFEC, 1); |
1366 | stv0900_write_bits(i_params, F0900_FRESFEC, 0); | 1310 | stv0900_write_bits(intp, F0900_FRESFEC, 0); |
1311 | |||
1312 | for (reg_ind = 0; reg_ind < 7; reg_ind++) | ||
1313 | stv0900_write_reg(intp, | ||
1314 | R0900_P1_MODCODLST0 + reg_ind, | ||
1315 | 0xff); | ||
1316 | for (reg_ind = 0; reg_ind < 8; reg_ind++) | ||
1317 | stv0900_write_reg(intp, | ||
1318 | R0900_P1_MODCODLST7 + reg_ind, | ||
1319 | 0xcc); | ||
1320 | |||
1321 | stv0900_write_reg(intp, R0900_P1_MODCODLSTE, 0xff); | ||
1322 | stv0900_write_reg(intp, R0900_P1_MODCODLSTF, 0xcf); | ||
1323 | |||
1324 | for (reg_ind = 0; reg_ind < 7; reg_ind++) | ||
1325 | stv0900_write_reg(intp, | ||
1326 | R0900_P2_MODCODLST0 + reg_ind, | ||
1327 | 0xff); | ||
1328 | for (reg_ind = 0; reg_ind < 8; reg_ind++) | ||
1329 | stv0900_write_reg(intp, | ||
1330 | R0900_P2_MODCODLST7 + reg_ind, | ||
1331 | 0xcc); | ||
1332 | |||
1333 | stv0900_write_reg(intp, R0900_P2_MODCODLSTE, 0xff); | ||
1334 | stv0900_write_reg(intp, R0900_P2_MODCODLSTF, 0xcf); | ||
1367 | } | 1335 | } |
1368 | 1336 | ||
1369 | break; | 1337 | break; |
1370 | case STV0900_SINGLE: | 1338 | case STV0900_SINGLE: |
1371 | if (demod == STV0900_DEMOD_2) | 1339 | if (demod == STV0900_DEMOD_2) { |
1372 | stv0900_write_reg(i_params, R0900_GENCFG, 0x06); | 1340 | stv0900_stop_all_s2_modcod(intp, STV0900_DEMOD_1); |
1373 | else | 1341 | stv0900_activate_s2_modcod_single(intp, |
1374 | stv0900_write_reg(i_params, R0900_GENCFG, 0x04); | 1342 | STV0900_DEMOD_2); |
1343 | stv0900_write_reg(intp, R0900_GENCFG, 0x06); | ||
1344 | } else { | ||
1345 | stv0900_stop_all_s2_modcod(intp, STV0900_DEMOD_2); | ||
1346 | stv0900_activate_s2_modcod_single(intp, | ||
1347 | STV0900_DEMOD_1); | ||
1348 | stv0900_write_reg(intp, R0900_GENCFG, 0x04); | ||
1349 | } | ||
1375 | 1350 | ||
1376 | i_params->demod_mode = STV0900_SINGLE; | 1351 | intp->demod_mode = STV0900_SINGLE; |
1377 | 1352 | ||
1378 | stv0900_write_bits(i_params, F0900_FRESFEC, 1); | 1353 | stv0900_write_bits(intp, F0900_FRESFEC, 1); |
1379 | stv0900_write_bits(i_params, F0900_FRESFEC, 0); | 1354 | stv0900_write_bits(intp, F0900_FRESFEC, 0); |
1380 | stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 1); | 1355 | stv0900_write_bits(intp, F0900_P1_ALGOSWRST, 1); |
1381 | stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 0); | 1356 | stv0900_write_bits(intp, F0900_P1_ALGOSWRST, 0); |
1382 | stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 1); | 1357 | stv0900_write_bits(intp, F0900_P2_ALGOSWRST, 1); |
1383 | stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 0); | 1358 | stv0900_write_bits(intp, F0900_P2_ALGOSWRST, 0); |
1384 | break; | 1359 | break; |
1385 | } | 1360 | } |
1386 | 1361 | ||
@@ -1393,131 +1368,178 @@ static enum fe_stv0900_error stv0900_init_internal(struct dvb_frontend *fe, | |||
1393 | struct stv0900_state *state = fe->demodulator_priv; | 1368 | struct stv0900_state *state = fe->demodulator_priv; |
1394 | enum fe_stv0900_error error = STV0900_NO_ERROR; | 1369 | enum fe_stv0900_error error = STV0900_NO_ERROR; |
1395 | enum fe_stv0900_error demodError = STV0900_NO_ERROR; | 1370 | enum fe_stv0900_error demodError = STV0900_NO_ERROR; |
1371 | struct stv0900_internal *intp = NULL; | ||
1396 | int selosci, i; | 1372 | int selosci, i; |
1397 | 1373 | ||
1398 | struct stv0900_inode *temp_int = find_inode(state->i2c_adap, | 1374 | struct stv0900_inode *temp_int = find_inode(state->i2c_adap, |
1399 | state->config->demod_address); | 1375 | state->config->demod_address); |
1400 | 1376 | ||
1401 | dprintk(KERN_INFO "%s\n", __func__); | 1377 | dprintk("%s\n", __func__); |
1402 | 1378 | ||
1403 | if (temp_int != NULL) { | 1379 | if ((temp_int != NULL) && (p_init->demod_mode == STV0900_DUAL)) { |
1404 | state->internal = temp_int->internal; | 1380 | state->internal = temp_int->internal; |
1405 | (state->internal->dmds_used)++; | 1381 | (state->internal->dmds_used)++; |
1406 | dprintk(KERN_INFO "%s: Find Internal Structure!\n", __func__); | 1382 | dprintk("%s: Find Internal Structure!\n", __func__); |
1407 | return STV0900_NO_ERROR; | 1383 | return STV0900_NO_ERROR; |
1408 | } else { | 1384 | } else { |
1409 | state->internal = kmalloc(sizeof(struct stv0900_internal), GFP_KERNEL); | 1385 | state->internal = kmalloc(sizeof(struct stv0900_internal), |
1386 | GFP_KERNEL); | ||
1387 | if (state->internal == NULL) | ||
1388 | return STV0900_INVALID_HANDLE; | ||
1410 | temp_int = append_internal(state->internal); | 1389 | temp_int = append_internal(state->internal); |
1390 | if (temp_int == NULL) { | ||
1391 | kfree(state->internal); | ||
1392 | state->internal = NULL; | ||
1393 | return STV0900_INVALID_HANDLE; | ||
1394 | } | ||
1411 | state->internal->dmds_used = 1; | 1395 | state->internal->dmds_used = 1; |
1412 | state->internal->i2c_adap = state->i2c_adap; | 1396 | state->internal->i2c_adap = state->i2c_adap; |
1413 | state->internal->i2c_addr = state->config->demod_address; | 1397 | state->internal->i2c_addr = state->config->demod_address; |
1414 | state->internal->clkmode = state->config->clkmode; | 1398 | state->internal->clkmode = state->config->clkmode; |
1415 | state->internal->errs = STV0900_NO_ERROR; | 1399 | state->internal->errs = STV0900_NO_ERROR; |
1416 | dprintk(KERN_INFO "%s: Create New Internal Structure!\n", __func__); | 1400 | dprintk("%s: Create New Internal Structure!\n", __func__); |
1417 | } | 1401 | } |
1418 | 1402 | ||
1419 | if (state->internal != NULL) { | 1403 | if (state->internal == NULL) { |
1420 | demodError = stv0900_initialize(state->internal); | 1404 | error = STV0900_INVALID_HANDLE; |
1421 | if (demodError == STV0900_NO_ERROR) { | 1405 | return error; |
1422 | error = STV0900_NO_ERROR; | 1406 | } |
1423 | } else { | ||
1424 | if (demodError == STV0900_INVALID_HANDLE) | ||
1425 | error = STV0900_INVALID_HANDLE; | ||
1426 | else | ||
1427 | error = STV0900_I2C_ERROR; | ||
1428 | } | ||
1429 | 1407 | ||
1430 | if (state->internal != NULL) { | 1408 | demodError = stv0900_initialize(state->internal); |
1431 | if (error == STV0900_NO_ERROR) { | 1409 | if (demodError == STV0900_NO_ERROR) { |
1432 | state->internal->demod_mode = p_init->demod_mode; | 1410 | error = STV0900_NO_ERROR; |
1433 | 1411 | } else { | |
1434 | stv0900_st_dvbs2_single(state->internal, state->internal->demod_mode, STV0900_DEMOD_1); | 1412 | if (demodError == STV0900_INVALID_HANDLE) |
1435 | 1413 | error = STV0900_INVALID_HANDLE; | |
1436 | state->internal->chip_id = stv0900_read_reg(state->internal, R0900_MID); | 1414 | else |
1437 | state->internal->rolloff = p_init->rolloff; | 1415 | error = STV0900_I2C_ERROR; |
1438 | state->internal->quartz = p_init->dmd_ref_clk; | ||
1439 | |||
1440 | stv0900_write_bits(state->internal, F0900_P1_ROLLOFF_CONTROL, p_init->rolloff); | ||
1441 | stv0900_write_bits(state->internal, F0900_P2_ROLLOFF_CONTROL, p_init->rolloff); | ||
1442 | |||
1443 | state->internal->ts_config = p_init->ts_config; | ||
1444 | if (state->internal->ts_config == NULL) | ||
1445 | stv0900_set_ts_parallel_serial(state->internal, | ||
1446 | p_init->path1_ts_clock, | ||
1447 | p_init->path2_ts_clock); | ||
1448 | else { | ||
1449 | for (i = 0; state->internal->ts_config[i].addr != 0xffff; i++) | ||
1450 | stv0900_write_reg(state->internal, | ||
1451 | state->internal->ts_config[i].addr, | ||
1452 | state->internal->ts_config[i].val); | ||
1453 | |||
1454 | stv0900_write_bits(state->internal, F0900_P2_RST_HWARE, 1); | ||
1455 | stv0900_write_bits(state->internal, F0900_P2_RST_HWARE, 0); | ||
1456 | stv0900_write_bits(state->internal, F0900_P1_RST_HWARE, 1); | ||
1457 | stv0900_write_bits(state->internal, F0900_P1_RST_HWARE, 0); | ||
1458 | } | ||
1459 | 1416 | ||
1460 | stv0900_write_bits(state->internal, F0900_P1_TUN_MADDRESS, p_init->tun1_maddress); | 1417 | return error; |
1461 | switch (p_init->tuner1_adc) { | 1418 | } |
1462 | case 1: | ||
1463 | stv0900_write_reg(state->internal, R0900_TSTTNR1, 0x26); | ||
1464 | break; | ||
1465 | default: | ||
1466 | break; | ||
1467 | } | ||
1468 | 1419 | ||
1469 | stv0900_write_bits(state->internal, F0900_P2_TUN_MADDRESS, p_init->tun2_maddress); | 1420 | intp = state->internal; |
1470 | switch (p_init->tuner2_adc) { | ||
1471 | case 1: | ||
1472 | stv0900_write_reg(state->internal, R0900_TSTTNR3, 0x26); | ||
1473 | break; | ||
1474 | default: | ||
1475 | break; | ||
1476 | } | ||
1477 | 1421 | ||
1478 | stv0900_write_bits(state->internal, F0900_P1_TUN_IQSWAP, p_init->tun1_iq_inversion); | 1422 | intp->demod_mode = p_init->demod_mode; |
1479 | stv0900_write_bits(state->internal, F0900_P2_TUN_IQSWAP, p_init->tun2_iq_inversion); | 1423 | stv0900_st_dvbs2_single(intp, intp->demod_mode, STV0900_DEMOD_1); |
1480 | stv0900_set_mclk(state->internal, 135000000); | 1424 | intp->chip_id = stv0900_read_reg(intp, R0900_MID); |
1481 | msleep(3); | 1425 | intp->rolloff = p_init->rolloff; |
1482 | 1426 | intp->quartz = p_init->dmd_ref_clk; | |
1483 | switch (state->internal->clkmode) { | ||
1484 | case 0: | ||
1485 | case 2: | ||
1486 | stv0900_write_reg(state->internal, R0900_SYNTCTRL, 0x20 | state->internal->clkmode); | ||
1487 | break; | ||
1488 | default: | ||
1489 | selosci = 0x02 & stv0900_read_reg(state->internal, R0900_SYNTCTRL); | ||
1490 | stv0900_write_reg(state->internal, R0900_SYNTCTRL, 0x20 | selosci); | ||
1491 | break; | ||
1492 | } | ||
1493 | msleep(3); | ||
1494 | 1427 | ||
1495 | state->internal->mclk = stv0900_get_mclk_freq(state->internal, state->internal->quartz); | 1428 | stv0900_write_bits(intp, F0900_P1_ROLLOFF_CONTROL, p_init->rolloff); |
1496 | if (state->internal->errs) | 1429 | stv0900_write_bits(intp, F0900_P2_ROLLOFF_CONTROL, p_init->rolloff); |
1497 | error = STV0900_I2C_ERROR; | 1430 | |
1498 | } | 1431 | intp->ts_config = p_init->ts_config; |
1499 | } else { | 1432 | if (intp->ts_config == NULL) |
1500 | error = STV0900_INVALID_HANDLE; | 1433 | stv0900_set_ts_parallel_serial(intp, |
1501 | } | 1434 | p_init->path1_ts_clock, |
1435 | p_init->path2_ts_clock); | ||
1436 | else { | ||
1437 | for (i = 0; intp->ts_config[i].addr != 0xffff; i++) | ||
1438 | stv0900_write_reg(intp, | ||
1439 | intp->ts_config[i].addr, | ||
1440 | intp->ts_config[i].val); | ||
1441 | |||
1442 | stv0900_write_bits(intp, F0900_P2_RST_HWARE, 1); | ||
1443 | stv0900_write_bits(intp, F0900_P2_RST_HWARE, 0); | ||
1444 | stv0900_write_bits(intp, F0900_P1_RST_HWARE, 1); | ||
1445 | stv0900_write_bits(intp, F0900_P1_RST_HWARE, 0); | ||
1502 | } | 1446 | } |
1503 | 1447 | ||
1448 | intp->tuner_type[0] = p_init->tuner1_type; | ||
1449 | intp->tuner_type[1] = p_init->tuner2_type; | ||
1450 | /* tuner init */ | ||
1451 | switch (p_init->tuner1_type) { | ||
1452 | case 3: /*FE_AUTO_STB6100:*/ | ||
1453 | stv0900_write_reg(intp, R0900_P1_TNRCFG, 0x3c); | ||
1454 | stv0900_write_reg(intp, R0900_P1_TNRCFG2, 0x86); | ||
1455 | stv0900_write_reg(intp, R0900_P1_TNRCFG3, 0x18); | ||
1456 | stv0900_write_reg(intp, R0900_P1_TNRXTAL, 27); /* 27MHz */ | ||
1457 | stv0900_write_reg(intp, R0900_P1_TNRSTEPS, 0x05); | ||
1458 | stv0900_write_reg(intp, R0900_P1_TNRGAIN, 0x17); | ||
1459 | stv0900_write_reg(intp, R0900_P1_TNRADJ, 0x1f); | ||
1460 | stv0900_write_reg(intp, R0900_P1_TNRCTL2, 0x0); | ||
1461 | stv0900_write_bits(intp, F0900_P1_TUN_TYPE, 3); | ||
1462 | break; | ||
1463 | /* case FE_SW_TUNER: */ | ||
1464 | default: | ||
1465 | stv0900_write_bits(intp, F0900_P1_TUN_TYPE, 6); | ||
1466 | break; | ||
1467 | } | ||
1468 | |||
1469 | stv0900_write_bits(intp, F0900_P1_TUN_MADDRESS, p_init->tun1_maddress); | ||
1470 | switch (p_init->tuner1_adc) { | ||
1471 | case 1: | ||
1472 | stv0900_write_reg(intp, R0900_TSTTNR1, 0x26); | ||
1473 | break; | ||
1474 | default: | ||
1475 | break; | ||
1476 | } | ||
1477 | |||
1478 | stv0900_write_reg(intp, R0900_P1_TNRLD, 1); /* hw tuner */ | ||
1479 | |||
1480 | /* tuner init */ | ||
1481 | switch (p_init->tuner2_type) { | ||
1482 | case 3: /*FE_AUTO_STB6100:*/ | ||
1483 | stv0900_write_reg(intp, R0900_P2_TNRCFG, 0x3c); | ||
1484 | stv0900_write_reg(intp, R0900_P2_TNRCFG2, 0x86); | ||
1485 | stv0900_write_reg(intp, R0900_P2_TNRCFG3, 0x18); | ||
1486 | stv0900_write_reg(intp, R0900_P2_TNRXTAL, 27); /* 27MHz */ | ||
1487 | stv0900_write_reg(intp, R0900_P2_TNRSTEPS, 0x05); | ||
1488 | stv0900_write_reg(intp, R0900_P2_TNRGAIN, 0x17); | ||
1489 | stv0900_write_reg(intp, R0900_P2_TNRADJ, 0x1f); | ||
1490 | stv0900_write_reg(intp, R0900_P2_TNRCTL2, 0x0); | ||
1491 | stv0900_write_bits(intp, F0900_P2_TUN_TYPE, 3); | ||
1492 | break; | ||
1493 | /* case FE_SW_TUNER: */ | ||
1494 | default: | ||
1495 | stv0900_write_bits(intp, F0900_P2_TUN_TYPE, 6); | ||
1496 | break; | ||
1497 | } | ||
1498 | |||
1499 | stv0900_write_bits(intp, F0900_P2_TUN_MADDRESS, p_init->tun2_maddress); | ||
1500 | switch (p_init->tuner2_adc) { | ||
1501 | case 1: | ||
1502 | stv0900_write_reg(intp, R0900_TSTTNR3, 0x26); | ||
1503 | break; | ||
1504 | default: | ||
1505 | break; | ||
1506 | } | ||
1507 | |||
1508 | stv0900_write_reg(intp, R0900_P2_TNRLD, 1); /* hw tuner */ | ||
1509 | |||
1510 | stv0900_write_bits(intp, F0900_P1_TUN_IQSWAP, p_init->tun1_iq_inv); | ||
1511 | stv0900_write_bits(intp, F0900_P2_TUN_IQSWAP, p_init->tun2_iq_inv); | ||
1512 | stv0900_set_mclk(intp, 135000000); | ||
1513 | msleep(3); | ||
1514 | |||
1515 | switch (intp->clkmode) { | ||
1516 | case 0: | ||
1517 | case 2: | ||
1518 | stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20 | intp->clkmode); | ||
1519 | break; | ||
1520 | default: | ||
1521 | selosci = 0x02 & stv0900_read_reg(intp, R0900_SYNTCTRL); | ||
1522 | stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20 | selosci); | ||
1523 | break; | ||
1524 | } | ||
1525 | msleep(3); | ||
1526 | |||
1527 | intp->mclk = stv0900_get_mclk_freq(intp, intp->quartz); | ||
1528 | if (intp->errs) | ||
1529 | error = STV0900_I2C_ERROR; | ||
1530 | |||
1504 | return error; | 1531 | return error; |
1505 | } | 1532 | } |
1506 | 1533 | ||
1507 | static int stv0900_status(struct stv0900_internal *i_params, | 1534 | static int stv0900_status(struct stv0900_internal *intp, |
1508 | enum fe_stv0900_demod_num demod) | 1535 | enum fe_stv0900_demod_num demod) |
1509 | { | 1536 | { |
1510 | enum fe_stv0900_search_state demod_state; | 1537 | enum fe_stv0900_search_state demod_state; |
1511 | s32 mode_field, delin_field, lock_field, fifo_field, lockedvit_field; | ||
1512 | int locked = FALSE; | 1538 | int locked = FALSE; |
1539 | u8 tsbitrate0_val, tsbitrate1_val; | ||
1540 | s32 bitrate; | ||
1513 | 1541 | ||
1514 | dmd_reg(mode_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); | 1542 | demod_state = stv0900_get_bits(intp, HEADER_MODE); |
1515 | dmd_reg(lock_field, F0900_P1_LOCK_DEFINITIF, F0900_P2_LOCK_DEFINITIF); | ||
1516 | dmd_reg(delin_field, F0900_P1_PKTDELIN_LOCK, F0900_P2_PKTDELIN_LOCK); | ||
1517 | dmd_reg(fifo_field, F0900_P1_TSFIFO_LINEOK, F0900_P2_TSFIFO_LINEOK); | ||
1518 | dmd_reg(lockedvit_field, F0900_P1_LOCKEDVIT, F0900_P2_LOCKEDVIT); | ||
1519 | |||
1520 | demod_state = stv0900_get_bits(i_params, mode_field); | ||
1521 | switch (demod_state) { | 1543 | switch (demod_state) { |
1522 | case STV0900_SEARCH: | 1544 | case STV0900_SEARCH: |
1523 | case STV0900_PLH_DETECTED: | 1545 | case STV0900_PLH_DETECTED: |
@@ -1525,17 +1547,30 @@ static int stv0900_status(struct stv0900_internal *i_params, | |||
1525 | locked = FALSE; | 1547 | locked = FALSE; |
1526 | break; | 1548 | break; |
1527 | case STV0900_DVBS2_FOUND: | 1549 | case STV0900_DVBS2_FOUND: |
1528 | locked = stv0900_get_bits(i_params, lock_field) && | 1550 | locked = stv0900_get_bits(intp, LOCK_DEFINITIF) && |
1529 | stv0900_get_bits(i_params, delin_field) && | 1551 | stv0900_get_bits(intp, PKTDELIN_LOCK) && |
1530 | stv0900_get_bits(i_params, fifo_field); | 1552 | stv0900_get_bits(intp, TSFIFO_LINEOK); |
1531 | break; | 1553 | break; |
1532 | case STV0900_DVBS_FOUND: | 1554 | case STV0900_DVBS_FOUND: |
1533 | locked = stv0900_get_bits(i_params, lock_field) && | 1555 | locked = stv0900_get_bits(intp, LOCK_DEFINITIF) && |
1534 | stv0900_get_bits(i_params, lockedvit_field) && | 1556 | stv0900_get_bits(intp, LOCKEDVIT) && |
1535 | stv0900_get_bits(i_params, fifo_field); | 1557 | stv0900_get_bits(intp, TSFIFO_LINEOK); |
1536 | break; | 1558 | break; |
1537 | } | 1559 | } |
1538 | 1560 | ||
1561 | dprintk("%s: locked = %d\n", __func__, locked); | ||
1562 | |||
1563 | if (stvdebug) { | ||
1564 | /* Print TS bitrate */ | ||
1565 | tsbitrate0_val = stv0900_read_reg(intp, TSBITRATE0); | ||
1566 | tsbitrate1_val = stv0900_read_reg(intp, TSBITRATE1); | ||
1567 | /* Formula Bit rate = Mclk * px_tsfifo_bitrate / 16384 */ | ||
1568 | bitrate = (stv0900_get_mclk_freq(intp, intp->quartz)/1000000) | ||
1569 | * (tsbitrate1_val << 8 | tsbitrate0_val); | ||
1570 | bitrate /= 16384; | ||
1571 | dprintk("TS bitrate = %d Mbit/sec \n", bitrate); | ||
1572 | }; | ||
1573 | |||
1539 | return locked; | 1574 | return locked; |
1540 | } | 1575 | } |
1541 | 1576 | ||
@@ -1543,7 +1578,8 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe, | |||
1543 | struct dvb_frontend_parameters *params) | 1578 | struct dvb_frontend_parameters *params) |
1544 | { | 1579 | { |
1545 | struct stv0900_state *state = fe->demodulator_priv; | 1580 | struct stv0900_state *state = fe->demodulator_priv; |
1546 | struct stv0900_internal *i_params = state->internal; | 1581 | struct stv0900_internal *intp = state->internal; |
1582 | enum fe_stv0900_demod_num demod = state->demod; | ||
1547 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | 1583 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
1548 | 1584 | ||
1549 | struct stv0900_search_params p_search; | 1585 | struct stv0900_search_params p_search; |
@@ -1551,10 +1587,16 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe, | |||
1551 | 1587 | ||
1552 | enum fe_stv0900_error error = STV0900_NO_ERROR; | 1588 | enum fe_stv0900_error error = STV0900_NO_ERROR; |
1553 | 1589 | ||
1554 | dprintk(KERN_INFO "%s: ", __func__); | 1590 | dprintk("%s: ", __func__); |
1591 | |||
1592 | if (!(INRANGE(100000, c->symbol_rate, 70000000))) | ||
1593 | return DVBFE_ALGO_SEARCH_FAILED; | ||
1594 | |||
1595 | if (state->config->set_ts_params) | ||
1596 | state->config->set_ts_params(fe, 0); | ||
1555 | 1597 | ||
1556 | p_result.locked = FALSE; | 1598 | p_result.locked = FALSE; |
1557 | p_search.path = state->demod; | 1599 | p_search.path = demod; |
1558 | p_search.frequency = c->frequency; | 1600 | p_search.frequency = c->frequency; |
1559 | p_search.symbol_rate = c->symbol_rate; | 1601 | p_search.symbol_rate = c->symbol_rate; |
1560 | p_search.search_range = 10000000; | 1602 | p_search.search_range = 10000000; |
@@ -1563,103 +1605,47 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe, | |||
1563 | p_search.iq_inversion = STV0900_IQ_AUTO; | 1605 | p_search.iq_inversion = STV0900_IQ_AUTO; |
1564 | p_search.search_algo = STV0900_BLIND_SEARCH; | 1606 | p_search.search_algo = STV0900_BLIND_SEARCH; |
1565 | 1607 | ||
1566 | if ((INRANGE(100000, p_search.symbol_rate, 70000000)) && | 1608 | intp->srch_standard[demod] = p_search.standard; |
1567 | (INRANGE(100000, p_search.search_range, 50000000))) { | 1609 | intp->symbol_rate[demod] = p_search.symbol_rate; |
1568 | switch (p_search.path) { | 1610 | intp->srch_range[demod] = p_search.search_range; |
1569 | case STV0900_DEMOD_1: | 1611 | intp->freq[demod] = p_search.frequency; |
1570 | default: | 1612 | intp->srch_algo[demod] = p_search.search_algo; |
1571 | i_params->dmd1_srch_standard = p_search.standard; | 1613 | intp->srch_iq_inv[demod] = p_search.iq_inversion; |
1572 | i_params->dmd1_symbol_rate = p_search.symbol_rate; | 1614 | intp->fec[demod] = p_search.fec; |
1573 | i_params->dmd1_srch_range = p_search.search_range; | 1615 | if ((stv0900_algo(fe) == STV0900_RANGEOK) && |
1574 | i_params->tuner1_freq = p_search.frequency; | 1616 | (intp->errs == STV0900_NO_ERROR)) { |
1575 | i_params->dmd1_srch_algo = p_search.search_algo; | 1617 | p_result.locked = intp->result[demod].locked; |
1576 | i_params->dmd1_srch_iq_inv = p_search.iq_inversion; | 1618 | p_result.standard = intp->result[demod].standard; |
1577 | i_params->dmd1_fec = p_search.fec; | 1619 | p_result.frequency = intp->result[demod].frequency; |
1620 | p_result.symbol_rate = intp->result[demod].symbol_rate; | ||
1621 | p_result.fec = intp->result[demod].fec; | ||
1622 | p_result.modcode = intp->result[demod].modcode; | ||
1623 | p_result.pilot = intp->result[demod].pilot; | ||
1624 | p_result.frame_len = intp->result[demod].frame_len; | ||
1625 | p_result.spectrum = intp->result[demod].spectrum; | ||
1626 | p_result.rolloff = intp->result[demod].rolloff; | ||
1627 | p_result.modulation = intp->result[demod].modulation; | ||
1628 | } else { | ||
1629 | p_result.locked = FALSE; | ||
1630 | switch (intp->err[demod]) { | ||
1631 | case STV0900_I2C_ERROR: | ||
1632 | error = STV0900_I2C_ERROR; | ||
1578 | break; | 1633 | break; |
1579 | 1634 | case STV0900_NO_ERROR: | |
1580 | case STV0900_DEMOD_2: | 1635 | default: |
1581 | i_params->dmd2_srch_stndrd = p_search.standard; | 1636 | error = STV0900_SEARCH_FAILED; |
1582 | i_params->dmd2_symbol_rate = p_search.symbol_rate; | ||
1583 | i_params->dmd2_srch_range = p_search.search_range; | ||
1584 | i_params->tuner2_freq = p_search.frequency; | ||
1585 | i_params->dmd2_srch_algo = p_search.search_algo; | ||
1586 | i_params->dmd2_srch_iq_inv = p_search.iq_inversion; | ||
1587 | i_params->dmd2_fec = p_search.fec; | ||
1588 | break; | 1637 | break; |
1589 | } | 1638 | } |
1590 | 1639 | } | |
1591 | if ((stv0900_algo(fe) == STV0900_RANGEOK) && | ||
1592 | (i_params->errs == STV0900_NO_ERROR)) { | ||
1593 | switch (p_search.path) { | ||
1594 | case STV0900_DEMOD_1: | ||
1595 | default: | ||
1596 | p_result.locked = i_params->dmd1_rslts.locked; | ||
1597 | p_result.standard = i_params->dmd1_rslts.standard; | ||
1598 | p_result.frequency = i_params->dmd1_rslts.frequency; | ||
1599 | p_result.symbol_rate = i_params->dmd1_rslts.symbol_rate; | ||
1600 | p_result.fec = i_params->dmd1_rslts.fec; | ||
1601 | p_result.modcode = i_params->dmd1_rslts.modcode; | ||
1602 | p_result.pilot = i_params->dmd1_rslts.pilot; | ||
1603 | p_result.frame_length = i_params->dmd1_rslts.frame_length; | ||
1604 | p_result.spectrum = i_params->dmd1_rslts.spectrum; | ||
1605 | p_result.rolloff = i_params->dmd1_rslts.rolloff; | ||
1606 | p_result.modulation = i_params->dmd1_rslts.modulation; | ||
1607 | break; | ||
1608 | case STV0900_DEMOD_2: | ||
1609 | p_result.locked = i_params->dmd2_rslts.locked; | ||
1610 | p_result.standard = i_params->dmd2_rslts.standard; | ||
1611 | p_result.frequency = i_params->dmd2_rslts.frequency; | ||
1612 | p_result.symbol_rate = i_params->dmd2_rslts.symbol_rate; | ||
1613 | p_result.fec = i_params->dmd2_rslts.fec; | ||
1614 | p_result.modcode = i_params->dmd2_rslts.modcode; | ||
1615 | p_result.pilot = i_params->dmd2_rslts.pilot; | ||
1616 | p_result.frame_length = i_params->dmd2_rslts.frame_length; | ||
1617 | p_result.spectrum = i_params->dmd2_rslts.spectrum; | ||
1618 | p_result.rolloff = i_params->dmd2_rslts.rolloff; | ||
1619 | p_result.modulation = i_params->dmd2_rslts.modulation; | ||
1620 | break; | ||
1621 | } | ||
1622 | |||
1623 | } else { | ||
1624 | p_result.locked = FALSE; | ||
1625 | switch (p_search.path) { | ||
1626 | case STV0900_DEMOD_1: | ||
1627 | switch (i_params->dmd1_err) { | ||
1628 | case STV0900_I2C_ERROR: | ||
1629 | error = STV0900_I2C_ERROR; | ||
1630 | break; | ||
1631 | case STV0900_NO_ERROR: | ||
1632 | default: | ||
1633 | error = STV0900_SEARCH_FAILED; | ||
1634 | break; | ||
1635 | } | ||
1636 | break; | ||
1637 | case STV0900_DEMOD_2: | ||
1638 | switch (i_params->dmd2_err) { | ||
1639 | case STV0900_I2C_ERROR: | ||
1640 | error = STV0900_I2C_ERROR; | ||
1641 | break; | ||
1642 | case STV0900_NO_ERROR: | ||
1643 | default: | ||
1644 | error = STV0900_SEARCH_FAILED; | ||
1645 | break; | ||
1646 | } | ||
1647 | break; | ||
1648 | } | ||
1649 | } | ||
1650 | |||
1651 | } else | ||
1652 | error = STV0900_BAD_PARAMETER; | ||
1653 | 1640 | ||
1654 | if ((p_result.locked == TRUE) && (error == STV0900_NO_ERROR)) { | 1641 | if ((p_result.locked == TRUE) && (error == STV0900_NO_ERROR)) { |
1655 | dprintk(KERN_INFO "Search Success\n"); | 1642 | dprintk("Search Success\n"); |
1656 | return DVBFE_ALGO_SEARCH_SUCCESS; | 1643 | return DVBFE_ALGO_SEARCH_SUCCESS; |
1657 | } else { | 1644 | } else { |
1658 | dprintk(KERN_INFO "Search Fail\n"); | 1645 | dprintk("Search Fail\n"); |
1659 | return DVBFE_ALGO_SEARCH_FAILED; | 1646 | return DVBFE_ALGO_SEARCH_FAILED; |
1660 | } | 1647 | } |
1661 | 1648 | ||
1662 | return DVBFE_ALGO_SEARCH_ERROR; | ||
1663 | } | 1649 | } |
1664 | 1650 | ||
1665 | static int stv0900_read_status(struct dvb_frontend *fe, enum fe_status *status) | 1651 | static int stv0900_read_status(struct dvb_frontend *fe, enum fe_status *status) |
@@ -1690,16 +1676,13 @@ static int stv0900_stop_ts(struct dvb_frontend *fe, int stop_ts) | |||
1690 | { | 1676 | { |
1691 | 1677 | ||
1692 | struct stv0900_state *state = fe->demodulator_priv; | 1678 | struct stv0900_state *state = fe->demodulator_priv; |
1693 | struct stv0900_internal *i_params = state->internal; | 1679 | struct stv0900_internal *intp = state->internal; |
1694 | enum fe_stv0900_demod_num demod = state->demod; | 1680 | enum fe_stv0900_demod_num demod = state->demod; |
1695 | s32 rst_field; | ||
1696 | |||
1697 | dmd_reg(rst_field, F0900_P1_RST_HWARE, F0900_P2_RST_HWARE); | ||
1698 | 1681 | ||
1699 | if (stop_ts == TRUE) | 1682 | if (stop_ts == TRUE) |
1700 | stv0900_write_bits(i_params, rst_field, 1); | 1683 | stv0900_write_bits(intp, RST_HWARE, 1); |
1701 | else | 1684 | else |
1702 | stv0900_write_bits(i_params, rst_field, 0); | 1685 | stv0900_write_bits(intp, RST_HWARE, 0); |
1703 | 1686 | ||
1704 | return 0; | 1687 | return 0; |
1705 | } | 1688 | } |
@@ -1707,23 +1690,19 @@ static int stv0900_stop_ts(struct dvb_frontend *fe, int stop_ts) | |||
1707 | static int stv0900_diseqc_init(struct dvb_frontend *fe) | 1690 | static int stv0900_diseqc_init(struct dvb_frontend *fe) |
1708 | { | 1691 | { |
1709 | struct stv0900_state *state = fe->demodulator_priv; | 1692 | struct stv0900_state *state = fe->demodulator_priv; |
1710 | struct stv0900_internal *i_params = state->internal; | 1693 | struct stv0900_internal *intp = state->internal; |
1711 | enum fe_stv0900_demod_num demod = state->demod; | 1694 | enum fe_stv0900_demod_num demod = state->demod; |
1712 | s32 mode_field, reset_field; | ||
1713 | 1695 | ||
1714 | dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); | 1696 | stv0900_write_bits(intp, DISTX_MODE, state->config->diseqc_mode); |
1715 | dmd_reg(reset_field, F0900_P1_DISEQC_RESET, F0900_P2_DISEQC_RESET); | 1697 | stv0900_write_bits(intp, DISEQC_RESET, 1); |
1716 | 1698 | stv0900_write_bits(intp, DISEQC_RESET, 0); | |
1717 | stv0900_write_bits(i_params, mode_field, state->config->diseqc_mode); | ||
1718 | stv0900_write_bits(i_params, reset_field, 1); | ||
1719 | stv0900_write_bits(i_params, reset_field, 0); | ||
1720 | 1699 | ||
1721 | return 0; | 1700 | return 0; |
1722 | } | 1701 | } |
1723 | 1702 | ||
1724 | static int stv0900_init(struct dvb_frontend *fe) | 1703 | static int stv0900_init(struct dvb_frontend *fe) |
1725 | { | 1704 | { |
1726 | dprintk(KERN_INFO "%s\n", __func__); | 1705 | dprintk("%s\n", __func__); |
1727 | 1706 | ||
1728 | stv0900_stop_ts(fe, 1); | 1707 | stv0900_stop_ts(fe, 1); |
1729 | stv0900_diseqc_init(fe); | 1708 | stv0900_diseqc_init(fe); |
@@ -1731,48 +1710,24 @@ static int stv0900_init(struct dvb_frontend *fe) | |||
1731 | return 0; | 1710 | return 0; |
1732 | } | 1711 | } |
1733 | 1712 | ||
1734 | static int stv0900_diseqc_send(struct stv0900_internal *i_params , u8 *Data, | 1713 | static int stv0900_diseqc_send(struct stv0900_internal *intp , u8 *data, |
1735 | u32 NbData, enum fe_stv0900_demod_num demod) | 1714 | u32 NbData, enum fe_stv0900_demod_num demod) |
1736 | { | 1715 | { |
1737 | s32 i = 0; | 1716 | s32 i = 0; |
1738 | 1717 | ||
1739 | switch (demod) { | 1718 | stv0900_write_bits(intp, DIS_PRECHARGE, 1); |
1740 | case STV0900_DEMOD_1: | 1719 | while (i < NbData) { |
1741 | default: | 1720 | while (stv0900_get_bits(intp, FIFO_FULL)) |
1742 | stv0900_write_bits(i_params, F0900_P1_DIS_PRECHARGE, 1); | 1721 | ;/* checkpatch complains */ |
1743 | while (i < NbData) { | 1722 | stv0900_write_reg(intp, DISTXDATA, data[i]); |
1744 | while (stv0900_get_bits(i_params, F0900_P1_FIFO_FULL)) | 1723 | i++; |
1745 | ;/* checkpatch complains */ | 1724 | } |
1746 | stv0900_write_reg(i_params, R0900_P1_DISTXDATA, Data[i]); | ||
1747 | i++; | ||
1748 | } | ||
1749 | |||
1750 | stv0900_write_bits(i_params, F0900_P1_DIS_PRECHARGE, 0); | ||
1751 | i = 0; | ||
1752 | while ((stv0900_get_bits(i_params, F0900_P1_TX_IDLE) != 1) && (i < 10)) { | ||
1753 | msleep(10); | ||
1754 | i++; | ||
1755 | } | ||
1756 | |||
1757 | break; | ||
1758 | case STV0900_DEMOD_2: | ||
1759 | stv0900_write_bits(i_params, F0900_P2_DIS_PRECHARGE, 1); | ||
1760 | |||
1761 | while (i < NbData) { | ||
1762 | while (stv0900_get_bits(i_params, F0900_P2_FIFO_FULL)) | ||
1763 | ;/* checkpatch complains */ | ||
1764 | stv0900_write_reg(i_params, R0900_P2_DISTXDATA, Data[i]); | ||
1765 | i++; | ||
1766 | } | ||
1767 | |||
1768 | stv0900_write_bits(i_params, F0900_P2_DIS_PRECHARGE, 0); | ||
1769 | i = 0; | ||
1770 | while ((stv0900_get_bits(i_params, F0900_P2_TX_IDLE) != 1) && (i < 10)) { | ||
1771 | msleep(10); | ||
1772 | i++; | ||
1773 | } | ||
1774 | 1725 | ||
1775 | break; | 1726 | stv0900_write_bits(intp, DIS_PRECHARGE, 0); |
1727 | i = 0; | ||
1728 | while ((stv0900_get_bits(intp, TX_IDLE) != 1) && (i < 10)) { | ||
1729 | msleep(10); | ||
1730 | i++; | ||
1776 | } | 1731 | } |
1777 | 1732 | ||
1778 | return 0; | 1733 | return 0; |
@@ -1792,22 +1747,21 @@ static int stv0900_send_master_cmd(struct dvb_frontend *fe, | |||
1792 | static int stv0900_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) | 1747 | static int stv0900_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) |
1793 | { | 1748 | { |
1794 | struct stv0900_state *state = fe->demodulator_priv; | 1749 | struct stv0900_state *state = fe->demodulator_priv; |
1795 | struct stv0900_internal *i_params = state->internal; | 1750 | struct stv0900_internal *intp = state->internal; |
1796 | enum fe_stv0900_demod_num demod = state->demod; | 1751 | enum fe_stv0900_demod_num demod = state->demod; |
1797 | s32 mode_field; | 1752 | u8 data; |
1798 | u32 diseqc_fifo; | ||
1799 | 1753 | ||
1800 | dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); | ||
1801 | dmd_reg(diseqc_fifo, R0900_P1_DISTXDATA, R0900_P2_DISTXDATA); | ||
1802 | 1754 | ||
1803 | switch (burst) { | 1755 | switch (burst) { |
1804 | case SEC_MINI_A: | 1756 | case SEC_MINI_A: |
1805 | stv0900_write_bits(i_params, mode_field, 3);/* Unmodulated */ | 1757 | stv0900_write_bits(intp, DISTX_MODE, 3);/* Unmodulated */ |
1806 | stv0900_write_reg(i_params, diseqc_fifo, 0x00); | 1758 | data = 0x00; |
1759 | stv0900_diseqc_send(intp, &data, 1, state->demod); | ||
1807 | break; | 1760 | break; |
1808 | case SEC_MINI_B: | 1761 | case SEC_MINI_B: |
1809 | stv0900_write_bits(i_params, mode_field, 2);/* Modulated */ | 1762 | stv0900_write_bits(intp, DISTX_MODE, 2);/* Modulated */ |
1810 | stv0900_write_reg(i_params, diseqc_fifo, 0xff); | 1763 | data = 0xff; |
1764 | stv0900_diseqc_send(intp, &data, 1, state->demod); | ||
1811 | break; | 1765 | break; |
1812 | } | 1766 | } |
1813 | 1767 | ||
@@ -1818,68 +1772,54 @@ static int stv0900_recv_slave_reply(struct dvb_frontend *fe, | |||
1818 | struct dvb_diseqc_slave_reply *reply) | 1772 | struct dvb_diseqc_slave_reply *reply) |
1819 | { | 1773 | { |
1820 | struct stv0900_state *state = fe->demodulator_priv; | 1774 | struct stv0900_state *state = fe->demodulator_priv; |
1821 | struct stv0900_internal *i_params = state->internal; | 1775 | struct stv0900_internal *intp = state->internal; |
1776 | enum fe_stv0900_demod_num demod = state->demod; | ||
1822 | s32 i = 0; | 1777 | s32 i = 0; |
1823 | 1778 | ||
1824 | switch (state->demod) { | 1779 | reply->msg_len = 0; |
1825 | case STV0900_DEMOD_1: | ||
1826 | default: | ||
1827 | reply->msg_len = 0; | ||
1828 | |||
1829 | while ((stv0900_get_bits(i_params, F0900_P1_RX_END) != 1) && (i < 10)) { | ||
1830 | msleep(10); | ||
1831 | i++; | ||
1832 | } | ||
1833 | |||
1834 | if (stv0900_get_bits(i_params, F0900_P1_RX_END)) { | ||
1835 | reply->msg_len = stv0900_get_bits(i_params, F0900_P1_FIFO_BYTENBR); | ||
1836 | |||
1837 | for (i = 0; i < reply->msg_len; i++) | ||
1838 | reply->msg[i] = stv0900_read_reg(i_params, R0900_P1_DISRXDATA); | ||
1839 | } | ||
1840 | break; | ||
1841 | case STV0900_DEMOD_2: | ||
1842 | reply->msg_len = 0; | ||
1843 | 1780 | ||
1844 | while ((stv0900_get_bits(i_params, F0900_P2_RX_END) != 1) && (i < 10)) { | 1781 | while ((stv0900_get_bits(intp, RX_END) != 1) && (i < 10)) { |
1845 | msleep(10); | 1782 | msleep(10); |
1846 | i++; | 1783 | i++; |
1847 | } | 1784 | } |
1848 | 1785 | ||
1849 | if (stv0900_get_bits(i_params, F0900_P2_RX_END)) { | 1786 | if (stv0900_get_bits(intp, RX_END)) { |
1850 | reply->msg_len = stv0900_get_bits(i_params, F0900_P2_FIFO_BYTENBR); | 1787 | reply->msg_len = stv0900_get_bits(intp, FIFO_BYTENBR); |
1851 | 1788 | ||
1852 | for (i = 0; i < reply->msg_len; i++) | 1789 | for (i = 0; i < reply->msg_len; i++) |
1853 | reply->msg[i] = stv0900_read_reg(i_params, R0900_P2_DISRXDATA); | 1790 | reply->msg[i] = stv0900_read_reg(intp, DISRXDATA); |
1854 | } | ||
1855 | break; | ||
1856 | } | 1791 | } |
1857 | 1792 | ||
1858 | return 0; | 1793 | return 0; |
1859 | } | 1794 | } |
1860 | 1795 | ||
1861 | static int stv0900_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | 1796 | static int stv0900_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t toneoff) |
1862 | { | 1797 | { |
1863 | struct stv0900_state *state = fe->demodulator_priv; | 1798 | struct stv0900_state *state = fe->demodulator_priv; |
1864 | struct stv0900_internal *i_params = state->internal; | 1799 | struct stv0900_internal *intp = state->internal; |
1865 | enum fe_stv0900_demod_num demod = state->demod; | 1800 | enum fe_stv0900_demod_num demod = state->demod; |
1866 | s32 mode_field, reset_field; | ||
1867 | |||
1868 | dprintk(KERN_INFO "%s: %s\n", __func__, ((tone == 0) ? "Off" : "On")); | ||
1869 | 1801 | ||
1870 | dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); | 1802 | dprintk("%s: %s\n", __func__, ((toneoff == 0) ? "On" : "Off")); |
1871 | dmd_reg(reset_field, F0900_P1_DISEQC_RESET, F0900_P2_DISEQC_RESET); | ||
1872 | 1803 | ||
1873 | if (tone) { | 1804 | switch (toneoff) { |
1874 | /*Set the DiseqC mode to 22Khz continues tone*/ | 1805 | case SEC_TONE_ON: |
1875 | stv0900_write_bits(i_params, mode_field, 0); | 1806 | /*Set the DiseqC mode to 22Khz _continues_ tone*/ |
1876 | stv0900_write_bits(i_params, reset_field, 1); | 1807 | stv0900_write_bits(intp, DISTX_MODE, 0); |
1808 | stv0900_write_bits(intp, DISEQC_RESET, 1); | ||
1877 | /*release DiseqC reset to enable the 22KHz tone*/ | 1809 | /*release DiseqC reset to enable the 22KHz tone*/ |
1878 | stv0900_write_bits(i_params, reset_field, 0); | 1810 | stv0900_write_bits(intp, DISEQC_RESET, 0); |
1879 | } else { | 1811 | break; |
1880 | stv0900_write_bits(i_params, mode_field, 0); | 1812 | case SEC_TONE_OFF: |
1813 | /*return diseqc mode to config->diseqc_mode. | ||
1814 | Usually it's without _continues_ tone */ | ||
1815 | stv0900_write_bits(intp, DISTX_MODE, | ||
1816 | state->config->diseqc_mode); | ||
1881 | /*maintain the DiseqC reset to disable the 22KHz tone*/ | 1817 | /*maintain the DiseqC reset to disable the 22KHz tone*/ |
1882 | stv0900_write_bits(i_params, reset_field, 1); | 1818 | stv0900_write_bits(intp, DISEQC_RESET, 1); |
1819 | stv0900_write_bits(intp, DISEQC_RESET, 0); | ||
1820 | break; | ||
1821 | default: | ||
1822 | return -EINVAL; | ||
1883 | } | 1823 | } |
1884 | 1824 | ||
1885 | return 0; | 1825 | return 0; |
@@ -1889,11 +1829,11 @@ static void stv0900_release(struct dvb_frontend *fe) | |||
1889 | { | 1829 | { |
1890 | struct stv0900_state *state = fe->demodulator_priv; | 1830 | struct stv0900_state *state = fe->demodulator_priv; |
1891 | 1831 | ||
1892 | dprintk(KERN_INFO "%s\n", __func__); | 1832 | dprintk("%s\n", __func__); |
1893 | 1833 | ||
1894 | if ((--(state->internal->dmds_used)) <= 0) { | 1834 | if ((--(state->internal->dmds_used)) <= 0) { |
1895 | 1835 | ||
1896 | dprintk(KERN_INFO "%s: Actually removing\n", __func__); | 1836 | dprintk("%s: Actually removing\n", __func__); |
1897 | 1837 | ||
1898 | remove_inode(state->internal); | 1838 | remove_inode(state->internal); |
1899 | kfree(state->internal); | 1839 | kfree(state->internal); |
@@ -1963,17 +1903,19 @@ struct dvb_frontend *stv0900_attach(const struct stv0900_config *config, | |||
1963 | case 0: | 1903 | case 0: |
1964 | case 1: | 1904 | case 1: |
1965 | init_params.dmd_ref_clk = config->xtal; | 1905 | init_params.dmd_ref_clk = config->xtal; |
1966 | init_params.demod_mode = STV0900_DUAL; | 1906 | init_params.demod_mode = config->demod_mode; |
1967 | init_params.rolloff = STV0900_35; | 1907 | init_params.rolloff = STV0900_35; |
1968 | init_params.path1_ts_clock = config->path1_mode; | 1908 | init_params.path1_ts_clock = config->path1_mode; |
1969 | init_params.tun1_maddress = config->tun1_maddress; | 1909 | init_params.tun1_maddress = config->tun1_maddress; |
1970 | init_params.tun1_iq_inversion = STV0900_IQ_NORMAL; | 1910 | init_params.tun1_iq_inv = STV0900_IQ_NORMAL; |
1971 | init_params.tuner1_adc = config->tun1_adc; | 1911 | init_params.tuner1_adc = config->tun1_adc; |
1912 | init_params.tuner1_type = config->tun1_type; | ||
1972 | init_params.path2_ts_clock = config->path2_mode; | 1913 | init_params.path2_ts_clock = config->path2_mode; |
1973 | init_params.ts_config = config->ts_config_regs; | 1914 | init_params.ts_config = config->ts_config_regs; |
1974 | init_params.tun2_maddress = config->tun2_maddress; | 1915 | init_params.tun2_maddress = config->tun2_maddress; |
1975 | init_params.tuner2_adc = config->tun2_adc; | 1916 | init_params.tuner2_adc = config->tun2_adc; |
1976 | init_params.tun2_iq_inversion = STV0900_IQ_SWAPPED; | 1917 | init_params.tuner2_type = config->tun2_type; |
1918 | init_params.tun2_iq_inv = STV0900_IQ_SWAPPED; | ||
1977 | 1919 | ||
1978 | err_stv0900 = stv0900_init_internal(&state->frontend, | 1920 | err_stv0900 = stv0900_init_internal(&state->frontend, |
1979 | &init_params); | 1921 | &init_params); |
diff --git a/drivers/media/dvb/frontends/stv0900_init.h b/drivers/media/dvb/frontends/stv0900_init.h index ff388b47a4e3..b684df9995d8 100644 --- a/drivers/media/dvb/frontends/stv0900_init.h +++ b/drivers/media/dvb/frontends/stv0900_init.h | |||
@@ -141,85 +141,228 @@ struct stv0900_short_frames_car_loop_optim { | |||
141 | 141 | ||
142 | }; | 142 | }; |
143 | 143 | ||
144 | struct stv0900_short_frames_car_loop_optim_vs_mod { | ||
145 | enum fe_stv0900_modulation modulation; | ||
146 | u8 car_loop_2; /* SR<3msps */ | ||
147 | u8 car_loop_5; /* 3<SR<=7msps */ | ||
148 | u8 car_loop_10; /* 7<SR<=15msps */ | ||
149 | u8 car_loop_20; /* 10<SR<=25msps */ | ||
150 | u8 car_loop_30; /* 10<SR<=45msps */ | ||
151 | }; | ||
152 | |||
144 | /* Cut 1.x Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */ | 153 | /* Cut 1.x Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */ |
145 | static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoop[14] = { | 154 | static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoop[14] = { |
146 | /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | 155 | /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon |
147 | { STV0900_QPSK_12, 0x1C, 0x0D, 0x1B, 0x2C, 0x3A, 0x1C, 0x2A, 0x3B, 0x2A, 0x1B }, | 156 | 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ |
148 | { STV0900_QPSK_35, 0x2C, 0x0D, 0x2B, 0x2C, 0x3A, 0x0C, 0x3A, 0x2B, 0x2A, 0x0B }, | 157 | { STV0900_QPSK_12, 0x1C, 0x0D, 0x1B, 0x2C, 0x3A, |
149 | { STV0900_QPSK_23, 0x2C, 0x0D, 0x2B, 0x2C, 0x0B, 0x0C, 0x3A, 0x1B, 0x2A, 0x3A }, | 158 | 0x1C, 0x2A, 0x3B, 0x2A, 0x1B }, |
150 | { STV0900_QPSK_34, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, | 159 | { STV0900_QPSK_35, 0x2C, 0x0D, 0x2B, 0x2C, 0x3A, |
151 | { STV0900_QPSK_45, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, | 160 | 0x0C, 0x3A, 0x2B, 0x2A, 0x0B }, |
152 | { STV0900_QPSK_56, 0x0D, 0x0D, 0x3B, 0x1C, 0x0B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, | 161 | { STV0900_QPSK_23, 0x2C, 0x0D, 0x2B, 0x2C, 0x0B, |
153 | { STV0900_QPSK_89, 0x0D, 0x0D, 0x3B, 0x1C, 0x1B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, | 162 | 0x0C, 0x3A, 0x1B, 0x2A, 0x3A }, |
154 | { STV0900_QPSK_910, 0x1D, 0x0D, 0x3B, 0x1C, 0x1B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, | 163 | { STV0900_QPSK_34, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B, |
155 | { STV0900_8PSK_35, 0x29, 0x3B, 0x09, 0x2B, 0x38, 0x0B, 0x18, 0x1A, 0x08, 0x0A }, | 164 | 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, |
156 | { STV0900_8PSK_23, 0x0A, 0x3B, 0x29, 0x2B, 0x19, 0x0B, 0x38, 0x1A, 0x18, 0x0A }, | 165 | { STV0900_QPSK_45, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B, |
157 | { STV0900_8PSK_34, 0x3A, 0x3B, 0x2A, 0x2B, 0x39, 0x0B, 0x19, 0x1A, 0x38, 0x0A }, | 166 | 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, |
158 | { STV0900_8PSK_56, 0x1B, 0x3B, 0x0B, 0x2B, 0x1A, 0x0B, 0x39, 0x1A, 0x19, 0x0A }, | 167 | { STV0900_QPSK_56, 0x0D, 0x0D, 0x3B, 0x1C, 0x0B, |
159 | { STV0900_8PSK_89, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A, 0x0B, 0x39, 0x1A, 0x29, 0x39 }, | 168 | 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, |
160 | { STV0900_8PSK_910, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A, 0x0B, 0x39, 0x1A, 0x29, 0x39 } | 169 | { STV0900_QPSK_89, 0x0D, 0x0D, 0x3B, 0x1C, 0x1B, |
170 | 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, | ||
171 | { STV0900_QPSK_910, 0x1D, 0x0D, 0x3B, 0x1C, 0x1B, | ||
172 | 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, | ||
173 | { STV0900_8PSK_35, 0x29, 0x3B, 0x09, 0x2B, 0x38, | ||
174 | 0x0B, 0x18, 0x1A, 0x08, 0x0A }, | ||
175 | { STV0900_8PSK_23, 0x0A, 0x3B, 0x29, 0x2B, 0x19, | ||
176 | 0x0B, 0x38, 0x1A, 0x18, 0x0A }, | ||
177 | { STV0900_8PSK_34, 0x3A, 0x3B, 0x2A, 0x2B, 0x39, | ||
178 | 0x0B, 0x19, 0x1A, 0x38, 0x0A }, | ||
179 | { STV0900_8PSK_56, 0x1B, 0x3B, 0x0B, 0x2B, 0x1A, | ||
180 | 0x0B, 0x39, 0x1A, 0x19, 0x0A }, | ||
181 | { STV0900_8PSK_89, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A, | ||
182 | 0x0B, 0x39, 0x1A, 0x29, 0x39 }, | ||
183 | { STV0900_8PSK_910, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A, | ||
184 | 0x0B, 0x39, 0x1A, 0x29, 0x39 } | ||
161 | }; | 185 | }; |
162 | 186 | ||
163 | 187 | ||
164 | /* Cut 2.0 Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */ | 188 | /* Cut 2.0 Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */ |
165 | static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoopCut20[14] = { | 189 | static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoopCut20[14] = { |
166 | /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | 190 | /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon |
167 | { STV0900_QPSK_12, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D, 0x1F, 0x3D, 0x3E, 0x3D, 0x1E }, | 191 | 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ |
168 | { STV0900_QPSK_35, 0x2F, 0x3F, 0x2E, 0x2F, 0x3D, 0x0F, 0x0E, 0x2E, 0x3D, 0x0E }, | 192 | { STV0900_QPSK_12, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D, |
169 | { STV0900_QPSK_23, 0x2F, 0x3F, 0x2E, 0x2F, 0x0E, 0x0F, 0x0E, 0x1E, 0x3D, 0x3D }, | 193 | 0x1F, 0x3D, 0x3E, 0x3D, 0x1E }, |
170 | { STV0900_QPSK_34, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, | 194 | { STV0900_QPSK_35, 0x2F, 0x3F, 0x2E, 0x2F, 0x3D, |
171 | { STV0900_QPSK_45, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, | 195 | 0x0F, 0x0E, 0x2E, 0x3D, 0x0E }, |
172 | { STV0900_QPSK_56, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, | 196 | { STV0900_QPSK_23, 0x2F, 0x3F, 0x2E, 0x2F, 0x0E, |
173 | { STV0900_QPSK_89, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, | 197 | 0x0F, 0x0E, 0x1E, 0x3D, 0x3D }, |
174 | { STV0900_QPSK_910, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, | 198 | { STV0900_QPSK_34, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, |
175 | { STV0900_8PSK_35, 0x3c, 0x0c, 0x1c, 0x3b, 0x0c, 0x3b, 0x2b, 0x2b, 0x1b, 0x2b }, | 199 | 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, |
176 | { STV0900_8PSK_23, 0x1d, 0x0c, 0x3c, 0x0c, 0x2c, 0x3b, 0x0c, 0x2b, 0x2b, 0x2b }, | 200 | { STV0900_QPSK_45, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, |
177 | { STV0900_8PSK_34, 0x0e, 0x1c, 0x3d, 0x0c, 0x0d, 0x3b, 0x2c, 0x3b, 0x0c, 0x2b }, | 201 | 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, |
178 | { STV0900_8PSK_56, 0x2e, 0x3e, 0x1e, 0x2e, 0x2d, 0x1e, 0x3c, 0x2d, 0x2c, 0x1d }, | 202 | { STV0900_QPSK_56, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, |
179 | { STV0900_8PSK_89, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, 0x1e, 0x0d, 0x2d, 0x3c, 0x1d }, | 203 | 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, |
180 | { STV0900_8PSK_910, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, 0x1e, 0x1d, 0x2d, 0x0d, 0x1d } | 204 | { STV0900_QPSK_89, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E, |
205 | 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, | ||
206 | { STV0900_QPSK_910, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E, | ||
207 | 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, | ||
208 | { STV0900_8PSK_35, 0x3c, 0x0c, 0x1c, 0x3b, 0x0c, | ||
209 | 0x3b, 0x2b, 0x2b, 0x1b, 0x2b }, | ||
210 | { STV0900_8PSK_23, 0x1d, 0x0c, 0x3c, 0x0c, 0x2c, | ||
211 | 0x3b, 0x0c, 0x2b, 0x2b, 0x2b }, | ||
212 | { STV0900_8PSK_34, 0x0e, 0x1c, 0x3d, 0x0c, 0x0d, | ||
213 | 0x3b, 0x2c, 0x3b, 0x0c, 0x2b }, | ||
214 | { STV0900_8PSK_56, 0x2e, 0x3e, 0x1e, 0x2e, 0x2d, | ||
215 | 0x1e, 0x3c, 0x2d, 0x2c, 0x1d }, | ||
216 | { STV0900_8PSK_89, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, | ||
217 | 0x1e, 0x0d, 0x2d, 0x3c, 0x1d }, | ||
218 | { STV0900_8PSK_910, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, | ||
219 | 0x1e, 0x1d, 0x2d, 0x0d, 0x1d }, | ||
181 | }; | 220 | }; |
182 | 221 | ||
183 | 222 | ||
184 | 223 | ||
185 | /* Cut 2.0 Tracking carrier loop carrier 16APSK 2/3 to 32APSK 9/10 long Frame */ | 224 | /* Cut 2.0 Tracking carrier loop carrier 16APSK 2/3 to 32APSK 9/10 long Frame */ |
186 | static const struct stv0900_car_loop_optim FE_STV0900_S2APSKCarLoopCut20[11] = { | 225 | static const struct stv0900_car_loop_optim FE_STV0900_S2APSKCarLoopCut20[11] = { |
187 | /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | 226 | /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon |
188 | { STV0900_16APSK_23, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x0C, 0x3C, 0x0C, 0x2C, 0x0C }, | 227 | 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ |
189 | { STV0900_16APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, 0x0C, 0x2D, 0x0C, 0x1D, 0x0C }, | 228 | { STV0900_16APSK_23, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, |
190 | { STV0900_16APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x0C, 0x3D, 0x0C, 0x2D, 0x0C }, | 229 | 0x0C, 0x3C, 0x0C, 0x2C, 0x0C }, |
191 | { STV0900_16APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x0C, 0x3D, 0x0C, 0x2D, 0x0C }, | 230 | { STV0900_16APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, |
192 | { STV0900_16APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E, 0x0C, 0x0E, 0x0C, 0x3D, 0x0C }, | 231 | 0x0C, 0x2D, 0x0C, 0x1D, 0x0C }, |
193 | { STV0900_16APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E, 0x0C, 0x0E, 0x0C, 0x3D, 0x0C }, | 232 | { STV0900_16APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, |
194 | { STV0900_32APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | 233 | 0x0C, 0x3D, 0x0C, 0x2D, 0x0C }, |
195 | { STV0900_32APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | 234 | { STV0900_16APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, |
196 | { STV0900_32APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | 235 | 0x0C, 0x3D, 0x0C, 0x2D, 0x0C }, |
197 | { STV0900_32APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | 236 | { STV0900_16APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E, |
198 | { STV0900_32APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C } | 237 | 0x0C, 0x0E, 0x0C, 0x3D, 0x0C }, |
238 | { STV0900_16APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E, | ||
239 | 0x0C, 0x0E, 0x0C, 0x3D, 0x0C }, | ||
240 | { STV0900_32APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, | ||
241 | 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | ||
242 | { STV0900_32APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, | ||
243 | 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | ||
244 | { STV0900_32APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, | ||
245 | 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | ||
246 | { STV0900_32APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, | ||
247 | 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | ||
248 | { STV0900_32APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, | ||
249 | 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, | ||
199 | }; | 250 | }; |
200 | 251 | ||
201 | 252 | ||
202 | /* Cut 2.0 Tracking carrier loop carrier QPSK 1/4 to QPSK 2/5 long Frame */ | 253 | /* Cut 2.0 Tracking carrier loop carrier QPSK 1/4 to QPSK 2/5 long Frame */ |
203 | static const struct stv0900_car_loop_optim FE_STV0900_S2LowQPCarLoopCut20[3] = { | 254 | static const struct stv0900_car_loop_optim FE_STV0900_S2LowQPCarLoopCut20[3] = { |
204 | /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | 255 | /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon |
205 | { STV0900_QPSK_14, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D, 0x2F, 0x2D, 0x1F, 0x3D, 0x3E }, | 256 | 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ |
206 | { STV0900_QPSK_13, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D, 0x2F, 0x3D, 0x0F, 0x3D, 0x2E }, | 257 | { STV0900_QPSK_14, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D, |
207 | { STV0900_QPSK_25, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D, 0x1F, 0x3D, 0x3E, 0x3D, 0x2E } | 258 | 0x2F, 0x2D, 0x1F, 0x3D, 0x3E }, |
259 | { STV0900_QPSK_13, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D, | ||
260 | 0x2F, 0x3D, 0x0F, 0x3D, 0x2E }, | ||
261 | { STV0900_QPSK_25, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D, | ||
262 | 0x1F, 0x3D, 0x3E, 0x3D, 0x2E } | ||
208 | }; | 263 | }; |
209 | 264 | ||
210 | 265 | ||
211 | /* Cut 2.0 Tracking carrier loop carrier short Frame, cut 1.2 and 2.0 */ | 266 | /* Cut 2.0 Tracking carrier loop carrier short Frame, cut 1.2 and 2.0 */ |
212 | static const struct stv0900_short_frames_car_loop_optim FE_STV0900_S2ShortCarLoop[4] = { | 267 | static const |
213 | /*Mod 2M_cut1.2 2M_cut2.0 5M_cut1.2 5M_cut2.0 10M_cut1.2 10M_cut2.0 20M_cut1.2 20M_cut2.0 30M_cut1.2 30M_cut2.0 */ | 268 | struct stv0900_short_frames_car_loop_optim FE_STV0900_S2ShortCarLoop[4] = { |
214 | { STV0900_QPSK, 0x3C, 0x2F, 0x2B, 0x2E, 0x0B, 0x0E, 0x3A, 0x0E, 0x2A, 0x3D }, | 269 | /*Mod 2Mcut1.2 2Mcut2.0 5Mcut1.2 5Mcut2.0 10Mcut1.2 |
215 | { STV0900_8PSK, 0x0B, 0x3E, 0x2A, 0x0E, 0x0A, 0x2D, 0x19, 0x0D, 0x09, 0x3C }, | 270 | 10Mcut2.0 20Mcut1.2 20M_cut2.0 30Mcut1.2 30Mcut2.0*/ |
216 | { STV0900_16APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B, 0x1E, 0x3A, 0x3D, 0x2A, 0x2D }, | 271 | { STV0900_QPSK, 0x3C, 0x2F, 0x2B, 0x2E, 0x0B, |
217 | { STV0900_32APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B, 0x1E, 0x3A, 0x3D, 0x2A, 0x2D } | 272 | 0x0E, 0x3A, 0x0E, 0x2A, 0x3D }, |
273 | { STV0900_8PSK, 0x0B, 0x3E, 0x2A, 0x0E, 0x0A, | ||
274 | 0x2D, 0x19, 0x0D, 0x09, 0x3C }, | ||
275 | { STV0900_16APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B, | ||
276 | 0x1E, 0x3A, 0x3D, 0x2A, 0x2D }, | ||
277 | { STV0900_32APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B, | ||
278 | 0x1E, 0x3A, 0x3D, 0x2A, 0x2D } | ||
279 | }; | ||
280 | |||
281 | static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoopCut30[14] = { | ||
282 | /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon | ||
283 | 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
284 | { STV0900_QPSK_12, 0x3C, 0x2C, 0x0C, 0x2C, 0x1B, | ||
285 | 0x2C, 0x1B, 0x1C, 0x0B, 0x3B }, | ||
286 | { STV0900_QPSK_35, 0x0D, 0x0D, 0x0C, 0x0D, 0x1B, | ||
287 | 0x3C, 0x1B, 0x1C, 0x0B, 0x3B }, | ||
288 | { STV0900_QPSK_23, 0x1D, 0x0D, 0x0C, 0x1D, 0x2B, | ||
289 | 0x3C, 0x1B, 0x1C, 0x0B, 0x3B }, | ||
290 | { STV0900_QPSK_34, 0x1D, 0x1D, 0x0C, 0x1D, 0x2B, | ||
291 | 0x3C, 0x1B, 0x1C, 0x0B, 0x3B }, | ||
292 | { STV0900_QPSK_45, 0x2D, 0x1D, 0x1C, 0x1D, 0x2B, | ||
293 | 0x3C, 0x2B, 0x0C, 0x1B, 0x3B }, | ||
294 | { STV0900_QPSK_56, 0x2D, 0x1D, 0x1C, 0x1D, 0x2B, | ||
295 | 0x3C, 0x2B, 0x0C, 0x1B, 0x3B }, | ||
296 | { STV0900_QPSK_89, 0x3D, 0x2D, 0x1C, 0x1D, 0x3B, | ||
297 | 0x3C, 0x2B, 0x0C, 0x1B, 0x3B }, | ||
298 | { STV0900_QPSK_910, 0x3D, 0x2D, 0x1C, 0x1D, 0x3B, | ||
299 | 0x3C, 0x2B, 0x0C, 0x1B, 0x3B }, | ||
300 | { STV0900_8PSK_35, 0x39, 0x19, 0x39, 0x19, 0x19, | ||
301 | 0x19, 0x19, 0x19, 0x09, 0x19 }, | ||
302 | { STV0900_8PSK_23, 0x2A, 0x39, 0x1A, 0x0A, 0x39, | ||
303 | 0x0A, 0x29, 0x39, 0x29, 0x0A }, | ||
304 | { STV0900_8PSK_34, 0x0B, 0x3A, 0x0B, 0x0B, 0x3A, | ||
305 | 0x1B, 0x1A, 0x0B, 0x1A, 0x3A }, | ||
306 | { STV0900_8PSK_56, 0x0C, 0x1B, 0x3B, 0x2B, 0x1B, | ||
307 | 0x3B, 0x3A, 0x3B, 0x3A, 0x1B }, | ||
308 | { STV0900_8PSK_89, 0x2C, 0x2C, 0x2C, 0x1C, 0x2B, | ||
309 | 0x0C, 0x0B, 0x3B, 0x0B, 0x1B }, | ||
310 | { STV0900_8PSK_910, 0x2C, 0x3C, 0x2C, 0x1C, 0x3B, | ||
311 | 0x1C, 0x0B, 0x3B, 0x0B, 0x1B } | ||
312 | }; | ||
313 | |||
314 | static const | ||
315 | struct stv0900_car_loop_optim FE_STV0900_S2APSKCarLoopCut30[11] = { | ||
316 | /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon | ||
317 | 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
318 | { STV0900_16APSK_23, 0x0A, 0x0A, 0x0A, 0x0A, 0x1A, | ||
319 | 0x0A, 0x3A, 0x0A, 0x2A, 0x0A }, | ||
320 | { STV0900_16APSK_34, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, | ||
321 | 0x0A, 0x3B, 0x0A, 0x1B, 0x0A }, | ||
322 | { STV0900_16APSK_45, 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, | ||
323 | 0x0A, 0x3B, 0x0A, 0x2B, 0x0A }, | ||
324 | { STV0900_16APSK_56, 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, | ||
325 | 0x0A, 0x3B, 0x0A, 0x2B, 0x0A }, | ||
326 | { STV0900_16APSK_89, 0x0A, 0x0A, 0x0A, 0x0A, 0x2B, | ||
327 | 0x0A, 0x0C, 0x0A, 0x3B, 0x0A }, | ||
328 | { STV0900_16APSK_910, 0x0A, 0x0A, 0x0A, 0x0A, 0x2B, | ||
329 | 0x0A, 0x0C, 0x0A, 0x3B, 0x0A }, | ||
330 | { STV0900_32APSK_34, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, | ||
331 | 0x0A, 0x0A, 0x0A, 0x0A, 0x0A }, | ||
332 | { STV0900_32APSK_45, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, | ||
333 | 0x0A, 0x0A, 0x0A, 0x0A, 0x0A }, | ||
334 | { STV0900_32APSK_56, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, | ||
335 | 0x0A, 0x0A, 0x0A, 0x0A, 0x0A }, | ||
336 | { STV0900_32APSK_89, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, | ||
337 | 0x0A, 0x0A, 0x0A, 0x0A, 0x0A }, | ||
338 | { STV0900_32APSK_910, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, | ||
339 | 0x0A, 0x0A, 0x0A, 0x0A, 0x0A } | ||
340 | }; | ||
341 | |||
342 | static const | ||
343 | struct stv0900_car_loop_optim FE_STV0900_S2LowQPCarLoopCut30[3] = { | ||
344 | /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon | ||
345 | 10MPoff 20MPon 20MPoff 30MPon 30MPoff*/ | ||
346 | { STV0900_QPSK_14, 0x0C, 0x3C, 0x0B, 0x3C, 0x2A, | ||
347 | 0x2C, 0x2A, 0x1C, 0x3A, 0x3B }, | ||
348 | { STV0900_QPSK_13, 0x0C, 0x3C, 0x0B, 0x3C, 0x2A, | ||
349 | 0x2C, 0x3A, 0x0C, 0x3A, 0x2B }, | ||
350 | { STV0900_QPSK_25, 0x1C, 0x3C, 0x1B, 0x3C, 0x3A, | ||
351 | 0x1C, 0x3A, 0x3B, 0x3A, 0x2B } | ||
352 | }; | ||
353 | |||
354 | static const struct stv0900_short_frames_car_loop_optim_vs_mod | ||
355 | FE_STV0900_S2ShortCarLoopCut30[4] = { | ||
356 | /*Mod 2Mcut3.0 5Mcut3.0 10Mcut3.0 20Mcut3.0 30Mcut3.0*/ | ||
357 | { STV0900_QPSK, 0x2C, 0x2B, 0x0B, 0x0B, 0x3A }, | ||
358 | { STV0900_8PSK, 0x3B, 0x0B, 0x2A, 0x0A, 0x39 }, | ||
359 | { STV0900_16APSK, 0x1B, 0x1B, 0x1B, 0x3A, 0x2A }, | ||
360 | { STV0900_32APSK, 0x1B, 0x1B, 0x1B, 0x3A, 0x2A }, | ||
361 | |||
218 | }; | 362 | }; |
219 | 363 | ||
220 | static const u16 STV0900_InitVal[182][2] = { | 364 | static const u16 STV0900_InitVal[181][2] = { |
221 | { R0900_OUTCFG , 0x00 }, | 365 | { R0900_OUTCFG , 0x00 }, |
222 | { R0900_MODECFG , 0xff }, | ||
223 | { R0900_AGCRF1CFG , 0x11 }, | 366 | { R0900_AGCRF1CFG , 0x11 }, |
224 | { R0900_AGCRF2CFG , 0x13 }, | 367 | { R0900_AGCRF2CFG , 0x13 }, |
225 | { R0900_TSGENERAL1X , 0x14 }, | 368 | { R0900_TSGENERAL1X , 0x14 }, |
@@ -381,7 +524,7 @@ static const u16 STV0900_InitVal[182][2] = { | |||
381 | { R0900_GAINLLR_NF15 , 0x1A }, | 524 | { R0900_GAINLLR_NF15 , 0x1A }, |
382 | { R0900_GAINLLR_NF16 , 0x1F }, | 525 | { R0900_GAINLLR_NF16 , 0x1F }, |
383 | { R0900_GAINLLR_NF17 , 0x21 }, | 526 | { R0900_GAINLLR_NF17 , 0x21 }, |
384 | { R0900_RCCFGH , 0x20 }, | 527 | { R0900_RCCFG2 , 0x20 }, |
385 | { R0900_P1_FECM , 0x01 }, /*disable DSS modes*/ | 528 | { R0900_P1_FECM , 0x01 }, /*disable DSS modes*/ |
386 | { R0900_P2_FECM , 0x01 }, /*disable DSS modes*/ | 529 | { R0900_P2_FECM , 0x01 }, /*disable DSS modes*/ |
387 | { R0900_P1_PRVIT , 0x2F }, /*disable puncture rate 6/7*/ | 530 | { R0900_P1_PRVIT , 0x2F }, /*disable puncture rate 6/7*/ |
diff --git a/drivers/media/dvb/frontends/stv0900_priv.h b/drivers/media/dvb/frontends/stv0900_priv.h index 5ed7a145c7d3..b62b0f0a4fef 100644 --- a/drivers/media/dvb/frontends/stv0900_priv.h +++ b/drivers/media/dvb/frontends/stv0900_priv.h | |||
@@ -46,22 +46,6 @@ | |||
46 | #define FALSE (!TRUE) | 46 | #define FALSE (!TRUE) |
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #define dmd_reg(a, b, c) \ | ||
50 | do { \ | ||
51 | a = 0; \ | ||
52 | switch (demod) { \ | ||
53 | case STV0900_DEMOD_1: \ | ||
54 | default: \ | ||
55 | a = b; \ | ||
56 | break; \ | ||
57 | case STV0900_DEMOD_2: \ | ||
58 | a = c; \ | ||
59 | break; \ | ||
60 | } \ | ||
61 | } while (0) | ||
62 | |||
63 | static int stvdebug; | ||
64 | |||
65 | #define dprintk(args...) \ | 49 | #define dprintk(args...) \ |
66 | do { \ | 50 | do { \ |
67 | if (stvdebug) \ | 51 | if (stvdebug) \ |
@@ -70,6 +54,8 @@ static int stvdebug; | |||
70 | 54 | ||
71 | #define STV0900_MAXLOOKUPSIZE 500 | 55 | #define STV0900_MAXLOOKUPSIZE 500 |
72 | #define STV0900_BLIND_SEARCH_AGC2_TH 700 | 56 | #define STV0900_BLIND_SEARCH_AGC2_TH 700 |
57 | #define STV0900_BLIND_SEARCH_AGC2_TH_CUT30 1400 | ||
58 | #define IQPOWER_THRESHOLD 30 | ||
73 | 59 | ||
74 | /* One point of the lookup table */ | 60 | /* One point of the lookup table */ |
75 | struct stv000_lookpoint { | 61 | struct stv000_lookpoint { |
@@ -261,16 +247,18 @@ struct stv0900_init_params{ | |||
261 | 247 | ||
262 | u8 tun1_maddress; | 248 | u8 tun1_maddress; |
263 | int tuner1_adc; | 249 | int tuner1_adc; |
250 | int tuner1_type; | ||
264 | 251 | ||
265 | /* IQ from the tuner1 to the demod */ | 252 | /* IQ from the tuner1 to the demod */ |
266 | enum stv0900_iq_inversion tun1_iq_inversion; | 253 | enum stv0900_iq_inversion tun1_iq_inv; |
267 | enum fe_stv0900_clock_type path2_ts_clock; | 254 | enum fe_stv0900_clock_type path2_ts_clock; |
268 | 255 | ||
269 | u8 tun2_maddress; | 256 | u8 tun2_maddress; |
270 | int tuner2_adc; | 257 | int tuner2_adc; |
258 | int tuner2_type; | ||
271 | 259 | ||
272 | /* IQ from the tuner2 to the demod */ | 260 | /* IQ from the tuner2 to the demod */ |
273 | enum stv0900_iq_inversion tun2_iq_inversion; | 261 | enum stv0900_iq_inversion tun2_iq_inv; |
274 | struct stv0900_reg *ts_config; | 262 | struct stv0900_reg *ts_config; |
275 | }; | 263 | }; |
276 | 264 | ||
@@ -300,7 +288,7 @@ struct stv0900_signal_info { | |||
300 | enum fe_stv0900_modcode modcode; | 288 | enum fe_stv0900_modcode modcode; |
301 | enum fe_stv0900_modulation modulation; | 289 | enum fe_stv0900_modulation modulation; |
302 | enum fe_stv0900_pilot pilot; | 290 | enum fe_stv0900_pilot pilot; |
303 | enum fe_stv0900_frame_length frame_length; | 291 | enum fe_stv0900_frame_length frame_len; |
304 | enum stv0900_iq_inversion spectrum; | 292 | enum stv0900_iq_inversion spectrum; |
305 | enum fe_stv0900_rolloff rolloff; | 293 | enum fe_stv0900_rolloff rolloff; |
306 | 294 | ||
@@ -318,47 +306,27 @@ struct stv0900_internal{ | |||
318 | /* Demodulator use for single demod or for dual demod) */ | 306 | /* Demodulator use for single demod or for dual demod) */ |
319 | enum fe_stv0900_demod_mode demod_mode; | 307 | enum fe_stv0900_demod_mode demod_mode; |
320 | 308 | ||
321 | /*Demod 1*/ | 309 | /*Demods */ |
322 | s32 tuner1_freq; | 310 | s32 freq[2]; |
323 | s32 tuner1_bw; | 311 | s32 bw[2]; |
324 | s32 dmd1_symbol_rate; | 312 | s32 symbol_rate[2]; |
325 | s32 dmd1_srch_range; | 313 | s32 srch_range[2]; |
314 | /* for software/auto tuner */ | ||
315 | int tuner_type[2]; | ||
326 | 316 | ||
327 | /* algorithm for search Blind, Cold or Warm*/ | 317 | /* algorithm for search Blind, Cold or Warm*/ |
328 | enum fe_stv0900_search_algo dmd1_srch_algo; | 318 | enum fe_stv0900_search_algo srch_algo[2]; |
329 | /* search standard: Auto, DVBS1/DSS only or DVBS2 only*/ | 319 | /* search standard: Auto, DVBS1/DSS only or DVBS2 only*/ |
330 | enum fe_stv0900_search_standard dmd1_srch_standard; | 320 | enum fe_stv0900_search_standard srch_standard[2]; |
331 | /* inversion search : auto, auto norma first, normal or inverted */ | 321 | /* inversion search : auto, auto norma first, normal or inverted */ |
332 | enum fe_stv0900_search_iq dmd1_srch_iq_inv; | 322 | enum fe_stv0900_search_iq srch_iq_inv[2]; |
333 | enum fe_stv0900_modcode dmd1_modcode; | 323 | enum fe_stv0900_modcode modcode[2]; |
334 | enum fe_stv0900_modulation dmd1_modulation; | 324 | enum fe_stv0900_modulation modulation[2]; |
335 | enum fe_stv0900_fec dmd1_fec; | 325 | enum fe_stv0900_fec fec[2]; |
336 | |||
337 | struct stv0900_signal_info dmd1_rslts; | ||
338 | enum fe_stv0900_signal_type dmd1_state; | ||
339 | |||
340 | enum fe_stv0900_error dmd1_err; | ||
341 | 326 | ||
342 | /*Demod 2*/ | 327 | struct stv0900_signal_info result[2]; |
343 | s32 tuner2_freq; | 328 | enum fe_stv0900_error err[2]; |
344 | s32 tuner2_bw; | ||
345 | s32 dmd2_symbol_rate; | ||
346 | s32 dmd2_srch_range; | ||
347 | 329 | ||
348 | enum fe_stv0900_search_algo dmd2_srch_algo; | ||
349 | enum fe_stv0900_search_standard dmd2_srch_stndrd; | ||
350 | /* inversion search : auto, auto normal first, normal or inverted */ | ||
351 | enum fe_stv0900_search_iq dmd2_srch_iq_inv; | ||
352 | enum fe_stv0900_modcode dmd2_modcode; | ||
353 | enum fe_stv0900_modulation dmd2_modulation; | ||
354 | enum fe_stv0900_fec dmd2_fec; | ||
355 | |||
356 | /* results of the search*/ | ||
357 | struct stv0900_signal_info dmd2_rslts; | ||
358 | /* current state of the search algorithm */ | ||
359 | enum fe_stv0900_signal_type dmd2_state; | ||
360 | |||
361 | enum fe_stv0900_error dmd2_err; | ||
362 | 330 | ||
363 | struct i2c_adapter *i2c_adap; | 331 | struct i2c_adapter *i2c_adap; |
364 | u8 i2c_addr; | 332 | u8 i2c_addr; |
@@ -379,6 +347,8 @@ struct stv0900_state { | |||
379 | int demod; | 347 | int demod; |
380 | }; | 348 | }; |
381 | 349 | ||
350 | extern int stvdebug; | ||
351 | |||
382 | extern s32 ge2comp(s32 a, s32 width); | 352 | extern s32 ge2comp(s32 a, s32 width); |
383 | 353 | ||
384 | extern void stv0900_write_reg(struct stv0900_internal *i_params, | 354 | extern void stv0900_write_reg(struct stv0900_internal *i_params, |
@@ -418,13 +388,21 @@ extern u8 stv0900_get_optim_short_carr_loop(s32 srate, | |||
418 | extern void stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params, | 388 | extern void stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params, |
419 | enum fe_stv0900_demod_num demod); | 389 | enum fe_stv0900_demod_num demod); |
420 | 390 | ||
421 | extern void stv0900_activate_s2_modcode(struct stv0900_internal *i_params, | 391 | extern void stv0900_activate_s2_modcod(struct stv0900_internal *i_params, |
422 | enum fe_stv0900_demod_num demod); | 392 | enum fe_stv0900_demod_num demod); |
423 | 393 | ||
424 | extern void stv0900_activate_s2_modcode_single(struct stv0900_internal *i_params, | 394 | extern void stv0900_activate_s2_modcod_single(struct stv0900_internal *i_params, |
425 | enum fe_stv0900_demod_num demod); | 395 | enum fe_stv0900_demod_num demod); |
426 | 396 | ||
427 | extern enum fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe, | 397 | extern enum |
398 | fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe, | ||
428 | enum fe_stv0900_demod_num demod); | 399 | enum fe_stv0900_demod_num demod); |
429 | 400 | ||
401 | extern u32 | ||
402 | stv0900_get_freq_auto(struct stv0900_internal *intp, int demod); | ||
403 | |||
404 | extern void | ||
405 | stv0900_set_tuner_auto(struct stv0900_internal *intp, u32 Frequency, | ||
406 | u32 Bandwidth, int demod); | ||
407 | |||
430 | #endif | 408 | #endif |
diff --git a/drivers/media/dvb/frontends/stv0900_reg.h b/drivers/media/dvb/frontends/stv0900_reg.h index 264f9cf9a17e..731afe93a823 100644 --- a/drivers/media/dvb/frontends/stv0900_reg.h +++ b/drivers/media/dvb/frontends/stv0900_reg.h | |||
@@ -14,7 +14,7 @@ | |||
14 | * | 14 | * |
15 | * This program is distributed in the hope that it will be useful, | 15 | * This program is distributed in the hope that it will be useful, |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | * | 18 | * |
19 | * GNU General Public License for more details. | 19 | * GNU General Public License for more details. |
20 | * | 20 | * |
@@ -26,3762 +26,3956 @@ | |||
26 | #ifndef STV0900_REG_H | 26 | #ifndef STV0900_REG_H |
27 | #define STV0900_REG_H | 27 | #define STV0900_REG_H |
28 | 28 | ||
29 | extern s32 shiftx(s32 x, int demod, s32 shift); | ||
30 | |||
31 | #define REGx(x) shiftx(x, demod, 0x200) | ||
32 | #define FLDx(x) shiftx(x, demod, 0x2000000) | ||
33 | |||
29 | /*MID*/ | 34 | /*MID*/ |
30 | #define R0900_MID 0xf100 | 35 | #define R0900_MID 0xf100 |
31 | #define F0900_MCHIP_IDENT 0xf10000f0 | 36 | #define F0900_MCHIP_IDENT 0xf10000f0 |
32 | #define F0900_MRELEASE 0xf100000f | 37 | #define F0900_MRELEASE 0xf100000f |
33 | 38 | ||
34 | /*DACR1*/ | 39 | /*DACR1*/ |
35 | #define R0900_DACR1 0xf113 | 40 | #define R0900_DACR1 0xf113 |
36 | #define F0900_DAC_MODE 0xf11300e0 | 41 | #define F0900_DAC_MODE 0xf11300e0 |
37 | #define F0900_DAC_VALUE1 0xf113000f | 42 | #define F0900_DAC_VALUE1 0xf113000f |
38 | 43 | ||
39 | /*DACR2*/ | 44 | /*DACR2*/ |
40 | #define R0900_DACR2 0xf114 | 45 | #define R0900_DACR2 0xf114 |
41 | #define F0900_DAC_VALUE0 0xf11400ff | 46 | #define F0900_DAC_VALUE0 0xf11400ff |
42 | 47 | ||
43 | /*OUTCFG*/ | 48 | /*OUTCFG*/ |
44 | #define R0900_OUTCFG 0xf11c | 49 | #define R0900_OUTCFG 0xf11c |
45 | #define F0900_INV_DATA6 0xf11c0080 | 50 | #define F0900_OUTSERRS1_HZ 0xf11c0040 |
46 | #define F0900_OUTSERRS1_HZ 0xf11c0040 | 51 | #define F0900_OUTSERRS2_HZ 0xf11c0020 |
47 | #define F0900_OUTSERRS2_HZ 0xf11c0020 | 52 | #define F0900_OUTSERRS3_HZ 0xf11c0010 |
48 | #define F0900_OUTSERRS3_HZ 0xf11c0010 | 53 | #define F0900_OUTPARRS3_HZ 0xf11c0008 |
49 | #define F0900_OUTPARRS3_HZ 0xf11c0008 | ||
50 | #define F0900_OUTHZ3_CONTROL 0xf11c0007 | ||
51 | |||
52 | /*MODECFG*/ | ||
53 | #define R0900_MODECFG 0xf11d | ||
54 | #define F0900_FECSPY_SEL_2 0xf11d0020 | ||
55 | #define F0900_HWARE_SEL_2 0xf11d0010 | ||
56 | #define F0900_PKTDEL_SEL_2 0xf11d0008 | ||
57 | #define F0900_DISEQC_SEL_2 0xf11d0004 | ||
58 | #define F0900_VIT_SEL_2 0xf11d0002 | ||
59 | #define F0900_DEMOD_SEL_2 0xf11d0001 | ||
60 | 54 | ||
61 | /*IRQSTATUS3*/ | 55 | /*IRQSTATUS3*/ |
62 | #define R0900_IRQSTATUS3 0xf120 | 56 | #define R0900_IRQSTATUS3 0xf120 |
63 | #define F0900_SPLL_LOCK 0xf1200020 | 57 | #define F0900_SPLL_LOCK 0xf1200020 |
64 | #define F0900_SSTREAM_LCK_3 0xf1200010 | 58 | #define F0900_SSTREAM_LCK_3 0xf1200010 |
65 | #define F0900_SSTREAM_LCK_2 0xf1200008 | 59 | #define F0900_SSTREAM_LCK_2 0xf1200008 |
66 | #define F0900_SSTREAM_LCK_1 0xf1200004 | 60 | #define F0900_SSTREAM_LCK_1 0xf1200004 |
67 | #define F0900_SDVBS1_PRF_2 0xf1200002 | 61 | #define F0900_SDVBS1_PRF_2 0xf1200002 |
68 | #define F0900_SDVBS1_PRF_1 0xf1200001 | 62 | #define F0900_SDVBS1_PRF_1 0xf1200001 |
69 | 63 | ||
70 | /*IRQSTATUS2*/ | 64 | /*IRQSTATUS2*/ |
71 | #define R0900_IRQSTATUS2 0xf121 | 65 | #define R0900_IRQSTATUS2 0xf121 |
72 | #define F0900_SSPY_ENDSIM_3 0xf1210080 | 66 | #define F0900_SSPY_ENDSIM_3 0xf1210080 |
73 | #define F0900_SSPY_ENDSIM_2 0xf1210040 | 67 | #define F0900_SSPY_ENDSIM_2 0xf1210040 |
74 | #define F0900_SSPY_ENDSIM_1 0xf1210020 | 68 | #define F0900_SSPY_ENDSIM_1 0xf1210020 |
75 | #define F0900_SPKTDEL_ERROR_2 0xf1210010 | 69 | #define F0900_SPKTDEL_ERROR_2 0xf1210010 |
76 | #define F0900_SPKTDEL_LOCKB_2 0xf1210008 | 70 | #define F0900_SPKTDEL_LOCKB_2 0xf1210008 |
77 | #define F0900_SPKTDEL_LOCK_2 0xf1210004 | 71 | #define F0900_SPKTDEL_LOCK_2 0xf1210004 |
78 | #define F0900_SPKTDEL_ERROR_1 0xf1210002 | 72 | #define F0900_SPKTDEL_ERROR_1 0xf1210002 |
79 | #define F0900_SPKTDEL_LOCKB_1 0xf1210001 | 73 | #define F0900_SPKTDEL_LOCKB_1 0xf1210001 |
80 | 74 | ||
81 | /*IRQSTATUS1*/ | 75 | /*IRQSTATUS1*/ |
82 | #define R0900_IRQSTATUS1 0xf122 | 76 | #define R0900_IRQSTATUS1 0xf122 |
83 | #define F0900_SPKTDEL_LOCK_1 0xf1220080 | 77 | #define F0900_SPKTDEL_LOCK_1 0xf1220080 |
84 | #define F0900_SEXTPINB2 0xf1220040 | 78 | #define F0900_SDEMOD_LOCKB_2 0xf1220004 |
85 | #define F0900_SEXTPIN2 0xf1220020 | 79 | #define F0900_SDEMOD_LOCK_2 0xf1220002 |
86 | #define F0900_SEXTPINB1 0xf1220010 | 80 | #define F0900_SDEMOD_IRQ_2 0xf1220001 |
87 | #define F0900_SEXTPIN1 0xf1220008 | ||
88 | #define F0900_SDEMOD_LOCKB_2 0xf1220004 | ||
89 | #define F0900_SDEMOD_LOCK_2 0xf1220002 | ||
90 | #define F0900_SDEMOD_IRQ_2 0xf1220001 | ||
91 | 81 | ||
92 | /*IRQSTATUS0*/ | 82 | /*IRQSTATUS0*/ |
93 | #define R0900_IRQSTATUS0 0xf123 | 83 | #define R0900_IRQSTATUS0 0xf123 |
94 | #define F0900_SDEMOD_LOCKB_1 0xf1230080 | 84 | #define F0900_SDEMOD_LOCKB_1 0xf1230080 |
95 | #define F0900_SDEMOD_LOCK_1 0xf1230040 | 85 | #define F0900_SDEMOD_LOCK_1 0xf1230040 |
96 | #define F0900_SDEMOD_IRQ_1 0xf1230020 | 86 | #define F0900_SDEMOD_IRQ_1 0xf1230020 |
97 | #define F0900_SBCH_ERRFLAG 0xf1230010 | 87 | #define F0900_SBCH_ERRFLAG 0xf1230010 |
98 | #define F0900_SDISEQC2RX_IRQ 0xf1230008 | 88 | #define F0900_SDISEQC2RX_IRQ 0xf1230008 |
99 | #define F0900_SDISEQC2TX_IRQ 0xf1230004 | 89 | #define F0900_SDISEQC2TX_IRQ 0xf1230004 |
100 | #define F0900_SDISEQC1RX_IRQ 0xf1230002 | 90 | #define F0900_SDISEQC1RX_IRQ 0xf1230002 |
101 | #define F0900_SDISEQC1TX_IRQ 0xf1230001 | 91 | #define F0900_SDISEQC1TX_IRQ 0xf1230001 |
102 | 92 | ||
103 | /*IRQMASK3*/ | 93 | /*IRQMASK3*/ |
104 | #define R0900_IRQMASK3 0xf124 | 94 | #define R0900_IRQMASK3 0xf124 |
105 | #define F0900_MPLL_LOCK 0xf1240020 | 95 | #define F0900_MPLL_LOCK 0xf1240020 |
106 | #define F0900_MSTREAM_LCK_3 0xf1240010 | 96 | #define F0900_MSTREAM_LCK_3 0xf1240010 |
107 | #define F0900_MSTREAM_LCK_2 0xf1240008 | 97 | #define F0900_MSTREAM_LCK_2 0xf1240008 |
108 | #define F0900_MSTREAM_LCK_1 0xf1240004 | 98 | #define F0900_MSTREAM_LCK_1 0xf1240004 |
109 | #define F0900_MDVBS1_PRF_2 0xf1240002 | 99 | #define F0900_MDVBS1_PRF_2 0xf1240002 |
110 | #define F0900_MDVBS1_PRF_1 0xf1240001 | 100 | #define F0900_MDVBS1_PRF_1 0xf1240001 |
111 | 101 | ||
112 | /*IRQMASK2*/ | 102 | /*IRQMASK2*/ |
113 | #define R0900_IRQMASK2 0xf125 | 103 | #define R0900_IRQMASK2 0xf125 |
114 | #define F0900_MSPY_ENDSIM_3 0xf1250080 | 104 | #define F0900_MSPY_ENDSIM_3 0xf1250080 |
115 | #define F0900_MSPY_ENDSIM_2 0xf1250040 | 105 | #define F0900_MSPY_ENDSIM_2 0xf1250040 |
116 | #define F0900_MSPY_ENDSIM_1 0xf1250020 | 106 | #define F0900_MSPY_ENDSIM_1 0xf1250020 |
117 | #define F0900_MPKTDEL_ERROR_2 0xf1250010 | 107 | #define F0900_MPKTDEL_ERROR_2 0xf1250010 |
118 | #define F0900_MPKTDEL_LOCKB_2 0xf1250008 | 108 | #define F0900_MPKTDEL_LOCKB_2 0xf1250008 |
119 | #define F0900_MPKTDEL_LOCK_2 0xf1250004 | 109 | #define F0900_MPKTDEL_LOCK_2 0xf1250004 |
120 | #define F0900_MPKTDEL_ERROR_1 0xf1250002 | 110 | #define F0900_MPKTDEL_ERROR_1 0xf1250002 |
121 | #define F0900_MPKTDEL_LOCKB_1 0xf1250001 | 111 | #define F0900_MPKTDEL_LOCKB_1 0xf1250001 |
122 | 112 | ||
123 | /*IRQMASK1*/ | 113 | /*IRQMASK1*/ |
124 | #define R0900_IRQMASK1 0xf126 | 114 | #define R0900_IRQMASK1 0xf126 |
125 | #define F0900_MPKTDEL_LOCK_1 0xf1260080 | 115 | #define F0900_MPKTDEL_LOCK_1 0xf1260080 |
126 | #define F0900_MEXTPINB2 0xf1260040 | 116 | #define F0900_MEXTPINB2 0xf1260040 |
127 | #define F0900_MEXTPIN2 0xf1260020 | 117 | #define F0900_MEXTPIN2 0xf1260020 |
128 | #define F0900_MEXTPINB1 0xf1260010 | 118 | #define F0900_MEXTPINB1 0xf1260010 |
129 | #define F0900_MEXTPIN1 0xf1260008 | 119 | #define F0900_MEXTPIN1 0xf1260008 |
130 | #define F0900_MDEMOD_LOCKB_2 0xf1260004 | 120 | #define F0900_MDEMOD_LOCKB_2 0xf1260004 |
131 | #define F0900_MDEMOD_LOCK_2 0xf1260002 | 121 | #define F0900_MDEMOD_LOCK_2 0xf1260002 |
132 | #define F0900_MDEMOD_IRQ_2 0xf1260001 | 122 | #define F0900_MDEMOD_IRQ_2 0xf1260001 |
133 | 123 | ||
134 | /*IRQMASK0*/ | 124 | /*IRQMASK0*/ |
135 | #define R0900_IRQMASK0 0xf127 | 125 | #define R0900_IRQMASK0 0xf127 |
136 | #define F0900_MDEMOD_LOCKB_1 0xf1270080 | 126 | #define F0900_MDEMOD_LOCKB_1 0xf1270080 |
137 | #define F0900_MDEMOD_LOCK_1 0xf1270040 | 127 | #define F0900_MDEMOD_LOCK_1 0xf1270040 |
138 | #define F0900_MDEMOD_IRQ_1 0xf1270020 | 128 | #define F0900_MDEMOD_IRQ_1 0xf1270020 |
139 | #define F0900_MBCH_ERRFLAG 0xf1270010 | 129 | #define F0900_MBCH_ERRFLAG 0xf1270010 |
140 | #define F0900_MDISEQC2RX_IRQ 0xf1270008 | 130 | #define F0900_MDISEQC2RX_IRQ 0xf1270008 |
141 | #define F0900_MDISEQC2TX_IRQ 0xf1270004 | 131 | #define F0900_MDISEQC2TX_IRQ 0xf1270004 |
142 | #define F0900_MDISEQC1RX_IRQ 0xf1270002 | 132 | #define F0900_MDISEQC1RX_IRQ 0xf1270002 |
143 | #define F0900_MDISEQC1TX_IRQ 0xf1270001 | 133 | #define F0900_MDISEQC1TX_IRQ 0xf1270001 |
144 | 134 | ||
145 | /*I2CCFG*/ | 135 | /*I2CCFG*/ |
146 | #define R0900_I2CCFG 0xf129 | 136 | #define R0900_I2CCFG 0xf129 |
147 | #define F0900_I2C2_FASTMODE 0xf1290080 | 137 | #define F0900_I2C_FASTMODE 0xf1290008 |
148 | #define F0900_STATUS_WR2 0xf1290040 | 138 | #define F0900_I2CADDR_INC 0xf1290003 |
149 | #define F0900_I2C2ADDR_INC 0xf1290030 | ||
150 | #define F0900_I2C_FASTMODE 0xf1290008 | ||
151 | #define F0900_STATUS_WR 0xf1290004 | ||
152 | #define F0900_I2CADDR_INC 0xf1290003 | ||
153 | 139 | ||
154 | /*P1_I2CRPT*/ | 140 | /*P1_I2CRPT*/ |
155 | #define R0900_P1_I2CRPT 0xf12a | 141 | #define R0900_P1_I2CRPT 0xf12a |
156 | #define F0900_P1_I2CT_ON 0xf12a0080 | 142 | #define I2CRPT shiftx(R0900_P1_I2CRPT, demod, -1) |
157 | #define F0900_P1_ENARPT_LEVEL 0xf12a0070 | 143 | #define F0900_P1_I2CT_ON 0xf12a0080 |
158 | #define F0900_P1_SCLT_DELAY 0xf12a0008 | 144 | #define I2CT_ON shiftx(F0900_P1_I2CT_ON, demod, -0x10000) |
159 | #define F0900_P1_STOP_ENABLE 0xf12a0004 | 145 | #define F0900_P1_ENARPT_LEVEL 0xf12a0070 |
160 | #define F0900_P1_STOP_SDAT2SDA 0xf12a0002 | 146 | #define F0900_P1_SCLT_DELAY 0xf12a0008 |
147 | #define F0900_P1_STOP_ENABLE 0xf12a0004 | ||
148 | #define F0900_P1_STOP_SDAT2SDA 0xf12a0002 | ||
161 | 149 | ||
162 | /*P2_I2CRPT*/ | 150 | /*P2_I2CRPT*/ |
163 | #define R0900_P2_I2CRPT 0xf12b | 151 | #define R0900_P2_I2CRPT 0xf12b |
164 | #define F0900_P2_I2CT_ON 0xf12b0080 | 152 | #define F0900_P2_I2CT_ON 0xf12b0080 |
165 | #define F0900_P2_ENARPT_LEVEL 0xf12b0070 | 153 | #define F0900_P2_ENARPT_LEVEL 0xf12b0070 |
166 | #define F0900_P2_SCLT_DELAY 0xf12b0008 | 154 | #define F0900_P2_SCLT_DELAY 0xf12b0008 |
167 | #define F0900_P2_STOP_ENABLE 0xf12b0004 | 155 | #define F0900_P2_STOP_ENABLE 0xf12b0004 |
168 | #define F0900_P2_STOP_SDAT2SDA 0xf12b0002 | 156 | #define F0900_P2_STOP_SDAT2SDA 0xf12b0002 |
157 | |||
158 | /*IOPVALUE6*/ | ||
159 | #define R0900_IOPVALUE6 0xf138 | ||
160 | #define F0900_VSCL 0xf1380004 | ||
161 | #define F0900_VSDA 0xf1380002 | ||
162 | #define F0900_VDATA3_0 0xf1380001 | ||
163 | |||
164 | /*IOPVALUE5*/ | ||
165 | #define R0900_IOPVALUE5 0xf139 | ||
166 | #define F0900_VDATA3_1 0xf1390080 | ||
167 | #define F0900_VDATA3_2 0xf1390040 | ||
168 | #define F0900_VDATA3_3 0xf1390020 | ||
169 | #define F0900_VDATA3_4 0xf1390010 | ||
170 | #define F0900_VDATA3_5 0xf1390008 | ||
171 | #define F0900_VDATA3_6 0xf1390004 | ||
172 | #define F0900_VDATA3_7 0xf1390002 | ||
173 | #define F0900_VCLKOUT3 0xf1390001 | ||
174 | |||
175 | /*IOPVALUE4*/ | ||
176 | #define R0900_IOPVALUE4 0xf13a | ||
177 | #define F0900_VSTROUT3 0xf13a0080 | ||
178 | #define F0900_VDPN3 0xf13a0040 | ||
179 | #define F0900_VERROR3 0xf13a0020 | ||
180 | #define F0900_VDATA2_7 0xf13a0010 | ||
181 | #define F0900_VCLKOUT2 0xf13a0008 | ||
182 | #define F0900_VSTROUT2 0xf13a0004 | ||
183 | #define F0900_VDPN2 0xf13a0002 | ||
184 | #define F0900_VERROR2 0xf13a0001 | ||
185 | |||
186 | /*IOPVALUE3*/ | ||
187 | #define R0900_IOPVALUE3 0xf13b | ||
188 | #define F0900_VDATA1_7 0xf13b0080 | ||
189 | #define F0900_VCLKOUT1 0xf13b0040 | ||
190 | #define F0900_VSTROUT1 0xf13b0020 | ||
191 | #define F0900_VDPN1 0xf13b0010 | ||
192 | #define F0900_VERROR1 0xf13b0008 | ||
193 | #define F0900_VCLKOUT27 0xf13b0004 | ||
194 | #define F0900_VDISEQCOUT2 0xf13b0002 | ||
195 | #define F0900_VSCLT2 0xf13b0001 | ||
196 | |||
197 | /*IOPVALUE2*/ | ||
198 | #define R0900_IOPVALUE2 0xf13c | ||
199 | #define F0900_VSDAT2 0xf13c0080 | ||
200 | #define F0900_VAGCRF2 0xf13c0040 | ||
201 | #define F0900_VDISEQCOUT1 0xf13c0020 | ||
202 | #define F0900_VSCLT1 0xf13c0010 | ||
203 | #define F0900_VSDAT1 0xf13c0008 | ||
204 | #define F0900_VAGCRF1 0xf13c0004 | ||
205 | #define F0900_VDIRCLK 0xf13c0002 | ||
206 | #define F0900_VSTDBY 0xf13c0001 | ||
207 | |||
208 | /*IOPVALUE1*/ | ||
209 | #define R0900_IOPVALUE1 0xf13d | ||
210 | #define F0900_VCS1 0xf13d0080 | ||
211 | #define F0900_VCS0 0xf13d0040 | ||
212 | #define F0900_VGPIO13 0xf13d0020 | ||
213 | #define F0900_VGPIO12 0xf13d0010 | ||
214 | #define F0900_VGPIO11 0xf13d0008 | ||
215 | #define F0900_VGPIO10 0xf13d0004 | ||
216 | #define F0900_VGPIO9 0xf13d0002 | ||
217 | #define F0900_VGPIO8 0xf13d0001 | ||
218 | |||
219 | /*IOPVALUE0*/ | ||
220 | #define R0900_IOPVALUE0 0xf13e | ||
221 | #define F0900_VGPIO7 0xf13e0080 | ||
222 | #define F0900_VGPIO6 0xf13e0040 | ||
223 | #define F0900_VGPIO5 0xf13e0020 | ||
224 | #define F0900_VGPIO4 0xf13e0010 | ||
225 | #define F0900_VGPIO3 0xf13e0008 | ||
226 | #define F0900_VGPIO2 0xf13e0004 | ||
227 | #define F0900_VGPIO1 0xf13e0002 | ||
228 | #define F0900_VCLKI2 0xf13e0001 | ||
169 | 229 | ||
170 | /*CLKI2CFG*/ | 230 | /*CLKI2CFG*/ |
171 | #define R0900_CLKI2CFG 0xf140 | 231 | #define R0900_CLKI2CFG 0xf140 |
172 | #define F0900_CLKI2_OPD 0xf1400080 | 232 | #define F0900_CLKI2_OPD 0xf1400080 |
173 | #define F0900_CLKI2_CONFIG 0xf140007e | 233 | #define F0900_CLKI2_CONFIG 0xf140007e |
174 | #define F0900_CLKI2_XOR 0xf1400001 | 234 | #define F0900_CLKI2_XOR 0xf1400001 |
175 | 235 | ||
176 | /*GPIO1CFG*/ | 236 | /*GPIO1CFG*/ |
177 | #define R0900_GPIO1CFG 0xf141 | 237 | #define R0900_GPIO1CFG 0xf141 |
178 | #define F0900_GPIO1_OPD 0xf1410080 | 238 | #define F0900_GPIO1_OPD 0xf1410080 |
179 | #define F0900_GPIO1_CONFIG 0xf141007e | 239 | #define F0900_GPIO1_CONFIG 0xf141007e |
180 | #define F0900_GPIO1_XOR 0xf1410001 | 240 | #define F0900_GPIO1_XOR 0xf1410001 |
181 | 241 | ||
182 | /*GPIO2CFG*/ | 242 | /*GPIO2CFG*/ |
183 | #define R0900_GPIO2CFG 0xf142 | 243 | #define R0900_GPIO2CFG 0xf142 |
184 | #define F0900_GPIO2_OPD 0xf1420080 | 244 | #define F0900_GPIO2_OPD 0xf1420080 |
185 | #define F0900_GPIO2_CONFIG 0xf142007e | 245 | #define F0900_GPIO2_CONFIG 0xf142007e |
186 | #define F0900_GPIO2_XOR 0xf1420001 | 246 | #define F0900_GPIO2_XOR 0xf1420001 |
187 | 247 | ||
188 | /*GPIO3CFG*/ | 248 | /*GPIO3CFG*/ |
189 | #define R0900_GPIO3CFG 0xf143 | 249 | #define R0900_GPIO3CFG 0xf143 |
190 | #define F0900_GPIO3_OPD 0xf1430080 | 250 | #define F0900_GPIO3_OPD 0xf1430080 |
191 | #define F0900_GPIO3_CONFIG 0xf143007e | 251 | #define F0900_GPIO3_CONFIG 0xf143007e |
192 | #define F0900_GPIO3_XOR 0xf1430001 | 252 | #define F0900_GPIO3_XOR 0xf1430001 |
193 | 253 | ||
194 | /*GPIO4CFG*/ | 254 | /*GPIO4CFG*/ |
195 | #define R0900_GPIO4CFG 0xf144 | 255 | #define R0900_GPIO4CFG 0xf144 |
196 | #define F0900_GPIO4_OPD 0xf1440080 | 256 | #define F0900_GPIO4_OPD 0xf1440080 |
197 | #define F0900_GPIO4_CONFIG 0xf144007e | 257 | #define F0900_GPIO4_CONFIG 0xf144007e |
198 | #define F0900_GPIO4_XOR 0xf1440001 | 258 | #define F0900_GPIO4_XOR 0xf1440001 |
199 | 259 | ||
200 | /*GPIO5CFG*/ | 260 | /*GPIO5CFG*/ |
201 | #define R0900_GPIO5CFG 0xf145 | 261 | #define R0900_GPIO5CFG 0xf145 |
202 | #define F0900_GPIO5_OPD 0xf1450080 | 262 | #define F0900_GPIO5_OPD 0xf1450080 |
203 | #define F0900_GPIO5_CONFIG 0xf145007e | 263 | #define F0900_GPIO5_CONFIG 0xf145007e |
204 | #define F0900_GPIO5_XOR 0xf1450001 | 264 | #define F0900_GPIO5_XOR 0xf1450001 |
205 | 265 | ||
206 | /*GPIO6CFG*/ | 266 | /*GPIO6CFG*/ |
207 | #define R0900_GPIO6CFG 0xf146 | 267 | #define R0900_GPIO6CFG 0xf146 |
208 | #define F0900_GPIO6_OPD 0xf1460080 | 268 | #define F0900_GPIO6_OPD 0xf1460080 |
209 | #define F0900_GPIO6_CONFIG 0xf146007e | 269 | #define F0900_GPIO6_CONFIG 0xf146007e |
210 | #define F0900_GPIO6_XOR 0xf1460001 | 270 | #define F0900_GPIO6_XOR 0xf1460001 |
211 | 271 | ||
212 | /*GPIO7CFG*/ | 272 | /*GPIO7CFG*/ |
213 | #define R0900_GPIO7CFG 0xf147 | 273 | #define R0900_GPIO7CFG 0xf147 |
214 | #define F0900_GPIO7_OPD 0xf1470080 | 274 | #define F0900_GPIO7_OPD 0xf1470080 |
215 | #define F0900_GPIO7_CONFIG 0xf147007e | 275 | #define F0900_GPIO7_CONFIG 0xf147007e |
216 | #define F0900_GPIO7_XOR 0xf1470001 | 276 | #define F0900_GPIO7_XOR 0xf1470001 |
217 | 277 | ||
218 | /*GPIO8CFG*/ | 278 | /*GPIO8CFG*/ |
219 | #define R0900_GPIO8CFG 0xf148 | 279 | #define R0900_GPIO8CFG 0xf148 |
220 | #define F0900_GPIO8_OPD 0xf1480080 | 280 | #define F0900_GPIO8_OPD 0xf1480080 |
221 | #define F0900_GPIO8_CONFIG 0xf148007e | 281 | #define F0900_GPIO8_CONFIG 0xf148007e |
222 | #define F0900_GPIO8_XOR 0xf1480001 | 282 | #define F0900_GPIO8_XOR 0xf1480001 |
223 | 283 | ||
224 | /*GPIO9CFG*/ | 284 | /*GPIO9CFG*/ |
225 | #define R0900_GPIO9CFG 0xf149 | 285 | #define R0900_GPIO9CFG 0xf149 |
226 | #define F0900_GPIO9_OPD 0xf1490080 | 286 | #define F0900_GPIO9_OPD 0xf1490080 |
227 | #define F0900_GPIO9_CONFIG 0xf149007e | 287 | #define F0900_GPIO9_CONFIG 0xf149007e |
228 | #define F0900_GPIO9_XOR 0xf1490001 | 288 | #define F0900_GPIO9_XOR 0xf1490001 |
229 | 289 | ||
230 | /*GPIO10CFG*/ | 290 | /*GPIO10CFG*/ |
231 | #define R0900_GPIO10CFG 0xf14a | 291 | #define R0900_GPIO10CFG 0xf14a |
232 | #define F0900_GPIO10_OPD 0xf14a0080 | 292 | #define F0900_GPIO10_OPD 0xf14a0080 |
233 | #define F0900_GPIO10_CONFIG 0xf14a007e | 293 | #define F0900_GPIO10_CONFIG 0xf14a007e |
234 | #define F0900_GPIO10_XOR 0xf14a0001 | 294 | #define F0900_GPIO10_XOR 0xf14a0001 |
235 | 295 | ||
236 | /*GPIO11CFG*/ | 296 | /*GPIO11CFG*/ |
237 | #define R0900_GPIO11CFG 0xf14b | 297 | #define R0900_GPIO11CFG 0xf14b |
238 | #define F0900_GPIO11_OPD 0xf14b0080 | 298 | #define F0900_GPIO11_OPD 0xf14b0080 |
239 | #define F0900_GPIO11_CONFIG 0xf14b007e | 299 | #define F0900_GPIO11_CONFIG 0xf14b007e |
240 | #define F0900_GPIO11_XOR 0xf14b0001 | 300 | #define F0900_GPIO11_XOR 0xf14b0001 |
241 | 301 | ||
242 | /*GPIO12CFG*/ | 302 | /*GPIO12CFG*/ |
243 | #define R0900_GPIO12CFG 0xf14c | 303 | #define R0900_GPIO12CFG 0xf14c |
244 | #define F0900_GPIO12_OPD 0xf14c0080 | 304 | #define F0900_GPIO12_OPD 0xf14c0080 |
245 | #define F0900_GPIO12_CONFIG 0xf14c007e | 305 | #define F0900_GPIO12_CONFIG 0xf14c007e |
246 | #define F0900_GPIO12_XOR 0xf14c0001 | 306 | #define F0900_GPIO12_XOR 0xf14c0001 |
247 | 307 | ||
248 | /*GPIO13CFG*/ | 308 | /*GPIO13CFG*/ |
249 | #define R0900_GPIO13CFG 0xf14d | 309 | #define R0900_GPIO13CFG 0xf14d |
250 | #define F0900_GPIO13_OPD 0xf14d0080 | 310 | #define F0900_GPIO13_OPD 0xf14d0080 |
251 | #define F0900_GPIO13_CONFIG 0xf14d007e | 311 | #define F0900_GPIO13_CONFIG 0xf14d007e |
252 | #define F0900_GPIO13_XOR 0xf14d0001 | 312 | #define F0900_GPIO13_XOR 0xf14d0001 |
253 | 313 | ||
254 | /*CS0CFG*/ | 314 | /*CS0CFG*/ |
255 | #define R0900_CS0CFG 0xf14e | 315 | #define R0900_CS0CFG 0xf14e |
256 | #define F0900_CS0_OPD 0xf14e0080 | 316 | #define F0900_CS0_OPD 0xf14e0080 |
257 | #define F0900_CS0_CONFIG 0xf14e007e | 317 | #define F0900_CS0_CONFIG 0xf14e007e |
258 | #define F0900_CS0_XOR 0xf14e0001 | 318 | #define F0900_CS0_XOR 0xf14e0001 |
259 | 319 | ||
260 | /*CS1CFG*/ | 320 | /*CS1CFG*/ |
261 | #define R0900_CS1CFG 0xf14f | 321 | #define R0900_CS1CFG 0xf14f |
262 | #define F0900_CS1_OPD 0xf14f0080 | 322 | #define F0900_CS1_OPD 0xf14f0080 |
263 | #define F0900_CS1_CONFIG 0xf14f007e | 323 | #define F0900_CS1_CONFIG 0xf14f007e |
264 | #define F0900_CS1_XOR 0xf14f0001 | 324 | #define F0900_CS1_XOR 0xf14f0001 |
265 | 325 | ||
266 | /*STDBYCFG*/ | 326 | /*STDBYCFG*/ |
267 | #define R0900_STDBYCFG 0xf150 | 327 | #define R0900_STDBYCFG 0xf150 |
268 | #define F0900_STDBY_OPD 0xf1500080 | 328 | #define F0900_STDBY_OPD 0xf1500080 |
269 | #define F0900_STDBY_CONFIG 0xf150007e | 329 | #define F0900_STDBY_CONFIG 0xf150007e |
270 | #define F0900_STBDY_XOR 0xf1500001 | 330 | #define F0900_STBDY_XOR 0xf1500001 |
271 | 331 | ||
272 | /*DIRCLKCFG*/ | 332 | /*DIRCLKCFG*/ |
273 | #define R0900_DIRCLKCFG 0xf151 | 333 | #define R0900_DIRCLKCFG 0xf151 |
274 | #define F0900_DIRCLK_OPD 0xf1510080 | 334 | #define F0900_DIRCLK_OPD 0xf1510080 |
275 | #define F0900_DIRCLK_CONFIG 0xf151007e | 335 | #define F0900_DIRCLK_CONFIG 0xf151007e |
276 | #define F0900_DIRCLK_XOR 0xf1510001 | 336 | #define F0900_DIRCLK_XOR 0xf1510001 |
277 | 337 | ||
278 | /*AGCRF1CFG*/ | 338 | /*AGCRF1CFG*/ |
279 | #define R0900_AGCRF1CFG 0xf152 | 339 | #define R0900_AGCRF1CFG 0xf152 |
280 | #define F0900_AGCRF1_OPD 0xf1520080 | 340 | #define F0900_AGCRF1_OPD 0xf1520080 |
281 | #define F0900_AGCRF1_CONFIG 0xf152007e | 341 | #define F0900_AGCRF1_CONFIG 0xf152007e |
282 | #define F0900_AGCRF1_XOR 0xf1520001 | 342 | #define F0900_AGCRF1_XOR 0xf1520001 |
283 | 343 | ||
284 | /*SDAT1CFG*/ | 344 | /*SDAT1CFG*/ |
285 | #define R0900_SDAT1CFG 0xf153 | 345 | #define R0900_SDAT1CFG 0xf153 |
286 | #define F0900_SDAT1_OPD 0xf1530080 | 346 | #define F0900_SDAT1_OPD 0xf1530080 |
287 | #define F0900_SDAT1_CONFIG 0xf153007e | 347 | #define F0900_SDAT1_CONFIG 0xf153007e |
288 | #define F0900_SDAT1_XOR 0xf1530001 | 348 | #define F0900_SDAT1_XOR 0xf1530001 |
289 | 349 | ||
290 | /*SCLT1CFG*/ | 350 | /*SCLT1CFG*/ |
291 | #define R0900_SCLT1CFG 0xf154 | 351 | #define R0900_SCLT1CFG 0xf154 |
292 | #define F0900_SCLT1_OPD 0xf1540080 | 352 | #define F0900_SCLT1_OPD 0xf1540080 |
293 | #define F0900_SCLT1_CONFIG 0xf154007e | 353 | #define F0900_SCLT1_CONFIG 0xf154007e |
294 | #define F0900_SCLT1_XOR 0xf1540001 | 354 | #define F0900_SCLT1_XOR 0xf1540001 |
295 | 355 | ||
296 | /*DISEQCO1CFG*/ | 356 | /*DISEQCO1CFG*/ |
297 | #define R0900_DISEQCO1CFG 0xf155 | 357 | #define R0900_DISEQCO1CFG 0xf155 |
298 | #define F0900_DISEQCO1_OPD 0xf1550080 | 358 | #define F0900_DISEQCO1_OPD 0xf1550080 |
299 | #define F0900_DISEQCO1_CONFIG 0xf155007e | 359 | #define F0900_DISEQCO1_CONFIG 0xf155007e |
300 | #define F0900_DISEQC1_XOR 0xf1550001 | 360 | #define F0900_DISEQC1_XOR 0xf1550001 |
301 | 361 | ||
302 | /*AGCRF2CFG*/ | 362 | /*AGCRF2CFG*/ |
303 | #define R0900_AGCRF2CFG 0xf156 | 363 | #define R0900_AGCRF2CFG 0xf156 |
304 | #define F0900_AGCRF2_OPD 0xf1560080 | 364 | #define F0900_AGCRF2_OPD 0xf1560080 |
305 | #define F0900_AGCRF2_CONFIG 0xf156007e | 365 | #define F0900_AGCRF2_CONFIG 0xf156007e |
306 | #define F0900_AGCRF2_XOR 0xf1560001 | 366 | #define F0900_AGCRF2_XOR 0xf1560001 |
307 | 367 | ||
308 | /*SDAT2CFG*/ | 368 | /*SDAT2CFG*/ |
309 | #define R0900_SDAT2CFG 0xf157 | 369 | #define R0900_SDAT2CFG 0xf157 |
310 | #define F0900_SDAT2_OPD 0xf1570080 | 370 | #define F0900_SDAT2_OPD 0xf1570080 |
311 | #define F0900_SDAT2_CONFIG 0xf157007e | 371 | #define F0900_SDAT2_CONFIG 0xf157007e |
312 | #define F0900_SDAT2_XOR 0xf1570001 | 372 | #define F0900_SDAT2_XOR 0xf1570001 |
313 | 373 | ||
314 | /*SCLT2CFG*/ | 374 | /*SCLT2CFG*/ |
315 | #define R0900_SCLT2CFG 0xf158 | 375 | #define R0900_SCLT2CFG 0xf158 |
316 | #define F0900_SCLT2_OPD 0xf1580080 | 376 | #define F0900_SCLT2_OPD 0xf1580080 |
317 | #define F0900_SCLT2_CONFIG 0xf158007e | 377 | #define F0900_SCLT2_CONFIG 0xf158007e |
318 | #define F0900_SCLT2_XOR 0xf1580001 | 378 | #define F0900_SCLT2_XOR 0xf1580001 |
319 | 379 | ||
320 | /*DISEQCO2CFG*/ | 380 | /*DISEQCO2CFG*/ |
321 | #define R0900_DISEQCO2CFG 0xf159 | 381 | #define R0900_DISEQCO2CFG 0xf159 |
322 | #define F0900_DISEQCO2_OPD 0xf1590080 | 382 | #define F0900_DISEQCO2_OPD 0xf1590080 |
323 | #define F0900_DISEQCO2_CONFIG 0xf159007e | 383 | #define F0900_DISEQCO2_CONFIG 0xf159007e |
324 | #define F0900_DISEQC2_XOR 0xf1590001 | 384 | #define F0900_DISEQC2_XOR 0xf1590001 |
325 | 385 | ||
326 | /*CLKOUT27CFG*/ | 386 | /*CLKOUT27CFG*/ |
327 | #define R0900_CLKOUT27CFG 0xf15a | 387 | #define R0900_CLKOUT27CFG 0xf15a |
328 | #define F0900_CLKOUT27_OPD 0xf15a0080 | 388 | #define F0900_CLKOUT27_OPD 0xf15a0080 |
329 | #define F0900_CLKOUT27_CONFIG 0xf15a007e | 389 | #define F0900_CLKOUT27_CONFIG 0xf15a007e |
330 | #define F0900_CLKOUT27_XOR 0xf15a0001 | 390 | #define F0900_CLKOUT27_XOR 0xf15a0001 |
331 | 391 | ||
332 | /*ERROR1CFG*/ | 392 | /*ERROR1CFG*/ |
333 | #define R0900_ERROR1CFG 0xf15b | 393 | #define R0900_ERROR1CFG 0xf15b |
334 | #define F0900_ERROR1_OPD 0xf15b0080 | 394 | #define F0900_ERROR1_OPD 0xf15b0080 |
335 | #define F0900_ERROR1_CONFIG 0xf15b007e | 395 | #define F0900_ERROR1_CONFIG 0xf15b007e |
336 | #define F0900_ERROR1_XOR 0xf15b0001 | 396 | #define F0900_ERROR1_XOR 0xf15b0001 |
337 | 397 | ||
338 | /*DPN1CFG*/ | 398 | /*DPN1CFG*/ |
339 | #define R0900_DPN1CFG 0xf15c | 399 | #define R0900_DPN1CFG 0xf15c |
340 | #define F0900_DPN1_OPD 0xf15c0080 | 400 | #define F0900_DPN1_OPD 0xf15c0080 |
341 | #define F0900_DPN1_CONFIG 0xf15c007e | 401 | #define F0900_DPN1_CONFIG 0xf15c007e |
342 | #define F0900_DPN1_XOR 0xf15c0001 | 402 | #define F0900_DPN1_XOR 0xf15c0001 |
343 | 403 | ||
344 | /*STROUT1CFG*/ | 404 | /*STROUT1CFG*/ |
345 | #define R0900_STROUT1CFG 0xf15d | 405 | #define R0900_STROUT1CFG 0xf15d |
346 | #define F0900_STROUT1_OPD 0xf15d0080 | 406 | #define F0900_STROUT1_OPD 0xf15d0080 |
347 | #define F0900_STROUT1_CONFIG 0xf15d007e | 407 | #define F0900_STROUT1_CONFIG 0xf15d007e |
348 | #define F0900_STROUT1_XOR 0xf15d0001 | 408 | #define F0900_STROUT1_XOR 0xf15d0001 |
349 | 409 | ||
350 | /*CLKOUT1CFG*/ | 410 | /*CLKOUT1CFG*/ |
351 | #define R0900_CLKOUT1CFG 0xf15e | 411 | #define R0900_CLKOUT1CFG 0xf15e |
352 | #define F0900_CLKOUT1_OPD 0xf15e0080 | 412 | #define F0900_CLKOUT1_OPD 0xf15e0080 |
353 | #define F0900_CLKOUT1_CONFIG 0xf15e007e | 413 | #define F0900_CLKOUT1_CONFIG 0xf15e007e |
354 | #define F0900_CLKOUT1_XOR 0xf15e0001 | 414 | #define F0900_CLKOUT1_XOR 0xf15e0001 |
355 | 415 | ||
356 | /*DATA71CFG*/ | 416 | /*DATA71CFG*/ |
357 | #define R0900_DATA71CFG 0xf15f | 417 | #define R0900_DATA71CFG 0xf15f |
358 | #define F0900_DATA71_OPD 0xf15f0080 | 418 | #define F0900_DATA71_OPD 0xf15f0080 |
359 | #define F0900_DATA71_CONFIG 0xf15f007e | 419 | #define F0900_DATA71_CONFIG 0xf15f007e |
360 | #define F0900_DATA71_XOR 0xf15f0001 | 420 | #define F0900_DATA71_XOR 0xf15f0001 |
361 | 421 | ||
362 | /*ERROR2CFG*/ | 422 | /*ERROR2CFG*/ |
363 | #define R0900_ERROR2CFG 0xf160 | 423 | #define R0900_ERROR2CFG 0xf160 |
364 | #define F0900_ERROR2_OPD 0xf1600080 | 424 | #define F0900_ERROR2_OPD 0xf1600080 |
365 | #define F0900_ERROR2_CONFIG 0xf160007e | 425 | #define F0900_ERROR2_CONFIG 0xf160007e |
366 | #define F0900_ERROR2_XOR 0xf1600001 | 426 | #define F0900_ERROR2_XOR 0xf1600001 |
367 | 427 | ||
368 | /*DPN2CFG*/ | 428 | /*DPN2CFG*/ |
369 | #define R0900_DPN2CFG 0xf161 | 429 | #define R0900_DPN2CFG 0xf161 |
370 | #define F0900_DPN2_OPD 0xf1610080 | 430 | #define F0900_DPN2_OPD 0xf1610080 |
371 | #define F0900_DPN2_CONFIG 0xf161007e | 431 | #define F0900_DPN2_CONFIG 0xf161007e |
372 | #define F0900_DPN2_XOR 0xf1610001 | 432 | #define F0900_DPN2_XOR 0xf1610001 |
373 | 433 | ||
374 | /*STROUT2CFG*/ | 434 | /*STROUT2CFG*/ |
375 | #define R0900_STROUT2CFG 0xf162 | 435 | #define R0900_STROUT2CFG 0xf162 |
376 | #define F0900_STROUT2_OPD 0xf1620080 | 436 | #define F0900_STROUT2_OPD 0xf1620080 |
377 | #define F0900_STROUT2_CONFIG 0xf162007e | 437 | #define F0900_STROUT2_CONFIG 0xf162007e |
378 | #define F0900_STROUT2_XOR 0xf1620001 | 438 | #define F0900_STROUT2_XOR 0xf1620001 |
379 | 439 | ||
380 | /*CLKOUT2CFG*/ | 440 | /*CLKOUT2CFG*/ |
381 | #define R0900_CLKOUT2CFG 0xf163 | 441 | #define R0900_CLKOUT2CFG 0xf163 |
382 | #define F0900_CLKOUT2_OPD 0xf1630080 | 442 | #define F0900_CLKOUT2_OPD 0xf1630080 |
383 | #define F0900_CLKOUT2_CONFIG 0xf163007e | 443 | #define F0900_CLKOUT2_CONFIG 0xf163007e |
384 | #define F0900_CLKOUT2_XOR 0xf1630001 | 444 | #define F0900_CLKOUT2_XOR 0xf1630001 |
385 | 445 | ||
386 | /*DATA72CFG*/ | 446 | /*DATA72CFG*/ |
387 | #define R0900_DATA72CFG 0xf164 | 447 | #define R0900_DATA72CFG 0xf164 |
388 | #define F0900_DATA72_OPD 0xf1640080 | 448 | #define F0900_DATA72_OPD 0xf1640080 |
389 | #define F0900_DATA72_CONFIG 0xf164007e | 449 | #define F0900_DATA72_CONFIG 0xf164007e |
390 | #define F0900_DATA72_XOR 0xf1640001 | 450 | #define F0900_DATA72_XOR 0xf1640001 |
391 | 451 | ||
392 | /*ERROR3CFG*/ | 452 | /*ERROR3CFG*/ |
393 | #define R0900_ERROR3CFG 0xf165 | 453 | #define R0900_ERROR3CFG 0xf165 |
394 | #define F0900_ERROR3_OPD 0xf1650080 | 454 | #define F0900_ERROR3_OPD 0xf1650080 |
395 | #define F0900_ERROR3_CONFIG 0xf165007e | 455 | #define F0900_ERROR3_CONFIG 0xf165007e |
396 | #define F0900_ERROR3_XOR 0xf1650001 | 456 | #define F0900_ERROR3_XOR 0xf1650001 |
397 | 457 | ||
398 | /*DPN3CFG*/ | 458 | /*DPN3CFG*/ |
399 | #define R0900_DPN3CFG 0xf166 | 459 | #define R0900_DPN3CFG 0xf166 |
400 | #define F0900_DPN3_OPD 0xf1660080 | 460 | #define F0900_DPN3_OPD 0xf1660080 |
401 | #define F0900_DPN3_CONFIG 0xf166007e | 461 | #define F0900_DPN3_CONFIG 0xf166007e |
402 | #define F0900_DPN3_XOR 0xf1660001 | 462 | #define F0900_DPN3_XOR 0xf1660001 |
403 | 463 | ||
404 | /*STROUT3CFG*/ | 464 | /*STROUT3CFG*/ |
405 | #define R0900_STROUT3CFG 0xf167 | 465 | #define R0900_STROUT3CFG 0xf167 |
406 | #define F0900_STROUT3_OPD 0xf1670080 | 466 | #define F0900_STROUT3_OPD 0xf1670080 |
407 | #define F0900_STROUT3_CONFIG 0xf167007e | 467 | #define F0900_STROUT3_CONFIG 0xf167007e |
408 | #define F0900_STROUT3_XOR 0xf1670001 | 468 | #define F0900_STROUT3_XOR 0xf1670001 |
409 | 469 | ||
410 | /*CLKOUT3CFG*/ | 470 | /*CLKOUT3CFG*/ |
411 | #define R0900_CLKOUT3CFG 0xf168 | 471 | #define R0900_CLKOUT3CFG 0xf168 |
412 | #define F0900_CLKOUT3_OPD 0xf1680080 | 472 | #define F0900_CLKOUT3_OPD 0xf1680080 |
413 | #define F0900_CLKOUT3_CONFIG 0xf168007e | 473 | #define F0900_CLKOUT3_CONFIG 0xf168007e |
414 | #define F0900_CLKOUT3_XOR 0xf1680001 | 474 | #define F0900_CLKOUT3_XOR 0xf1680001 |
415 | 475 | ||
416 | /*DATA73CFG*/ | 476 | /*DATA73CFG*/ |
417 | #define R0900_DATA73CFG 0xf169 | 477 | #define R0900_DATA73CFG 0xf169 |
418 | #define F0900_DATA73_OPD 0xf1690080 | 478 | #define F0900_DATA73_OPD 0xf1690080 |
419 | #define F0900_DATA73_CONFIG 0xf169007e | 479 | #define F0900_DATA73_CONFIG 0xf169007e |
420 | #define F0900_DATA73_XOR 0xf1690001 | 480 | #define F0900_DATA73_XOR 0xf1690001 |
481 | |||
482 | /*STRSTATUS1*/ | ||
483 | #define R0900_STRSTATUS1 0xf16a | ||
484 | #define F0900_STRSTATUS_SEL2 0xf16a00f0 | ||
485 | #define F0900_STRSTATUS_SEL1 0xf16a000f | ||
486 | |||
487 | /*STRSTATUS2*/ | ||
488 | #define R0900_STRSTATUS2 0xf16b | ||
489 | #define F0900_STRSTATUS_SEL4 0xf16b00f0 | ||
490 | #define F0900_STRSTATUS_SEL3 0xf16b000f | ||
491 | |||
492 | /*STRSTATUS3*/ | ||
493 | #define R0900_STRSTATUS3 0xf16c | ||
494 | #define F0900_STRSTATUS_SEL6 0xf16c00f0 | ||
495 | #define F0900_STRSTATUS_SEL5 0xf16c000f | ||
421 | 496 | ||
422 | /*FSKTFC2*/ | 497 | /*FSKTFC2*/ |
423 | #define R0900_FSKTFC2 0xf170 | 498 | #define R0900_FSKTFC2 0xf170 |
424 | #define F0900_FSKT_KMOD 0xf17000fc | 499 | #define F0900_FSKT_KMOD 0xf17000fc |
425 | #define F0900_FSKT_CAR2 0xf1700003 | 500 | #define F0900_FSKT_CAR2 0xf1700003 |
426 | 501 | ||
427 | /*FSKTFC1*/ | 502 | /*FSKTFC1*/ |
428 | #define R0900_FSKTFC1 0xf171 | 503 | #define R0900_FSKTFC1 0xf171 |
429 | #define F0900_FSKT_CAR1 0xf17100ff | 504 | #define F0900_FSKT_CAR1 0xf17100ff |
430 | 505 | ||
431 | /*FSKTFC0*/ | 506 | /*FSKTFC0*/ |
432 | #define R0900_FSKTFC0 0xf172 | 507 | #define R0900_FSKTFC0 0xf172 |
433 | #define F0900_FSKT_CAR0 0xf17200ff | 508 | #define F0900_FSKT_CAR0 0xf17200ff |
434 | 509 | ||
435 | /*FSKTDELTAF1*/ | 510 | /*FSKTDELTAF1*/ |
436 | #define R0900_FSKTDELTAF1 0xf173 | 511 | #define R0900_FSKTDELTAF1 0xf173 |
437 | #define F0900_FSKT_DELTAF1 0xf173000f | 512 | #define F0900_FSKT_DELTAF1 0xf173000f |
438 | 513 | ||
439 | /*FSKTDELTAF0*/ | 514 | /*FSKTDELTAF0*/ |
440 | #define R0900_FSKTDELTAF0 0xf174 | 515 | #define R0900_FSKTDELTAF0 0xf174 |
441 | #define F0900_FSKT_DELTAF0 0xf17400ff | 516 | #define F0900_FSKT_DELTAF0 0xf17400ff |
442 | 517 | ||
443 | /*FSKTCTRL*/ | 518 | /*FSKTCTRL*/ |
444 | #define R0900_FSKTCTRL 0xf175 | 519 | #define R0900_FSKTCTRL 0xf175 |
445 | #define F0900_FSKT_EN_SGN 0xf1750040 | 520 | #define F0900_FSKT_EN_SGN 0xf1750040 |
446 | #define F0900_FSKT_MOD_SGN 0xf1750020 | 521 | #define F0900_FSKT_MOD_SGN 0xf1750020 |
447 | #define F0900_FSKT_MOD_EN 0xf175001c | 522 | #define F0900_FSKT_MOD_EN 0xf175001c |
448 | #define F0900_FSKT_DACMODE 0xf1750003 | 523 | #define F0900_FSKT_DACMODE 0xf1750003 |
449 | 524 | ||
450 | /*FSKRFC2*/ | 525 | /*FSKRFC2*/ |
451 | #define R0900_FSKRFC2 0xf176 | 526 | #define R0900_FSKRFC2 0xf176 |
452 | #define F0900_FSKR_DETSGN 0xf1760040 | 527 | #define F0900_FSKR_DETSGN 0xf1760040 |
453 | #define F0900_FSKR_OUTSGN 0xf1760020 | 528 | #define F0900_FSKR_OUTSGN 0xf1760020 |
454 | #define F0900_FSKR_KAGC 0xf176001c | 529 | #define F0900_FSKR_KAGC 0xf176001c |
455 | #define F0900_FSKR_CAR2 0xf1760003 | 530 | #define F0900_FSKR_CAR2 0xf1760003 |
456 | 531 | ||
457 | /*FSKRFC1*/ | 532 | /*FSKRFC1*/ |
458 | #define R0900_FSKRFC1 0xf177 | 533 | #define R0900_FSKRFC1 0xf177 |
459 | #define F0900_FSKR_CAR1 0xf17700ff | 534 | #define F0900_FSKR_CAR1 0xf17700ff |
460 | 535 | ||
461 | /*FSKRFC0*/ | 536 | /*FSKRFC0*/ |
462 | #define R0900_FSKRFC0 0xf178 | 537 | #define R0900_FSKRFC0 0xf178 |
463 | #define F0900_FSKR_CAR0 0xf17800ff | 538 | #define F0900_FSKR_CAR0 0xf17800ff |
464 | 539 | ||
465 | /*FSKRK1*/ | 540 | /*FSKRK1*/ |
466 | #define R0900_FSKRK1 0xf179 | 541 | #define R0900_FSKRK1 0xf179 |
467 | #define F0900_FSKR_K1_EXP 0xf17900e0 | 542 | #define F0900_FSKR_K1_EXP 0xf17900e0 |
468 | #define F0900_FSKR_K1_MANT 0xf179001f | 543 | #define F0900_FSKR_K1_MANT 0xf179001f |
469 | 544 | ||
470 | /*FSKRK2*/ | 545 | /*FSKRK2*/ |
471 | #define R0900_FSKRK2 0xf17a | 546 | #define R0900_FSKRK2 0xf17a |
472 | #define F0900_FSKR_K2_EXP 0xf17a00e0 | 547 | #define F0900_FSKR_K2_EXP 0xf17a00e0 |
473 | #define F0900_FSKR_K2_MANT 0xf17a001f | 548 | #define F0900_FSKR_K2_MANT 0xf17a001f |
474 | 549 | ||
475 | /*FSKRAGCR*/ | 550 | /*FSKRAGCR*/ |
476 | #define R0900_FSKRAGCR 0xf17b | 551 | #define R0900_FSKRAGCR 0xf17b |
477 | #define F0900_FSKR_OUTCTL 0xf17b00c0 | 552 | #define F0900_FSKR_OUTCTL 0xf17b00c0 |
478 | #define F0900_FSKR_AGC_REF 0xf17b003f | 553 | #define F0900_FSKR_AGC_REF 0xf17b003f |
479 | 554 | ||
480 | /*FSKRAGC*/ | 555 | /*FSKRAGC*/ |
481 | #define R0900_FSKRAGC 0xf17c | 556 | #define R0900_FSKRAGC 0xf17c |
482 | #define F0900_FSKR_AGC_ACCU 0xf17c00ff | 557 | #define F0900_FSKR_AGC_ACCU 0xf17c00ff |
483 | 558 | ||
484 | /*FSKRALPHA*/ | 559 | /*FSKRALPHA*/ |
485 | #define R0900_FSKRALPHA 0xf17d | 560 | #define R0900_FSKRALPHA 0xf17d |
486 | #define F0900_FSKR_ALPHA_EXP 0xf17d001c | 561 | #define F0900_FSKR_ALPHA_EXP 0xf17d001c |
487 | #define F0900_FSKR_ALPHA_M 0xf17d0003 | 562 | #define F0900_FSKR_ALPHA_M 0xf17d0003 |
488 | 563 | ||
489 | /*FSKRPLTH1*/ | 564 | /*FSKRPLTH1*/ |
490 | #define R0900_FSKRPLTH1 0xf17e | 565 | #define R0900_FSKRPLTH1 0xf17e |
491 | #define F0900_FSKR_BETA 0xf17e00f0 | 566 | #define F0900_FSKR_BETA 0xf17e00f0 |
492 | #define F0900_FSKR_PLL_TRESH1 0xf17e000f | 567 | #define F0900_FSKR_PLL_TRESH1 0xf17e000f |
493 | 568 | ||
494 | /*FSKRPLTH0*/ | 569 | /*FSKRPLTH0*/ |
495 | #define R0900_FSKRPLTH0 0xf17f | 570 | #define R0900_FSKRPLTH0 0xf17f |
496 | #define F0900_FSKR_PLL_TRESH0 0xf17f00ff | 571 | #define F0900_FSKR_PLL_TRESH0 0xf17f00ff |
497 | 572 | ||
498 | /*FSKRDF1*/ | 573 | /*FSKRDF1*/ |
499 | #define R0900_FSKRDF1 0xf180 | 574 | #define R0900_FSKRDF1 0xf180 |
500 | #define F0900_FSKR_OUT 0xf1800080 | 575 | #define F0900_FSKR_OUT 0xf1800080 |
501 | #define F0900_FSKR_DELTAF1 0xf180001f | 576 | #define F0900_FSKR_DELTAF1 0xf180001f |
502 | 577 | ||
503 | /*FSKRDF0*/ | 578 | /*FSKRDF0*/ |
504 | #define R0900_FSKRDF0 0xf181 | 579 | #define R0900_FSKRDF0 0xf181 |
505 | #define F0900_FSKR_DELTAF0 0xf18100ff | 580 | #define F0900_FSKR_DELTAF0 0xf18100ff |
506 | 581 | ||
507 | /*FSKRSTEPP*/ | 582 | /*FSKRSTEPP*/ |
508 | #define R0900_FSKRSTEPP 0xf182 | 583 | #define R0900_FSKRSTEPP 0xf182 |
509 | #define F0900_FSKR_STEP_PLUS 0xf18200ff | 584 | #define F0900_FSKR_STEP_PLUS 0xf18200ff |
510 | 585 | ||
511 | /*FSKRSTEPM*/ | 586 | /*FSKRSTEPM*/ |
512 | #define R0900_FSKRSTEPM 0xf183 | 587 | #define R0900_FSKRSTEPM 0xf183 |
513 | #define F0900_FSKR_STEP_MINUS 0xf18300ff | 588 | #define F0900_FSKR_STEP_MINUS 0xf18300ff |
514 | 589 | ||
515 | /*FSKRDET1*/ | 590 | /*FSKRDET1*/ |
516 | #define R0900_FSKRDET1 0xf184 | 591 | #define R0900_FSKRDET1 0xf184 |
517 | #define F0900_FSKR_DETECT 0xf1840080 | 592 | #define F0900_FSKR_DETECT 0xf1840080 |
518 | #define F0900_FSKR_CARDET_ACCU1 0xf184000f | 593 | #define F0900_FSKR_CARDET_ACCU1 0xf184000f |
519 | 594 | ||
520 | /*FSKRDET0*/ | 595 | /*FSKRDET0*/ |
521 | #define R0900_FSKRDET0 0xf185 | 596 | #define R0900_FSKRDET0 0xf185 |
522 | #define F0900_FSKR_CARDET_ACCU0 0xf18500ff | 597 | #define F0900_FSKR_CARDET_ACCU0 0xf18500ff |
523 | 598 | ||
524 | /*FSKRDTH1*/ | 599 | /*FSKRDTH1*/ |
525 | #define R0900_FSKRDTH1 0xf186 | 600 | #define R0900_FSKRDTH1 0xf186 |
526 | #define F0900_FSKR_CARLOSS_THRESH1 0xf18600f0 | 601 | #define F0900_FSKR_CARLOSS_THRESH1 0xf18600f0 |
527 | #define F0900_FSKR_CARDET_THRESH1 0xf186000f | 602 | #define F0900_FSKR_CARDET_THRESH1 0xf186000f |
528 | 603 | ||
529 | /*FSKRDTH0*/ | 604 | /*FSKRDTH0*/ |
530 | #define R0900_FSKRDTH0 0xf187 | 605 | #define R0900_FSKRDTH0 0xf187 |
531 | #define F0900_FSKR_CARDET_THRESH0 0xf18700ff | 606 | #define F0900_FSKR_CARDET_THRESH0 0xf18700ff |
532 | 607 | ||
533 | /*FSKRLOSS*/ | 608 | /*FSKRLOSS*/ |
534 | #define R0900_FSKRLOSS 0xf188 | 609 | #define R0900_FSKRLOSS 0xf188 |
535 | #define F0900_FSKR_CARLOSS_THRESH0 0xf18800ff | 610 | #define F0900_FSKR_CARLOSS_THRESH0 0xf18800ff |
536 | 611 | ||
537 | /*P2_DISTXCTL*/ | 612 | /*P2_DISTXCTL*/ |
538 | #define R0900_P2_DISTXCTL 0xf190 | 613 | #define R0900_P2_DISTXCTL 0xf190 |
539 | #define F0900_P2_TIM_OFF 0xf1900080 | 614 | #define F0900_P2_TIM_OFF 0xf1900080 |
540 | #define F0900_P2_DISEQC_RESET 0xf1900040 | 615 | #define F0900_P2_DISEQC_RESET 0xf1900040 |
541 | #define F0900_P2_TIM_CMD 0xf1900030 | 616 | #define F0900_P2_TIM_CMD 0xf1900030 |
542 | #define F0900_P2_DIS_PRECHARGE 0xf1900008 | 617 | #define F0900_P2_DIS_PRECHARGE 0xf1900008 |
543 | #define F0900_P2_DISTX_MODE 0xf1900007 | 618 | #define F0900_P2_DISTX_MODE 0xf1900007 |
544 | 619 | ||
545 | /*P2_DISRXCTL*/ | 620 | /*P2_DISRXCTL*/ |
546 | #define R0900_P2_DISRXCTL 0xf191 | 621 | #define R0900_P2_DISRXCTL 0xf191 |
547 | #define F0900_P2_RECEIVER_ON 0xf1910080 | 622 | #define F0900_P2_RECEIVER_ON 0xf1910080 |
548 | #define F0900_P2_IGNO_SHORT22K 0xf1910040 | 623 | #define F0900_P2_IGNO_SHORT22K 0xf1910040 |
549 | #define F0900_P2_ONECHIP_TRX 0xf1910020 | 624 | #define F0900_P2_ONECHIP_TRX 0xf1910020 |
550 | #define F0900_P2_EXT_ENVELOP 0xf1910010 | 625 | #define F0900_P2_EXT_ENVELOP 0xf1910010 |
551 | #define F0900_P2_PIN_SELECT 0xf191000c | 626 | #define F0900_P2_PIN_SELECT0 0xf191000c |
552 | #define F0900_P2_IRQ_RXEND 0xf1910002 | 627 | #define F0900_P2_IRQ_RXEND 0xf1910002 |
553 | #define F0900_P2_IRQ_4NBYTES 0xf1910001 | 628 | #define F0900_P2_IRQ_4NBYTES 0xf1910001 |
554 | 629 | ||
555 | /*P2_DISRX_ST0*/ | 630 | /*P2_DISRX_ST0*/ |
556 | #define R0900_P2_DISRX_ST0 0xf194 | 631 | #define R0900_P2_DISRX_ST0 0xf194 |
557 | #define F0900_P2_RX_END 0xf1940080 | 632 | #define F0900_P2_RX_END 0xf1940080 |
558 | #define F0900_P2_RX_ACTIVE 0xf1940040 | 633 | #define F0900_P2_RX_ACTIVE 0xf1940040 |
559 | #define F0900_P2_SHORT_22KHZ 0xf1940020 | 634 | #define F0900_P2_SHORT_22KHZ 0xf1940020 |
560 | #define F0900_P2_CONT_TONE 0xf1940010 | 635 | #define F0900_P2_CONT_TONE 0xf1940010 |
561 | #define F0900_P2_FIFO_4BREADY 0xf1940008 | 636 | #define F0900_P2_FIFO_4BREADY 0xf1940008 |
562 | #define F0900_P2_FIFO_EMPTY 0xf1940004 | 637 | #define F0900_P2_FIFO_EMPTY 0xf1940004 |
563 | #define F0900_P2_ABORT_DISRX 0xf1940001 | 638 | #define F0900_P2_ABORT_DISRX 0xf1940001 |
564 | 639 | ||
565 | /*P2_DISRX_ST1*/ | 640 | /*P2_DISRX_ST1*/ |
566 | #define R0900_P2_DISRX_ST1 0xf195 | 641 | #define R0900_P2_DISRX_ST1 0xf195 |
567 | #define F0900_P2_RX_FAIL 0xf1950080 | 642 | #define F0900_P2_RX_FAIL 0xf1950080 |
568 | #define F0900_P2_FIFO_PARITYFAIL 0xf1950040 | 643 | #define F0900_P2_FIFO_PARITYFAIL 0xf1950040 |
569 | #define F0900_P2_RX_NONBYTE 0xf1950020 | 644 | #define F0900_P2_RX_NONBYTE 0xf1950020 |
570 | #define F0900_P2_FIFO_OVERFLOW 0xf1950010 | 645 | #define F0900_P2_FIFO_OVERFLOW 0xf1950010 |
571 | #define F0900_P2_FIFO_BYTENBR 0xf195000f | 646 | #define F0900_P2_FIFO_BYTENBR 0xf195000f |
572 | 647 | ||
573 | /*P2_DISRXDATA*/ | 648 | /*P2_DISRXDATA*/ |
574 | #define R0900_P2_DISRXDATA 0xf196 | 649 | #define R0900_P2_DISRXDATA 0xf196 |
575 | #define F0900_P2_DISRX_DATA 0xf19600ff | 650 | #define F0900_P2_DISRX_DATA 0xf19600ff |
576 | 651 | ||
577 | /*P2_DISTXDATA*/ | 652 | /*P2_DISTXDATA*/ |
578 | #define R0900_P2_DISTXDATA 0xf197 | 653 | #define R0900_P2_DISTXDATA 0xf197 |
579 | #define F0900_P2_DISEQC_FIFO 0xf19700ff | 654 | #define F0900_P2_DISEQC_FIFO 0xf19700ff |
580 | 655 | ||
581 | /*P2_DISTXSTATUS*/ | 656 | /*P2_DISTXSTATUS*/ |
582 | #define R0900_P2_DISTXSTATUS 0xf198 | 657 | #define R0900_P2_DISTXSTATUS 0xf198 |
583 | #define F0900_P2_TX_FAIL 0xf1980080 | 658 | #define F0900_P2_TX_FAIL 0xf1980080 |
584 | #define F0900_P2_FIFO_FULL 0xf1980040 | 659 | #define F0900_P2_FIFO_FULL 0xf1980040 |
585 | #define F0900_P2_TX_IDLE 0xf1980020 | 660 | #define F0900_P2_TX_IDLE 0xf1980020 |
586 | #define F0900_P2_GAP_BURST 0xf1980010 | 661 | #define F0900_P2_GAP_BURST 0xf1980010 |
587 | #define F0900_P2_TXFIFO_BYTES 0xf198000f | 662 | #define F0900_P2_TXFIFO_BYTES 0xf198000f |
588 | 663 | ||
589 | /*P2_F22TX*/ | 664 | /*P2_F22TX*/ |
590 | #define R0900_P2_F22TX 0xf199 | 665 | #define R0900_P2_F22TX 0xf199 |
591 | #define F0900_P2_F22_REG 0xf19900ff | 666 | #define F0900_P2_F22_REG 0xf19900ff |
592 | 667 | ||
593 | /*P2_F22RX*/ | 668 | /*P2_F22RX*/ |
594 | #define R0900_P2_F22RX 0xf19a | 669 | #define R0900_P2_F22RX 0xf19a |
595 | #define F0900_P2_F22RX_REG 0xf19a00ff | 670 | #define F0900_P2_F22RX_REG 0xf19a00ff |
596 | 671 | ||
597 | /*P2_ACRPRESC*/ | 672 | /*P2_ACRPRESC*/ |
598 | #define R0900_P2_ACRPRESC 0xf19c | 673 | #define R0900_P2_ACRPRESC 0xf19c |
599 | #define F0900_P2_ACR_CODFRDY 0xf19c0008 | 674 | #define F0900_P2_ACR_PRESC 0xf19c0007 |
600 | #define F0900_P2_ACR_PRESC 0xf19c0007 | ||
601 | 675 | ||
602 | /*P2_ACRDIV*/ | 676 | /*P2_ACRDIV*/ |
603 | #define R0900_P2_ACRDIV 0xf19d | 677 | #define R0900_P2_ACRDIV 0xf19d |
604 | #define F0900_P2_ACR_DIV 0xf19d00ff | 678 | #define F0900_P2_ACR_DIV 0xf19d00ff |
605 | 679 | ||
606 | /*P1_DISTXCTL*/ | 680 | /*P1_DISTXCTL*/ |
607 | #define R0900_P1_DISTXCTL 0xf1a0 | 681 | #define R0900_P1_DISTXCTL 0xf1a0 |
608 | #define F0900_P1_TIM_OFF 0xf1a00080 | 682 | #define DISTXCTL shiftx(R0900_P1_DISTXCTL, demod, 0x10) |
609 | #define F0900_P1_DISEQC_RESET 0xf1a00040 | 683 | #define F0900_P1_TIM_OFF 0xf1a00080 |
610 | #define F0900_P1_TIM_CMD 0xf1a00030 | 684 | #define F0900_P1_DISEQC_RESET 0xf1a00040 |
611 | #define F0900_P1_DIS_PRECHARGE 0xf1a00008 | 685 | #define DISEQC_RESET shiftx(F0900_P1_DISEQC_RESET, demod, 0x100000) |
612 | #define F0900_P1_DISTX_MODE 0xf1a00007 | 686 | #define F0900_P1_TIM_CMD 0xf1a00030 |
687 | #define F0900_P1_DIS_PRECHARGE 0xf1a00008 | ||
688 | #define DIS_PRECHARGE shiftx(F0900_P1_DIS_PRECHARGE, demod, 0x100000) | ||
689 | #define F0900_P1_DISTX_MODE 0xf1a00007 | ||
690 | #define DISTX_MODE shiftx(F0900_P1_DISTX_MODE, demod, 0x100000) | ||
613 | 691 | ||
614 | /*P1_DISRXCTL*/ | 692 | /*P1_DISRXCTL*/ |
615 | #define R0900_P1_DISRXCTL 0xf1a1 | 693 | #define R0900_P1_DISRXCTL 0xf1a1 |
616 | #define F0900_P1_RECEIVER_ON 0xf1a10080 | 694 | #define DISRXCTL shiftx(R0900_P1_DISRXCTL, demod, 0x10) |
617 | #define F0900_P1_IGNO_SHORT22K 0xf1a10040 | 695 | #define F0900_P1_RECEIVER_ON 0xf1a10080 |
618 | #define F0900_P1_ONECHIP_TRX 0xf1a10020 | 696 | #define F0900_P1_IGNO_SHORT22K 0xf1a10040 |
619 | #define F0900_P1_EXT_ENVELOP 0xf1a10010 | 697 | #define F0900_P1_ONECHIP_TRX 0xf1a10020 |
620 | #define F0900_P1_PIN_SELECT 0xf1a1000c | 698 | #define F0900_P1_EXT_ENVELOP 0xf1a10010 |
621 | #define F0900_P1_IRQ_RXEND 0xf1a10002 | 699 | #define F0900_P1_PIN_SELECT0 0xf1a1000c |
622 | #define F0900_P1_IRQ_4NBYTES 0xf1a10001 | 700 | #define F0900_P1_IRQ_RXEND 0xf1a10002 |
701 | #define F0900_P1_IRQ_4NBYTES 0xf1a10001 | ||
623 | 702 | ||
624 | /*P1_DISRX_ST0*/ | 703 | /*P1_DISRX_ST0*/ |
625 | #define R0900_P1_DISRX_ST0 0xf1a4 | 704 | #define R0900_P1_DISRX_ST0 0xf1a4 |
626 | #define F0900_P1_RX_END 0xf1a40080 | 705 | #define DISRX_ST0 shiftx(R0900_P1_DISRX_ST0, demod, 0x10) |
627 | #define F0900_P1_RX_ACTIVE 0xf1a40040 | 706 | #define F0900_P1_RX_END 0xf1a40080 |
628 | #define F0900_P1_SHORT_22KHZ 0xf1a40020 | 707 | #define RX_END shiftx(F0900_P1_RX_END, demod, 0x100000) |
629 | #define F0900_P1_CONT_TONE 0xf1a40010 | 708 | #define F0900_P1_RX_ACTIVE 0xf1a40040 |
630 | #define F0900_P1_FIFO_4BREADY 0xf1a40008 | 709 | #define F0900_P1_SHORT_22KHZ 0xf1a40020 |
631 | #define F0900_P1_FIFO_EMPTY 0xf1a40004 | 710 | #define F0900_P1_CONT_TONE 0xf1a40010 |
632 | #define F0900_P1_ABORT_DISRX 0xf1a40001 | 711 | #define F0900_P1_FIFO_4BREADY 0xf1a40008 |
712 | #define F0900_P1_FIFO_EMPTY 0xf1a40004 | ||
713 | #define F0900_P1_ABORT_DISRX 0xf1a40001 | ||
633 | 714 | ||
634 | /*P1_DISRX_ST1*/ | 715 | /*P1_DISRX_ST1*/ |
635 | #define R0900_P1_DISRX_ST1 0xf1a5 | 716 | #define R0900_P1_DISRX_ST1 0xf1a5 |
636 | #define F0900_P1_RX_FAIL 0xf1a50080 | 717 | #define DISRX_ST1 shiftx(R0900_P1_DISRX_ST1, demod, 0x10) |
637 | #define F0900_P1_FIFO_PARITYFAIL 0xf1a50040 | 718 | #define F0900_P1_RX_FAIL 0xf1a50080 |
638 | #define F0900_P1_RX_NONBYTE 0xf1a50020 | 719 | #define F0900_P1_FIFO_PARITYFAIL 0xf1a50040 |
639 | #define F0900_P1_FIFO_OVERFLOW 0xf1a50010 | 720 | #define F0900_P1_RX_NONBYTE 0xf1a50020 |
640 | #define F0900_P1_FIFO_BYTENBR 0xf1a5000f | 721 | #define F0900_P1_FIFO_OVERFLOW 0xf1a50010 |
722 | #define F0900_P1_FIFO_BYTENBR 0xf1a5000f | ||
723 | #define FIFO_BYTENBR shiftx(F0900_P1_FIFO_BYTENBR, demod, 0x100000) | ||
641 | 724 | ||
642 | /*P1_DISRXDATA*/ | 725 | /*P1_DISRXDATA*/ |
643 | #define R0900_P1_DISRXDATA 0xf1a6 | 726 | #define R0900_P1_DISRXDATA 0xf1a6 |
644 | #define F0900_P1_DISRX_DATA 0xf1a600ff | 727 | #define DISRXDATA shiftx(R0900_P1_DISRXDATA, demod, 0x10) |
728 | #define F0900_P1_DISRX_DATA 0xf1a600ff | ||
645 | 729 | ||
646 | /*P1_DISTXDATA*/ | 730 | /*P1_DISTXDATA*/ |
647 | #define R0900_P1_DISTXDATA 0xf1a7 | 731 | #define R0900_P1_DISTXDATA 0xf1a7 |
648 | #define F0900_P1_DISEQC_FIFO 0xf1a700ff | 732 | #define DISTXDATA shiftx(R0900_P1_DISTXDATA, demod, 0x10) |
733 | #define F0900_P1_DISEQC_FIFO 0xf1a700ff | ||
649 | 734 | ||
650 | /*P1_DISTXSTATUS*/ | 735 | /*P1_DISTXSTATUS*/ |
651 | #define R0900_P1_DISTXSTATUS 0xf1a8 | 736 | #define R0900_P1_DISTXSTATUS 0xf1a8 |
652 | #define F0900_P1_TX_FAIL 0xf1a80080 | 737 | #define F0900_P1_TX_FAIL 0xf1a80080 |
653 | #define F0900_P1_FIFO_FULL 0xf1a80040 | 738 | #define F0900_P1_FIFO_FULL 0xf1a80040 |
654 | #define F0900_P1_TX_IDLE 0xf1a80020 | 739 | #define FIFO_FULL shiftx(F0900_P1_FIFO_FULL, demod, 0x100000) |
655 | #define F0900_P1_GAP_BURST 0xf1a80010 | 740 | #define F0900_P1_TX_IDLE 0xf1a80020 |
656 | #define F0900_P1_TXFIFO_BYTES 0xf1a8000f | 741 | #define TX_IDLE shiftx(F0900_P1_TX_IDLE, demod, 0x100000) |
742 | #define F0900_P1_GAP_BURST 0xf1a80010 | ||
743 | #define F0900_P1_TXFIFO_BYTES 0xf1a8000f | ||
657 | 744 | ||
658 | /*P1_F22TX*/ | 745 | /*P1_F22TX*/ |
659 | #define R0900_P1_F22TX 0xf1a9 | 746 | #define R0900_P1_F22TX 0xf1a9 |
660 | #define F0900_P1_F22_REG 0xf1a900ff | 747 | #define F22TX shiftx(R0900_P1_F22TX, demod, 0x10) |
748 | #define F0900_P1_F22_REG 0xf1a900ff | ||
661 | 749 | ||
662 | /*P1_F22RX*/ | 750 | /*P1_F22RX*/ |
663 | #define R0900_P1_F22RX 0xf1aa | 751 | #define R0900_P1_F22RX 0xf1aa |
664 | #define F0900_P1_F22RX_REG 0xf1aa00ff | 752 | #define F22RX shiftx(R0900_P1_F22RX, demod, 0x10) |
753 | #define F0900_P1_F22RX_REG 0xf1aa00ff | ||
665 | 754 | ||
666 | /*P1_ACRPRESC*/ | 755 | /*P1_ACRPRESC*/ |
667 | #define R0900_P1_ACRPRESC 0xf1ac | 756 | #define R0900_P1_ACRPRESC 0xf1ac |
668 | #define F0900_P1_ACR_CODFRDY 0xf1ac0008 | 757 | #define ACRPRESC shiftx(R0900_P1_ACRPRESC, demod, 0x10) |
669 | #define F0900_P1_ACR_PRESC 0xf1ac0007 | 758 | #define F0900_P1_ACR_PRESC 0xf1ac0007 |
670 | 759 | ||
671 | /*P1_ACRDIV*/ | 760 | /*P1_ACRDIV*/ |
672 | #define R0900_P1_ACRDIV 0xf1ad | 761 | #define R0900_P1_ACRDIV 0xf1ad |
673 | #define F0900_P1_ACR_DIV 0xf1ad00ff | 762 | #define ACRDIV shiftx(R0900_P1_ACRDIV, demod, 0x10) |
763 | #define F0900_P1_ACR_DIV 0xf1ad00ff | ||
674 | 764 | ||
675 | /*NCOARSE*/ | 765 | /*NCOARSE*/ |
676 | #define R0900_NCOARSE 0xf1b3 | 766 | #define R0900_NCOARSE 0xf1b3 |
677 | #define F0900_M_DIV 0xf1b300ff | 767 | #define F0900_M_DIV 0xf1b300ff |
678 | 768 | ||
679 | /*SYNTCTRL*/ | 769 | /*SYNTCTRL*/ |
680 | #define R0900_SYNTCTRL 0xf1b6 | 770 | #define R0900_SYNTCTRL 0xf1b6 |
681 | #define F0900_STANDBY 0xf1b60080 | 771 | #define F0900_STANDBY 0xf1b60080 |
682 | #define F0900_BYPASSPLLCORE 0xf1b60040 | 772 | #define F0900_BYPASSPLLCORE 0xf1b60040 |
683 | #define F0900_SELX1RATIO 0xf1b60020 | 773 | #define F0900_SELX1RATIO 0xf1b60020 |
684 | #define F0900_I2C_TUD 0xf1b60010 | 774 | #define F0900_STOP_PLL 0xf1b60008 |
685 | #define F0900_STOP_PLL 0xf1b60008 | 775 | #define F0900_BYPASSPLLFSK 0xf1b60004 |
686 | #define F0900_BYPASSPLLFSK 0xf1b60004 | 776 | #define F0900_SELOSCI 0xf1b60002 |
687 | #define F0900_SELOSCI 0xf1b60002 | 777 | #define F0900_BYPASSPLLADC 0xf1b60001 |
688 | #define F0900_BYPASSPLLADC 0xf1b60001 | ||
689 | 778 | ||
690 | /*FILTCTRL*/ | 779 | /*FILTCTRL*/ |
691 | #define R0900_FILTCTRL 0xf1b7 | 780 | #define R0900_FILTCTRL 0xf1b7 |
692 | #define F0900_INV_CLK135 0xf1b70080 | 781 | #define F0900_INV_CLK135 0xf1b70080 |
693 | #define F0900_PERM_BYPDIS 0xf1b70040 | 782 | #define F0900_SEL_FSKCKDIV 0xf1b70004 |
694 | #define F0900_SEL_FSKCKDIV 0xf1b70004 | 783 | #define F0900_INV_CLKFSK 0xf1b70002 |
695 | #define F0900_INV_CLKFSK 0xf1b70002 | 784 | #define F0900_BYPASS_APPLI 0xf1b70001 |
696 | #define F0900_BYPASS_APPLI 0xf1b70001 | ||
697 | 785 | ||
698 | /*PLLSTAT*/ | 786 | /*PLLSTAT*/ |
699 | #define R0900_PLLSTAT 0xf1b8 | 787 | #define R0900_PLLSTAT 0xf1b8 |
700 | #define F0900_ACM_SEL 0xf1b80080 | 788 | #define F0900_PLLLOCK 0xf1b80001 |
701 | #define F0900_DTV_SEL 0xf1b80040 | ||
702 | #define F0900_PLLLOCK 0xf1b80001 | ||
703 | 789 | ||
704 | /*STOPCLK1*/ | 790 | /*STOPCLK1*/ |
705 | #define R0900_STOPCLK1 0xf1c2 | 791 | #define R0900_STOPCLK1 0xf1c2 |
706 | #define F0900_STOP_CLKPKDT2 0xf1c20040 | 792 | #define F0900_STOP_CLKPKDT2 0xf1c20040 |
707 | #define F0900_STOP_CLKPKDT1 0xf1c20020 | 793 | #define F0900_STOP_CLKPKDT1 0xf1c20020 |
708 | #define F0900_STOP_CLKFEC 0xf1c20010 | 794 | #define F0900_STOP_CLKFEC 0xf1c20010 |
709 | #define F0900_STOP_CLKADCI2 0xf1c20008 | 795 | #define F0900_STOP_CLKADCI2 0xf1c20008 |
710 | #define F0900_INV_CLKADCI2 0xf1c20004 | 796 | #define F0900_INV_CLKADCI2 0xf1c20004 |
711 | #define F0900_STOP_CLKADCI1 0xf1c20002 | 797 | #define F0900_STOP_CLKADCI1 0xf1c20002 |
712 | #define F0900_INV_CLKADCI1 0xf1c20001 | 798 | #define F0900_INV_CLKADCI1 0xf1c20001 |
713 | 799 | ||
714 | /*STOPCLK2*/ | 800 | /*STOPCLK2*/ |
715 | #define R0900_STOPCLK2 0xf1c3 | 801 | #define R0900_STOPCLK2 0xf1c3 |
716 | #define F0900_STOP_CLKSAMP2 0xf1c30010 | 802 | #define F0900_STOP_CLKSAMP2 0xf1c30010 |
717 | #define F0900_STOP_CLKSAMP1 0xf1c30008 | 803 | #define F0900_STOP_CLKSAMP1 0xf1c30008 |
718 | #define F0900_STOP_CLKVIT2 0xf1c30004 | 804 | #define F0900_STOP_CLKVIT2 0xf1c30004 |
719 | #define F0900_STOP_CLKVIT1 0xf1c30002 | 805 | #define F0900_STOP_CLKVIT1 0xf1c30002 |
720 | #define F0900_STOP_CLKTS 0xf1c30001 | 806 | #define STOP_CLKVIT shiftx(F0900_STOP_CLKVIT1, demod, -2) |
807 | #define F0900_STOP_CLKTS 0xf1c30001 | ||
721 | 808 | ||
722 | /*TSTTNR0*/ | 809 | /*TSTTNR0*/ |
723 | #define R0900_TSTTNR0 0xf1df | 810 | #define R0900_TSTTNR0 0xf1df |
724 | #define F0900_SEL_FSK 0xf1df0080 | 811 | #define F0900_SEL_FSK 0xf1df0080 |
725 | #define F0900_FSK_PON 0xf1df0004 | 812 | #define F0900_FSK_PON 0xf1df0004 |
726 | #define F0900_FSK_OPENLOOP 0xf1df0002 | ||
727 | 813 | ||
728 | /*TSTTNR1*/ | 814 | /*TSTTNR1*/ |
729 | #define R0900_TSTTNR1 0xf1e0 | 815 | #define R0900_TSTTNR1 0xf1e0 |
730 | #define F0900_BYPASS_ADC1 0xf1e00080 | 816 | #define F0900_ADC1_PON 0xf1e00002 |
731 | #define F0900_INVADC1_CKOUT 0xf1e00040 | 817 | #define F0900_ADC1_INMODE 0xf1e00001 |
732 | #define F0900_SELIQSRC1 0xf1e00030 | ||
733 | #define F0900_ADC1_PON 0xf1e00002 | ||
734 | #define F0900_ADC1_INMODE 0xf1e00001 | ||
735 | 818 | ||
736 | /*TSTTNR2*/ | 819 | /*TSTTNR2*/ |
737 | #define R0900_TSTTNR2 0xf1e1 | 820 | #define R0900_TSTTNR2 0xf1e1 |
738 | #define F0900_DISEQC1_PON 0xf1e10020 | 821 | #define F0900_DISEQC1_PON 0xf1e10020 |
739 | #define F0900_DISEQC1_TEST 0xf1e1001f | ||
740 | 822 | ||
741 | /*TSTTNR3*/ | 823 | /*TSTTNR3*/ |
742 | #define R0900_TSTTNR3 0xf1e2 | 824 | #define R0900_TSTTNR3 0xf1e2 |
743 | #define F0900_BYPASS_ADC2 0xf1e20080 | 825 | #define F0900_ADC2_PON 0xf1e20002 |
744 | #define F0900_INVADC2_CKOUT 0xf1e20040 | 826 | #define F0900_ADC2_INMODE 0xf1e20001 |
745 | #define F0900_SELIQSRC2 0xf1e20030 | ||
746 | #define F0900_ADC2_PON 0xf1e20002 | ||
747 | #define F0900_ADC2_INMODE 0xf1e20001 | ||
748 | 827 | ||
749 | /*TSTTNR4*/ | 828 | /*TSTTNR4*/ |
750 | #define R0900_TSTTNR4 0xf1e3 | 829 | #define R0900_TSTTNR4 0xf1e3 |
751 | #define F0900_DISEQC2_PON 0xf1e30020 | 830 | #define F0900_DISEQC2_PON 0xf1e30020 |
752 | #define F0900_DISEQC2_TEST 0xf1e3001f | ||
753 | 831 | ||
754 | /*P2_IQCONST*/ | 832 | /*P2_IQCONST*/ |
755 | #define R0900_P2_IQCONST 0xf200 | 833 | #define R0900_P2_IQCONST 0xf200 |
756 | #define F0900_P2_CONSTEL_SELECT 0xf2000060 | 834 | #define F0900_P2_CONSTEL_SELECT 0xf2000060 |
757 | #define F0900_P2_IQSYMB_SEL 0xf200001f | 835 | #define F0900_P2_IQSYMB_SEL 0xf200001f |
758 | 836 | ||
759 | /*P2_NOSCFG*/ | 837 | /*P2_NOSCFG*/ |
760 | #define R0900_P2_NOSCFG 0xf201 | 838 | #define R0900_P2_NOSCFG 0xf201 |
761 | #define F0900_P2_DUMMYPL_NOSDATA 0xf2010020 | 839 | #define F0900_P2_DUMMYPL_NOSDATA 0xf2010020 |
762 | #define F0900_P2_NOSPLH_BETA 0xf2010018 | 840 | #define F0900_P2_NOSPLH_BETA 0xf2010018 |
763 | #define F0900_P2_NOSDATA_BETA 0xf2010007 | 841 | #define F0900_P2_NOSDATA_BETA 0xf2010007 |
764 | 842 | ||
765 | /*P2_ISYMB*/ | 843 | /*P2_ISYMB*/ |
766 | #define R0900_P2_ISYMB 0xf202 | 844 | #define R0900_P2_ISYMB 0xf202 |
767 | #define F0900_P2_I_SYMBOL 0xf20201ff | 845 | #define F0900_P2_I_SYMBOL 0xf20201ff |
768 | 846 | ||
769 | /*P2_QSYMB*/ | 847 | /*P2_QSYMB*/ |
770 | #define R0900_P2_QSYMB 0xf203 | 848 | #define R0900_P2_QSYMB 0xf203 |
771 | #define F0900_P2_Q_SYMBOL 0xf20301ff | 849 | #define F0900_P2_Q_SYMBOL 0xf20301ff |
772 | 850 | ||
773 | /*P2_AGC1CFG*/ | 851 | /*P2_AGC1CFG*/ |
774 | #define R0900_P2_AGC1CFG 0xf204 | 852 | #define R0900_P2_AGC1CFG 0xf204 |
775 | #define F0900_P2_DC_FROZEN 0xf2040080 | 853 | #define F0900_P2_DC_FROZEN 0xf2040080 |
776 | #define F0900_P2_DC_CORRECT 0xf2040040 | 854 | #define F0900_P2_DC_CORRECT 0xf2040040 |
777 | #define F0900_P2_AMM_FROZEN 0xf2040020 | 855 | #define F0900_P2_AMM_FROZEN 0xf2040020 |
778 | #define F0900_P2_AMM_CORRECT 0xf2040010 | 856 | #define F0900_P2_AMM_CORRECT 0xf2040010 |
779 | #define F0900_P2_QUAD_FROZEN 0xf2040008 | 857 | #define F0900_P2_QUAD_FROZEN 0xf2040008 |
780 | #define F0900_P2_QUAD_CORRECT 0xf2040004 | 858 | #define F0900_P2_QUAD_CORRECT 0xf2040004 |
781 | #define F0900_P2_DCCOMP_SLOW 0xf2040002 | ||
782 | #define F0900_P2_IQMISM_SLOW 0xf2040001 | ||
783 | 859 | ||
784 | /*P2_AGC1CN*/ | 860 | /*P2_AGC1CN*/ |
785 | #define R0900_P2_AGC1CN 0xf206 | 861 | #define R0900_P2_AGC1CN 0xf206 |
786 | #define F0900_P2_AGC1_LOCKED 0xf2060080 | 862 | #define F0900_P2_AGC1_LOCKED 0xf2060080 |
787 | #define F0900_P2_AGC1_OVERFLOW 0xf2060040 | 863 | #define F0900_P2_AGC1_MINPOWER 0xf2060010 |
788 | #define F0900_P2_AGC1_NOSLOWLK 0xf2060020 | 864 | #define F0900_P2_AGCOUT_FAST 0xf2060008 |
789 | #define F0900_P2_AGC1_MINPOWER 0xf2060010 | 865 | #define F0900_P2_AGCIQ_BETA 0xf2060007 |
790 | #define F0900_P2_AGCOUT_FAST 0xf2060008 | ||
791 | #define F0900_P2_AGCIQ_BETA 0xf2060007 | ||
792 | 866 | ||
793 | /*P2_AGC1REF*/ | 867 | /*P2_AGC1REF*/ |
794 | #define R0900_P2_AGC1REF 0xf207 | 868 | #define R0900_P2_AGC1REF 0xf207 |
795 | #define F0900_P2_AGCIQ_REF 0xf20700ff | 869 | #define F0900_P2_AGCIQ_REF 0xf20700ff |
796 | 870 | ||
797 | /*P2_IDCCOMP*/ | 871 | /*P2_IDCCOMP*/ |
798 | #define R0900_P2_IDCCOMP 0xf208 | 872 | #define R0900_P2_IDCCOMP 0xf208 |
799 | #define F0900_P2_IAVERAGE_ADJ 0xf20801ff | 873 | #define F0900_P2_IAVERAGE_ADJ 0xf20801ff |
800 | 874 | ||
801 | /*P2_QDCCOMP*/ | 875 | /*P2_QDCCOMP*/ |
802 | #define R0900_P2_QDCCOMP 0xf209 | 876 | #define R0900_P2_QDCCOMP 0xf209 |
803 | #define F0900_P2_QAVERAGE_ADJ 0xf20901ff | 877 | #define F0900_P2_QAVERAGE_ADJ 0xf20901ff |
804 | 878 | ||
805 | /*P2_POWERI*/ | 879 | /*P2_POWERI*/ |
806 | #define R0900_P2_POWERI 0xf20a | 880 | #define R0900_P2_POWERI 0xf20a |
807 | #define F0900_P2_POWER_I 0xf20a00ff | 881 | #define F0900_P2_POWER_I 0xf20a00ff |
808 | 882 | ||
809 | /*P2_POWERQ*/ | 883 | /*P2_POWERQ*/ |
810 | #define R0900_P2_POWERQ 0xf20b | 884 | #define R0900_P2_POWERQ 0xf20b |
811 | #define F0900_P2_POWER_Q 0xf20b00ff | 885 | #define F0900_P2_POWER_Q 0xf20b00ff |
812 | 886 | ||
813 | /*P2_AGC1AMM*/ | 887 | /*P2_AGC1AMM*/ |
814 | #define R0900_P2_AGC1AMM 0xf20c | 888 | #define R0900_P2_AGC1AMM 0xf20c |
815 | #define F0900_P2_AMM_VALUE 0xf20c00ff | 889 | #define F0900_P2_AMM_VALUE 0xf20c00ff |
816 | 890 | ||
817 | /*P2_AGC1QUAD*/ | 891 | /*P2_AGC1QUAD*/ |
818 | #define R0900_P2_AGC1QUAD 0xf20d | 892 | #define R0900_P2_AGC1QUAD 0xf20d |
819 | #define F0900_P2_QUAD_VALUE 0xf20d01ff | 893 | #define F0900_P2_QUAD_VALUE 0xf20d01ff |
820 | 894 | ||
821 | /*P2_AGCIQIN1*/ | 895 | /*P2_AGCIQIN1*/ |
822 | #define R0900_P2_AGCIQIN1 0xf20e | 896 | #define R0900_P2_AGCIQIN1 0xf20e |
823 | #define F0900_P2_AGCIQ_VALUE1 0xf20e00ff | 897 | #define F0900_P2_AGCIQ_VALUE1 0xf20e00ff |
824 | 898 | ||
825 | /*P2_AGCIQIN0*/ | 899 | /*P2_AGCIQIN0*/ |
826 | #define R0900_P2_AGCIQIN0 0xf20f | 900 | #define R0900_P2_AGCIQIN0 0xf20f |
827 | #define F0900_P2_AGCIQ_VALUE0 0xf20f00ff | 901 | #define F0900_P2_AGCIQ_VALUE0 0xf20f00ff |
828 | 902 | ||
829 | /*P2_DEMOD*/ | 903 | /*P2_DEMOD*/ |
830 | #define R0900_P2_DEMOD 0xf210 | 904 | #define R0900_P2_DEMOD 0xf210 |
831 | #define F0900_P2_DEMOD_STOP 0xf2100040 | 905 | #define F0900_P2_MANUALS2_ROLLOFF 0xf2100080 |
832 | #define F0900_P2_SPECINV_CONTROL 0xf2100030 | 906 | #define F0900_P2_SPECINV_CONTROL 0xf2100030 |
833 | #define F0900_P2_FORCE_ENASAMP 0xf2100008 | 907 | #define F0900_P2_FORCE_ENASAMP 0xf2100008 |
834 | #define F0900_P2_MANUAL_ROLLOFF 0xf2100004 | 908 | #define F0900_P2_MANUALSX_ROLLOFF 0xf2100004 |
835 | #define F0900_P2_ROLLOFF_CONTROL 0xf2100003 | 909 | #define F0900_P2_ROLLOFF_CONTROL 0xf2100003 |
836 | 910 | ||
837 | /*P2_DMDMODCOD*/ | 911 | /*P2_DMDMODCOD*/ |
838 | #define R0900_P2_DMDMODCOD 0xf211 | 912 | #define R0900_P2_DMDMODCOD 0xf211 |
839 | #define F0900_P2_MANUAL_MODCOD 0xf2110080 | 913 | #define F0900_P2_MANUAL_MODCOD 0xf2110080 |
840 | #define F0900_P2_DEMOD_MODCOD 0xf211007c | 914 | #define F0900_P2_DEMOD_MODCOD 0xf211007c |
841 | #define F0900_P2_DEMOD_TYPE 0xf2110003 | 915 | #define F0900_P2_DEMOD_TYPE 0xf2110003 |
842 | 916 | ||
843 | /*P2_DSTATUS*/ | 917 | /*P2_DSTATUS*/ |
844 | #define R0900_P2_DSTATUS 0xf212 | 918 | #define R0900_P2_DSTATUS 0xf212 |
845 | #define F0900_P2_CAR_LOCK 0xf2120080 | 919 | #define F0900_P2_CAR_LOCK 0xf2120080 |
846 | #define F0900_P2_TMGLOCK_QUALITY 0xf2120060 | 920 | #define F0900_P2_TMGLOCK_QUALITY 0xf2120060 |
847 | #define F0900_P2_SDVBS1_ENABLE 0xf2120010 | 921 | #define F0900_P2_LOCK_DEFINITIF 0xf2120008 |
848 | #define F0900_P2_LOCK_DEFINITIF 0xf2120008 | 922 | #define F0900_P2_OVADC_DETECT 0xf2120001 |
849 | #define F0900_P2_TIMING_IS_LOCKED 0xf2120004 | ||
850 | #define F0900_P2_COARSE_TMGLOCK 0xf2120002 | ||
851 | #define F0900_P2_COARSE_CARLOCK 0xf2120001 | ||
852 | 923 | ||
853 | /*P2_DSTATUS2*/ | 924 | /*P2_DSTATUS2*/ |
854 | #define R0900_P2_DSTATUS2 0xf213 | 925 | #define R0900_P2_DSTATUS2 0xf213 |
855 | #define F0900_P2_DEMOD_DELOCK 0xf2130080 | 926 | #define F0900_P2_DEMOD_DELOCK 0xf2130080 |
856 | #define F0900_P2_DEMOD_TIMEOUT 0xf2130040 | 927 | #define F0900_P2_AGC1_NOSIGNALACK 0xf2130008 |
857 | #define F0900_P2_MODCODRQ_SYNCTAG 0xf2130020 | 928 | #define F0900_P2_AGC2_OVERFLOW 0xf2130004 |
858 | #define F0900_P2_POLYPH_SATEVENT 0xf2130010 | 929 | #define F0900_P2_CFR_OVERFLOW 0xf2130002 |
859 | #define F0900_P2_AGC1_NOSIGNALACK 0xf2130008 | 930 | #define F0900_P2_GAMMA_OVERUNDER 0xf2130001 |
860 | #define F0900_P2_AGC2_OVERFLOW 0xf2130004 | ||
861 | #define F0900_P2_CFR_OVERFLOW 0xf2130002 | ||
862 | #define F0900_P2_GAMMA_OVERUNDER 0xf2130001 | ||
863 | 931 | ||
864 | /*P2_DMDCFGMD*/ | 932 | /*P2_DMDCFGMD*/ |
865 | #define R0900_P2_DMDCFGMD 0xf214 | 933 | #define R0900_P2_DMDCFGMD 0xf214 |
866 | #define F0900_P2_DVBS2_ENABLE 0xf2140080 | 934 | #define F0900_P2_DVBS2_ENABLE 0xf2140080 |
867 | #define F0900_P2_DVBS1_ENABLE 0xf2140040 | 935 | #define F0900_P2_DVBS1_ENABLE 0xf2140040 |
868 | #define F0900_P2_CFR_AUTOSCAN 0xf2140020 | 936 | #define F0900_P2_SCAN_ENABLE 0xf2140010 |
869 | #define F0900_P2_SCAN_ENABLE 0xf2140010 | 937 | #define F0900_P2_CFR_AUTOSCAN 0xf2140008 |
870 | #define F0900_P2_TUN_AUTOSCAN 0xf2140008 | 938 | #define F0900_P2_TUN_RNG 0xf2140003 |
871 | #define F0900_P2_NOFORCE_RELOCK 0xf2140004 | ||
872 | #define F0900_P2_TUN_RNG 0xf2140003 | ||
873 | 939 | ||
874 | /*P2_DMDCFG2*/ | 940 | /*P2_DMDCFG2*/ |
875 | #define R0900_P2_DMDCFG2 0xf215 | 941 | #define R0900_P2_DMDCFG2 0xf215 |
876 | #define F0900_P2_AGC1_WAITLOCK 0xf2150080 | 942 | #define F0900_P2_S1S2_SEQUENTIAL 0xf2150040 |
877 | #define F0900_P2_S1S2_SEQUENTIAL 0xf2150040 | 943 | #define F0900_P2_INFINITE_RELOCK 0xf2150010 |
878 | #define F0900_P2_OVERFLOW_TIMEOUT 0xf2150020 | ||
879 | #define F0900_P2_SCANFAIL_TIMEOUT 0xf2150010 | ||
880 | #define F0900_P2_DMDTOUT_BACK 0xf2150008 | ||
881 | #define F0900_P2_CARLOCK_S1ENABLE 0xf2150004 | ||
882 | #define F0900_P2_COARSE_LK3MODE 0xf2150002 | ||
883 | #define F0900_P2_COARSE_LK2MODE 0xf2150001 | ||
884 | 944 | ||
885 | /*P2_DMDISTATE*/ | 945 | /*P2_DMDISTATE*/ |
886 | #define R0900_P2_DMDISTATE 0xf216 | 946 | #define R0900_P2_DMDISTATE 0xf216 |
887 | #define F0900_P2_I2C_NORESETDMODE 0xf2160080 | 947 | #define F0900_P2_I2C_DEMOD_MODE 0xf216001f |
888 | #define F0900_P2_FORCE_ETAPED 0xf2160040 | ||
889 | #define F0900_P2_SDMDRST_DIRCLK 0xf2160020 | ||
890 | #define F0900_P2_I2C_DEMOD_MODE 0xf216001f | ||
891 | 948 | ||
892 | /*P2_DMDT0M*/ | 949 | /*P2_DMDT0M*/ |
893 | #define R0900_P2_DMDT0M 0xf217 | 950 | #define R0900_P2_DMDT0M 0xf217 |
894 | #define F0900_P2_DMDT0_MIN 0xf21700ff | 951 | #define F0900_P2_DMDT0_MIN 0xf21700ff |
895 | 952 | ||
896 | /*P2_DMDSTATE*/ | 953 | /*P2_DMDSTATE*/ |
897 | #define R0900_P2_DMDSTATE 0xf21b | 954 | #define R0900_P2_DMDSTATE 0xf21b |
898 | #define F0900_P2_DEMOD_LOCKED 0xf21b0080 | 955 | #define F0900_P2_HEADER_MODE 0xf21b0060 |
899 | #define F0900_P2_HEADER_MODE 0xf21b0060 | ||
900 | #define F0900_P2_DEMOD_MODE 0xf21b001f | ||
901 | 956 | ||
902 | /*P2_DMDFLYW*/ | 957 | /*P2_DMDFLYW*/ |
903 | #define R0900_P2_DMDFLYW 0xf21c | 958 | #define R0900_P2_DMDFLYW 0xf21c |
904 | #define F0900_P2_I2C_IRQVAL 0xf21c00f0 | 959 | #define F0900_P2_I2C_IRQVAL 0xf21c00f0 |
905 | #define F0900_P2_FLYWHEEL_CPT 0xf21c000f | 960 | #define F0900_P2_FLYWHEEL_CPT 0xf21c000f |
906 | 961 | ||
907 | /*P2_DSTATUS3*/ | 962 | /*P2_DSTATUS3*/ |
908 | #define R0900_P2_DSTATUS3 0xf21d | 963 | #define R0900_P2_DSTATUS3 0xf21d |
909 | #define F0900_P2_CFR_ZIGZAG 0xf21d0080 | 964 | #define F0900_P2_DEMOD_CFGMODE 0xf21d0060 |
910 | #define F0900_P2_DEMOD_CFGMODE 0xf21d0060 | ||
911 | #define F0900_P2_GAMMA_LOWBAUDRATE 0xf21d0010 | ||
912 | #define F0900_P2_RELOCK_MODE 0xf21d0008 | ||
913 | #define F0900_P2_DEMOD_FAIL 0xf21d0004 | ||
914 | #define F0900_P2_ETAPE1A_DVBXMEM 0xf21d0003 | ||
915 | 965 | ||
916 | /*P2_DMDCFG3*/ | 966 | /*P2_DMDCFG3*/ |
917 | #define R0900_P2_DMDCFG3 0xf21e | 967 | #define R0900_P2_DMDCFG3 0xf21e |
918 | #define F0900_P2_DVBS1_TMGWAIT 0xf21e0080 | 968 | #define F0900_P2_NOSTOP_FIFOFULL 0xf21e0008 |
919 | #define F0900_P2_NO_BWCENTERING 0xf21e0040 | ||
920 | #define F0900_P2_INV_SEQSRCH 0xf21e0020 | ||
921 | #define F0900_P2_DIS_SFRUPLOW_TRK 0xf21e0010 | ||
922 | #define F0900_P2_NOSTOP_FIFOFULL 0xf21e0008 | ||
923 | #define F0900_P2_LOCKTIME_MODE 0xf21e0007 | ||
924 | 969 | ||
925 | /*P2_DMDCFG4*/ | 970 | /*P2_DMDCFG4*/ |
926 | #define R0900_P2_DMDCFG4 0xf21f | 971 | #define R0900_P2_DMDCFG4 0xf21f |
927 | #define F0900_P2_TUNER_NRELAUNCH 0xf21f0008 | 972 | #define F0900_P2_TUNER_NRELAUNCH 0xf21f0008 |
928 | #define F0900_P2_DIS_CLKENABLE 0xf21f0004 | ||
929 | #define F0900_P2_DIS_HDRDIVLOCK 0xf21f0002 | ||
930 | #define F0900_P2_NO_TNRWBINIT 0xf21f0001 | ||
931 | 973 | ||
932 | /*P2_CORRELMANT*/ | 974 | /*P2_CORRELMANT*/ |
933 | #define R0900_P2_CORRELMANT 0xf220 | 975 | #define R0900_P2_CORRELMANT 0xf220 |
934 | #define F0900_P2_CORREL_MANT 0xf22000ff | 976 | #define F0900_P2_CORREL_MANT 0xf22000ff |
935 | 977 | ||
936 | /*P2_CORRELABS*/ | 978 | /*P2_CORRELABS*/ |
937 | #define R0900_P2_CORRELABS 0xf221 | 979 | #define R0900_P2_CORRELABS 0xf221 |
938 | #define F0900_P2_CORREL_ABS 0xf22100ff | 980 | #define F0900_P2_CORREL_ABS 0xf22100ff |
939 | 981 | ||
940 | /*P2_CORRELEXP*/ | 982 | /*P2_CORRELEXP*/ |
941 | #define R0900_P2_CORRELEXP 0xf222 | 983 | #define R0900_P2_CORRELEXP 0xf222 |
942 | #define F0900_P2_CORREL_ABSEXP 0xf22200f0 | 984 | #define F0900_P2_CORREL_ABSEXP 0xf22200f0 |
943 | #define F0900_P2_CORREL_EXP 0xf222000f | 985 | #define F0900_P2_CORREL_EXP 0xf222000f |
944 | 986 | ||
945 | /*P2_PLHMODCOD*/ | 987 | /*P2_PLHMODCOD*/ |
946 | #define R0900_P2_PLHMODCOD 0xf224 | 988 | #define R0900_P2_PLHMODCOD 0xf224 |
947 | #define F0900_P2_SPECINV_DEMOD 0xf2240080 | 989 | #define F0900_P2_SPECINV_DEMOD 0xf2240080 |
948 | #define F0900_P2_PLH_MODCOD 0xf224007c | 990 | #define F0900_P2_PLH_MODCOD 0xf224007c |
949 | #define F0900_P2_PLH_TYPE 0xf2240003 | 991 | #define F0900_P2_PLH_TYPE 0xf2240003 |
950 | 992 | ||
951 | /*P2_AGCK32*/ | 993 | /*P2_DMDREG*/ |
952 | #define R0900_P2_AGCK32 0xf22b | 994 | #define R0900_P2_DMDREG 0xf225 |
953 | #define F0900_P2_R3ADJOFF_32APSK 0xf22b0080 | 995 | #define F0900_P2_DECIM_PLFRAMES 0xf2250001 |
954 | #define F0900_P2_R2ADJOFF_32APSK 0xf22b0040 | ||
955 | #define F0900_P2_R1ADJOFF_32APSK 0xf22b0020 | ||
956 | #define F0900_P2_RADJ_32APSK 0xf22b001f | ||
957 | 996 | ||
958 | /*P2_AGC2O*/ | 997 | /*P2_AGC2O*/ |
959 | #define R0900_P2_AGC2O 0xf22c | 998 | #define R0900_P2_AGC2O 0xf22c |
960 | #define F0900_P2_AGC2REF_ADJUSTING 0xf22c0080 | 999 | #define F0900_P2_AGC2_COEF 0xf22c0007 |
961 | #define F0900_P2_AGC2_COARSEFAST 0xf22c0040 | ||
962 | #define F0900_P2_AGC2_LKSQRT 0xf22c0020 | ||
963 | #define F0900_P2_AGC2_LKMODE 0xf22c0010 | ||
964 | #define F0900_P2_AGC2_LKEQUA 0xf22c0008 | ||
965 | #define F0900_P2_AGC2_COEF 0xf22c0007 | ||
966 | 1000 | ||
967 | /*P2_AGC2REF*/ | 1001 | /*P2_AGC2REF*/ |
968 | #define R0900_P2_AGC2REF 0xf22d | 1002 | #define R0900_P2_AGC2REF 0xf22d |
969 | #define F0900_P2_AGC2_REF 0xf22d00ff | 1003 | #define F0900_P2_AGC2_REF 0xf22d00ff |
970 | 1004 | ||
971 | /*P2_AGC1ADJ*/ | 1005 | /*P2_AGC1ADJ*/ |
972 | #define R0900_P2_AGC1ADJ 0xf22e | 1006 | #define R0900_P2_AGC1ADJ 0xf22e |
973 | #define F0900_P2_AGC1ADJ_MANUAL 0xf22e0080 | 1007 | #define F0900_P2_AGC1_ADJUSTED 0xf22e007f |
974 | #define F0900_P2_AGC1_ADJUSTED 0xf22e017f | ||
975 | 1008 | ||
976 | /*P2_AGC2I1*/ | 1009 | /*P2_AGC2I1*/ |
977 | #define R0900_P2_AGC2I1 0xf236 | 1010 | #define R0900_P2_AGC2I1 0xf236 |
978 | #define F0900_P2_AGC2_INTEGRATOR1 0xf23600ff | 1011 | #define F0900_P2_AGC2_INTEGRATOR1 0xf23600ff |
979 | 1012 | ||
980 | /*P2_AGC2I0*/ | 1013 | /*P2_AGC2I0*/ |
981 | #define R0900_P2_AGC2I0 0xf237 | 1014 | #define R0900_P2_AGC2I0 0xf237 |
982 | #define F0900_P2_AGC2_INTEGRATOR0 0xf23700ff | 1015 | #define F0900_P2_AGC2_INTEGRATOR0 0xf23700ff |
983 | 1016 | ||
984 | /*P2_CARCFG*/ | 1017 | /*P2_CARCFG*/ |
985 | #define R0900_P2_CARCFG 0xf238 | 1018 | #define R0900_P2_CARCFG 0xf238 |
986 | #define F0900_P2_CFRUPLOW_AUTO 0xf2380080 | 1019 | #define F0900_P2_CFRUPLOW_AUTO 0xf2380080 |
987 | #define F0900_P2_CFRUPLOW_TEST 0xf2380040 | 1020 | #define F0900_P2_CFRUPLOW_TEST 0xf2380040 |
988 | #define F0900_P2_EN_CAR2CENTER 0xf2380020 | 1021 | #define F0900_P2_ROTAON 0xf2380004 |
989 | #define F0900_P2_CARHDR_NODIV8 0xf2380010 | 1022 | #define F0900_P2_PH_DET_ALGO 0xf2380003 |
990 | #define F0900_P2_I2C_ROTA 0xf2380008 | ||
991 | #define F0900_P2_ROTAON 0xf2380004 | ||
992 | #define F0900_P2_PH_DET_ALGO 0xf2380003 | ||
993 | 1023 | ||
994 | /*P2_ACLC*/ | 1024 | /*P2_ACLC*/ |
995 | #define R0900_P2_ACLC 0xf239 | 1025 | #define R0900_P2_ACLC 0xf239 |
996 | #define F0900_P2_STOP_S2ALPHA 0xf23900c0 | 1026 | #define F0900_P2_CAR_ALPHA_MANT 0xf2390030 |
997 | #define F0900_P2_CAR_ALPHA_MANT 0xf2390030 | 1027 | #define F0900_P2_CAR_ALPHA_EXP 0xf239000f |
998 | #define F0900_P2_CAR_ALPHA_EXP 0xf239000f | ||
999 | 1028 | ||
1000 | /*P2_BCLC*/ | 1029 | /*P2_BCLC*/ |
1001 | #define R0900_P2_BCLC 0xf23a | 1030 | #define R0900_P2_BCLC 0xf23a |
1002 | #define F0900_P2_STOP_S2BETA 0xf23a00c0 | 1031 | #define F0900_P2_CAR_BETA_MANT 0xf23a0030 |
1003 | #define F0900_P2_CAR_BETA_MANT 0xf23a0030 | 1032 | #define F0900_P2_CAR_BETA_EXP 0xf23a000f |
1004 | #define F0900_P2_CAR_BETA_EXP 0xf23a000f | ||
1005 | 1033 | ||
1006 | /*P2_CARFREQ*/ | 1034 | /*P2_CARFREQ*/ |
1007 | #define R0900_P2_CARFREQ 0xf23d | 1035 | #define R0900_P2_CARFREQ 0xf23d |
1008 | #define F0900_P2_KC_COARSE_EXP 0xf23d00f0 | 1036 | #define F0900_P2_KC_COARSE_EXP 0xf23d00f0 |
1009 | #define F0900_P2_BETA_FREQ 0xf23d000f | 1037 | #define F0900_P2_BETA_FREQ 0xf23d000f |
1010 | 1038 | ||
1011 | /*P2_CARHDR*/ | 1039 | /*P2_CARHDR*/ |
1012 | #define R0900_P2_CARHDR 0xf23e | 1040 | #define R0900_P2_CARHDR 0xf23e |
1013 | #define F0900_P2_K_FREQ_HDR 0xf23e00ff | 1041 | #define F0900_P2_K_FREQ_HDR 0xf23e00ff |
1014 | 1042 | ||
1015 | /*P2_LDT*/ | 1043 | /*P2_LDT*/ |
1016 | #define R0900_P2_LDT 0xf23f | 1044 | #define R0900_P2_LDT 0xf23f |
1017 | #define F0900_P2_CARLOCK_THRES 0xf23f01ff | 1045 | #define F0900_P2_CARLOCK_THRES 0xf23f01ff |
1018 | 1046 | ||
1019 | /*P2_LDT2*/ | 1047 | /*P2_LDT2*/ |
1020 | #define R0900_P2_LDT2 0xf240 | 1048 | #define R0900_P2_LDT2 0xf240 |
1021 | #define F0900_P2_CARLOCK_THRES2 0xf24001ff | 1049 | #define F0900_P2_CARLOCK_THRES2 0xf24001ff |
1022 | 1050 | ||
1023 | /*P2_CFRICFG*/ | 1051 | /*P2_CFRICFG*/ |
1024 | #define R0900_P2_CFRICFG 0xf241 | 1052 | #define R0900_P2_CFRICFG 0xf241 |
1025 | #define F0900_P2_CFRINIT_UNVALRNG 0xf2410080 | 1053 | #define F0900_P2_NEG_CFRSTEP 0xf2410001 |
1026 | #define F0900_P2_CFRINIT_LUNVALCPT 0xf2410040 | ||
1027 | #define F0900_P2_CFRINIT_ABORTDBL 0xf2410020 | ||
1028 | #define F0900_P2_CFRINIT_ABORTPRED 0xf2410010 | ||
1029 | #define F0900_P2_CFRINIT_UNVALSKIP 0xf2410008 | ||
1030 | #define F0900_P2_CFRINIT_CSTINC 0xf2410004 | ||
1031 | #define F0900_P2_NEG_CFRSTEP 0xf2410001 | ||
1032 | 1054 | ||
1033 | /*P2_CFRUP1*/ | 1055 | /*P2_CFRUP1*/ |
1034 | #define R0900_P2_CFRUP1 0xf242 | 1056 | #define R0900_P2_CFRUP1 0xf242 |
1035 | #define F0900_P2_CFR_UP1 0xf24201ff | 1057 | #define F0900_P2_CFR_UP1 0xf24201ff |
1036 | 1058 | ||
1037 | /*P2_CFRUP0*/ | 1059 | /*P2_CFRUP0*/ |
1038 | #define R0900_P2_CFRUP0 0xf243 | 1060 | #define R0900_P2_CFRUP0 0xf243 |
1039 | #define F0900_P2_CFR_UP0 0xf24300ff | 1061 | #define F0900_P2_CFR_UP0 0xf24300ff |
1040 | 1062 | ||
1041 | /*P2_CFRLOW1*/ | 1063 | /*P2_CFRLOW1*/ |
1042 | #define R0900_P2_CFRLOW1 0xf246 | 1064 | #define R0900_P2_CFRLOW1 0xf246 |
1043 | #define F0900_P2_CFR_LOW1 0xf24601ff | 1065 | #define F0900_P2_CFR_LOW1 0xf24601ff |
1044 | 1066 | ||
1045 | /*P2_CFRLOW0*/ | 1067 | /*P2_CFRLOW0*/ |
1046 | #define R0900_P2_CFRLOW0 0xf247 | 1068 | #define R0900_P2_CFRLOW0 0xf247 |
1047 | #define F0900_P2_CFR_LOW0 0xf24700ff | 1069 | #define F0900_P2_CFR_LOW0 0xf24700ff |
1048 | 1070 | ||
1049 | /*P2_CFRINIT1*/ | 1071 | /*P2_CFRINIT1*/ |
1050 | #define R0900_P2_CFRINIT1 0xf248 | 1072 | #define R0900_P2_CFRINIT1 0xf248 |
1051 | #define F0900_P2_CFR_INIT1 0xf24801ff | 1073 | #define F0900_P2_CFR_INIT1 0xf24801ff |
1052 | 1074 | ||
1053 | /*P2_CFRINIT0*/ | 1075 | /*P2_CFRINIT0*/ |
1054 | #define R0900_P2_CFRINIT0 0xf249 | 1076 | #define R0900_P2_CFRINIT0 0xf249 |
1055 | #define F0900_P2_CFR_INIT0 0xf24900ff | 1077 | #define F0900_P2_CFR_INIT0 0xf24900ff |
1056 | 1078 | ||
1057 | /*P2_CFRINC1*/ | 1079 | /*P2_CFRINC1*/ |
1058 | #define R0900_P2_CFRINC1 0xf24a | 1080 | #define R0900_P2_CFRINC1 0xf24a |
1059 | #define F0900_P2_MANUAL_CFRINC 0xf24a0080 | 1081 | #define F0900_P2_MANUAL_CFRINC 0xf24a0080 |
1060 | #define F0900_P2_CFR_INC1 0xf24a017f | 1082 | #define F0900_P2_CFR_INC1 0xf24a003f |
1061 | 1083 | ||
1062 | /*P2_CFRINC0*/ | 1084 | /*P2_CFRINC0*/ |
1063 | #define R0900_P2_CFRINC0 0xf24b | 1085 | #define R0900_P2_CFRINC0 0xf24b |
1064 | #define F0900_P2_CFR_INC0 0xf24b00f0 | 1086 | #define F0900_P2_CFR_INC0 0xf24b00f8 |
1065 | 1087 | ||
1066 | /*P2_CFR2*/ | 1088 | /*P2_CFR2*/ |
1067 | #define R0900_P2_CFR2 0xf24c | 1089 | #define R0900_P2_CFR2 0xf24c |
1068 | #define F0900_P2_CAR_FREQ2 0xf24c01ff | 1090 | #define F0900_P2_CAR_FREQ2 0xf24c01ff |
1069 | 1091 | ||
1070 | /*P2_CFR1*/ | 1092 | /*P2_CFR1*/ |
1071 | #define R0900_P2_CFR1 0xf24d | 1093 | #define R0900_P2_CFR1 0xf24d |
1072 | #define F0900_P2_CAR_FREQ1 0xf24d00ff | 1094 | #define F0900_P2_CAR_FREQ1 0xf24d00ff |
1073 | 1095 | ||
1074 | /*P2_CFR0*/ | 1096 | /*P2_CFR0*/ |
1075 | #define R0900_P2_CFR0 0xf24e | 1097 | #define R0900_P2_CFR0 0xf24e |
1076 | #define F0900_P2_CAR_FREQ0 0xf24e00ff | 1098 | #define F0900_P2_CAR_FREQ0 0xf24e00ff |
1077 | 1099 | ||
1078 | /*P2_LDI*/ | 1100 | /*P2_LDI*/ |
1079 | #define R0900_P2_LDI 0xf24f | 1101 | #define R0900_P2_LDI 0xf24f |
1080 | #define F0900_P2_LOCK_DET_INTEGR 0xf24f01ff | 1102 | #define F0900_P2_LOCK_DET_INTEGR 0xf24f01ff |
1081 | 1103 | ||
1082 | /*P2_TMGCFG*/ | 1104 | /*P2_TMGCFG*/ |
1083 | #define R0900_P2_TMGCFG 0xf250 | 1105 | #define R0900_P2_TMGCFG 0xf250 |
1084 | #define F0900_P2_TMGLOCK_BETA 0xf25000c0 | 1106 | #define F0900_P2_TMGLOCK_BETA 0xf25000c0 |
1085 | #define F0900_P2_NOTMG_GROUPDELAY 0xf2500020 | 1107 | #define F0900_P2_DO_TIMING_CORR 0xf2500010 |
1086 | #define F0900_P2_DO_TIMING_CORR 0xf2500010 | 1108 | #define F0900_P2_TMG_MINFREQ 0xf2500003 |
1087 | #define F0900_P2_MANUAL_SCAN 0xf250000c | ||
1088 | #define F0900_P2_TMG_MINFREQ 0xf2500003 | ||
1089 | 1109 | ||
1090 | /*P2_RTC*/ | 1110 | /*P2_RTC*/ |
1091 | #define R0900_P2_RTC 0xf251 | 1111 | #define R0900_P2_RTC 0xf251 |
1092 | #define F0900_P2_TMGALPHA_EXP 0xf25100f0 | 1112 | #define F0900_P2_TMGALPHA_EXP 0xf25100f0 |
1093 | #define F0900_P2_TMGBETA_EXP 0xf251000f | 1113 | #define F0900_P2_TMGBETA_EXP 0xf251000f |
1094 | 1114 | ||
1095 | /*P2_RTCS2*/ | 1115 | /*P2_RTCS2*/ |
1096 | #define R0900_P2_RTCS2 0xf252 | 1116 | #define R0900_P2_RTCS2 0xf252 |
1097 | #define F0900_P2_TMGALPHAS2_EXP 0xf25200f0 | 1117 | #define F0900_P2_TMGALPHAS2_EXP 0xf25200f0 |
1098 | #define F0900_P2_TMGBETAS2_EXP 0xf252000f | 1118 | #define F0900_P2_TMGBETAS2_EXP 0xf252000f |
1099 | 1119 | ||
1100 | /*P2_TMGTHRISE*/ | 1120 | /*P2_TMGTHRISE*/ |
1101 | #define R0900_P2_TMGTHRISE 0xf253 | 1121 | #define R0900_P2_TMGTHRISE 0xf253 |
1102 | #define F0900_P2_TMGLOCK_THRISE 0xf25300ff | 1122 | #define F0900_P2_TMGLOCK_THRISE 0xf25300ff |
1103 | 1123 | ||
1104 | /*P2_TMGTHFALL*/ | 1124 | /*P2_TMGTHFALL*/ |
1105 | #define R0900_P2_TMGTHFALL 0xf254 | 1125 | #define R0900_P2_TMGTHFALL 0xf254 |
1106 | #define F0900_P2_TMGLOCK_THFALL 0xf25400ff | 1126 | #define F0900_P2_TMGLOCK_THFALL 0xf25400ff |
1107 | 1127 | ||
1108 | /*P2_SFRUPRATIO*/ | 1128 | /*P2_SFRUPRATIO*/ |
1109 | #define R0900_P2_SFRUPRATIO 0xf255 | 1129 | #define R0900_P2_SFRUPRATIO 0xf255 |
1110 | #define F0900_P2_SFR_UPRATIO 0xf25500ff | 1130 | #define F0900_P2_SFR_UPRATIO 0xf25500ff |
1111 | 1131 | ||
1112 | /*P2_SFRLOWRATIO*/ | 1132 | /*P2_SFRLOWRATIO*/ |
1113 | #define R0900_P2_SFRLOWRATIO 0xf256 | 1133 | #define R0900_P2_SFRLOWRATIO 0xf256 |
1114 | #define F0900_P2_SFR_LOWRATIO 0xf25600ff | 1134 | #define F0900_P2_SFR_LOWRATIO 0xf25600ff |
1115 | 1135 | ||
1116 | /*P2_KREFTMG*/ | 1136 | /*P2_KREFTMG*/ |
1117 | #define R0900_P2_KREFTMG 0xf258 | 1137 | #define R0900_P2_KREFTMG 0xf258 |
1118 | #define F0900_P2_KREF_TMG 0xf25800ff | 1138 | #define F0900_P2_KREF_TMG 0xf25800ff |
1119 | 1139 | ||
1120 | /*P2_SFRSTEP*/ | 1140 | /*P2_SFRSTEP*/ |
1121 | #define R0900_P2_SFRSTEP 0xf259 | 1141 | #define R0900_P2_SFRSTEP 0xf259 |
1122 | #define F0900_P2_SFR_SCANSTEP 0xf25900f0 | 1142 | #define F0900_P2_SFR_SCANSTEP 0xf25900f0 |
1123 | #define F0900_P2_SFR_CENTERSTEP 0xf259000f | 1143 | #define F0900_P2_SFR_CENTERSTEP 0xf259000f |
1124 | 1144 | ||
1125 | /*P2_TMGCFG2*/ | 1145 | /*P2_TMGCFG2*/ |
1126 | #define R0900_P2_TMGCFG2 0xf25a | 1146 | #define R0900_P2_TMGCFG2 0xf25a |
1127 | #define F0900_P2_DIS_AUTOSAMP 0xf25a0008 | 1147 | #define F0900_P2_SFRRATIO_FINE 0xf25a0001 |
1128 | #define F0900_P2_SCANINIT_QUART 0xf25a0004 | 1148 | |
1129 | #define F0900_P2_NOTMG_DVBS1DERAT 0xf25a0002 | 1149 | /*P2_KREFTMG2*/ |
1130 | #define F0900_P2_SFRRATIO_FINE 0xf25a0001 | 1150 | #define R0900_P2_KREFTMG2 0xf25b |
1151 | #define F0900_P2_KREF_TMG2 0xf25b00ff | ||
1131 | 1152 | ||
1132 | /*P2_SFRINIT1*/ | 1153 | /*P2_SFRINIT1*/ |
1133 | #define R0900_P2_SFRINIT1 0xf25e | 1154 | #define R0900_P2_SFRINIT1 0xf25e |
1134 | #define F0900_P2_SFR_INIT1 0xf25e00ff | 1155 | #define F0900_P2_SFR_INIT1 0xf25e007f |
1135 | 1156 | ||
1136 | /*P2_SFRINIT0*/ | 1157 | /*P2_SFRINIT0*/ |
1137 | #define R0900_P2_SFRINIT0 0xf25f | 1158 | #define R0900_P2_SFRINIT0 0xf25f |
1138 | #define F0900_P2_SFR_INIT0 0xf25f00ff | 1159 | #define F0900_P2_SFR_INIT0 0xf25f00ff |
1139 | 1160 | ||
1140 | /*P2_SFRUP1*/ | 1161 | /*P2_SFRUP1*/ |
1141 | #define R0900_P2_SFRUP1 0xf260 | 1162 | #define R0900_P2_SFRUP1 0xf260 |
1142 | #define F0900_P2_AUTO_GUP 0xf2600080 | 1163 | #define F0900_P2_AUTO_GUP 0xf2600080 |
1143 | #define F0900_P2_SYMB_FREQ_UP1 0xf260007f | 1164 | #define F0900_P2_SYMB_FREQ_UP1 0xf260007f |
1144 | 1165 | ||
1145 | /*P2_SFRUP0*/ | 1166 | /*P2_SFRUP0*/ |
1146 | #define R0900_P2_SFRUP0 0xf261 | 1167 | #define R0900_P2_SFRUP0 0xf261 |
1147 | #define F0900_P2_SYMB_FREQ_UP0 0xf26100ff | 1168 | #define F0900_P2_SYMB_FREQ_UP0 0xf26100ff |
1148 | 1169 | ||
1149 | /*P2_SFRLOW1*/ | 1170 | /*P2_SFRLOW1*/ |
1150 | #define R0900_P2_SFRLOW1 0xf262 | 1171 | #define R0900_P2_SFRLOW1 0xf262 |
1151 | #define F0900_P2_AUTO_GLOW 0xf2620080 | 1172 | #define F0900_P2_AUTO_GLOW 0xf2620080 |
1152 | #define F0900_P2_SYMB_FREQ_LOW1 0xf262007f | 1173 | #define F0900_P2_SYMB_FREQ_LOW1 0xf262007f |
1153 | 1174 | ||
1154 | /*P2_SFRLOW0*/ | 1175 | /*P2_SFRLOW0*/ |
1155 | #define R0900_P2_SFRLOW0 0xf263 | 1176 | #define R0900_P2_SFRLOW0 0xf263 |
1156 | #define F0900_P2_SYMB_FREQ_LOW0 0xf26300ff | 1177 | #define F0900_P2_SYMB_FREQ_LOW0 0xf26300ff |
1157 | 1178 | ||
1158 | /*P2_SFR3*/ | 1179 | /*P2_SFR3*/ |
1159 | #define R0900_P2_SFR3 0xf264 | 1180 | #define R0900_P2_SFR3 0xf264 |
1160 | #define F0900_P2_SYMB_FREQ3 0xf26400ff | 1181 | #define F0900_P2_SYMB_FREQ3 0xf26400ff |
1161 | 1182 | ||
1162 | /*P2_SFR2*/ | 1183 | /*P2_SFR2*/ |
1163 | #define R0900_P2_SFR2 0xf265 | 1184 | #define R0900_P2_SFR2 0xf265 |
1164 | #define F0900_P2_SYMB_FREQ2 0xf26500ff | 1185 | #define F0900_P2_SYMB_FREQ2 0xf26500ff |
1165 | 1186 | ||
1166 | /*P2_SFR1*/ | 1187 | /*P2_SFR1*/ |
1167 | #define R0900_P2_SFR1 0xf266 | 1188 | #define R0900_P2_SFR1 0xf266 |
1168 | #define F0900_P2_SYMB_FREQ1 0xf26600ff | 1189 | #define F0900_P2_SYMB_FREQ1 0xf26600ff |
1169 | 1190 | ||
1170 | /*P2_SFR0*/ | 1191 | /*P2_SFR0*/ |
1171 | #define R0900_P2_SFR0 0xf267 | 1192 | #define R0900_P2_SFR0 0xf267 |
1172 | #define F0900_P2_SYMB_FREQ0 0xf26700ff | 1193 | #define F0900_P2_SYMB_FREQ0 0xf26700ff |
1173 | 1194 | ||
1174 | /*P2_TMGREG2*/ | 1195 | /*P2_TMGREG2*/ |
1175 | #define R0900_P2_TMGREG2 0xf268 | 1196 | #define R0900_P2_TMGREG2 0xf268 |
1176 | #define F0900_P2_TMGREG2 0xf26800ff | 1197 | #define F0900_P2_TMGREG2 0xf26800ff |
1177 | 1198 | ||
1178 | /*P2_TMGREG1*/ | 1199 | /*P2_TMGREG1*/ |
1179 | #define R0900_P2_TMGREG1 0xf269 | 1200 | #define R0900_P2_TMGREG1 0xf269 |
1180 | #define F0900_P2_TMGREG1 0xf26900ff | 1201 | #define F0900_P2_TMGREG1 0xf26900ff |
1181 | 1202 | ||
1182 | /*P2_TMGREG0*/ | 1203 | /*P2_TMGREG0*/ |
1183 | #define R0900_P2_TMGREG0 0xf26a | 1204 | #define R0900_P2_TMGREG0 0xf26a |
1184 | #define F0900_P2_TMGREG0 0xf26a00ff | 1205 | #define F0900_P2_TMGREG0 0xf26a00ff |
1185 | 1206 | ||
1186 | /*P2_TMGLOCK1*/ | 1207 | /*P2_TMGLOCK1*/ |
1187 | #define R0900_P2_TMGLOCK1 0xf26b | 1208 | #define R0900_P2_TMGLOCK1 0xf26b |
1188 | #define F0900_P2_TMGLOCK_LEVEL1 0xf26b01ff | 1209 | #define F0900_P2_TMGLOCK_LEVEL1 0xf26b01ff |
1189 | 1210 | ||
1190 | /*P2_TMGLOCK0*/ | 1211 | /*P2_TMGLOCK0*/ |
1191 | #define R0900_P2_TMGLOCK0 0xf26c | 1212 | #define R0900_P2_TMGLOCK0 0xf26c |
1192 | #define F0900_P2_TMGLOCK_LEVEL0 0xf26c00ff | 1213 | #define F0900_P2_TMGLOCK_LEVEL0 0xf26c00ff |
1193 | 1214 | ||
1194 | /*P2_TMGOBS*/ | 1215 | /*P2_TMGOBS*/ |
1195 | #define R0900_P2_TMGOBS 0xf26d | 1216 | #define R0900_P2_TMGOBS 0xf26d |
1196 | #define F0900_P2_ROLLOFF_STATUS 0xf26d00c0 | 1217 | #define F0900_P2_ROLLOFF_STATUS 0xf26d00c0 |
1197 | #define F0900_P2_SCAN_SIGN 0xf26d0030 | ||
1198 | #define F0900_P2_TMG_SCANNING 0xf26d0008 | ||
1199 | #define F0900_P2_CHCENTERING_MODE 0xf26d0004 | ||
1200 | #define F0900_P2_TMG_SCANFAIL 0xf26d0002 | ||
1201 | 1218 | ||
1202 | /*P2_EQUALCFG*/ | 1219 | /*P2_EQUALCFG*/ |
1203 | #define R0900_P2_EQUALCFG 0xf26f | 1220 | #define R0900_P2_EQUALCFG 0xf26f |
1204 | #define F0900_P2_NOTMG_NEGALWAIT 0xf26f0080 | 1221 | #define F0900_P2_EQUAL_ON 0xf26f0040 |
1205 | #define F0900_P2_EQUAL_ON 0xf26f0040 | 1222 | #define F0900_P2_MU_EQUALDFE 0xf26f0007 |
1206 | #define F0900_P2_SEL_EQUALCOR 0xf26f0038 | ||
1207 | #define F0900_P2_MU_EQUALDFE 0xf26f0007 | ||
1208 | 1223 | ||
1209 | /*P2_EQUAI1*/ | 1224 | /*P2_EQUAI1*/ |
1210 | #define R0900_P2_EQUAI1 0xf270 | 1225 | #define R0900_P2_EQUAI1 0xf270 |
1211 | #define F0900_P2_EQUA_ACCI1 0xf27001ff | 1226 | #define F0900_P2_EQUA_ACCI1 0xf27001ff |
1212 | 1227 | ||
1213 | /*P2_EQUAQ1*/ | 1228 | /*P2_EQUAQ1*/ |
1214 | #define R0900_P2_EQUAQ1 0xf271 | 1229 | #define R0900_P2_EQUAQ1 0xf271 |
1215 | #define F0900_P2_EQUA_ACCQ1 0xf27101ff | 1230 | #define F0900_P2_EQUA_ACCQ1 0xf27101ff |
1216 | 1231 | ||
1217 | /*P2_EQUAI2*/ | 1232 | /*P2_EQUAI2*/ |
1218 | #define R0900_P2_EQUAI2 0xf272 | 1233 | #define R0900_P2_EQUAI2 0xf272 |
1219 | #define F0900_P2_EQUA_ACCI2 0xf27201ff | 1234 | #define F0900_P2_EQUA_ACCI2 0xf27201ff |
1220 | 1235 | ||
1221 | /*P2_EQUAQ2*/ | 1236 | /*P2_EQUAQ2*/ |
1222 | #define R0900_P2_EQUAQ2 0xf273 | 1237 | #define R0900_P2_EQUAQ2 0xf273 |
1223 | #define F0900_P2_EQUA_ACCQ2 0xf27301ff | 1238 | #define F0900_P2_EQUA_ACCQ2 0xf27301ff |
1224 | 1239 | ||
1225 | /*P2_EQUAI3*/ | 1240 | /*P2_EQUAI3*/ |
1226 | #define R0900_P2_EQUAI3 0xf274 | 1241 | #define R0900_P2_EQUAI3 0xf274 |
1227 | #define F0900_P2_EQUA_ACCI3 0xf27401ff | 1242 | #define F0900_P2_EQUA_ACCI3 0xf27401ff |
1228 | 1243 | ||
1229 | /*P2_EQUAQ3*/ | 1244 | /*P2_EQUAQ3*/ |
1230 | #define R0900_P2_EQUAQ3 0xf275 | 1245 | #define R0900_P2_EQUAQ3 0xf275 |
1231 | #define F0900_P2_EQUA_ACCQ3 0xf27501ff | 1246 | #define F0900_P2_EQUA_ACCQ3 0xf27501ff |
1232 | 1247 | ||
1233 | /*P2_EQUAI4*/ | 1248 | /*P2_EQUAI4*/ |
1234 | #define R0900_P2_EQUAI4 0xf276 | 1249 | #define R0900_P2_EQUAI4 0xf276 |
1235 | #define F0900_P2_EQUA_ACCI4 0xf27601ff | 1250 | #define F0900_P2_EQUA_ACCI4 0xf27601ff |
1236 | 1251 | ||
1237 | /*P2_EQUAQ4*/ | 1252 | /*P2_EQUAQ4*/ |
1238 | #define R0900_P2_EQUAQ4 0xf277 | 1253 | #define R0900_P2_EQUAQ4 0xf277 |
1239 | #define F0900_P2_EQUA_ACCQ4 0xf27701ff | 1254 | #define F0900_P2_EQUA_ACCQ4 0xf27701ff |
1240 | 1255 | ||
1241 | /*P2_EQUAI5*/ | 1256 | /*P2_EQUAI5*/ |
1242 | #define R0900_P2_EQUAI5 0xf278 | 1257 | #define R0900_P2_EQUAI5 0xf278 |
1243 | #define F0900_P2_EQUA_ACCI5 0xf27801ff | 1258 | #define F0900_P2_EQUA_ACCI5 0xf27801ff |
1244 | 1259 | ||
1245 | /*P2_EQUAQ5*/ | 1260 | /*P2_EQUAQ5*/ |
1246 | #define R0900_P2_EQUAQ5 0xf279 | 1261 | #define R0900_P2_EQUAQ5 0xf279 |
1247 | #define F0900_P2_EQUA_ACCQ5 0xf27901ff | 1262 | #define F0900_P2_EQUA_ACCQ5 0xf27901ff |
1248 | 1263 | ||
1249 | /*P2_EQUAI6*/ | 1264 | /*P2_EQUAI6*/ |
1250 | #define R0900_P2_EQUAI6 0xf27a | 1265 | #define R0900_P2_EQUAI6 0xf27a |
1251 | #define F0900_P2_EQUA_ACCI6 0xf27a01ff | 1266 | #define F0900_P2_EQUA_ACCI6 0xf27a01ff |
1252 | 1267 | ||
1253 | /*P2_EQUAQ6*/ | 1268 | /*P2_EQUAQ6*/ |
1254 | #define R0900_P2_EQUAQ6 0xf27b | 1269 | #define R0900_P2_EQUAQ6 0xf27b |
1255 | #define F0900_P2_EQUA_ACCQ6 0xf27b01ff | 1270 | #define F0900_P2_EQUA_ACCQ6 0xf27b01ff |
1256 | 1271 | ||
1257 | /*P2_EQUAI7*/ | 1272 | /*P2_EQUAI7*/ |
1258 | #define R0900_P2_EQUAI7 0xf27c | 1273 | #define R0900_P2_EQUAI7 0xf27c |
1259 | #define F0900_P2_EQUA_ACCI7 0xf27c01ff | 1274 | #define F0900_P2_EQUA_ACCI7 0xf27c01ff |
1260 | 1275 | ||
1261 | /*P2_EQUAQ7*/ | 1276 | /*P2_EQUAQ7*/ |
1262 | #define R0900_P2_EQUAQ7 0xf27d | 1277 | #define R0900_P2_EQUAQ7 0xf27d |
1263 | #define F0900_P2_EQUA_ACCQ7 0xf27d01ff | 1278 | #define F0900_P2_EQUA_ACCQ7 0xf27d01ff |
1264 | 1279 | ||
1265 | /*P2_EQUAI8*/ | 1280 | /*P2_EQUAI8*/ |
1266 | #define R0900_P2_EQUAI8 0xf27e | 1281 | #define R0900_P2_EQUAI8 0xf27e |
1267 | #define F0900_P2_EQUA_ACCI8 0xf27e01ff | 1282 | #define F0900_P2_EQUA_ACCI8 0xf27e01ff |
1268 | 1283 | ||
1269 | /*P2_EQUAQ8*/ | 1284 | /*P2_EQUAQ8*/ |
1270 | #define R0900_P2_EQUAQ8 0xf27f | 1285 | #define R0900_P2_EQUAQ8 0xf27f |
1271 | #define F0900_P2_EQUA_ACCQ8 0xf27f01ff | 1286 | #define F0900_P2_EQUA_ACCQ8 0xf27f01ff |
1272 | 1287 | ||
1273 | /*P2_NNOSDATAT1*/ | 1288 | /*P2_NNOSDATAT1*/ |
1274 | #define R0900_P2_NNOSDATAT1 0xf280 | 1289 | #define R0900_P2_NNOSDATAT1 0xf280 |
1275 | #define F0900_P2_NOSDATAT_NORMED1 0xf28000ff | 1290 | #define F0900_P2_NOSDATAT_NORMED1 0xf28000ff |
1276 | 1291 | ||
1277 | /*P2_NNOSDATAT0*/ | 1292 | /*P2_NNOSDATAT0*/ |
1278 | #define R0900_P2_NNOSDATAT0 0xf281 | 1293 | #define R0900_P2_NNOSDATAT0 0xf281 |
1279 | #define F0900_P2_NOSDATAT_NORMED0 0xf28100ff | 1294 | #define F0900_P2_NOSDATAT_NORMED0 0xf28100ff |
1280 | 1295 | ||
1281 | /*P2_NNOSDATA1*/ | 1296 | /*P2_NNOSDATA1*/ |
1282 | #define R0900_P2_NNOSDATA1 0xf282 | 1297 | #define R0900_P2_NNOSDATA1 0xf282 |
1283 | #define F0900_P2_NOSDATA_NORMED1 0xf28200ff | 1298 | #define F0900_P2_NOSDATA_NORMED1 0xf28200ff |
1284 | 1299 | ||
1285 | /*P2_NNOSDATA0*/ | 1300 | /*P2_NNOSDATA0*/ |
1286 | #define R0900_P2_NNOSDATA0 0xf283 | 1301 | #define R0900_P2_NNOSDATA0 0xf283 |
1287 | #define F0900_P2_NOSDATA_NORMED0 0xf28300ff | 1302 | #define F0900_P2_NOSDATA_NORMED0 0xf28300ff |
1288 | 1303 | ||
1289 | /*P2_NNOSPLHT1*/ | 1304 | /*P2_NNOSPLHT1*/ |
1290 | #define R0900_P2_NNOSPLHT1 0xf284 | 1305 | #define R0900_P2_NNOSPLHT1 0xf284 |
1291 | #define F0900_P2_NOSPLHT_NORMED1 0xf28400ff | 1306 | #define F0900_P2_NOSPLHT_NORMED1 0xf28400ff |
1292 | 1307 | ||
1293 | /*P2_NNOSPLHT0*/ | 1308 | /*P2_NNOSPLHT0*/ |
1294 | #define R0900_P2_NNOSPLHT0 0xf285 | 1309 | #define R0900_P2_NNOSPLHT0 0xf285 |
1295 | #define F0900_P2_NOSPLHT_NORMED0 0xf28500ff | 1310 | #define F0900_P2_NOSPLHT_NORMED0 0xf28500ff |
1296 | 1311 | ||
1297 | /*P2_NNOSPLH1*/ | 1312 | /*P2_NNOSPLH1*/ |
1298 | #define R0900_P2_NNOSPLH1 0xf286 | 1313 | #define R0900_P2_NNOSPLH1 0xf286 |
1299 | #define F0900_P2_NOSPLH_NORMED1 0xf28600ff | 1314 | #define F0900_P2_NOSPLH_NORMED1 0xf28600ff |
1300 | 1315 | ||
1301 | /*P2_NNOSPLH0*/ | 1316 | /*P2_NNOSPLH0*/ |
1302 | #define R0900_P2_NNOSPLH0 0xf287 | 1317 | #define R0900_P2_NNOSPLH0 0xf287 |
1303 | #define F0900_P2_NOSPLH_NORMED0 0xf28700ff | 1318 | #define F0900_P2_NOSPLH_NORMED0 0xf28700ff |
1304 | 1319 | ||
1305 | /*P2_NOSDATAT1*/ | 1320 | /*P2_NOSDATAT1*/ |
1306 | #define R0900_P2_NOSDATAT1 0xf288 | 1321 | #define R0900_P2_NOSDATAT1 0xf288 |
1307 | #define F0900_P2_NOSDATAT_UNNORMED1 0xf28800ff | 1322 | #define F0900_P2_NOSDATAT_UNNORMED1 0xf28800ff |
1308 | 1323 | ||
1309 | /*P2_NOSDATAT0*/ | 1324 | /*P2_NOSDATAT0*/ |
1310 | #define R0900_P2_NOSDATAT0 0xf289 | 1325 | #define R0900_P2_NOSDATAT0 0xf289 |
1311 | #define F0900_P2_NOSDATAT_UNNORMED0 0xf28900ff | 1326 | #define F0900_P2_NOSDATAT_UNNORMED0 0xf28900ff |
1312 | 1327 | ||
1313 | /*P2_NOSDATA1*/ | 1328 | /*P2_NOSDATA1*/ |
1314 | #define R0900_P2_NOSDATA1 0xf28a | 1329 | #define R0900_P2_NOSDATA1 0xf28a |
1315 | #define F0900_P2_NOSDATA_UNNORMED1 0xf28a00ff | 1330 | #define F0900_P2_NOSDATA_UNNORMED1 0xf28a00ff |
1316 | 1331 | ||
1317 | /*P2_NOSDATA0*/ | 1332 | /*P2_NOSDATA0*/ |
1318 | #define R0900_P2_NOSDATA0 0xf28b | 1333 | #define R0900_P2_NOSDATA0 0xf28b |
1319 | #define F0900_P2_NOSDATA_UNNORMED0 0xf28b00ff | 1334 | #define F0900_P2_NOSDATA_UNNORMED0 0xf28b00ff |
1320 | 1335 | ||
1321 | /*P2_NOSPLHT1*/ | 1336 | /*P2_NOSPLHT1*/ |
1322 | #define R0900_P2_NOSPLHT1 0xf28c | 1337 | #define R0900_P2_NOSPLHT1 0xf28c |
1323 | #define F0900_P2_NOSPLHT_UNNORMED1 0xf28c00ff | 1338 | #define F0900_P2_NOSPLHT_UNNORMED1 0xf28c00ff |
1324 | 1339 | ||
1325 | /*P2_NOSPLHT0*/ | 1340 | /*P2_NOSPLHT0*/ |
1326 | #define R0900_P2_NOSPLHT0 0xf28d | 1341 | #define R0900_P2_NOSPLHT0 0xf28d |
1327 | #define F0900_P2_NOSPLHT_UNNORMED0 0xf28d00ff | 1342 | #define F0900_P2_NOSPLHT_UNNORMED0 0xf28d00ff |
1328 | 1343 | ||
1329 | /*P2_NOSPLH1*/ | 1344 | /*P2_NOSPLH1*/ |
1330 | #define R0900_P2_NOSPLH1 0xf28e | 1345 | #define R0900_P2_NOSPLH1 0xf28e |
1331 | #define F0900_P2_NOSPLH_UNNORMED1 0xf28e00ff | 1346 | #define F0900_P2_NOSPLH_UNNORMED1 0xf28e00ff |
1332 | 1347 | ||
1333 | /*P2_NOSPLH0*/ | 1348 | /*P2_NOSPLH0*/ |
1334 | #define R0900_P2_NOSPLH0 0xf28f | 1349 | #define R0900_P2_NOSPLH0 0xf28f |
1335 | #define F0900_P2_NOSPLH_UNNORMED0 0xf28f00ff | 1350 | #define F0900_P2_NOSPLH_UNNORMED0 0xf28f00ff |
1336 | 1351 | ||
1337 | /*P2_CAR2CFG*/ | 1352 | /*P2_CAR2CFG*/ |
1338 | #define R0900_P2_CAR2CFG 0xf290 | 1353 | #define R0900_P2_CAR2CFG 0xf290 |
1339 | #define F0900_P2_DESCRAMB_OFF 0xf2900080 | 1354 | #define F0900_P2_CARRIER3_DISABLE 0xf2900040 |
1340 | #define F0900_P2_PN4_SELECT 0xf2900040 | 1355 | #define F0900_P2_ROTA2ON 0xf2900004 |
1341 | #define F0900_P2_CFR2_STOPDVBS1 0xf2900020 | 1356 | #define F0900_P2_PH_DET_ALGO2 0xf2900003 |
1342 | #define F0900_P2_STOP_CFR2UPDATE 0xf2900010 | 1357 | |
1343 | #define F0900_P2_STOP_NCO2UPDATE 0xf2900008 | 1358 | /*P2_CFR2CFR1*/ |
1344 | #define F0900_P2_ROTA2ON 0xf2900004 | 1359 | #define R0900_P2_CFR2CFR1 0xf291 |
1345 | #define F0900_P2_PH_DET_ALGO2 0xf2900003 | 1360 | #define F0900_P2_CFR2TOCFR1_DVBS1 0xf29100c0 |
1346 | 1361 | #define F0900_P2_EN_S2CAR2CENTER 0xf2910020 | |
1347 | /*P2_ACLC2*/ | 1362 | #define F0900_P2_DIS_BCHERRCFR2 0xf2910010 |
1348 | #define R0900_P2_ACLC2 0xf291 | 1363 | #define F0900_P2_CFR2TOCFR1_BETA 0xf2910007 |
1349 | #define F0900_P2_CAR2_PUNCT_ADERAT 0xf2910040 | ||
1350 | #define F0900_P2_CAR2_ALPHA_MANT 0xf2910030 | ||
1351 | #define F0900_P2_CAR2_ALPHA_EXP 0xf291000f | ||
1352 | |||
1353 | /*P2_BCLC2*/ | ||
1354 | #define R0900_P2_BCLC2 0xf292 | ||
1355 | #define F0900_P2_DVBS2_NIP 0xf2920080 | ||
1356 | #define F0900_P2_CAR2_PUNCT_BDERAT 0xf2920040 | ||
1357 | #define F0900_P2_CAR2_BETA_MANT 0xf2920030 | ||
1358 | #define F0900_P2_CAR2_BETA_EXP 0xf292000f | ||
1359 | 1364 | ||
1360 | /*P2_CFR22*/ | 1365 | /*P2_CFR22*/ |
1361 | #define R0900_P2_CFR22 0xf293 | 1366 | #define R0900_P2_CFR22 0xf293 |
1362 | #define F0900_P2_CAR2_FREQ2 0xf29301ff | 1367 | #define F0900_P2_CAR2_FREQ2 0xf29301ff |
1363 | 1368 | ||
1364 | /*P2_CFR21*/ | 1369 | /*P2_CFR21*/ |
1365 | #define R0900_P2_CFR21 0xf294 | 1370 | #define R0900_P2_CFR21 0xf294 |
1366 | #define F0900_P2_CAR2_FREQ1 0xf29400ff | 1371 | #define F0900_P2_CAR2_FREQ1 0xf29400ff |
1367 | 1372 | ||
1368 | /*P2_CFR20*/ | 1373 | /*P2_CFR20*/ |
1369 | #define R0900_P2_CFR20 0xf295 | 1374 | #define R0900_P2_CFR20 0xf295 |
1370 | #define F0900_P2_CAR2_FREQ0 0xf29500ff | 1375 | #define F0900_P2_CAR2_FREQ0 0xf29500ff |
1371 | 1376 | ||
1372 | /*P2_ACLC2S2Q*/ | 1377 | /*P2_ACLC2S2Q*/ |
1373 | #define R0900_P2_ACLC2S2Q 0xf297 | 1378 | #define R0900_P2_ACLC2S2Q 0xf297 |
1374 | #define F0900_P2_ENAB_SPSKSYMB 0xf2970080 | 1379 | #define F0900_P2_ENAB_SPSKSYMB 0xf2970080 |
1375 | #define F0900_P2_CAR2S2_QADERAT 0xf2970040 | 1380 | #define F0900_P2_CAR2S2_Q_ALPH_M 0xf2970030 |
1376 | #define F0900_P2_CAR2S2_Q_ALPH_M 0xf2970030 | 1381 | #define F0900_P2_CAR2S2_Q_ALPH_E 0xf297000f |
1377 | #define F0900_P2_CAR2S2_Q_ALPH_E 0xf297000f | ||
1378 | 1382 | ||
1379 | /*P2_ACLC2S28*/ | 1383 | /*P2_ACLC2S28*/ |
1380 | #define R0900_P2_ACLC2S28 0xf298 | 1384 | #define R0900_P2_ACLC2S28 0xf298 |
1381 | #define F0900_P2_OLDI3Q_MODE 0xf2980080 | 1385 | #define F0900_P2_OLDI3Q_MODE 0xf2980080 |
1382 | #define F0900_P2_CAR2S2_8ADERAT 0xf2980040 | 1386 | #define F0900_P2_CAR2S2_8_ALPH_M 0xf2980030 |
1383 | #define F0900_P2_CAR2S2_8_ALPH_M 0xf2980030 | 1387 | #define F0900_P2_CAR2S2_8_ALPH_E 0xf298000f |
1384 | #define F0900_P2_CAR2S2_8_ALPH_E 0xf298000f | ||
1385 | 1388 | ||
1386 | /*P2_ACLC2S216A*/ | 1389 | /*P2_ACLC2S216A*/ |
1387 | #define R0900_P2_ACLC2S216A 0xf299 | 1390 | #define R0900_P2_ACLC2S216A 0xf299 |
1388 | #define F0900_P2_CAR2S2_16ADERAT 0xf2990040 | 1391 | #define F0900_P2_DIS_C3STOPA2 0xf2990080 |
1389 | #define F0900_P2_CAR2S2_16A_ALPH_M 0xf2990030 | 1392 | #define F0900_P2_CAR2S2_16ADERAT 0xf2990040 |
1390 | #define F0900_P2_CAR2S2_16A_ALPH_E 0xf299000f | 1393 | #define F0900_P2_CAR2S2_16A_ALPH_M 0xf2990030 |
1394 | #define F0900_P2_CAR2S2_16A_ALPH_E 0xf299000f | ||
1391 | 1395 | ||
1392 | /*P2_ACLC2S232A*/ | 1396 | /*P2_ACLC2S232A*/ |
1393 | #define R0900_P2_ACLC2S232A 0xf29a | 1397 | #define R0900_P2_ACLC2S232A 0xf29a |
1394 | #define F0900_P2_CAR2S2_32ADERAT 0xf29a0040 | 1398 | #define F0900_P2_CAR2S2_32ADERAT 0xf29a0040 |
1395 | #define F0900_P2_CAR2S2_32A_ALPH_M 0xf29a0030 | 1399 | #define F0900_P2_CAR2S2_32A_ALPH_M 0xf29a0030 |
1396 | #define F0900_P2_CAR2S2_32A_ALPH_E 0xf29a000f | 1400 | #define F0900_P2_CAR2S2_32A_ALPH_E 0xf29a000f |
1397 | 1401 | ||
1398 | /*P2_BCLC2S2Q*/ | 1402 | /*P2_BCLC2S2Q*/ |
1399 | #define R0900_P2_BCLC2S2Q 0xf29c | 1403 | #define R0900_P2_BCLC2S2Q 0xf29c |
1400 | #define F0900_P2_DVBS2S2Q_NIP 0xf29c0080 | 1404 | #define F0900_P2_CAR2S2_Q_BETA_M 0xf29c0030 |
1401 | #define F0900_P2_CAR2S2_QBDERAT 0xf29c0040 | 1405 | #define F0900_P2_CAR2S2_Q_BETA_E 0xf29c000f |
1402 | #define F0900_P2_CAR2S2_Q_BETA_M 0xf29c0030 | ||
1403 | #define F0900_P2_CAR2S2_Q_BETA_E 0xf29c000f | ||
1404 | 1406 | ||
1405 | /*P2_BCLC2S28*/ | 1407 | /*P2_BCLC2S28*/ |
1406 | #define R0900_P2_BCLC2S28 0xf29d | 1408 | #define R0900_P2_BCLC2S28 0xf29d |
1407 | #define F0900_P2_DVBS2S28_NIP 0xf29d0080 | 1409 | #define F0900_P2_CAR2S2_8_BETA_M 0xf29d0030 |
1408 | #define F0900_P2_CAR2S2_8BDERAT 0xf29d0040 | 1410 | #define F0900_P2_CAR2S2_8_BETA_E 0xf29d000f |
1409 | #define F0900_P2_CAR2S2_8_BETA_M 0xf29d0030 | ||
1410 | #define F0900_P2_CAR2S2_8_BETA_E 0xf29d000f | ||
1411 | 1411 | ||
1412 | /*P2_BCLC2S216A*/ | 1412 | /*P2_BCLC2S216A*/ |
1413 | #define R0900_P2_BCLC2S216A 0xf29e | 1413 | #define R0900_P2_BCLC2S216A 0xf29e |
1414 | #define F0900_P2_DVBS2S216A_NIP 0xf29e0080 | ||
1415 | #define F0900_P2_CAR2S2_16BDERAT 0xf29e0040 | ||
1416 | #define F0900_P2_CAR2S2_16A_BETA_M 0xf29e0030 | ||
1417 | #define F0900_P2_CAR2S2_16A_BETA_E 0xf29e000f | ||
1418 | 1414 | ||
1419 | /*P2_BCLC2S232A*/ | 1415 | /*P2_BCLC2S232A*/ |
1420 | #define R0900_P2_BCLC2S232A 0xf29f | 1416 | #define R0900_P2_BCLC2S232A 0xf29f |
1421 | #define F0900_P2_DVBS2S232A_NIP 0xf29f0080 | ||
1422 | #define F0900_P2_CAR2S2_32BDERAT 0xf29f0040 | ||
1423 | #define F0900_P2_CAR2S2_32A_BETA_M 0xf29f0030 | ||
1424 | #define F0900_P2_CAR2S2_32A_BETA_E 0xf29f000f | ||
1425 | 1417 | ||
1426 | /*P2_PLROOT2*/ | 1418 | /*P2_PLROOT2*/ |
1427 | #define R0900_P2_PLROOT2 0xf2ac | 1419 | #define R0900_P2_PLROOT2 0xf2ac |
1428 | #define F0900_P2_SHORTFR_DISABLE 0xf2ac0080 | 1420 | #define F0900_P2_PLSCRAMB_MODE 0xf2ac000c |
1429 | #define F0900_P2_LONGFR_DISABLE 0xf2ac0040 | 1421 | #define F0900_P2_PLSCRAMB_ROOT2 0xf2ac0003 |
1430 | #define F0900_P2_DUMMYPL_DISABLE 0xf2ac0020 | ||
1431 | #define F0900_P2_SHORTFR_AVOID 0xf2ac0010 | ||
1432 | #define F0900_P2_PLSCRAMB_MODE 0xf2ac000c | ||
1433 | #define F0900_P2_PLSCRAMB_ROOT2 0xf2ac0003 | ||
1434 | 1422 | ||
1435 | /*P2_PLROOT1*/ | 1423 | /*P2_PLROOT1*/ |
1436 | #define R0900_P2_PLROOT1 0xf2ad | 1424 | #define R0900_P2_PLROOT1 0xf2ad |
1437 | #define F0900_P2_PLSCRAMB_ROOT1 0xf2ad00ff | 1425 | #define F0900_P2_PLSCRAMB_ROOT1 0xf2ad00ff |
1438 | 1426 | ||
1439 | /*P2_PLROOT0*/ | 1427 | /*P2_PLROOT0*/ |
1440 | #define R0900_P2_PLROOT0 0xf2ae | 1428 | #define R0900_P2_PLROOT0 0xf2ae |
1441 | #define F0900_P2_PLSCRAMB_ROOT0 0xf2ae00ff | 1429 | #define F0900_P2_PLSCRAMB_ROOT0 0xf2ae00ff |
1442 | 1430 | ||
1443 | /*P2_MODCODLST0*/ | 1431 | /*P2_MODCODLST0*/ |
1444 | #define R0900_P2_MODCODLST0 0xf2b0 | 1432 | #define R0900_P2_MODCODLST0 0xf2b0 |
1445 | #define F0900_P2_EN_TOKEN31 0xf2b00080 | ||
1446 | #define F0900_P2_SYNCTAG_SELECT 0xf2b00040 | ||
1447 | #define F0900_P2_MODCODRQ_MODE 0xf2b00030 | ||
1448 | 1433 | ||
1449 | /*P2_MODCODLST1*/ | 1434 | /*P2_MODCODLST1*/ |
1450 | #define R0900_P2_MODCODLST1 0xf2b1 | 1435 | #define R0900_P2_MODCODLST1 0xf2b1 |
1451 | #define F0900_P2_DIS_MODCOD29 0xf2b100f0 | 1436 | #define F0900_P2_DIS_MODCOD29 0xf2b100f0 |
1452 | #define F0900_P2_DIS_32PSK_9_10 0xf2b1000f | 1437 | #define F0900_P2_DIS_32PSK_9_10 0xf2b1000f |
1453 | 1438 | ||
1454 | /*P2_MODCODLST2*/ | 1439 | /*P2_MODCODLST2*/ |
1455 | #define R0900_P2_MODCODLST2 0xf2b2 | 1440 | #define R0900_P2_MODCODLST2 0xf2b2 |
1456 | #define F0900_P2_DIS_32PSK_8_9 0xf2b200f0 | 1441 | #define F0900_P2_DIS_32PSK_8_9 0xf2b200f0 |
1457 | #define F0900_P2_DIS_32PSK_5_6 0xf2b2000f | 1442 | #define F0900_P2_DIS_32PSK_5_6 0xf2b2000f |
1458 | 1443 | ||
1459 | /*P2_MODCODLST3*/ | 1444 | /*P2_MODCODLST3*/ |
1460 | #define R0900_P2_MODCODLST3 0xf2b3 | 1445 | #define R0900_P2_MODCODLST3 0xf2b3 |
1461 | #define F0900_P2_DIS_32PSK_4_5 0xf2b300f0 | 1446 | #define F0900_P2_DIS_32PSK_4_5 0xf2b300f0 |
1462 | #define F0900_P2_DIS_32PSK_3_4 0xf2b3000f | 1447 | #define F0900_P2_DIS_32PSK_3_4 0xf2b3000f |
1463 | 1448 | ||
1464 | /*P2_MODCODLST4*/ | 1449 | /*P2_MODCODLST4*/ |
1465 | #define R0900_P2_MODCODLST4 0xf2b4 | 1450 | #define R0900_P2_MODCODLST4 0xf2b4 |
1466 | #define F0900_P2_DIS_16PSK_9_10 0xf2b400f0 | 1451 | #define F0900_P2_DIS_16PSK_9_10 0xf2b400f0 |
1467 | #define F0900_P2_DIS_16PSK_8_9 0xf2b4000f | 1452 | #define F0900_P2_DIS_16PSK_8_9 0xf2b4000f |
1468 | 1453 | ||
1469 | /*P2_MODCODLST5*/ | 1454 | /*P2_MODCODLST5*/ |
1470 | #define R0900_P2_MODCODLST5 0xf2b5 | 1455 | #define R0900_P2_MODCODLST5 0xf2b5 |
1471 | #define F0900_P2_DIS_16PSK_5_6 0xf2b500f0 | 1456 | #define F0900_P2_DIS_16PSK_5_6 0xf2b500f0 |
1472 | #define F0900_P2_DIS_16PSK_4_5 0xf2b5000f | 1457 | #define F0900_P2_DIS_16PSK_4_5 0xf2b5000f |
1473 | 1458 | ||
1474 | /*P2_MODCODLST6*/ | 1459 | /*P2_MODCODLST6*/ |
1475 | #define R0900_P2_MODCODLST6 0xf2b6 | 1460 | #define R0900_P2_MODCODLST6 0xf2b6 |
1476 | #define F0900_P2_DIS_16PSK_3_4 0xf2b600f0 | 1461 | #define F0900_P2_DIS_16PSK_3_4 0xf2b600f0 |
1477 | #define F0900_P2_DIS_16PSK_2_3 0xf2b6000f | 1462 | #define F0900_P2_DIS_16PSK_2_3 0xf2b6000f |
1478 | 1463 | ||
1479 | /*P2_MODCODLST7*/ | 1464 | /*P2_MODCODLST7*/ |
1480 | #define R0900_P2_MODCODLST7 0xf2b7 | 1465 | #define R0900_P2_MODCODLST7 0xf2b7 |
1481 | #define F0900_P2_DIS_8P_9_10 0xf2b700f0 | 1466 | #define F0900_P2_DIS_8P_9_10 0xf2b700f0 |
1482 | #define F0900_P2_DIS_8P_8_9 0xf2b7000f | 1467 | #define F0900_P2_DIS_8P_8_9 0xf2b7000f |
1483 | 1468 | ||
1484 | /*P2_MODCODLST8*/ | 1469 | /*P2_MODCODLST8*/ |
1485 | #define R0900_P2_MODCODLST8 0xf2b8 | 1470 | #define R0900_P2_MODCODLST8 0xf2b8 |
1486 | #define F0900_P2_DIS_8P_5_6 0xf2b800f0 | 1471 | #define F0900_P2_DIS_8P_5_6 0xf2b800f0 |
1487 | #define F0900_P2_DIS_8P_3_4 0xf2b8000f | 1472 | #define F0900_P2_DIS_8P_3_4 0xf2b8000f |
1488 | 1473 | ||
1489 | /*P2_MODCODLST9*/ | 1474 | /*P2_MODCODLST9*/ |
1490 | #define R0900_P2_MODCODLST9 0xf2b9 | 1475 | #define R0900_P2_MODCODLST9 0xf2b9 |
1491 | #define F0900_P2_DIS_8P_2_3 0xf2b900f0 | 1476 | #define F0900_P2_DIS_8P_2_3 0xf2b900f0 |
1492 | #define F0900_P2_DIS_8P_3_5 0xf2b9000f | 1477 | #define F0900_P2_DIS_8P_3_5 0xf2b9000f |
1493 | 1478 | ||
1494 | /*P2_MODCODLSTA*/ | 1479 | /*P2_MODCODLSTA*/ |
1495 | #define R0900_P2_MODCODLSTA 0xf2ba | 1480 | #define R0900_P2_MODCODLSTA 0xf2ba |
1496 | #define F0900_P2_DIS_QP_9_10 0xf2ba00f0 | 1481 | #define F0900_P2_DIS_QP_9_10 0xf2ba00f0 |
1497 | #define F0900_P2_DIS_QP_8_9 0xf2ba000f | 1482 | #define F0900_P2_DIS_QP_8_9 0xf2ba000f |
1498 | 1483 | ||
1499 | /*P2_MODCODLSTB*/ | 1484 | /*P2_MODCODLSTB*/ |
1500 | #define R0900_P2_MODCODLSTB 0xf2bb | 1485 | #define R0900_P2_MODCODLSTB 0xf2bb |
1501 | #define F0900_P2_DIS_QP_5_6 0xf2bb00f0 | 1486 | #define F0900_P2_DIS_QP_5_6 0xf2bb00f0 |
1502 | #define F0900_P2_DIS_QP_4_5 0xf2bb000f | 1487 | #define F0900_P2_DIS_QP_4_5 0xf2bb000f |
1503 | 1488 | ||
1504 | /*P2_MODCODLSTC*/ | 1489 | /*P2_MODCODLSTC*/ |
1505 | #define R0900_P2_MODCODLSTC 0xf2bc | 1490 | #define R0900_P2_MODCODLSTC 0xf2bc |
1506 | #define F0900_P2_DIS_QP_3_4 0xf2bc00f0 | 1491 | #define F0900_P2_DIS_QP_3_4 0xf2bc00f0 |
1507 | #define F0900_P2_DIS_QP_2_3 0xf2bc000f | 1492 | #define F0900_P2_DIS_QP_2_3 0xf2bc000f |
1508 | 1493 | ||
1509 | /*P2_MODCODLSTD*/ | 1494 | /*P2_MODCODLSTD*/ |
1510 | #define R0900_P2_MODCODLSTD 0xf2bd | 1495 | #define R0900_P2_MODCODLSTD 0xf2bd |
1511 | #define F0900_P2_DIS_QP_3_5 0xf2bd00f0 | 1496 | #define F0900_P2_DIS_QP_3_5 0xf2bd00f0 |
1512 | #define F0900_P2_DIS_QP_1_2 0xf2bd000f | 1497 | #define F0900_P2_DIS_QP_1_2 0xf2bd000f |
1513 | 1498 | ||
1514 | /*P2_MODCODLSTE*/ | 1499 | /*P2_MODCODLSTE*/ |
1515 | #define R0900_P2_MODCODLSTE 0xf2be | 1500 | #define R0900_P2_MODCODLSTE 0xf2be |
1516 | #define F0900_P2_DIS_QP_2_5 0xf2be00f0 | 1501 | #define F0900_P2_DIS_QP_2_5 0xf2be00f0 |
1517 | #define F0900_P2_DIS_QP_1_3 0xf2be000f | 1502 | #define F0900_P2_DIS_QP_1_3 0xf2be000f |
1518 | 1503 | ||
1519 | /*P2_MODCODLSTF*/ | 1504 | /*P2_MODCODLSTF*/ |
1520 | #define R0900_P2_MODCODLSTF 0xf2bf | 1505 | #define R0900_P2_MODCODLSTF 0xf2bf |
1521 | #define F0900_P2_DIS_QP_1_4 0xf2bf00f0 | 1506 | #define F0900_P2_DIS_QP_1_4 0xf2bf00f0 |
1522 | #define F0900_P2_DDEMOD_SET 0xf2bf0002 | 1507 | |
1523 | #define F0900_P2_DDEMOD_MASK 0xf2bf0001 | 1508 | /*P2_GAUSSR0*/ |
1509 | #define R0900_P2_GAUSSR0 0xf2c0 | ||
1510 | #define F0900_P2_EN_CCIMODE 0xf2c00080 | ||
1511 | #define F0900_P2_R0_GAUSSIEN 0xf2c0007f | ||
1512 | |||
1513 | /*P2_CCIR0*/ | ||
1514 | #define R0900_P2_CCIR0 0xf2c1 | ||
1515 | #define F0900_P2_CCIDETECT_PLHONLY 0xf2c10080 | ||
1516 | #define F0900_P2_R0_CCI 0xf2c1007f | ||
1517 | |||
1518 | /*P2_CCIQUANT*/ | ||
1519 | #define R0900_P2_CCIQUANT 0xf2c2 | ||
1520 | #define F0900_P2_CCI_BETA 0xf2c200e0 | ||
1521 | #define F0900_P2_CCI_QUANT 0xf2c2001f | ||
1522 | |||
1523 | /*P2_CCITHRES*/ | ||
1524 | #define R0900_P2_CCITHRES 0xf2c3 | ||
1525 | #define F0900_P2_CCI_THRESHOLD 0xf2c300ff | ||
1526 | |||
1527 | /*P2_CCIACC*/ | ||
1528 | #define R0900_P2_CCIACC 0xf2c4 | ||
1529 | #define F0900_P2_CCI_VALUE 0xf2c400ff | ||
1524 | 1530 | ||
1525 | /*P2_DMDRESCFG*/ | 1531 | /*P2_DMDRESCFG*/ |
1526 | #define R0900_P2_DMDRESCFG 0xf2c6 | 1532 | #define R0900_P2_DMDRESCFG 0xf2c6 |
1527 | #define F0900_P2_DMDRES_RESET 0xf2c60080 | 1533 | #define F0900_P2_DMDRES_RESET 0xf2c60080 |
1528 | #define F0900_P2_DMDRES_NOISESQR 0xf2c60010 | 1534 | #define F0900_P2_DMDRES_STRALL 0xf2c60008 |
1529 | #define F0900_P2_DMDRES_STRALL 0xf2c60008 | 1535 | #define F0900_P2_DMDRES_NEWONLY 0xf2c60004 |
1530 | #define F0900_P2_DMDRES_NEWONLY 0xf2c60004 | 1536 | #define F0900_P2_DMDRES_NOSTORE 0xf2c60002 |
1531 | #define F0900_P2_DMDRES_NOSTORE 0xf2c60002 | ||
1532 | #define F0900_P2_DMDRES_AGC2MEM 0xf2c60001 | ||
1533 | 1537 | ||
1534 | /*P2_DMDRESADR*/ | 1538 | /*P2_DMDRESADR*/ |
1535 | #define R0900_P2_DMDRESADR 0xf2c7 | 1539 | #define R0900_P2_DMDRESADR 0xf2c7 |
1536 | #define F0900_P2_SUSP_PREDCANAL 0xf2c70080 | 1540 | #define F0900_P2_DMDRES_VALIDCFR 0xf2c70040 |
1537 | #define F0900_P2_DMDRES_VALIDCFR 0xf2c70040 | 1541 | #define F0900_P2_DMDRES_MEMFULL 0xf2c70030 |
1538 | #define F0900_P2_DMDRES_MEMFULL 0xf2c70030 | 1542 | #define F0900_P2_DMDRES_RESNBR 0xf2c7000f |
1539 | #define F0900_P2_DMDRES_RESNBR 0xf2c7000f | ||
1540 | 1543 | ||
1541 | /*P2_DMDRESDATA7*/ | 1544 | /*P2_DMDRESDATA7*/ |
1542 | #define R0900_P2_DMDRESDATA7 0xf2c8 | 1545 | #define R0900_P2_DMDRESDATA7 0xf2c8 |
1543 | #define F0900_P2_DMDRES_DATA7 0xf2c800ff | 1546 | #define F0900_P2_DMDRES_DATA7 0xf2c800ff |
1544 | 1547 | ||
1545 | /*P2_DMDRESDATA6*/ | 1548 | /*P2_DMDRESDATA6*/ |
1546 | #define R0900_P2_DMDRESDATA6 0xf2c9 | 1549 | #define R0900_P2_DMDRESDATA6 0xf2c9 |
1547 | #define F0900_P2_DMDRES_DATA6 0xf2c900ff | 1550 | #define F0900_P2_DMDRES_DATA6 0xf2c900ff |
1548 | 1551 | ||
1549 | /*P2_DMDRESDATA5*/ | 1552 | /*P2_DMDRESDATA5*/ |
1550 | #define R0900_P2_DMDRESDATA5 0xf2ca | 1553 | #define R0900_P2_DMDRESDATA5 0xf2ca |
1551 | #define F0900_P2_DMDRES_DATA5 0xf2ca00ff | 1554 | #define F0900_P2_DMDRES_DATA5 0xf2ca00ff |
1552 | 1555 | ||
1553 | /*P2_DMDRESDATA4*/ | 1556 | /*P2_DMDRESDATA4*/ |
1554 | #define R0900_P2_DMDRESDATA4 0xf2cb | 1557 | #define R0900_P2_DMDRESDATA4 0xf2cb |
1555 | #define F0900_P2_DMDRES_DATA4 0xf2cb00ff | 1558 | #define F0900_P2_DMDRES_DATA4 0xf2cb00ff |
1556 | 1559 | ||
1557 | /*P2_DMDRESDATA3*/ | 1560 | /*P2_DMDRESDATA3*/ |
1558 | #define R0900_P2_DMDRESDATA3 0xf2cc | 1561 | #define R0900_P2_DMDRESDATA3 0xf2cc |
1559 | #define F0900_P2_DMDRES_DATA3 0xf2cc00ff | 1562 | #define F0900_P2_DMDRES_DATA3 0xf2cc00ff |
1560 | 1563 | ||
1561 | /*P2_DMDRESDATA2*/ | 1564 | /*P2_DMDRESDATA2*/ |
1562 | #define R0900_P2_DMDRESDATA2 0xf2cd | 1565 | #define R0900_P2_DMDRESDATA2 0xf2cd |
1563 | #define F0900_P2_DMDRES_DATA2 0xf2cd00ff | 1566 | #define F0900_P2_DMDRES_DATA2 0xf2cd00ff |
1564 | 1567 | ||
1565 | /*P2_DMDRESDATA1*/ | 1568 | /*P2_DMDRESDATA1*/ |
1566 | #define R0900_P2_DMDRESDATA1 0xf2ce | 1569 | #define R0900_P2_DMDRESDATA1 0xf2ce |
1567 | #define F0900_P2_DMDRES_DATA1 0xf2ce00ff | 1570 | #define F0900_P2_DMDRES_DATA1 0xf2ce00ff |
1568 | 1571 | ||
1569 | /*P2_DMDRESDATA0*/ | 1572 | /*P2_DMDRESDATA0*/ |
1570 | #define R0900_P2_DMDRESDATA0 0xf2cf | 1573 | #define R0900_P2_DMDRESDATA0 0xf2cf |
1571 | #define F0900_P2_DMDRES_DATA0 0xf2cf00ff | 1574 | #define F0900_P2_DMDRES_DATA0 0xf2cf00ff |
1572 | 1575 | ||
1573 | /*P2_FFEI1*/ | 1576 | /*P2_FFEI1*/ |
1574 | #define R0900_P2_FFEI1 0xf2d0 | 1577 | #define R0900_P2_FFEI1 0xf2d0 |
1575 | #define F0900_P2_FFE_ACCI1 0xf2d001ff | 1578 | #define F0900_P2_FFE_ACCI1 0xf2d001ff |
1576 | 1579 | ||
1577 | /*P2_FFEQ1*/ | 1580 | /*P2_FFEQ1*/ |
1578 | #define R0900_P2_FFEQ1 0xf2d1 | 1581 | #define R0900_P2_FFEQ1 0xf2d1 |
1579 | #define F0900_P2_FFE_ACCQ1 0xf2d101ff | 1582 | #define F0900_P2_FFE_ACCQ1 0xf2d101ff |
1580 | 1583 | ||
1581 | /*P2_FFEI2*/ | 1584 | /*P2_FFEI2*/ |
1582 | #define R0900_P2_FFEI2 0xf2d2 | 1585 | #define R0900_P2_FFEI2 0xf2d2 |
1583 | #define F0900_P2_FFE_ACCI2 0xf2d201ff | 1586 | #define F0900_P2_FFE_ACCI2 0xf2d201ff |
1584 | 1587 | ||
1585 | /*P2_FFEQ2*/ | 1588 | /*P2_FFEQ2*/ |
1586 | #define R0900_P2_FFEQ2 0xf2d3 | 1589 | #define R0900_P2_FFEQ2 0xf2d3 |
1587 | #define F0900_P2_FFE_ACCQ2 0xf2d301ff | 1590 | #define F0900_P2_FFE_ACCQ2 0xf2d301ff |
1588 | 1591 | ||
1589 | /*P2_FFEI3*/ | 1592 | /*P2_FFEI3*/ |
1590 | #define R0900_P2_FFEI3 0xf2d4 | 1593 | #define R0900_P2_FFEI3 0xf2d4 |
1591 | #define F0900_P2_FFE_ACCI3 0xf2d401ff | 1594 | #define F0900_P2_FFE_ACCI3 0xf2d401ff |
1592 | 1595 | ||
1593 | /*P2_FFEQ3*/ | 1596 | /*P2_FFEQ3*/ |
1594 | #define R0900_P2_FFEQ3 0xf2d5 | 1597 | #define R0900_P2_FFEQ3 0xf2d5 |
1595 | #define F0900_P2_FFE_ACCQ3 0xf2d501ff | 1598 | #define F0900_P2_FFE_ACCQ3 0xf2d501ff |
1596 | 1599 | ||
1597 | /*P2_FFEI4*/ | 1600 | /*P2_FFEI4*/ |
1598 | #define R0900_P2_FFEI4 0xf2d6 | 1601 | #define R0900_P2_FFEI4 0xf2d6 |
1599 | #define F0900_P2_FFE_ACCI4 0xf2d601ff | 1602 | #define F0900_P2_FFE_ACCI4 0xf2d601ff |
1600 | 1603 | ||
1601 | /*P2_FFEQ4*/ | 1604 | /*P2_FFEQ4*/ |
1602 | #define R0900_P2_FFEQ4 0xf2d7 | 1605 | #define R0900_P2_FFEQ4 0xf2d7 |
1603 | #define F0900_P2_FFE_ACCQ4 0xf2d701ff | 1606 | #define F0900_P2_FFE_ACCQ4 0xf2d701ff |
1604 | 1607 | ||
1605 | /*P2_FFECFG*/ | 1608 | /*P2_FFECFG*/ |
1606 | #define R0900_P2_FFECFG 0xf2d8 | 1609 | #define R0900_P2_FFECFG 0xf2d8 |
1607 | #define F0900_P2_EQUALFFE_ON 0xf2d80040 | 1610 | #define F0900_P2_EQUALFFE_ON 0xf2d80040 |
1608 | #define F0900_P2_EQUAL_USEDSYMB 0xf2d80030 | 1611 | #define F0900_P2_MU_EQUALFFE 0xf2d80007 |
1609 | #define F0900_P2_MU_EQUALFFE 0xf2d80007 | ||
1610 | 1612 | ||
1611 | /*P2_TNRCFG*/ | 1613 | /*P2_TNRCFG*/ |
1612 | #define R0900_P2_TNRCFG 0xf2e0 | 1614 | #define R0900_P2_TNRCFG 0xf2e0 |
1613 | #define F0900_P2_TUN_ACKFAIL 0xf2e00080 | 1615 | #define F0900_P2_TUN_ACKFAIL 0xf2e00080 |
1614 | #define F0900_P2_TUN_TYPE 0xf2e00070 | 1616 | #define F0900_P2_TUN_TYPE 0xf2e00070 |
1615 | #define F0900_P2_TUN_SECSTOP 0xf2e00008 | 1617 | #define F0900_P2_TUN_SECSTOP 0xf2e00008 |
1616 | #define F0900_P2_TUN_VCOSRCH 0xf2e00004 | 1618 | #define F0900_P2_TUN_VCOSRCH 0xf2e00004 |
1617 | #define F0900_P2_TUN_MADDRESS 0xf2e00003 | 1619 | #define F0900_P2_TUN_MADDRESS 0xf2e00003 |
1618 | 1620 | ||
1619 | /*P2_TNRCFG2*/ | 1621 | /*P2_TNRCFG2*/ |
1620 | #define R0900_P2_TNRCFG2 0xf2e1 | 1622 | #define R0900_P2_TNRCFG2 0xf2e1 |
1621 | #define F0900_P2_TUN_IQSWAP 0xf2e10080 | 1623 | #define F0900_P2_TUN_IQSWAP 0xf2e10080 |
1622 | #define F0900_P2_STB6110_STEP2MHZ 0xf2e10040 | 1624 | #define F0900_P2_DIS_BWCALC 0xf2e10004 |
1623 | #define F0900_P2_STB6120_DBLI2C 0xf2e10020 | 1625 | #define F0900_P2_SHORT_WAITSTATES 0xf2e10002 |
1624 | #define F0900_P2_DIS_FCCK 0xf2e10010 | ||
1625 | #define F0900_P2_DIS_LPEN 0xf2e10008 | ||
1626 | #define F0900_P2_DIS_BWCALC 0xf2e10004 | ||
1627 | #define F0900_P2_SHORT_WAITSTATES 0xf2e10002 | ||
1628 | #define F0900_P2_DIS_2BWAGC1 0xf2e10001 | ||
1629 | 1626 | ||
1630 | /*P2_TNRXTAL*/ | 1627 | /*P2_TNRXTAL*/ |
1631 | #define R0900_P2_TNRXTAL 0xf2e4 | 1628 | #define R0900_P2_TNRXTAL 0xf2e4 |
1632 | #define F0900_P2_TUN_MCLKDECIMAL 0xf2e400e0 | 1629 | #define F0900_P2_TUN_XTALFREQ 0xf2e4001f |
1633 | #define F0900_P2_TUN_XTALFREQ 0xf2e4001f | ||
1634 | 1630 | ||
1635 | /*P2_TNRSTEPS*/ | 1631 | /*P2_TNRSTEPS*/ |
1636 | #define R0900_P2_TNRSTEPS 0xf2e7 | 1632 | #define R0900_P2_TNRSTEPS 0xf2e7 |
1637 | #define F0900_P2_TUNER_BW1P6 0xf2e70080 | 1633 | #define F0900_P2_TUNER_BW0P125 0xf2e70080 |
1638 | #define F0900_P2_BWINC_OFFSET 0xf2e70070 | 1634 | #define F0900_P2_BWINC_OFFSET 0xf2e70170 |
1639 | #define F0900_P2_SOFTSTEP_RNG 0xf2e70008 | 1635 | #define F0900_P2_SOFTSTEP_RNG 0xf2e70008 |
1640 | #define F0900_P2_TUN_BWOFFSET 0xf2e70107 | 1636 | #define F0900_P2_TUN_BWOFFSET 0xf2e70007 |
1641 | 1637 | ||
1642 | /*P2_TNRGAIN*/ | 1638 | /*P2_TNRGAIN*/ |
1643 | #define R0900_P2_TNRGAIN 0xf2e8 | 1639 | #define R0900_P2_TNRGAIN 0xf2e8 |
1644 | #define F0900_P2_TUN_KDIVEN 0xf2e800c0 | 1640 | #define F0900_P2_TUN_KDIVEN 0xf2e800c0 |
1645 | #define F0900_P2_STB6X00_OCK 0xf2e80030 | 1641 | #define F0900_P2_STB6X00_OCK 0xf2e80030 |
1646 | #define F0900_P2_TUN_GAIN 0xf2e8000f | 1642 | #define F0900_P2_TUN_GAIN 0xf2e8000f |
1647 | 1643 | ||
1648 | /*P2_TNRRF1*/ | 1644 | /*P2_TNRRF1*/ |
1649 | #define R0900_P2_TNRRF1 0xf2e9 | 1645 | #define R0900_P2_TNRRF1 0xf2e9 |
1650 | #define F0900_P2_TUN_RFFREQ2 0xf2e900ff | 1646 | #define F0900_P2_TUN_RFFREQ2 0xf2e900ff |
1651 | 1647 | ||
1652 | /*P2_TNRRF0*/ | 1648 | /*P2_TNRRF0*/ |
1653 | #define R0900_P2_TNRRF0 0xf2ea | 1649 | #define R0900_P2_TNRRF0 0xf2ea |
1654 | #define F0900_P2_TUN_RFFREQ1 0xf2ea00ff | 1650 | #define F0900_P2_TUN_RFFREQ1 0xf2ea00ff |
1655 | 1651 | ||
1656 | /*P2_TNRBW*/ | 1652 | /*P2_TNRBW*/ |
1657 | #define R0900_P2_TNRBW 0xf2eb | 1653 | #define R0900_P2_TNRBW 0xf2eb |
1658 | #define F0900_P2_TUN_RFFREQ0 0xf2eb00c0 | 1654 | #define F0900_P2_TUN_RFFREQ0 0xf2eb00c0 |
1659 | #define F0900_P2_TUN_BW 0xf2eb003f | 1655 | #define F0900_P2_TUN_BW 0xf2eb003f |
1660 | 1656 | ||
1661 | /*P2_TNRADJ*/ | 1657 | /*P2_TNRADJ*/ |
1662 | #define R0900_P2_TNRADJ 0xf2ec | 1658 | #define R0900_P2_TNRADJ 0xf2ec |
1663 | #define F0900_P2_STB61X0_RCLK 0xf2ec0080 | 1659 | #define F0900_P2_STB61X0_CALTIME 0xf2ec0040 |
1664 | #define F0900_P2_STB61X0_CALTIME 0xf2ec0040 | ||
1665 | #define F0900_P2_STB6X00_DLB 0xf2ec0038 | ||
1666 | #define F0900_P2_STB6000_FCL 0xf2ec0007 | ||
1667 | 1660 | ||
1668 | /*P2_TNRCTL2*/ | 1661 | /*P2_TNRCTL2*/ |
1669 | #define R0900_P2_TNRCTL2 0xf2ed | 1662 | #define R0900_P2_TNRCTL2 0xf2ed |
1670 | #define F0900_P2_STB61X0_LCP1_RCCKOFF 0xf2ed0080 | 1663 | #define F0900_P2_STB61X0_RCCKOFF 0xf2ed0080 |
1671 | #define F0900_P2_STB61X0_LCP0 0xf2ed0040 | 1664 | #define F0900_P2_STB61X0_ICP_SDOFF 0xf2ed0040 |
1672 | #define F0900_P2_STB61X0_XTOUT_RFOUTS 0xf2ed0020 | 1665 | #define F0900_P2_STB61X0_DCLOOPOFF 0xf2ed0020 |
1673 | #define F0900_P2_STB61X0_XTON_MCKDV 0xf2ed0010 | 1666 | #define F0900_P2_STB61X0_REFOUTSEL 0xf2ed0010 |
1674 | #define F0900_P2_STB61X0_CALOFF_DCOFF 0xf2ed0008 | 1667 | #define F0900_P2_STB61X0_CALOFF 0xf2ed0008 |
1675 | #define F0900_P2_STB6110_LPT 0xf2ed0004 | 1668 | #define F0900_P2_STB6XX0_LPT_BEN 0xf2ed0004 |
1676 | #define F0900_P2_STB6110_RX 0xf2ed0002 | 1669 | #define F0900_P2_STB6XX0_RX_OSCP 0xf2ed0002 |
1677 | #define F0900_P2_STB6110_SYN 0xf2ed0001 | 1670 | #define F0900_P2_STB6XX0_SYN 0xf2ed0001 |
1678 | 1671 | ||
1679 | /*P2_TNRCFG3*/ | 1672 | /*P2_TNRCFG3*/ |
1680 | #define R0900_P2_TNRCFG3 0xf2ee | 1673 | #define R0900_P2_TNRCFG3 0xf2ee |
1681 | #define F0900_P2_STB6120_DISCTRL1 0xf2ee0080 | 1674 | #define F0900_P2_TUN_PLLFREQ 0xf2ee001c |
1682 | #define F0900_P2_STB6120_INVORDER 0xf2ee0040 | 1675 | #define F0900_P2_TUN_I2CFREQ_MODE 0xf2ee0003 |
1683 | #define F0900_P2_STB6120_ENCTRL6 0xf2ee0020 | ||
1684 | #define F0900_P2_TUN_PLLFREQ 0xf2ee001c | ||
1685 | #define F0900_P2_TUN_I2CFREQ_MODE 0xf2ee0003 | ||
1686 | 1676 | ||
1687 | /*P2_TNRLAUNCH*/ | 1677 | /*P2_TNRLAUNCH*/ |
1688 | #define R0900_P2_TNRLAUNCH 0xf2f0 | 1678 | #define R0900_P2_TNRLAUNCH 0xf2f0 |
1689 | 1679 | ||
1690 | /*P2_TNRLD*/ | 1680 | /*P2_TNRLD*/ |
1691 | #define R0900_P2_TNRLD 0xf2f0 | 1681 | #define R0900_P2_TNRLD 0xf2f0 |
1692 | #define F0900_P2_TUNLD_VCOING 0xf2f00080 | 1682 | #define F0900_P2_TUNLD_VCOING 0xf2f00080 |
1693 | #define F0900_P2_TUN_REG1FAIL 0xf2f00040 | 1683 | #define F0900_P2_TUN_REG1FAIL 0xf2f00040 |
1694 | #define F0900_P2_TUN_REG2FAIL 0xf2f00020 | 1684 | #define F0900_P2_TUN_REG2FAIL 0xf2f00020 |
1695 | #define F0900_P2_TUN_REG3FAIL 0xf2f00010 | 1685 | #define F0900_P2_TUN_REG3FAIL 0xf2f00010 |
1696 | #define F0900_P2_TUN_REG4FAIL 0xf2f00008 | 1686 | #define F0900_P2_TUN_REG4FAIL 0xf2f00008 |
1697 | #define F0900_P2_TUN_REG5FAIL 0xf2f00004 | 1687 | #define F0900_P2_TUN_REG5FAIL 0xf2f00004 |
1698 | #define F0900_P2_TUN_BWING 0xf2f00002 | 1688 | #define F0900_P2_TUN_BWING 0xf2f00002 |
1699 | #define F0900_P2_TUN_LOCKED 0xf2f00001 | 1689 | #define F0900_P2_TUN_LOCKED 0xf2f00001 |
1700 | 1690 | ||
1701 | /*P2_TNROBSL*/ | 1691 | /*P2_TNROBSL*/ |
1702 | #define R0900_P2_TNROBSL 0xf2f6 | 1692 | #define R0900_P2_TNROBSL 0xf2f6 |
1703 | #define F0900_P2_TUN_I2CABORTED 0xf2f60080 | 1693 | #define F0900_P2_TUN_I2CABORTED 0xf2f60080 |
1704 | #define F0900_P2_TUN_LPEN 0xf2f60040 | 1694 | #define F0900_P2_TUN_LPEN 0xf2f60040 |
1705 | #define F0900_P2_TUN_FCCK 0xf2f60020 | 1695 | #define F0900_P2_TUN_FCCK 0xf2f60020 |
1706 | #define F0900_P2_TUN_I2CLOCKED 0xf2f60010 | 1696 | #define F0900_P2_TUN_I2CLOCKED 0xf2f60010 |
1707 | #define F0900_P2_TUN_PROGDONE 0xf2f6000c | 1697 | #define F0900_P2_TUN_PROGDONE 0xf2f6000c |
1708 | #define F0900_P2_TUN_RFRESTE1 0xf2f60003 | 1698 | #define F0900_P2_TUN_RFRESTE1 0xf2f60003 |
1709 | 1699 | ||
1710 | /*P2_TNRRESTE*/ | 1700 | /*P2_TNRRESTE*/ |
1711 | #define R0900_P2_TNRRESTE 0xf2f7 | 1701 | #define R0900_P2_TNRRESTE 0xf2f7 |
1712 | #define F0900_P2_TUN_RFRESTE0 0xf2f700ff | 1702 | #define F0900_P2_TUN_RFRESTE0 0xf2f700ff |
1713 | 1703 | ||
1714 | /*P2_SMAPCOEF7*/ | 1704 | /*P2_SMAPCOEF7*/ |
1715 | #define R0900_P2_SMAPCOEF7 0xf300 | 1705 | #define R0900_P2_SMAPCOEF7 0xf300 |
1716 | #define F0900_P2_DIS_QSCALE 0xf3000080 | 1706 | #define F0900_P2_DIS_QSCALE 0xf3000080 |
1717 | #define F0900_P2_SMAPCOEF_Q_LLR12 0xf300017f | 1707 | #define F0900_P2_SMAPCOEF_Q_LLR12 0xf300017f |
1718 | 1708 | ||
1719 | /*P2_SMAPCOEF6*/ | 1709 | /*P2_SMAPCOEF6*/ |
1720 | #define R0900_P2_SMAPCOEF6 0xf301 | 1710 | #define R0900_P2_SMAPCOEF6 0xf301 |
1721 | #define F0900_P2_DIS_NEWSCALE 0xf3010008 | 1711 | #define F0900_P2_ADJ_8PSKLLR1 0xf3010004 |
1722 | #define F0900_P2_ADJ_8PSKLLR1 0xf3010004 | 1712 | #define F0900_P2_OLD_8PSKLLR1 0xf3010002 |
1723 | #define F0900_P2_OLD_8PSKLLR1 0xf3010002 | 1713 | #define F0900_P2_DIS_AB8PSK 0xf3010001 |
1724 | #define F0900_P2_DIS_AB8PSK 0xf3010001 | ||
1725 | 1714 | ||
1726 | /*P2_SMAPCOEF5*/ | 1715 | /*P2_SMAPCOEF5*/ |
1727 | #define R0900_P2_SMAPCOEF5 0xf302 | 1716 | #define R0900_P2_SMAPCOEF5 0xf302 |
1728 | #define F0900_P2_DIS_8SCALE 0xf3020080 | 1717 | #define F0900_P2_DIS_8SCALE 0xf3020080 |
1729 | #define F0900_P2_SMAPCOEF_8P_LLR23 0xf302017f | 1718 | #define F0900_P2_SMAPCOEF_8P_LLR23 0xf302017f |
1719 | |||
1720 | /*P2_NCO2MAX1*/ | ||
1721 | #define R0900_P2_NCO2MAX1 0xf314 | ||
1722 | #define F0900_P2_TETA2_MAXVABS1 0xf31400ff | ||
1723 | |||
1724 | /*P2_NCO2MAX0*/ | ||
1725 | #define R0900_P2_NCO2MAX0 0xf315 | ||
1726 | #define F0900_P2_TETA2_MAXVABS0 0xf31500ff | ||
1727 | |||
1728 | /*P2_NCO2FR1*/ | ||
1729 | #define R0900_P2_NCO2FR1 0xf316 | ||
1730 | #define F0900_P2_NCO2FINAL_ANGLE1 0xf31600ff | ||
1731 | |||
1732 | /*P2_NCO2FR0*/ | ||
1733 | #define R0900_P2_NCO2FR0 0xf317 | ||
1734 | #define F0900_P2_NCO2FINAL_ANGLE0 0xf31700ff | ||
1735 | |||
1736 | /*P2_CFR2AVRGE1*/ | ||
1737 | #define R0900_P2_CFR2AVRGE1 0xf318 | ||
1738 | #define F0900_P2_I2C_CFR2AVERAGE1 0xf31800ff | ||
1739 | |||
1740 | /*P2_CFR2AVRGE0*/ | ||
1741 | #define R0900_P2_CFR2AVRGE0 0xf319 | ||
1742 | #define F0900_P2_I2C_CFR2AVERAGE0 0xf31900ff | ||
1730 | 1743 | ||
1731 | /*P2_DMDPLHSTAT*/ | 1744 | /*P2_DMDPLHSTAT*/ |
1732 | #define R0900_P2_DMDPLHSTAT 0xf320 | 1745 | #define R0900_P2_DMDPLHSTAT 0xf320 |
1733 | #define F0900_P2_PLH_STATISTIC 0xf32000ff | 1746 | #define F0900_P2_PLH_STATISTIC 0xf32000ff |
1734 | 1747 | ||
1735 | /*P2_LOCKTIME3*/ | 1748 | /*P2_LOCKTIME3*/ |
1736 | #define R0900_P2_LOCKTIME3 0xf322 | 1749 | #define R0900_P2_LOCKTIME3 0xf322 |
1737 | #define F0900_P2_DEMOD_LOCKTIME3 0xf32200ff | 1750 | #define F0900_P2_DEMOD_LOCKTIME3 0xf32200ff |
1738 | 1751 | ||
1739 | /*P2_LOCKTIME2*/ | 1752 | /*P2_LOCKTIME2*/ |
1740 | #define R0900_P2_LOCKTIME2 0xf323 | 1753 | #define R0900_P2_LOCKTIME2 0xf323 |
1741 | #define F0900_P2_DEMOD_LOCKTIME2 0xf32300ff | 1754 | #define F0900_P2_DEMOD_LOCKTIME2 0xf32300ff |
1742 | 1755 | ||
1743 | /*P2_LOCKTIME1*/ | 1756 | /*P2_LOCKTIME1*/ |
1744 | #define R0900_P2_LOCKTIME1 0xf324 | 1757 | #define R0900_P2_LOCKTIME1 0xf324 |
1745 | #define F0900_P2_DEMOD_LOCKTIME1 0xf32400ff | 1758 | #define F0900_P2_DEMOD_LOCKTIME1 0xf32400ff |
1746 | 1759 | ||
1747 | /*P2_LOCKTIME0*/ | 1760 | /*P2_LOCKTIME0*/ |
1748 | #define R0900_P2_LOCKTIME0 0xf325 | 1761 | #define R0900_P2_LOCKTIME0 0xf325 |
1749 | #define F0900_P2_DEMOD_LOCKTIME0 0xf32500ff | 1762 | #define F0900_P2_DEMOD_LOCKTIME0 0xf32500ff |
1750 | 1763 | ||
1751 | /*P2_VITSCALE*/ | 1764 | /*P2_VITSCALE*/ |
1752 | #define R0900_P2_VITSCALE 0xf332 | 1765 | #define R0900_P2_VITSCALE 0xf332 |
1753 | #define F0900_P2_NVTH_NOSRANGE 0xf3320080 | 1766 | #define F0900_P2_NVTH_NOSRANGE 0xf3320080 |
1754 | #define F0900_P2_VERROR_MAXMODE 0xf3320040 | 1767 | #define F0900_P2_VERROR_MAXMODE 0xf3320040 |
1755 | #define F0900_P2_KDIV_MODE 0xf3320030 | 1768 | #define F0900_P2_NSLOWSN_LOCKED 0xf3320008 |
1756 | #define F0900_P2_NSLOWSN_LOCKED 0xf3320008 | 1769 | #define F0900_P2_DIS_RSFLOCK 0xf3320002 |
1757 | #define F0900_P2_DELOCK_PRFLOSS 0xf3320004 | ||
1758 | #define F0900_P2_DIS_RSFLOCK 0xf3320002 | ||
1759 | 1770 | ||
1760 | /*P2_FECM*/ | 1771 | /*P2_FECM*/ |
1761 | #define R0900_P2_FECM 0xf333 | 1772 | #define R0900_P2_FECM 0xf333 |
1762 | #define F0900_P2_DSS_DVB 0xf3330080 | 1773 | #define F0900_P2_DSS_DVB 0xf3330080 |
1763 | #define F0900_P2_DEMOD_BYPASS 0xf3330040 | 1774 | #define F0900_P2_DSS_SRCH 0xf3330010 |
1764 | #define F0900_P2_CMP_SLOWMODE 0xf3330020 | 1775 | #define F0900_P2_SYNCVIT 0xf3330002 |
1765 | #define F0900_P2_DSS_SRCH 0xf3330010 | 1776 | #define F0900_P2_IQINV 0xf3330001 |
1766 | #define F0900_P2_DIFF_MODEVIT 0xf3330004 | ||
1767 | #define F0900_P2_SYNCVIT 0xf3330002 | ||
1768 | #define F0900_P2_IQINV 0xf3330001 | ||
1769 | 1777 | ||
1770 | /*P2_VTH12*/ | 1778 | /*P2_VTH12*/ |
1771 | #define R0900_P2_VTH12 0xf334 | 1779 | #define R0900_P2_VTH12 0xf334 |
1772 | #define F0900_P2_VTH12 0xf33400ff | 1780 | #define F0900_P2_VTH12 0xf33400ff |
1773 | 1781 | ||
1774 | /*P2_VTH23*/ | 1782 | /*P2_VTH23*/ |
1775 | #define R0900_P2_VTH23 0xf335 | 1783 | #define R0900_P2_VTH23 0xf335 |
1776 | #define F0900_P2_VTH23 0xf33500ff | 1784 | #define F0900_P2_VTH23 0xf33500ff |
1777 | 1785 | ||
1778 | /*P2_VTH34*/ | 1786 | /*P2_VTH34*/ |
1779 | #define R0900_P2_VTH34 0xf336 | 1787 | #define R0900_P2_VTH34 0xf336 |
1780 | #define F0900_P2_VTH34 0xf33600ff | 1788 | #define F0900_P2_VTH34 0xf33600ff |
1781 | 1789 | ||
1782 | /*P2_VTH56*/ | 1790 | /*P2_VTH56*/ |
1783 | #define R0900_P2_VTH56 0xf337 | 1791 | #define R0900_P2_VTH56 0xf337 |
1784 | #define F0900_P2_VTH56 0xf33700ff | 1792 | #define F0900_P2_VTH56 0xf33700ff |
1785 | 1793 | ||
1786 | /*P2_VTH67*/ | 1794 | /*P2_VTH67*/ |
1787 | #define R0900_P2_VTH67 0xf338 | 1795 | #define R0900_P2_VTH67 0xf338 |
1788 | #define F0900_P2_VTH67 0xf33800ff | 1796 | #define F0900_P2_VTH67 0xf33800ff |
1789 | 1797 | ||
1790 | /*P2_VTH78*/ | 1798 | /*P2_VTH78*/ |
1791 | #define R0900_P2_VTH78 0xf339 | 1799 | #define R0900_P2_VTH78 0xf339 |
1792 | #define F0900_P2_VTH78 0xf33900ff | 1800 | #define F0900_P2_VTH78 0xf33900ff |
1793 | 1801 | ||
1794 | /*P2_VITCURPUN*/ | 1802 | /*P2_VITCURPUN*/ |
1795 | #define R0900_P2_VITCURPUN 0xf33a | 1803 | #define R0900_P2_VITCURPUN 0xf33a |
1796 | #define F0900_P2_VIT_MAPPING 0xf33a00e0 | 1804 | #define F0900_P2_VIT_CURPUN 0xf33a001f |
1797 | #define F0900_P2_VIT_CURPUN 0xf33a001f | ||
1798 | 1805 | ||
1799 | /*P2_VERROR*/ | 1806 | /*P2_VERROR*/ |
1800 | #define R0900_P2_VERROR 0xf33b | 1807 | #define R0900_P2_VERROR 0xf33b |
1801 | #define F0900_P2_REGERR_VIT 0xf33b00ff | 1808 | #define F0900_P2_REGERR_VIT 0xf33b00ff |
1802 | 1809 | ||
1803 | /*P2_PRVIT*/ | 1810 | /*P2_PRVIT*/ |
1804 | #define R0900_P2_PRVIT 0xf33c | 1811 | #define R0900_P2_PRVIT 0xf33c |
1805 | #define F0900_P2_DIS_VTHLOCK 0xf33c0040 | 1812 | #define F0900_P2_DIS_VTHLOCK 0xf33c0040 |
1806 | #define F0900_P2_E7_8VIT 0xf33c0020 | 1813 | #define F0900_P2_E7_8VIT 0xf33c0020 |
1807 | #define F0900_P2_E6_7VIT 0xf33c0010 | 1814 | #define F0900_P2_E6_7VIT 0xf33c0010 |
1808 | #define F0900_P2_E5_6VIT 0xf33c0008 | 1815 | #define F0900_P2_E5_6VIT 0xf33c0008 |
1809 | #define F0900_P2_E3_4VIT 0xf33c0004 | 1816 | #define F0900_P2_E3_4VIT 0xf33c0004 |
1810 | #define F0900_P2_E2_3VIT 0xf33c0002 | 1817 | #define F0900_P2_E2_3VIT 0xf33c0002 |
1811 | #define F0900_P2_E1_2VIT 0xf33c0001 | 1818 | #define F0900_P2_E1_2VIT 0xf33c0001 |
1812 | 1819 | ||
1813 | /*P2_VAVSRVIT*/ | 1820 | /*P2_VAVSRVIT*/ |
1814 | #define R0900_P2_VAVSRVIT 0xf33d | 1821 | #define R0900_P2_VAVSRVIT 0xf33d |
1815 | #define F0900_P2_AMVIT 0xf33d0080 | 1822 | #define F0900_P2_AMVIT 0xf33d0080 |
1816 | #define F0900_P2_FROZENVIT 0xf33d0040 | 1823 | #define F0900_P2_FROZENVIT 0xf33d0040 |
1817 | #define F0900_P2_SNVIT 0xf33d0030 | 1824 | #define F0900_P2_SNVIT 0xf33d0030 |
1818 | #define F0900_P2_TOVVIT 0xf33d000c | 1825 | #define F0900_P2_TOVVIT 0xf33d000c |
1819 | #define F0900_P2_HYPVIT 0xf33d0003 | 1826 | #define F0900_P2_HYPVIT 0xf33d0003 |
1820 | 1827 | ||
1821 | /*P2_VSTATUSVIT*/ | 1828 | /*P2_VSTATUSVIT*/ |
1822 | #define R0900_P2_VSTATUSVIT 0xf33e | 1829 | #define R0900_P2_VSTATUSVIT 0xf33e |
1823 | #define F0900_P2_VITERBI_ON 0xf33e0080 | 1830 | #define F0900_P2_PRFVIT 0xf33e0010 |
1824 | #define F0900_P2_END_LOOPVIT 0xf33e0040 | 1831 | #define F0900_P2_LOCKEDVIT 0xf33e0008 |
1825 | #define F0900_P2_VITERBI_DEPRF 0xf33e0020 | ||
1826 | #define F0900_P2_PRFVIT 0xf33e0010 | ||
1827 | #define F0900_P2_LOCKEDVIT 0xf33e0008 | ||
1828 | #define F0900_P2_VITERBI_DELOCK 0xf33e0004 | ||
1829 | #define F0900_P2_VIT_DEMODSEL 0xf33e0002 | ||
1830 | #define F0900_P2_VITERBI_COMPOUT 0xf33e0001 | ||
1831 | 1832 | ||
1832 | /*P2_VTHINUSE*/ | 1833 | /*P2_VTHINUSE*/ |
1833 | #define R0900_P2_VTHINUSE 0xf33f | 1834 | #define R0900_P2_VTHINUSE 0xf33f |
1834 | #define F0900_P2_VIT_INUSE 0xf33f00ff | 1835 | #define F0900_P2_VIT_INUSE 0xf33f00ff |
1835 | 1836 | ||
1836 | /*P2_KDIV12*/ | 1837 | /*P2_KDIV12*/ |
1837 | #define R0900_P2_KDIV12 0xf340 | 1838 | #define R0900_P2_KDIV12 0xf340 |
1838 | #define F0900_P2_KDIV12_MANUAL 0xf3400080 | 1839 | #define F0900_P2_K_DIVIDER_12 0xf340007f |
1839 | #define F0900_P2_K_DIVIDER_12 0xf340007f | ||
1840 | 1840 | ||
1841 | /*P2_KDIV23*/ | 1841 | /*P2_KDIV23*/ |
1842 | #define R0900_P2_KDIV23 0xf341 | 1842 | #define R0900_P2_KDIV23 0xf341 |
1843 | #define F0900_P2_KDIV23_MANUAL 0xf3410080 | 1843 | #define F0900_P2_K_DIVIDER_23 0xf341007f |
1844 | #define F0900_P2_K_DIVIDER_23 0xf341007f | ||
1845 | 1844 | ||
1846 | /*P2_KDIV34*/ | 1845 | /*P2_KDIV34*/ |
1847 | #define R0900_P2_KDIV34 0xf342 | 1846 | #define R0900_P2_KDIV34 0xf342 |
1848 | #define F0900_P2_KDIV34_MANUAL 0xf3420080 | 1847 | #define F0900_P2_K_DIVIDER_34 0xf342007f |
1849 | #define F0900_P2_K_DIVIDER_34 0xf342007f | ||
1850 | 1848 | ||
1851 | /*P2_KDIV56*/ | 1849 | /*P2_KDIV56*/ |
1852 | #define R0900_P2_KDIV56 0xf343 | 1850 | #define R0900_P2_KDIV56 0xf343 |
1853 | #define F0900_P2_KDIV56_MANUAL 0xf3430080 | 1851 | #define F0900_P2_K_DIVIDER_56 0xf343007f |
1854 | #define F0900_P2_K_DIVIDER_56 0xf343007f | ||
1855 | 1852 | ||
1856 | /*P2_KDIV67*/ | 1853 | /*P2_KDIV67*/ |
1857 | #define R0900_P2_KDIV67 0xf344 | 1854 | #define R0900_P2_KDIV67 0xf344 |
1858 | #define F0900_P2_KDIV67_MANUAL 0xf3440080 | 1855 | #define F0900_P2_K_DIVIDER_67 0xf344007f |
1859 | #define F0900_P2_K_DIVIDER_67 0xf344007f | ||
1860 | 1856 | ||
1861 | /*P2_KDIV78*/ | 1857 | /*P2_KDIV78*/ |
1862 | #define R0900_P2_KDIV78 0xf345 | 1858 | #define R0900_P2_KDIV78 0xf345 |
1863 | #define F0900_P2_KDIV78_MANUAL 0xf3450080 | 1859 | #define F0900_P2_K_DIVIDER_78 0xf345007f |
1864 | #define F0900_P2_K_DIVIDER_78 0xf345007f | ||
1865 | 1860 | ||
1866 | /*P2_PDELCTRL1*/ | 1861 | /*P2_PDELCTRL1*/ |
1867 | #define R0900_P2_PDELCTRL1 0xf350 | 1862 | #define R0900_P2_PDELCTRL1 0xf350 |
1868 | #define F0900_P2_INV_MISMASK 0xf3500080 | 1863 | #define F0900_P2_INV_MISMASK 0xf3500080 |
1869 | #define F0900_P2_FORCE_ACCEPTED 0xf3500040 | 1864 | #define F0900_P2_FILTER_EN 0xf3500020 |
1870 | #define F0900_P2_FILTER_EN 0xf3500020 | 1865 | #define F0900_P2_EN_MIS00 0xf3500002 |
1871 | #define F0900_P2_FORCE_PKTDELINUSE 0xf3500010 | 1866 | #define F0900_P2_ALGOSWRST 0xf3500001 |
1872 | #define F0900_P2_HYSTEN 0xf3500008 | ||
1873 | #define F0900_P2_HYSTSWRST 0xf3500004 | ||
1874 | #define F0900_P2_EN_MIS00 0xf3500002 | ||
1875 | #define F0900_P2_ALGOSWRST 0xf3500001 | ||
1876 | 1867 | ||
1877 | /*P2_PDELCTRL2*/ | 1868 | /*P2_PDELCTRL2*/ |
1878 | #define R0900_P2_PDELCTRL2 0xf351 | 1869 | #define R0900_P2_PDELCTRL2 0xf351 |
1879 | #define F0900_P2_FORCE_CONTINUOUS 0xf3510080 | 1870 | #define F0900_P2_RESET_UPKO_COUNT 0xf3510040 |
1880 | #define F0900_P2_RESET_UPKO_COUNT 0xf3510040 | 1871 | #define F0900_P2_FRAME_MODE 0xf3510002 |
1881 | #define F0900_P2_USER_PKTDELIN_NB 0xf3510020 | 1872 | #define F0900_P2_NOBCHERRFLG_USE 0xf3510001 |
1882 | #define F0900_P2_FORCE_LOCKED 0xf3510010 | ||
1883 | #define F0900_P2_DATA_UNBBSCRAM 0xf3510008 | ||
1884 | #define F0900_P2_FORCE_LONGPKT 0xf3510004 | ||
1885 | #define F0900_P2_FRAME_MODE 0xf3510002 | ||
1886 | 1873 | ||
1887 | /*P2_HYSTTHRESH*/ | 1874 | /*P2_HYSTTHRESH*/ |
1888 | #define R0900_P2_HYSTTHRESH 0xf354 | 1875 | #define R0900_P2_HYSTTHRESH 0xf354 |
1889 | #define F0900_P2_UNLCK_THRESH 0xf35400f0 | 1876 | #define F0900_P2_UNLCK_THRESH 0xf35400f0 |
1890 | #define F0900_P2_DELIN_LCK_THRESH 0xf354000f | 1877 | #define F0900_P2_DELIN_LCK_THRESH 0xf354000f |
1891 | 1878 | ||
1892 | /*P2_ISIENTRY*/ | 1879 | /*P2_ISIENTRY*/ |
1893 | #define R0900_P2_ISIENTRY 0xf35e | 1880 | #define R0900_P2_ISIENTRY 0xf35e |
1894 | #define F0900_P2_ISI_ENTRY 0xf35e00ff | 1881 | #define F0900_P2_ISI_ENTRY 0xf35e00ff |
1895 | 1882 | ||
1896 | /*P2_ISIBITENA*/ | 1883 | /*P2_ISIBITENA*/ |
1897 | #define R0900_P2_ISIBITENA 0xf35f | 1884 | #define R0900_P2_ISIBITENA 0xf35f |
1898 | #define F0900_P2_ISI_BIT_EN 0xf35f00ff | 1885 | #define F0900_P2_ISI_BIT_EN 0xf35f00ff |
1899 | 1886 | ||
1900 | /*P2_MATSTR1*/ | 1887 | /*P2_MATSTR1*/ |
1901 | #define R0900_P2_MATSTR1 0xf360 | 1888 | #define R0900_P2_MATSTR1 0xf360 |
1902 | #define F0900_P2_MATYPE_CURRENT1 0xf36000ff | 1889 | #define F0900_P2_MATYPE_CURRENT1 0xf36000ff |
1903 | 1890 | ||
1904 | /*P2_MATSTR0*/ | 1891 | /*P2_MATSTR0*/ |
1905 | #define R0900_P2_MATSTR0 0xf361 | 1892 | #define R0900_P2_MATSTR0 0xf361 |
1906 | #define F0900_P2_MATYPE_CURRENT0 0xf36100ff | 1893 | #define F0900_P2_MATYPE_CURRENT0 0xf36100ff |
1907 | 1894 | ||
1908 | /*P2_UPLSTR1*/ | 1895 | /*P2_UPLSTR1*/ |
1909 | #define R0900_P2_UPLSTR1 0xf362 | 1896 | #define R0900_P2_UPLSTR1 0xf362 |
1910 | #define F0900_P2_UPL_CURRENT1 0xf36200ff | 1897 | #define F0900_P2_UPL_CURRENT1 0xf36200ff |
1911 | 1898 | ||
1912 | /*P2_UPLSTR0*/ | 1899 | /*P2_UPLSTR0*/ |
1913 | #define R0900_P2_UPLSTR0 0xf363 | 1900 | #define R0900_P2_UPLSTR0 0xf363 |
1914 | #define F0900_P2_UPL_CURRENT0 0xf36300ff | 1901 | #define F0900_P2_UPL_CURRENT0 0xf36300ff |
1915 | 1902 | ||
1916 | /*P2_DFLSTR1*/ | 1903 | /*P2_DFLSTR1*/ |
1917 | #define R0900_P2_DFLSTR1 0xf364 | 1904 | #define R0900_P2_DFLSTR1 0xf364 |
1918 | #define F0900_P2_DFL_CURRENT1 0xf36400ff | 1905 | #define F0900_P2_DFL_CURRENT1 0xf36400ff |
1919 | 1906 | ||
1920 | /*P2_DFLSTR0*/ | 1907 | /*P2_DFLSTR0*/ |
1921 | #define R0900_P2_DFLSTR0 0xf365 | 1908 | #define R0900_P2_DFLSTR0 0xf365 |
1922 | #define F0900_P2_DFL_CURRENT0 0xf36500ff | 1909 | #define F0900_P2_DFL_CURRENT0 0xf36500ff |
1923 | 1910 | ||
1924 | /*P2_SYNCSTR*/ | 1911 | /*P2_SYNCSTR*/ |
1925 | #define R0900_P2_SYNCSTR 0xf366 | 1912 | #define R0900_P2_SYNCSTR 0xf366 |
1926 | #define F0900_P2_SYNC_CURRENT 0xf36600ff | 1913 | #define F0900_P2_SYNC_CURRENT 0xf36600ff |
1927 | 1914 | ||
1928 | /*P2_SYNCDSTR1*/ | 1915 | /*P2_SYNCDSTR1*/ |
1929 | #define R0900_P2_SYNCDSTR1 0xf367 | 1916 | #define R0900_P2_SYNCDSTR1 0xf367 |
1930 | #define F0900_P2_SYNCD_CURRENT1 0xf36700ff | 1917 | #define F0900_P2_SYNCD_CURRENT1 0xf36700ff |
1931 | 1918 | ||
1932 | /*P2_SYNCDSTR0*/ | 1919 | /*P2_SYNCDSTR0*/ |
1933 | #define R0900_P2_SYNCDSTR0 0xf368 | 1920 | #define R0900_P2_SYNCDSTR0 0xf368 |
1934 | #define F0900_P2_SYNCD_CURRENT0 0xf36800ff | 1921 | #define F0900_P2_SYNCD_CURRENT0 0xf36800ff |
1935 | 1922 | ||
1936 | /*P2_PDELSTATUS1*/ | 1923 | /*P2_PDELSTATUS1*/ |
1937 | #define R0900_P2_PDELSTATUS1 0xf369 | 1924 | #define R0900_P2_PDELSTATUS1 0xf369 |
1938 | #define F0900_P2_PKTDELIN_DELOCK 0xf3690080 | 1925 | #define F0900_P2_PKTDELIN_DELOCK 0xf3690080 |
1939 | #define F0900_P2_SYNCDUPDFL_BADDFL 0xf3690040 | 1926 | #define F0900_P2_SYNCDUPDFL_BADDFL 0xf3690040 |
1940 | #define F0900_P2_CONTINUOUS_STREAM 0xf3690020 | 1927 | #define F0900_P2_CONTINUOUS_STREAM 0xf3690020 |
1941 | #define F0900_P2_UNACCEPTED_STREAM 0xf3690010 | 1928 | #define F0900_P2_UNACCEPTED_STREAM 0xf3690010 |
1942 | #define F0900_P2_BCH_ERROR_FLAG 0xf3690008 | 1929 | #define F0900_P2_BCH_ERROR_FLAG 0xf3690008 |
1943 | #define F0900_P2_BBHCRCKO 0xf3690004 | 1930 | #define F0900_P2_PKTDELIN_LOCK 0xf3690002 |
1944 | #define F0900_P2_PKTDELIN_LOCK 0xf3690002 | 1931 | #define F0900_P2_FIRST_LOCK 0xf3690001 |
1945 | #define F0900_P2_FIRST_LOCK 0xf3690001 | ||
1946 | 1932 | ||
1947 | /*P2_PDELSTATUS2*/ | 1933 | /*P2_PDELSTATUS2*/ |
1948 | #define R0900_P2_PDELSTATUS2 0xf36a | 1934 | #define R0900_P2_PDELSTATUS2 0xf36a |
1949 | #define F0900_P2_PKTDEL_DEMODSEL 0xf36a0080 | 1935 | #define F0900_P2_FRAME_MODCOD 0xf36a007c |
1950 | #define F0900_P2_FRAME_MODCOD 0xf36a007c | 1936 | #define F0900_P2_FRAME_TYPE 0xf36a0003 |
1951 | #define F0900_P2_FRAME_TYPE 0xf36a0003 | ||
1952 | 1937 | ||
1953 | /*P2_BBFCRCKO1*/ | 1938 | /*P2_BBFCRCKO1*/ |
1954 | #define R0900_P2_BBFCRCKO1 0xf36b | 1939 | #define R0900_P2_BBFCRCKO1 0xf36b |
1955 | #define F0900_P2_BBHCRC_KOCNT1 0xf36b00ff | 1940 | #define F0900_P2_BBHCRC_KOCNT1 0xf36b00ff |
1956 | 1941 | ||
1957 | /*P2_BBFCRCKO0*/ | 1942 | /*P2_BBFCRCKO0*/ |
1958 | #define R0900_P2_BBFCRCKO0 0xf36c | 1943 | #define R0900_P2_BBFCRCKO0 0xf36c |
1959 | #define F0900_P2_BBHCRC_KOCNT0 0xf36c00ff | 1944 | #define F0900_P2_BBHCRC_KOCNT0 0xf36c00ff |
1960 | 1945 | ||
1961 | /*P2_UPCRCKO1*/ | 1946 | /*P2_UPCRCKO1*/ |
1962 | #define R0900_P2_UPCRCKO1 0xf36d | 1947 | #define R0900_P2_UPCRCKO1 0xf36d |
1963 | #define F0900_P2_PKTCRC_KOCNT1 0xf36d00ff | 1948 | #define F0900_P2_PKTCRC_KOCNT1 0xf36d00ff |
1964 | 1949 | ||
1965 | /*P2_UPCRCKO0*/ | 1950 | /*P2_UPCRCKO0*/ |
1966 | #define R0900_P2_UPCRCKO0 0xf36e | 1951 | #define R0900_P2_UPCRCKO0 0xf36e |
1967 | #define F0900_P2_PKTCRC_KOCNT0 0xf36e00ff | 1952 | #define F0900_P2_PKTCRC_KOCNT0 0xf36e00ff |
1953 | |||
1954 | /*P2_PDELCTRL3*/ | ||
1955 | #define R0900_P2_PDELCTRL3 0xf36f | ||
1956 | #define F0900_P2_PKTDEL_CONTFAIL 0xf36f0080 | ||
1957 | #define F0900_P2_NOFIFO_BCHERR 0xf36f0020 | ||
1968 | 1958 | ||
1969 | /*P2_TSSTATEM*/ | 1959 | /*P2_TSSTATEM*/ |
1970 | #define R0900_P2_TSSTATEM 0xf370 | 1960 | #define R0900_P2_TSSTATEM 0xf370 |
1971 | #define F0900_P2_TSDIL_ON 0xf3700080 | 1961 | #define F0900_P2_TSDIL_ON 0xf3700080 |
1972 | #define F0900_P2_TSSKIPRS_ON 0xf3700040 | 1962 | #define F0900_P2_TSRS_ON 0xf3700020 |
1973 | #define F0900_P2_TSRS_ON 0xf3700020 | 1963 | #define F0900_P2_TSDESCRAMB_ON 0xf3700010 |
1974 | #define F0900_P2_TSDESCRAMB_ON 0xf3700010 | 1964 | #define F0900_P2_TSFRAME_MODE 0xf3700008 |
1975 | #define F0900_P2_TSFRAME_MODE 0xf3700008 | 1965 | #define F0900_P2_TS_DISABLE 0xf3700004 |
1976 | #define F0900_P2_TS_DISABLE 0xf3700004 | 1966 | #define F0900_P2_TSOUT_NOSYNC 0xf3700001 |
1977 | #define F0900_P2_TSACM_MODE 0xf3700002 | ||
1978 | #define F0900_P2_TSOUT_NOSYNC 0xf3700001 | ||
1979 | 1967 | ||
1980 | /*P2_TSCFGH*/ | 1968 | /*P2_TSCFGH*/ |
1981 | #define R0900_P2_TSCFGH 0xf372 | 1969 | #define R0900_P2_TSCFGH 0xf372 |
1982 | #define F0900_P2_TSFIFO_DVBCI 0xf3720080 | 1970 | #define F0900_P2_TSFIFO_DVBCI 0xf3720080 |
1983 | #define F0900_P2_TSFIFO_SERIAL 0xf3720040 | 1971 | #define F0900_P2_TSFIFO_SERIAL 0xf3720040 |
1984 | #define F0900_P2_TSFIFO_TEIUPDATE 0xf3720020 | 1972 | #define F0900_P2_TSFIFO_TEIUPDATE 0xf3720020 |
1985 | #define F0900_P2_TSFIFO_DUTY50 0xf3720010 | 1973 | #define F0900_P2_TSFIFO_DUTY50 0xf3720010 |
1986 | #define F0900_P2_TSFIFO_HSGNLOUT 0xf3720008 | 1974 | #define F0900_P2_TSFIFO_HSGNLOUT 0xf3720008 |
1987 | #define F0900_P2_TSFIFO_ERRMODE 0xf3720006 | 1975 | #define F0900_P2_TSFIFO_ERRMODE 0xf3720006 |
1988 | #define F0900_P2_RST_HWARE 0xf3720001 | 1976 | #define F0900_P2_RST_HWARE 0xf3720001 |
1989 | 1977 | ||
1990 | /*P2_TSCFGM*/ | 1978 | /*P2_TSCFGM*/ |
1991 | #define R0900_P2_TSCFGM 0xf373 | 1979 | #define R0900_P2_TSCFGM 0xf373 |
1992 | #define F0900_P2_TSFIFO_MANSPEED 0xf37300c0 | 1980 | #define F0900_P2_TSFIFO_MANSPEED 0xf37300c0 |
1993 | #define F0900_P2_TSFIFO_PERMDATA 0xf3730020 | 1981 | #define F0900_P2_TSFIFO_PERMDATA 0xf3730020 |
1994 | #define F0900_P2_TSFIFO_NONEWSGNL 0xf3730010 | 1982 | #define F0900_P2_TSFIFO_DPUNACT 0xf3730002 |
1995 | #define F0900_P2_TSFIFO_BITSPEED 0xf3730008 | 1983 | #define F0900_P2_TSFIFO_INVDATA 0xf3730001 |
1996 | #define F0900_P2_NPD_SPECDVBS2 0xf3730004 | ||
1997 | #define F0900_P2_TSFIFO_STOPCKDIS 0xf3730002 | ||
1998 | #define F0900_P2_TSFIFO_INVDATA 0xf3730001 | ||
1999 | 1984 | ||
2000 | /*P2_TSCFGL*/ | 1985 | /*P2_TSCFGL*/ |
2001 | #define R0900_P2_TSCFGL 0xf374 | 1986 | #define R0900_P2_TSCFGL 0xf374 |
2002 | #define F0900_P2_TSFIFO_BCLKDEL1CK 0xf37400c0 | 1987 | #define F0900_P2_TSFIFO_BCLKDEL1CK 0xf37400c0 |
2003 | #define F0900_P2_BCHERROR_MODE 0xf3740030 | 1988 | #define F0900_P2_BCHERROR_MODE 0xf3740030 |
2004 | #define F0900_P2_TSFIFO_NSGNL2DATA 0xf3740008 | 1989 | #define F0900_P2_TSFIFO_NSGNL2DATA 0xf3740008 |
2005 | #define F0900_P2_TSFIFO_EMBINDVB 0xf3740004 | 1990 | #define F0900_P2_TSFIFO_EMBINDVB 0xf3740004 |
2006 | #define F0900_P2_TSFIFO_DPUNACT 0xf3740002 | 1991 | #define F0900_P2_TSFIFO_BITSPEED 0xf3740003 |
2007 | #define F0900_P2_TSFIFO_NPDOFF 0xf3740001 | ||
2008 | 1992 | ||
2009 | /*P2_TSINSDELH*/ | 1993 | /*P2_TSINSDELH*/ |
2010 | #define R0900_P2_TSINSDELH 0xf376 | 1994 | #define R0900_P2_TSINSDELH 0xf376 |
2011 | #define F0900_P2_TSDEL_SYNCBYTE 0xf3760080 | 1995 | #define F0900_P2_TSDEL_SYNCBYTE 0xf3760080 |
2012 | #define F0900_P2_TSDEL_XXHEADER 0xf3760040 | 1996 | #define F0900_P2_TSDEL_XXHEADER 0xf3760040 |
2013 | #define F0900_P2_TSDEL_BBHEADER 0xf3760020 | 1997 | #define F0900_P2_TSDEL_BBHEADER 0xf3760020 |
2014 | #define F0900_P2_TSDEL_DATAFIELD 0xf3760010 | 1998 | #define F0900_P2_TSDEL_DATAFIELD 0xf3760010 |
2015 | #define F0900_P2_TSINSDEL_ISCR 0xf3760008 | 1999 | #define F0900_P2_TSINSDEL_ISCR 0xf3760008 |
2016 | #define F0900_P2_TSINSDEL_NPD 0xf3760004 | 2000 | #define F0900_P2_TSINSDEL_NPD 0xf3760004 |
2017 | #define F0900_P2_TSINSDEL_RSPARITY 0xf3760002 | 2001 | #define F0900_P2_TSINSDEL_RSPARITY 0xf3760002 |
2018 | #define F0900_P2_TSINSDEL_CRC8 0xf3760001 | 2002 | #define F0900_P2_TSINSDEL_CRC8 0xf3760001 |
2003 | |||
2004 | /*P2_TSDIVN*/ | ||
2005 | #define R0900_P2_TSDIVN 0xf379 | ||
2006 | #define F0900_P2_TSFIFO_SPEEDMODE 0xf37900c0 | ||
2007 | |||
2008 | /*P2_TSCFG4*/ | ||
2009 | #define R0900_P2_TSCFG4 0xf37a | ||
2010 | #define F0900_P2_TSFIFO_TSSPEEDMODE 0xf37a00c0 | ||
2019 | 2011 | ||
2020 | /*P2_TSSPEED*/ | 2012 | /*P2_TSSPEED*/ |
2021 | #define R0900_P2_TSSPEED 0xf380 | 2013 | #define R0900_P2_TSSPEED 0xf380 |
2022 | #define F0900_P2_TSFIFO_OUTSPEED 0xf38000ff | 2014 | #define F0900_P2_TSFIFO_OUTSPEED 0xf38000ff |
2023 | 2015 | ||
2024 | /*P2_TSSTATUS*/ | 2016 | /*P2_TSSTATUS*/ |
2025 | #define R0900_P2_TSSTATUS 0xf381 | 2017 | #define R0900_P2_TSSTATUS 0xf381 |
2026 | #define F0900_P2_TSFIFO_LINEOK 0xf3810080 | 2018 | #define F0900_P2_TSFIFO_LINEOK 0xf3810080 |
2027 | #define F0900_P2_TSFIFO_ERROR 0xf3810040 | 2019 | #define F0900_P2_TSFIFO_ERROR 0xf3810040 |
2028 | #define F0900_P2_TSFIFO_DATA7 0xf3810020 | 2020 | #define F0900_P2_DIL_READY 0xf3810001 |
2029 | #define F0900_P2_TSFIFO_NOSYNC 0xf3810010 | ||
2030 | #define F0900_P2_ISCR_INITIALIZED 0xf3810008 | ||
2031 | #define F0900_P2_ISCR_UPDATED 0xf3810004 | ||
2032 | #define F0900_P2_SOFFIFO_UNREGUL 0xf3810002 | ||
2033 | #define F0900_P2_DIL_READY 0xf3810001 | ||
2034 | 2021 | ||
2035 | /*P2_TSSTATUS2*/ | 2022 | /*P2_TSSTATUS2*/ |
2036 | #define R0900_P2_TSSTATUS2 0xf382 | 2023 | #define R0900_P2_TSSTATUS2 0xf382 |
2037 | #define F0900_P2_TSFIFO_DEMODSEL 0xf3820080 | 2024 | #define F0900_P2_TSFIFO_DEMODSEL 0xf3820080 |
2038 | #define F0900_P2_TSFIFOSPEED_STORE 0xf3820040 | 2025 | #define F0900_P2_TSFIFOSPEED_STORE 0xf3820040 |
2039 | #define F0900_P2_DILXX_RESET 0xf3820020 | 2026 | #define F0900_P2_DILXX_RESET 0xf3820020 |
2040 | #define F0900_P2_TSSERIAL_IMPOS 0xf3820010 | 2027 | #define F0900_P2_TSSERIAL_IMPOS 0xf3820010 |
2041 | #define F0900_P2_TSFIFO_LINENOK 0xf3820008 | 2028 | #define F0900_P2_SCRAMBDETECT 0xf3820002 |
2042 | #define F0900_P2_BITSPEED_EVENT 0xf3820004 | ||
2043 | #define F0900_P2_SCRAMBDETECT 0xf3820002 | ||
2044 | #define F0900_P2_ULDTV67_FALSELOCK 0xf3820001 | ||
2045 | 2029 | ||
2046 | /*P2_TSBITRATE1*/ | 2030 | /*P2_TSBITRATE1*/ |
2047 | #define R0900_P2_TSBITRATE1 0xf383 | 2031 | #define R0900_P2_TSBITRATE1 0xf383 |
2048 | #define F0900_P2_TSFIFO_BITRATE1 0xf38300ff | 2032 | #define F0900_P2_TSFIFO_BITRATE1 0xf38300ff |
2049 | 2033 | ||
2050 | /*P2_TSBITRATE0*/ | 2034 | /*P2_TSBITRATE0*/ |
2051 | #define R0900_P2_TSBITRATE0 0xf384 | 2035 | #define R0900_P2_TSBITRATE0 0xf384 |
2052 | #define F0900_P2_TSFIFO_BITRATE0 0xf38400ff | 2036 | #define F0900_P2_TSFIFO_BITRATE0 0xf38400ff |
2053 | 2037 | ||
2054 | /*P2_ERRCTRL1*/ | 2038 | /*P2_ERRCTRL1*/ |
2055 | #define R0900_P2_ERRCTRL1 0xf398 | 2039 | #define R0900_P2_ERRCTRL1 0xf398 |
2056 | #define F0900_P2_ERR_SOURCE1 0xf39800f0 | 2040 | #define F0900_P2_ERR_SOURCE1 0xf39800f0 |
2057 | #define F0900_P2_NUM_EVENT1 0xf3980007 | 2041 | #define F0900_P2_NUM_EVENT1 0xf3980007 |
2058 | 2042 | ||
2059 | /*P2_ERRCNT12*/ | 2043 | /*P2_ERRCNT12*/ |
2060 | #define R0900_P2_ERRCNT12 0xf399 | 2044 | #define R0900_P2_ERRCNT12 0xf399 |
2061 | #define F0900_P2_ERRCNT1_OLDVALUE 0xf3990080 | 2045 | #define F0900_P2_ERRCNT1_OLDVALUE 0xf3990080 |
2062 | #define F0900_P2_ERR_CNT12 0xf399007f | 2046 | #define F0900_P2_ERR_CNT12 0xf399007f |
2063 | 2047 | ||
2064 | /*P2_ERRCNT11*/ | 2048 | /*P2_ERRCNT11*/ |
2065 | #define R0900_P2_ERRCNT11 0xf39a | 2049 | #define R0900_P2_ERRCNT11 0xf39a |
2066 | #define F0900_P2_ERR_CNT11 0xf39a00ff | 2050 | #define F0900_P2_ERR_CNT11 0xf39a00ff |
2067 | 2051 | ||
2068 | /*P2_ERRCNT10*/ | 2052 | /*P2_ERRCNT10*/ |
2069 | #define R0900_P2_ERRCNT10 0xf39b | 2053 | #define R0900_P2_ERRCNT10 0xf39b |
2070 | #define F0900_P2_ERR_CNT10 0xf39b00ff | 2054 | #define F0900_P2_ERR_CNT10 0xf39b00ff |
2071 | 2055 | ||
2072 | /*P2_ERRCTRL2*/ | 2056 | /*P2_ERRCTRL2*/ |
2073 | #define R0900_P2_ERRCTRL2 0xf39c | 2057 | #define R0900_P2_ERRCTRL2 0xf39c |
2074 | #define F0900_P2_ERR_SOURCE2 0xf39c00f0 | 2058 | #define F0900_P2_ERR_SOURCE2 0xf39c00f0 |
2075 | #define F0900_P2_NUM_EVENT2 0xf39c0007 | 2059 | #define F0900_P2_NUM_EVENT2 0xf39c0007 |
2076 | 2060 | ||
2077 | /*P2_ERRCNT22*/ | 2061 | /*P2_ERRCNT22*/ |
2078 | #define R0900_P2_ERRCNT22 0xf39d | 2062 | #define R0900_P2_ERRCNT22 0xf39d |
2079 | #define F0900_P2_ERRCNT2_OLDVALUE 0xf39d0080 | 2063 | #define F0900_P2_ERRCNT2_OLDVALUE 0xf39d0080 |
2080 | #define F0900_P2_ERR_CNT22 0xf39d007f | 2064 | #define F0900_P2_ERR_CNT22 0xf39d007f |
2081 | 2065 | ||
2082 | /*P2_ERRCNT21*/ | 2066 | /*P2_ERRCNT21*/ |
2083 | #define R0900_P2_ERRCNT21 0xf39e | 2067 | #define R0900_P2_ERRCNT21 0xf39e |
2084 | #define F0900_P2_ERR_CNT21 0xf39e00ff | 2068 | #define F0900_P2_ERR_CNT21 0xf39e00ff |
2085 | 2069 | ||
2086 | /*P2_ERRCNT20*/ | 2070 | /*P2_ERRCNT20*/ |
2087 | #define R0900_P2_ERRCNT20 0xf39f | 2071 | #define R0900_P2_ERRCNT20 0xf39f |
2088 | #define F0900_P2_ERR_CNT20 0xf39f00ff | 2072 | #define F0900_P2_ERR_CNT20 0xf39f00ff |
2089 | 2073 | ||
2090 | /*P2_FECSPY*/ | 2074 | /*P2_FECSPY*/ |
2091 | #define R0900_P2_FECSPY 0xf3a0 | 2075 | #define R0900_P2_FECSPY 0xf3a0 |
2092 | #define F0900_P2_SPY_ENABLE 0xf3a00080 | 2076 | #define F0900_P2_SPY_ENABLE 0xf3a00080 |
2093 | #define F0900_P2_NO_SYNCBYTE 0xf3a00040 | 2077 | #define F0900_P2_NO_SYNCBYTE 0xf3a00040 |
2094 | #define F0900_P2_SERIAL_MODE 0xf3a00020 | 2078 | #define F0900_P2_SERIAL_MODE 0xf3a00020 |
2095 | #define F0900_P2_UNUSUAL_PACKET 0xf3a00010 | 2079 | #define F0900_P2_UNUSUAL_PACKET 0xf3a00010 |
2096 | #define F0900_P2_BER_PACKMODE 0xf3a00008 | 2080 | #define F0900_P2_BERMETER_DATAMODE 0xf3a00008 |
2097 | #define F0900_P2_BERMETER_LMODE 0xf3a00002 | 2081 | #define F0900_P2_BERMETER_LMODE 0xf3a00002 |
2098 | #define F0900_P2_BERMETER_RESET 0xf3a00001 | 2082 | #define F0900_P2_BERMETER_RESET 0xf3a00001 |
2099 | 2083 | ||
2100 | /*P2_FSPYCFG*/ | 2084 | /*P2_FSPYCFG*/ |
2101 | #define R0900_P2_FSPYCFG 0xf3a1 | 2085 | #define R0900_P2_FSPYCFG 0xf3a1 |
2102 | #define F0900_P2_FECSPY_INPUT 0xf3a100c0 | 2086 | #define F0900_P2_FECSPY_INPUT 0xf3a100c0 |
2103 | #define F0900_P2_RST_ON_ERROR 0xf3a10020 | 2087 | #define F0900_P2_RST_ON_ERROR 0xf3a10020 |
2104 | #define F0900_P2_ONE_SHOT 0xf3a10010 | 2088 | #define F0900_P2_ONE_SHOT 0xf3a10010 |
2105 | #define F0900_P2_I2C_MODE 0xf3a1000c | 2089 | #define F0900_P2_I2C_MODE 0xf3a1000c |
2106 | #define F0900_P2_SPY_HYSTERESIS 0xf3a10003 | 2090 | #define F0900_P2_SPY_HYSTERESIS 0xf3a10003 |
2107 | 2091 | ||
2108 | /*P2_FSPYDATA*/ | 2092 | /*P2_FSPYDATA*/ |
2109 | #define R0900_P2_FSPYDATA 0xf3a2 | 2093 | #define R0900_P2_FSPYDATA 0xf3a2 |
2110 | #define F0900_P2_SPY_STUFFING 0xf3a20080 | 2094 | #define F0900_P2_SPY_STUFFING 0xf3a20080 |
2111 | #define F0900_P2_NOERROR_PKTJITTER 0xf3a20040 | 2095 | #define F0900_P2_SPY_CNULLPKT 0xf3a20020 |
2112 | #define F0900_P2_SPY_CNULLPKT 0xf3a20020 | 2096 | #define F0900_P2_SPY_OUTDATA_MODE 0xf3a2001f |
2113 | #define F0900_P2_SPY_OUTDATA_MODE 0xf3a2001f | ||
2114 | 2097 | ||
2115 | /*P2_FSPYOUT*/ | 2098 | /*P2_FSPYOUT*/ |
2116 | #define R0900_P2_FSPYOUT 0xf3a3 | 2099 | #define R0900_P2_FSPYOUT 0xf3a3 |
2117 | #define F0900_P2_FSPY_DIRECT 0xf3a30080 | 2100 | #define F0900_P2_FSPY_DIRECT 0xf3a30080 |
2118 | #define F0900_P2_SPY_OUTDATA_BUS 0xf3a30038 | 2101 | #define F0900_P2_STUFF_MODE 0xf3a30007 |
2119 | #define F0900_P2_STUFF_MODE 0xf3a30007 | ||
2120 | 2102 | ||
2121 | /*P2_FSTATUS*/ | 2103 | /*P2_FSTATUS*/ |
2122 | #define R0900_P2_FSTATUS 0xf3a4 | 2104 | #define R0900_P2_FSTATUS 0xf3a4 |
2123 | #define F0900_P2_SPY_ENDSIM 0xf3a40080 | 2105 | #define F0900_P2_SPY_ENDSIM 0xf3a40080 |
2124 | #define F0900_P2_VALID_SIM 0xf3a40040 | 2106 | #define F0900_P2_VALID_SIM 0xf3a40040 |
2125 | #define F0900_P2_FOUND_SIGNAL 0xf3a40020 | 2107 | #define F0900_P2_FOUND_SIGNAL 0xf3a40020 |
2126 | #define F0900_P2_DSS_SYNCBYTE 0xf3a40010 | 2108 | #define F0900_P2_DSS_SYNCBYTE 0xf3a40010 |
2127 | #define F0900_P2_RESULT_STATE 0xf3a4000f | 2109 | #define F0900_P2_RESULT_STATE 0xf3a4000f |
2128 | 2110 | ||
2129 | /*P2_FBERCPT4*/ | 2111 | /*P2_FBERCPT4*/ |
2130 | #define R0900_P2_FBERCPT4 0xf3a8 | 2112 | #define R0900_P2_FBERCPT4 0xf3a8 |
2131 | #define F0900_P2_FBERMETER_CPT4 0xf3a800ff | 2113 | #define F0900_P2_FBERMETER_CPT4 0xf3a800ff |
2132 | 2114 | ||
2133 | /*P2_FBERCPT3*/ | 2115 | /*P2_FBERCPT3*/ |
2134 | #define R0900_P2_FBERCPT3 0xf3a9 | 2116 | #define R0900_P2_FBERCPT3 0xf3a9 |
2135 | #define F0900_P2_FBERMETER_CPT3 0xf3a900ff | 2117 | #define F0900_P2_FBERMETER_CPT3 0xf3a900ff |
2136 | 2118 | ||
2137 | /*P2_FBERCPT2*/ | 2119 | /*P2_FBERCPT2*/ |
2138 | #define R0900_P2_FBERCPT2 0xf3aa | 2120 | #define R0900_P2_FBERCPT2 0xf3aa |
2139 | #define F0900_P2_FBERMETER_CPT2 0xf3aa00ff | 2121 | #define F0900_P2_FBERMETER_CPT2 0xf3aa00ff |
2140 | 2122 | ||
2141 | /*P2_FBERCPT1*/ | 2123 | /*P2_FBERCPT1*/ |
2142 | #define R0900_P2_FBERCPT1 0xf3ab | 2124 | #define R0900_P2_FBERCPT1 0xf3ab |
2143 | #define F0900_P2_FBERMETER_CPT1 0xf3ab00ff | 2125 | #define F0900_P2_FBERMETER_CPT1 0xf3ab00ff |
2144 | 2126 | ||
2145 | /*P2_FBERCPT0*/ | 2127 | /*P2_FBERCPT0*/ |
2146 | #define R0900_P2_FBERCPT0 0xf3ac | 2128 | #define R0900_P2_FBERCPT0 0xf3ac |
2147 | #define F0900_P2_FBERMETER_CPT0 0xf3ac00ff | 2129 | #define F0900_P2_FBERMETER_CPT0 0xf3ac00ff |
2148 | 2130 | ||
2149 | /*P2_FBERERR2*/ | 2131 | /*P2_FBERERR2*/ |
2150 | #define R0900_P2_FBERERR2 0xf3ad | 2132 | #define R0900_P2_FBERERR2 0xf3ad |
2151 | #define F0900_P2_FBERMETER_ERR2 0xf3ad00ff | 2133 | #define F0900_P2_FBERMETER_ERR2 0xf3ad00ff |
2152 | 2134 | ||
2153 | /*P2_FBERERR1*/ | 2135 | /*P2_FBERERR1*/ |
2154 | #define R0900_P2_FBERERR1 0xf3ae | 2136 | #define R0900_P2_FBERERR1 0xf3ae |
2155 | #define F0900_P2_FBERMETER_ERR1 0xf3ae00ff | 2137 | #define F0900_P2_FBERMETER_ERR1 0xf3ae00ff |
2156 | 2138 | ||
2157 | /*P2_FBERERR0*/ | 2139 | /*P2_FBERERR0*/ |
2158 | #define R0900_P2_FBERERR0 0xf3af | 2140 | #define R0900_P2_FBERERR0 0xf3af |
2159 | #define F0900_P2_FBERMETER_ERR0 0xf3af00ff | 2141 | #define F0900_P2_FBERMETER_ERR0 0xf3af00ff |
2160 | 2142 | ||
2161 | /*P2_FSPYBER*/ | 2143 | /*P2_FSPYBER*/ |
2162 | #define R0900_P2_FSPYBER 0xf3b2 | 2144 | #define R0900_P2_FSPYBER 0xf3b2 |
2163 | #define F0900_P2_FSPYOBS_XORREAD 0xf3b20040 | 2145 | #define F0900_P2_FSPYBER_SYNCBYTE 0xf3b20010 |
2164 | #define F0900_P2_FSPYBER_OBSMODE 0xf3b20020 | 2146 | #define F0900_P2_FSPYBER_UNSYNC 0xf3b20008 |
2165 | #define F0900_P2_FSPYBER_SYNCBYTE 0xf3b20010 | 2147 | #define F0900_P2_FSPYBER_CTIME 0xf3b20007 |
2166 | #define F0900_P2_FSPYBER_UNSYNC 0xf3b20008 | ||
2167 | #define F0900_P2_FSPYBER_CTIME 0xf3b20007 | ||
2168 | 2148 | ||
2169 | /*P1_IQCONST*/ | 2149 | /*P1_IQCONST*/ |
2170 | #define R0900_P1_IQCONST 0xf400 | 2150 | #define R0900_P1_IQCONST 0xf400 |
2171 | #define F0900_P1_CONSTEL_SELECT 0xf4000060 | 2151 | #define IQCONST REGx(R0900_P1_IQCONST) |
2172 | #define F0900_P1_IQSYMB_SEL 0xf400001f | 2152 | #define F0900_P1_CONSTEL_SELECT 0xf4000060 |
2153 | #define F0900_P1_IQSYMB_SEL 0xf400001f | ||
2173 | 2154 | ||
2174 | /*P1_NOSCFG*/ | 2155 | /*P1_NOSCFG*/ |
2175 | #define R0900_P1_NOSCFG 0xf401 | 2156 | #define R0900_P1_NOSCFG 0xf401 |
2176 | #define F0900_P1_DUMMYPL_NOSDATA 0xf4010020 | 2157 | #define NOSCFG REGx(R0900_P1_NOSCFG) |
2177 | #define F0900_P1_NOSPLH_BETA 0xf4010018 | 2158 | #define F0900_P1_DUMMYPL_NOSDATA 0xf4010020 |
2178 | #define F0900_P1_NOSDATA_BETA 0xf4010007 | 2159 | #define F0900_P1_NOSPLH_BETA 0xf4010018 |
2160 | #define F0900_P1_NOSDATA_BETA 0xf4010007 | ||
2179 | 2161 | ||
2180 | /*P1_ISYMB*/ | 2162 | /*P1_ISYMB*/ |
2181 | #define R0900_P1_ISYMB 0xf402 | 2163 | #define R0900_P1_ISYMB 0xf402 |
2182 | #define F0900_P1_I_SYMBOL 0xf40201ff | 2164 | #define ISYMB REGx(R0900_P1_ISYMB) |
2165 | #define F0900_P1_I_SYMBOL 0xf40201ff | ||
2183 | 2166 | ||
2184 | /*P1_QSYMB*/ | 2167 | /*P1_QSYMB*/ |
2185 | #define R0900_P1_QSYMB 0xf403 | 2168 | #define R0900_P1_QSYMB 0xf403 |
2186 | #define F0900_P1_Q_SYMBOL 0xf40301ff | 2169 | #define QSYMB REGx(R0900_P1_QSYMB) |
2170 | #define F0900_P1_Q_SYMBOL 0xf40301ff | ||
2187 | 2171 | ||
2188 | /*P1_AGC1CFG*/ | 2172 | /*P1_AGC1CFG*/ |
2189 | #define R0900_P1_AGC1CFG 0xf404 | 2173 | #define R0900_P1_AGC1CFG 0xf404 |
2190 | #define F0900_P1_DC_FROZEN 0xf4040080 | 2174 | #define AGC1CFG REGx(R0900_P1_AGC1CFG) |
2191 | #define F0900_P1_DC_CORRECT 0xf4040040 | 2175 | #define F0900_P1_DC_FROZEN 0xf4040080 |
2192 | #define F0900_P1_AMM_FROZEN 0xf4040020 | 2176 | #define F0900_P1_DC_CORRECT 0xf4040040 |
2193 | #define F0900_P1_AMM_CORRECT 0xf4040010 | 2177 | #define F0900_P1_AMM_FROZEN 0xf4040020 |
2194 | #define F0900_P1_QUAD_FROZEN 0xf4040008 | 2178 | #define F0900_P1_AMM_CORRECT 0xf4040010 |
2195 | #define F0900_P1_QUAD_CORRECT 0xf4040004 | 2179 | #define F0900_P1_QUAD_FROZEN 0xf4040008 |
2196 | #define F0900_P1_DCCOMP_SLOW 0xf4040002 | 2180 | #define F0900_P1_QUAD_CORRECT 0xf4040004 |
2197 | #define F0900_P1_IQMISM_SLOW 0xf4040001 | ||
2198 | 2181 | ||
2199 | /*P1_AGC1CN*/ | 2182 | /*P1_AGC1CN*/ |
2200 | #define R0900_P1_AGC1CN 0xf406 | 2183 | #define R0900_P1_AGC1CN 0xf406 |
2201 | #define F0900_P1_AGC1_LOCKED 0xf4060080 | 2184 | #define AGC1CN REGx(R0900_P1_AGC1CN) |
2202 | #define F0900_P1_AGC1_OVERFLOW 0xf4060040 | 2185 | #define F0900_P1_AGC1_LOCKED 0xf4060080 |
2203 | #define F0900_P1_AGC1_NOSLOWLK 0xf4060020 | 2186 | #define F0900_P1_AGC1_MINPOWER 0xf4060010 |
2204 | #define F0900_P1_AGC1_MINPOWER 0xf4060010 | 2187 | #define F0900_P1_AGCOUT_FAST 0xf4060008 |
2205 | #define F0900_P1_AGCOUT_FAST 0xf4060008 | 2188 | #define F0900_P1_AGCIQ_BETA 0xf4060007 |
2206 | #define F0900_P1_AGCIQ_BETA 0xf4060007 | ||
2207 | 2189 | ||
2208 | /*P1_AGC1REF*/ | 2190 | /*P1_AGC1REF*/ |
2209 | #define R0900_P1_AGC1REF 0xf407 | 2191 | #define R0900_P1_AGC1REF 0xf407 |
2210 | #define F0900_P1_AGCIQ_REF 0xf40700ff | 2192 | #define AGC1REF REGx(R0900_P1_AGC1REF) |
2193 | #define F0900_P1_AGCIQ_REF 0xf40700ff | ||
2211 | 2194 | ||
2212 | /*P1_IDCCOMP*/ | 2195 | /*P1_IDCCOMP*/ |
2213 | #define R0900_P1_IDCCOMP 0xf408 | 2196 | #define R0900_P1_IDCCOMP 0xf408 |
2214 | #define F0900_P1_IAVERAGE_ADJ 0xf40801ff | 2197 | #define IDCCOMP REGx(R0900_P1_IDCCOMP) |
2198 | #define F0900_P1_IAVERAGE_ADJ 0xf40801ff | ||
2215 | 2199 | ||
2216 | /*P1_QDCCOMP*/ | 2200 | /*P1_QDCCOMP*/ |
2217 | #define R0900_P1_QDCCOMP 0xf409 | 2201 | #define R0900_P1_QDCCOMP 0xf409 |
2218 | #define F0900_P1_QAVERAGE_ADJ 0xf40901ff | 2202 | #define QDCCOMP REGx(R0900_P1_QDCCOMP) |
2203 | #define F0900_P1_QAVERAGE_ADJ 0xf40901ff | ||
2219 | 2204 | ||
2220 | /*P1_POWERI*/ | 2205 | /*P1_POWERI*/ |
2221 | #define R0900_P1_POWERI 0xf40a | 2206 | #define R0900_P1_POWERI 0xf40a |
2222 | #define F0900_P1_POWER_I 0xf40a00ff | 2207 | #define POWERI REGx(R0900_P1_POWERI) |
2208 | #define F0900_P1_POWER_I 0xf40a00ff | ||
2209 | #define POWER_I FLDx(F0900_P1_POWER_I) | ||
2223 | 2210 | ||
2224 | /*P1_POWERQ*/ | 2211 | /*P1_POWERQ*/ |
2225 | #define R0900_P1_POWERQ 0xf40b | 2212 | #define R0900_P1_POWERQ 0xf40b |
2226 | #define F0900_P1_POWER_Q 0xf40b00ff | 2213 | #define POWERQ REGx(R0900_P1_POWERQ) |
2214 | #define F0900_P1_POWER_Q 0xf40b00ff | ||
2215 | #define POWER_Q FLDx(F0900_P1_POWER_Q) | ||
2227 | 2216 | ||
2228 | /*P1_AGC1AMM*/ | 2217 | /*P1_AGC1AMM*/ |
2229 | #define R0900_P1_AGC1AMM 0xf40c | 2218 | #define R0900_P1_AGC1AMM 0xf40c |
2230 | #define F0900_P1_AMM_VALUE 0xf40c00ff | 2219 | #define AGC1AMM REGx(R0900_P1_AGC1AMM) |
2220 | #define F0900_P1_AMM_VALUE 0xf40c00ff | ||
2231 | 2221 | ||
2232 | /*P1_AGC1QUAD*/ | 2222 | /*P1_AGC1QUAD*/ |
2233 | #define R0900_P1_AGC1QUAD 0xf40d | 2223 | #define R0900_P1_AGC1QUAD 0xf40d |
2234 | #define F0900_P1_QUAD_VALUE 0xf40d01ff | 2224 | #define AGC1QUAD REGx(R0900_P1_AGC1QUAD) |
2225 | #define F0900_P1_QUAD_VALUE 0xf40d01ff | ||
2235 | 2226 | ||
2236 | /*P1_AGCIQIN1*/ | 2227 | /*P1_AGCIQIN1*/ |
2237 | #define R0900_P1_AGCIQIN1 0xf40e | 2228 | #define R0900_P1_AGCIQIN1 0xf40e |
2238 | #define F0900_P1_AGCIQ_VALUE1 0xf40e00ff | 2229 | #define AGCIQIN1 REGx(R0900_P1_AGCIQIN1) |
2230 | #define F0900_P1_AGCIQ_VALUE1 0xf40e00ff | ||
2231 | #define AGCIQ_VALUE1 FLDx(F0900_P1_AGCIQ_VALUE1) | ||
2239 | 2232 | ||
2240 | /*P1_AGCIQIN0*/ | 2233 | /*P1_AGCIQIN0*/ |
2241 | #define R0900_P1_AGCIQIN0 0xf40f | 2234 | #define R0900_P1_AGCIQIN0 0xf40f |
2242 | #define F0900_P1_AGCIQ_VALUE0 0xf40f00ff | 2235 | #define AGCIQIN0 REGx(R0900_P1_AGCIQIN0) |
2236 | #define F0900_P1_AGCIQ_VALUE0 0xf40f00ff | ||
2237 | #define AGCIQ_VALUE0 FLDx(F0900_P1_AGCIQ_VALUE0) | ||
2243 | 2238 | ||
2244 | /*P1_DEMOD*/ | 2239 | /*P1_DEMOD*/ |
2245 | #define R0900_P1_DEMOD 0xf410 | 2240 | #define R0900_P1_DEMOD 0xf410 |
2246 | #define F0900_P1_DEMOD_STOP 0xf4100040 | 2241 | #define DEMOD REGx(R0900_P1_DEMOD) |
2247 | #define F0900_P1_SPECINV_CONTROL 0xf4100030 | 2242 | #define F0900_P1_MANUALS2_ROLLOFF 0xf4100080 |
2248 | #define F0900_P1_FORCE_ENASAMP 0xf4100008 | 2243 | #define MANUALS2_ROLLOFF FLDx(F0900_P1_MANUALS2_ROLLOFF) |
2249 | #define F0900_P1_MANUAL_ROLLOFF 0xf4100004 | 2244 | |
2250 | #define F0900_P1_ROLLOFF_CONTROL 0xf4100003 | 2245 | #define F0900_P1_SPECINV_CONTROL 0xf4100030 |
2246 | #define SPECINV_CONTROL FLDx(F0900_P1_SPECINV_CONTROL) | ||
2247 | #define F0900_P1_FORCE_ENASAMP 0xf4100008 | ||
2248 | #define F0900_P1_MANUALSX_ROLLOFF 0xf4100004 | ||
2249 | #define MANUALSX_ROLLOFF FLDx(F0900_P1_MANUALSX_ROLLOFF) | ||
2250 | #define F0900_P1_ROLLOFF_CONTROL 0xf4100003 | ||
2251 | #define ROLLOFF_CONTROL FLDx(F0900_P1_ROLLOFF_CONTROL) | ||
2251 | 2252 | ||
2252 | /*P1_DMDMODCOD*/ | 2253 | /*P1_DMDMODCOD*/ |
2253 | #define R0900_P1_DMDMODCOD 0xf411 | 2254 | #define R0900_P1_DMDMODCOD 0xf411 |
2254 | #define F0900_P1_MANUAL_MODCOD 0xf4110080 | 2255 | #define DMDMODCOD REGx(R0900_P1_DMDMODCOD) |
2255 | #define F0900_P1_DEMOD_MODCOD 0xf411007c | 2256 | #define F0900_P1_MANUAL_MODCOD 0xf4110080 |
2256 | #define F0900_P1_DEMOD_TYPE 0xf4110003 | 2257 | #define F0900_P1_DEMOD_MODCOD 0xf411007c |
2258 | #define DEMOD_MODCOD FLDx(F0900_P1_DEMOD_MODCOD) | ||
2259 | #define F0900_P1_DEMOD_TYPE 0xf4110003 | ||
2260 | #define DEMOD_TYPE FLDx(F0900_P1_DEMOD_TYPE) | ||
2257 | 2261 | ||
2258 | /*P1_DSTATUS*/ | 2262 | /*P1_DSTATUS*/ |
2259 | #define R0900_P1_DSTATUS 0xf412 | 2263 | #define R0900_P1_DSTATUS 0xf412 |
2260 | #define F0900_P1_CAR_LOCK 0xf4120080 | 2264 | #define DSTATUS REGx(R0900_P1_DSTATUS) |
2261 | #define F0900_P1_TMGLOCK_QUALITY 0xf4120060 | 2265 | #define F0900_P1_CAR_LOCK 0xf4120080 |
2262 | #define F0900_P1_SDVBS1_ENABLE 0xf4120010 | 2266 | #define F0900_P1_TMGLOCK_QUALITY 0xf4120060 |
2263 | #define F0900_P1_LOCK_DEFINITIF 0xf4120008 | 2267 | #define TMGLOCK_QUALITY FLDx(F0900_P1_TMGLOCK_QUALITY) |
2264 | #define F0900_P1_TIMING_IS_LOCKED 0xf4120004 | 2268 | #define F0900_P1_LOCK_DEFINITIF 0xf4120008 |
2265 | #define F0900_P1_COARSE_TMGLOCK 0xf4120002 | 2269 | #define LOCK_DEFINITIF FLDx(F0900_P1_LOCK_DEFINITIF) |
2266 | #define F0900_P1_COARSE_CARLOCK 0xf4120001 | 2270 | #define F0900_P1_OVADC_DETECT 0xf4120001 |
2267 | 2271 | ||
2268 | /*P1_DSTATUS2*/ | 2272 | /*P1_DSTATUS2*/ |
2269 | #define R0900_P1_DSTATUS2 0xf413 | 2273 | #define R0900_P1_DSTATUS2 0xf413 |
2270 | #define F0900_P1_DEMOD_DELOCK 0xf4130080 | 2274 | #define DSTATUS2 REGx(R0900_P1_DSTATUS2) |
2271 | #define F0900_P1_DEMOD_TIMEOUT 0xf4130040 | 2275 | #define F0900_P1_DEMOD_DELOCK 0xf4130080 |
2272 | #define F0900_P1_MODCODRQ_SYNCTAG 0xf4130020 | 2276 | #define F0900_P1_AGC1_NOSIGNALACK 0xf4130008 |
2273 | #define F0900_P1_POLYPH_SATEVENT 0xf4130010 | 2277 | #define F0900_P1_AGC2_OVERFLOW 0xf4130004 |
2274 | #define F0900_P1_AGC1_NOSIGNALACK 0xf4130008 | 2278 | #define F0900_P1_CFR_OVERFLOW 0xf4130002 |
2275 | #define F0900_P1_AGC2_OVERFLOW 0xf4130004 | 2279 | #define F0900_P1_GAMMA_OVERUNDER 0xf4130001 |
2276 | #define F0900_P1_CFR_OVERFLOW 0xf4130002 | ||
2277 | #define F0900_P1_GAMMA_OVERUNDER 0xf4130001 | ||
2278 | 2280 | ||
2279 | /*P1_DMDCFGMD*/ | 2281 | /*P1_DMDCFGMD*/ |
2280 | #define R0900_P1_DMDCFGMD 0xf414 | 2282 | #define R0900_P1_DMDCFGMD 0xf414 |
2281 | #define F0900_P1_DVBS2_ENABLE 0xf4140080 | 2283 | #define DMDCFGMD REGx(R0900_P1_DMDCFGMD) |
2282 | #define F0900_P1_DVBS1_ENABLE 0xf4140040 | 2284 | #define F0900_P1_DVBS2_ENABLE 0xf4140080 |
2283 | #define F0900_P1_CFR_AUTOSCAN 0xf4140020 | 2285 | #define DVBS2_ENABLE FLDx(F0900_P1_DVBS2_ENABLE) |
2284 | #define F0900_P1_SCAN_ENABLE 0xf4140010 | 2286 | #define F0900_P1_DVBS1_ENABLE 0xf4140040 |
2285 | #define F0900_P1_TUN_AUTOSCAN 0xf4140008 | 2287 | #define DVBS1_ENABLE FLDx(F0900_P1_DVBS1_ENABLE) |
2286 | #define F0900_P1_NOFORCE_RELOCK 0xf4140004 | 2288 | #define F0900_P1_SCAN_ENABLE 0xf4140010 |
2287 | #define F0900_P1_TUN_RNG 0xf4140003 | 2289 | #define SCAN_ENABLE FLDx(F0900_P1_SCAN_ENABLE) |
2290 | #define F0900_P1_CFR_AUTOSCAN 0xf4140008 | ||
2291 | #define CFR_AUTOSCAN FLDx(F0900_P1_CFR_AUTOSCAN) | ||
2292 | #define F0900_P1_TUN_RNG 0xf4140003 | ||
2288 | 2293 | ||
2289 | /*P1_DMDCFG2*/ | 2294 | /*P1_DMDCFG2*/ |
2290 | #define R0900_P1_DMDCFG2 0xf415 | 2295 | #define R0900_P1_DMDCFG2 0xf415 |
2291 | #define F0900_P1_AGC1_WAITLOCK 0xf4150080 | 2296 | #define DMDCFG2 REGx(R0900_P1_DMDCFG2) |
2292 | #define F0900_P1_S1S2_SEQUENTIAL 0xf4150040 | 2297 | #define F0900_P1_S1S2_SEQUENTIAL 0xf4150040 |
2293 | #define F0900_P1_OVERFLOW_TIMEOUT 0xf4150020 | 2298 | #define S1S2_SEQUENTIAL FLDx(F0900_P1_S1S2_SEQUENTIAL) |
2294 | #define F0900_P1_SCANFAIL_TIMEOUT 0xf4150010 | 2299 | #define F0900_P1_INFINITE_RELOCK 0xf4150010 |
2295 | #define F0900_P1_DMDTOUT_BACK 0xf4150008 | ||
2296 | #define F0900_P1_CARLOCK_S1ENABLE 0xf4150004 | ||
2297 | #define F0900_P1_COARSE_LK3MODE 0xf4150002 | ||
2298 | #define F0900_P1_COARSE_LK2MODE 0xf4150001 | ||
2299 | 2300 | ||
2300 | /*P1_DMDISTATE*/ | 2301 | /*P1_DMDISTATE*/ |
2301 | #define R0900_P1_DMDISTATE 0xf416 | 2302 | #define R0900_P1_DMDISTATE 0xf416 |
2302 | #define F0900_P1_I2C_NORESETDMODE 0xf4160080 | 2303 | #define DMDISTATE REGx(R0900_P1_DMDISTATE) |
2303 | #define F0900_P1_FORCE_ETAPED 0xf4160040 | 2304 | #define F0900_P1_I2C_DEMOD_MODE 0xf416001f |
2304 | #define F0900_P1_SDMDRST_DIRCLK 0xf4160020 | 2305 | #define DEMOD_MODE FLDx(F0900_P1_I2C_DEMOD_MODE) |
2305 | #define F0900_P1_I2C_DEMOD_MODE 0xf416001f | ||
2306 | 2306 | ||
2307 | /*P1_DMDT0M*/ | 2307 | /*P1_DMDT0M*/ |
2308 | #define R0900_P1_DMDT0M 0xf417 | 2308 | #define R0900_P1_DMDT0M 0xf417 |
2309 | #define F0900_P1_DMDT0_MIN 0xf41700ff | 2309 | #define DMDT0M REGx(R0900_P1_DMDT0M) |
2310 | #define F0900_P1_DMDT0_MIN 0xf41700ff | ||
2310 | 2311 | ||
2311 | /*P1_DMDSTATE*/ | 2312 | /*P1_DMDSTATE*/ |
2312 | #define R0900_P1_DMDSTATE 0xf41b | 2313 | #define R0900_P1_DMDSTATE 0xf41b |
2313 | #define F0900_P1_DEMOD_LOCKED 0xf41b0080 | 2314 | #define DMDSTATE REGx(R0900_P1_DMDSTATE) |
2314 | #define F0900_P1_HEADER_MODE 0xf41b0060 | 2315 | #define F0900_P1_HEADER_MODE 0xf41b0060 |
2315 | #define F0900_P1_DEMOD_MODE 0xf41b001f | 2316 | #define HEADER_MODE FLDx(F0900_P1_HEADER_MODE) |
2316 | 2317 | ||
2317 | /*P1_DMDFLYW*/ | 2318 | /*P1_DMDFLYW*/ |
2318 | #define R0900_P1_DMDFLYW 0xf41c | 2319 | #define R0900_P1_DMDFLYW 0xf41c |
2319 | #define F0900_P1_I2C_IRQVAL 0xf41c00f0 | 2320 | #define DMDFLYW REGx(R0900_P1_DMDFLYW) |
2320 | #define F0900_P1_FLYWHEEL_CPT 0xf41c000f | 2321 | #define F0900_P1_I2C_IRQVAL 0xf41c00f0 |
2322 | #define F0900_P1_FLYWHEEL_CPT 0xf41c000f | ||
2323 | #define FLYWHEEL_CPT FLDx(F0900_P1_FLYWHEEL_CPT) | ||
2321 | 2324 | ||
2322 | /*P1_DSTATUS3*/ | 2325 | /*P1_DSTATUS3*/ |
2323 | #define R0900_P1_DSTATUS3 0xf41d | 2326 | #define R0900_P1_DSTATUS3 0xf41d |
2324 | #define F0900_P1_CFR_ZIGZAG 0xf41d0080 | 2327 | #define DSTATUS3 REGx(R0900_P1_DSTATUS3) |
2325 | #define F0900_P1_DEMOD_CFGMODE 0xf41d0060 | 2328 | #define F0900_P1_DEMOD_CFGMODE 0xf41d0060 |
2326 | #define F0900_P1_GAMMA_LOWBAUDRATE 0xf41d0010 | ||
2327 | #define F0900_P1_RELOCK_MODE 0xf41d0008 | ||
2328 | #define F0900_P1_DEMOD_FAIL 0xf41d0004 | ||
2329 | #define F0900_P1_ETAPE1A_DVBXMEM 0xf41d0003 | ||
2330 | 2329 | ||
2331 | /*P1_DMDCFG3*/ | 2330 | /*P1_DMDCFG3*/ |
2332 | #define R0900_P1_DMDCFG3 0xf41e | 2331 | #define R0900_P1_DMDCFG3 0xf41e |
2333 | #define F0900_P1_DVBS1_TMGWAIT 0xf41e0080 | 2332 | #define DMDCFG3 REGx(R0900_P1_DMDCFG3) |
2334 | #define F0900_P1_NO_BWCENTERING 0xf41e0040 | 2333 | #define F0900_P1_NOSTOP_FIFOFULL 0xf41e0008 |
2335 | #define F0900_P1_INV_SEQSRCH 0xf41e0020 | ||
2336 | #define F0900_P1_DIS_SFRUPLOW_TRK 0xf41e0010 | ||
2337 | #define F0900_P1_NOSTOP_FIFOFULL 0xf41e0008 | ||
2338 | #define F0900_P1_LOCKTIME_MODE 0xf41e0007 | ||
2339 | 2334 | ||
2340 | /*P1_DMDCFG4*/ | 2335 | /*P1_DMDCFG4*/ |
2341 | #define R0900_P1_DMDCFG4 0xf41f | 2336 | #define R0900_P1_DMDCFG4 0xf41f |
2342 | #define F0900_P1_TUNER_NRELAUNCH 0xf41f0008 | 2337 | #define DMDCFG4 REGx(R0900_P1_DMDCFG4) |
2343 | #define F0900_P1_DIS_CLKENABLE 0xf41f0004 | 2338 | #define F0900_P1_TUNER_NRELAUNCH 0xf41f0008 |
2344 | #define F0900_P1_DIS_HDRDIVLOCK 0xf41f0002 | ||
2345 | #define F0900_P1_NO_TNRWBINIT 0xf41f0001 | ||
2346 | 2339 | ||
2347 | /*P1_CORRELMANT*/ | 2340 | /*P1_CORRELMANT*/ |
2348 | #define R0900_P1_CORRELMANT 0xf420 | 2341 | #define R0900_P1_CORRELMANT 0xf420 |
2349 | #define F0900_P1_CORREL_MANT 0xf42000ff | 2342 | #define CORRELMANT REGx(R0900_P1_CORRELMANT) |
2343 | #define F0900_P1_CORREL_MANT 0xf42000ff | ||
2350 | 2344 | ||
2351 | /*P1_CORRELABS*/ | 2345 | /*P1_CORRELABS*/ |
2352 | #define R0900_P1_CORRELABS 0xf421 | 2346 | #define R0900_P1_CORRELABS 0xf421 |
2353 | #define F0900_P1_CORREL_ABS 0xf42100ff | 2347 | #define CORRELABS REGx(R0900_P1_CORRELABS) |
2348 | #define F0900_P1_CORREL_ABS 0xf42100ff | ||
2354 | 2349 | ||
2355 | /*P1_CORRELEXP*/ | 2350 | /*P1_CORRELEXP*/ |
2356 | #define R0900_P1_CORRELEXP 0xf422 | 2351 | #define R0900_P1_CORRELEXP 0xf422 |
2357 | #define F0900_P1_CORREL_ABSEXP 0xf42200f0 | 2352 | #define CORRELEXP REGx(R0900_P1_CORRELEXP) |
2358 | #define F0900_P1_CORREL_EXP 0xf422000f | 2353 | #define F0900_P1_CORREL_ABSEXP 0xf42200f0 |
2354 | #define F0900_P1_CORREL_EXP 0xf422000f | ||
2359 | 2355 | ||
2360 | /*P1_PLHMODCOD*/ | 2356 | /*P1_PLHMODCOD*/ |
2361 | #define R0900_P1_PLHMODCOD 0xf424 | 2357 | #define R0900_P1_PLHMODCOD 0xf424 |
2362 | #define F0900_P1_SPECINV_DEMOD 0xf4240080 | 2358 | #define PLHMODCOD REGx(R0900_P1_PLHMODCOD) |
2363 | #define F0900_P1_PLH_MODCOD 0xf424007c | 2359 | #define F0900_P1_SPECINV_DEMOD 0xf4240080 |
2364 | #define F0900_P1_PLH_TYPE 0xf4240003 | 2360 | #define SPECINV_DEMOD FLDx(F0900_P1_SPECINV_DEMOD) |
2365 | 2361 | #define F0900_P1_PLH_MODCOD 0xf424007c | |
2366 | /*P1_AGCK32*/ | 2362 | #define F0900_P1_PLH_TYPE 0xf4240003 |
2367 | #define R0900_P1_AGCK32 0xf42b | 2363 | |
2368 | #define F0900_P1_R3ADJOFF_32APSK 0xf42b0080 | 2364 | /*P1_DMDREG*/ |
2369 | #define F0900_P1_R2ADJOFF_32APSK 0xf42b0040 | 2365 | #define R0900_P1_DMDREG 0xf425 |
2370 | #define F0900_P1_R1ADJOFF_32APSK 0xf42b0020 | 2366 | #define DMDREG REGx(R0900_P1_DMDREG) |
2371 | #define F0900_P1_RADJ_32APSK 0xf42b001f | 2367 | #define F0900_P1_DECIM_PLFRAMES 0xf4250001 |
2372 | 2368 | ||
2373 | /*P1_AGC2O*/ | 2369 | /*P1_AGC2O*/ |
2374 | #define R0900_P1_AGC2O 0xf42c | 2370 | #define R0900_P1_AGC2O 0xf42c |
2375 | #define F0900_P1_AGC2REF_ADJUSTING 0xf42c0080 | 2371 | #define AGC2O REGx(R0900_P1_AGC2O) |
2376 | #define F0900_P1_AGC2_COARSEFAST 0xf42c0040 | 2372 | #define F0900_P1_AGC2_COEF 0xf42c0007 |
2377 | #define F0900_P1_AGC2_LKSQRT 0xf42c0020 | ||
2378 | #define F0900_P1_AGC2_LKMODE 0xf42c0010 | ||
2379 | #define F0900_P1_AGC2_LKEQUA 0xf42c0008 | ||
2380 | #define F0900_P1_AGC2_COEF 0xf42c0007 | ||
2381 | 2373 | ||
2382 | /*P1_AGC2REF*/ | 2374 | /*P1_AGC2REF*/ |
2383 | #define R0900_P1_AGC2REF 0xf42d | 2375 | #define R0900_P1_AGC2REF 0xf42d |
2384 | #define F0900_P1_AGC2_REF 0xf42d00ff | 2376 | #define AGC2REF REGx(R0900_P1_AGC2REF) |
2377 | #define F0900_P1_AGC2_REF 0xf42d00ff | ||
2385 | 2378 | ||
2386 | /*P1_AGC1ADJ*/ | 2379 | /*P1_AGC1ADJ*/ |
2387 | #define R0900_P1_AGC1ADJ 0xf42e | 2380 | #define R0900_P1_AGC1ADJ 0xf42e |
2388 | #define F0900_P1_AGC1ADJ_MANUAL 0xf42e0080 | 2381 | #define AGC1ADJ REGx(R0900_P1_AGC1ADJ) |
2389 | #define F0900_P1_AGC1_ADJUSTED 0xf42e017f | 2382 | #define F0900_P1_AGC1_ADJUSTED 0xf42e007f |
2390 | 2383 | ||
2391 | /*P1_AGC2I1*/ | 2384 | /*P1_AGC2I1*/ |
2392 | #define R0900_P1_AGC2I1 0xf436 | 2385 | #define R0900_P1_AGC2I1 0xf436 |
2393 | #define F0900_P1_AGC2_INTEGRATOR1 0xf43600ff | 2386 | #define AGC2I1 REGx(R0900_P1_AGC2I1) |
2387 | #define F0900_P1_AGC2_INTEGRATOR1 0xf43600ff | ||
2394 | 2388 | ||
2395 | /*P1_AGC2I0*/ | 2389 | /*P1_AGC2I0*/ |
2396 | #define R0900_P1_AGC2I0 0xf437 | 2390 | #define R0900_P1_AGC2I0 0xf437 |
2397 | #define F0900_P1_AGC2_INTEGRATOR0 0xf43700ff | 2391 | #define AGC2I0 REGx(R0900_P1_AGC2I0) |
2392 | #define F0900_P1_AGC2_INTEGRATOR0 0xf43700ff | ||
2398 | 2393 | ||
2399 | /*P1_CARCFG*/ | 2394 | /*P1_CARCFG*/ |
2400 | #define R0900_P1_CARCFG 0xf438 | 2395 | #define R0900_P1_CARCFG 0xf438 |
2401 | #define F0900_P1_CFRUPLOW_AUTO 0xf4380080 | 2396 | #define CARCFG REGx(R0900_P1_CARCFG) |
2402 | #define F0900_P1_CFRUPLOW_TEST 0xf4380040 | 2397 | #define F0900_P1_CFRUPLOW_AUTO 0xf4380080 |
2403 | #define F0900_P1_EN_CAR2CENTER 0xf4380020 | 2398 | #define F0900_P1_CFRUPLOW_TEST 0xf4380040 |
2404 | #define F0900_P1_CARHDR_NODIV8 0xf4380010 | 2399 | #define F0900_P1_ROTAON 0xf4380004 |
2405 | #define F0900_P1_I2C_ROTA 0xf4380008 | 2400 | #define F0900_P1_PH_DET_ALGO 0xf4380003 |
2406 | #define F0900_P1_ROTAON 0xf4380004 | ||
2407 | #define F0900_P1_PH_DET_ALGO 0xf4380003 | ||
2408 | 2401 | ||
2409 | /*P1_ACLC*/ | 2402 | /*P1_ACLC*/ |
2410 | #define R0900_P1_ACLC 0xf439 | 2403 | #define R0900_P1_ACLC 0xf439 |
2411 | #define F0900_P1_STOP_S2ALPHA 0xf43900c0 | 2404 | #define ACLC REGx(R0900_P1_ACLC) |
2412 | #define F0900_P1_CAR_ALPHA_MANT 0xf4390030 | 2405 | #define F0900_P1_CAR_ALPHA_MANT 0xf4390030 |
2413 | #define F0900_P1_CAR_ALPHA_EXP 0xf439000f | 2406 | #define F0900_P1_CAR_ALPHA_EXP 0xf439000f |
2414 | 2407 | ||
2415 | /*P1_BCLC*/ | 2408 | /*P1_BCLC*/ |
2416 | #define R0900_P1_BCLC 0xf43a | 2409 | #define R0900_P1_BCLC 0xf43a |
2417 | #define F0900_P1_STOP_S2BETA 0xf43a00c0 | 2410 | #define BCLC REGx(R0900_P1_BCLC) |
2418 | #define F0900_P1_CAR_BETA_MANT 0xf43a0030 | 2411 | #define F0900_P1_CAR_BETA_MANT 0xf43a0030 |
2419 | #define F0900_P1_CAR_BETA_EXP 0xf43a000f | 2412 | #define F0900_P1_CAR_BETA_EXP 0xf43a000f |
2420 | 2413 | ||
2421 | /*P1_CARFREQ*/ | 2414 | /*P1_CARFREQ*/ |
2422 | #define R0900_P1_CARFREQ 0xf43d | 2415 | #define R0900_P1_CARFREQ 0xf43d |
2423 | #define F0900_P1_KC_COARSE_EXP 0xf43d00f0 | 2416 | #define CARFREQ REGx(R0900_P1_CARFREQ) |
2424 | #define F0900_P1_BETA_FREQ 0xf43d000f | 2417 | #define F0900_P1_KC_COARSE_EXP 0xf43d00f0 |
2418 | #define F0900_P1_BETA_FREQ 0xf43d000f | ||
2425 | 2419 | ||
2426 | /*P1_CARHDR*/ | 2420 | /*P1_CARHDR*/ |
2427 | #define R0900_P1_CARHDR 0xf43e | 2421 | #define R0900_P1_CARHDR 0xf43e |
2428 | #define F0900_P1_K_FREQ_HDR 0xf43e00ff | 2422 | #define CARHDR REGx(R0900_P1_CARHDR) |
2423 | #define F0900_P1_K_FREQ_HDR 0xf43e00ff | ||
2429 | 2424 | ||
2430 | /*P1_LDT*/ | 2425 | /*P1_LDT*/ |
2431 | #define R0900_P1_LDT 0xf43f | 2426 | #define R0900_P1_LDT 0xf43f |
2432 | #define F0900_P1_CARLOCK_THRES 0xf43f01ff | 2427 | #define LDT REGx(R0900_P1_LDT) |
2428 | #define F0900_P1_CARLOCK_THRES 0xf43f01ff | ||
2433 | 2429 | ||
2434 | /*P1_LDT2*/ | 2430 | /*P1_LDT2*/ |
2435 | #define R0900_P1_LDT2 0xf440 | 2431 | #define R0900_P1_LDT2 0xf440 |
2436 | #define F0900_P1_CARLOCK_THRES2 0xf44001ff | 2432 | #define LDT2 REGx(R0900_P1_LDT2) |
2433 | #define F0900_P1_CARLOCK_THRES2 0xf44001ff | ||
2437 | 2434 | ||
2438 | /*P1_CFRICFG*/ | 2435 | /*P1_CFRICFG*/ |
2439 | #define R0900_P1_CFRICFG 0xf441 | 2436 | #define R0900_P1_CFRICFG 0xf441 |
2440 | #define F0900_P1_CFRINIT_UNVALRNG 0xf4410080 | 2437 | #define CFRICFG REGx(R0900_P1_CFRICFG) |
2441 | #define F0900_P1_CFRINIT_LUNVALCPT 0xf4410040 | 2438 | #define F0900_P1_NEG_CFRSTEP 0xf4410001 |
2442 | #define F0900_P1_CFRINIT_ABORTDBL 0xf4410020 | ||
2443 | #define F0900_P1_CFRINIT_ABORTPRED 0xf4410010 | ||
2444 | #define F0900_P1_CFRINIT_UNVALSKIP 0xf4410008 | ||
2445 | #define F0900_P1_CFRINIT_CSTINC 0xf4410004 | ||
2446 | #define F0900_P1_NEG_CFRSTEP 0xf4410001 | ||
2447 | 2439 | ||
2448 | /*P1_CFRUP1*/ | 2440 | /*P1_CFRUP1*/ |
2449 | #define R0900_P1_CFRUP1 0xf442 | 2441 | #define R0900_P1_CFRUP1 0xf442 |
2450 | #define F0900_P1_CFR_UP1 0xf44201ff | 2442 | #define CFRUP1 REGx(R0900_P1_CFRUP1) |
2443 | #define F0900_P1_CFR_UP1 0xf44201ff | ||
2444 | #define CFR_UP1 FLDx(F0900_P1_CFR_UP1) | ||
2451 | 2445 | ||
2452 | /*P1_CFRUP0*/ | 2446 | /*P1_CFRUP0*/ |
2453 | #define R0900_P1_CFRUP0 0xf443 | 2447 | #define R0900_P1_CFRUP0 0xf443 |
2454 | #define F0900_P1_CFR_UP0 0xf44300ff | 2448 | #define CFRUP0 REGx(R0900_P1_CFRUP0) |
2449 | #define F0900_P1_CFR_UP0 0xf44300ff | ||
2450 | #define CFR_UP0 FLDx(F0900_P1_CFR_UP0) | ||
2455 | 2451 | ||
2456 | /*P1_CFRLOW1*/ | 2452 | /*P1_CFRLOW1*/ |
2457 | #define R0900_P1_CFRLOW1 0xf446 | 2453 | #define R0900_P1_CFRLOW1 0xf446 |
2458 | #define F0900_P1_CFR_LOW1 0xf44601ff | 2454 | #define CFRLOW1 REGx(R0900_P1_CFRLOW1) |
2455 | #define F0900_P1_CFR_LOW1 0xf44601ff | ||
2456 | #define CFR_LOW1 FLDx(F0900_P1_CFR_LOW1) | ||
2459 | 2457 | ||
2460 | /*P1_CFRLOW0*/ | 2458 | /*P1_CFRLOW0*/ |
2461 | #define R0900_P1_CFRLOW0 0xf447 | 2459 | #define R0900_P1_CFRLOW0 0xf447 |
2462 | #define F0900_P1_CFR_LOW0 0xf44700ff | 2460 | #define CFRLOW0 REGx(R0900_P1_CFRLOW0) |
2461 | #define F0900_P1_CFR_LOW0 0xf44700ff | ||
2462 | #define CFR_LOW0 FLDx(F0900_P1_CFR_LOW0) | ||
2463 | 2463 | ||
2464 | /*P1_CFRINIT1*/ | 2464 | /*P1_CFRINIT1*/ |
2465 | #define R0900_P1_CFRINIT1 0xf448 | 2465 | #define R0900_P1_CFRINIT1 0xf448 |
2466 | #define F0900_P1_CFR_INIT1 0xf44801ff | 2466 | #define CFRINIT1 REGx(R0900_P1_CFRINIT1) |
2467 | #define F0900_P1_CFR_INIT1 0xf44801ff | ||
2468 | #define CFR_INIT1 FLDx(F0900_P1_CFR_INIT1) | ||
2467 | 2469 | ||
2468 | /*P1_CFRINIT0*/ | 2470 | /*P1_CFRINIT0*/ |
2469 | #define R0900_P1_CFRINIT0 0xf449 | 2471 | #define R0900_P1_CFRINIT0 0xf449 |
2470 | #define F0900_P1_CFR_INIT0 0xf44900ff | 2472 | #define CFRINIT0 REGx(R0900_P1_CFRINIT0) |
2473 | #define F0900_P1_CFR_INIT0 0xf44900ff | ||
2474 | #define CFR_INIT0 FLDx(F0900_P1_CFR_INIT0) | ||
2471 | 2475 | ||
2472 | /*P1_CFRINC1*/ | 2476 | /*P1_CFRINC1*/ |
2473 | #define R0900_P1_CFRINC1 0xf44a | 2477 | #define R0900_P1_CFRINC1 0xf44a |
2474 | #define F0900_P1_MANUAL_CFRINC 0xf44a0080 | 2478 | #define CFRINC1 REGx(R0900_P1_CFRINC1) |
2475 | #define F0900_P1_CFR_INC1 0xf44a017f | 2479 | #define F0900_P1_MANUAL_CFRINC 0xf44a0080 |
2480 | #define F0900_P1_CFR_INC1 0xf44a003f | ||
2476 | 2481 | ||
2477 | /*P1_CFRINC0*/ | 2482 | /*P1_CFRINC0*/ |
2478 | #define R0900_P1_CFRINC0 0xf44b | 2483 | #define R0900_P1_CFRINC0 0xf44b |
2479 | #define F0900_P1_CFR_INC0 0xf44b00f0 | 2484 | #define CFRINC0 REGx(R0900_P1_CFRINC0) |
2485 | #define F0900_P1_CFR_INC0 0xf44b00f8 | ||
2480 | 2486 | ||
2481 | /*P1_CFR2*/ | 2487 | /*P1_CFR2*/ |
2482 | #define R0900_P1_CFR2 0xf44c | 2488 | #define R0900_P1_CFR2 0xf44c |
2483 | #define F0900_P1_CAR_FREQ2 0xf44c01ff | 2489 | #define CFR2 REGx(R0900_P1_CFR2) |
2490 | #define F0900_P1_CAR_FREQ2 0xf44c01ff | ||
2491 | #define CAR_FREQ2 FLDx(F0900_P1_CAR_FREQ2) | ||
2484 | 2492 | ||
2485 | /*P1_CFR1*/ | 2493 | /*P1_CFR1*/ |
2486 | #define R0900_P1_CFR1 0xf44d | 2494 | #define R0900_P1_CFR1 0xf44d |
2487 | #define F0900_P1_CAR_FREQ1 0xf44d00ff | 2495 | #define CFR1 REGx(R0900_P1_CFR1) |
2496 | #define F0900_P1_CAR_FREQ1 0xf44d00ff | ||
2497 | #define CAR_FREQ1 FLDx(F0900_P1_CAR_FREQ1) | ||
2488 | 2498 | ||
2489 | /*P1_CFR0*/ | 2499 | /*P1_CFR0*/ |
2490 | #define R0900_P1_CFR0 0xf44e | 2500 | #define R0900_P1_CFR0 0xf44e |
2491 | #define F0900_P1_CAR_FREQ0 0xf44e00ff | 2501 | #define CFR0 REGx(R0900_P1_CFR0) |
2502 | #define F0900_P1_CAR_FREQ0 0xf44e00ff | ||
2503 | #define CAR_FREQ0 FLDx(F0900_P1_CAR_FREQ0) | ||
2492 | 2504 | ||
2493 | /*P1_LDI*/ | 2505 | /*P1_LDI*/ |
2494 | #define R0900_P1_LDI 0xf44f | 2506 | #define R0900_P1_LDI 0xf44f |
2495 | #define F0900_P1_LOCK_DET_INTEGR 0xf44f01ff | 2507 | #define LDI REGx(R0900_P1_LDI) |
2508 | #define F0900_P1_LOCK_DET_INTEGR 0xf44f01ff | ||
2496 | 2509 | ||
2497 | /*P1_TMGCFG*/ | 2510 | /*P1_TMGCFG*/ |
2498 | #define R0900_P1_TMGCFG 0xf450 | 2511 | #define R0900_P1_TMGCFG 0xf450 |
2499 | #define F0900_P1_TMGLOCK_BETA 0xf45000c0 | 2512 | #define TMGCFG REGx(R0900_P1_TMGCFG) |
2500 | #define F0900_P1_NOTMG_GROUPDELAY 0xf4500020 | 2513 | #define F0900_P1_TMGLOCK_BETA 0xf45000c0 |
2501 | #define F0900_P1_DO_TIMING_CORR 0xf4500010 | 2514 | #define F0900_P1_DO_TIMING_CORR 0xf4500010 |
2502 | #define F0900_P1_MANUAL_SCAN 0xf450000c | 2515 | #define F0900_P1_TMG_MINFREQ 0xf4500003 |
2503 | #define F0900_P1_TMG_MINFREQ 0xf4500003 | ||
2504 | 2516 | ||
2505 | /*P1_RTC*/ | 2517 | /*P1_RTC*/ |
2506 | #define R0900_P1_RTC 0xf451 | 2518 | #define R0900_P1_RTC 0xf451 |
2507 | #define F0900_P1_TMGALPHA_EXP 0xf45100f0 | 2519 | #define RTC REGx(R0900_P1_RTC) |
2508 | #define F0900_P1_TMGBETA_EXP 0xf451000f | 2520 | #define F0900_P1_TMGALPHA_EXP 0xf45100f0 |
2521 | #define F0900_P1_TMGBETA_EXP 0xf451000f | ||
2509 | 2522 | ||
2510 | /*P1_RTCS2*/ | 2523 | /*P1_RTCS2*/ |
2511 | #define R0900_P1_RTCS2 0xf452 | 2524 | #define R0900_P1_RTCS2 0xf452 |
2512 | #define F0900_P1_TMGALPHAS2_EXP 0xf45200f0 | 2525 | #define RTCS2 REGx(R0900_P1_RTCS2) |
2513 | #define F0900_P1_TMGBETAS2_EXP 0xf452000f | 2526 | #define F0900_P1_TMGALPHAS2_EXP 0xf45200f0 |
2527 | #define F0900_P1_TMGBETAS2_EXP 0xf452000f | ||
2514 | 2528 | ||
2515 | /*P1_TMGTHRISE*/ | 2529 | /*P1_TMGTHRISE*/ |
2516 | #define R0900_P1_TMGTHRISE 0xf453 | 2530 | #define R0900_P1_TMGTHRISE 0xf453 |
2517 | #define F0900_P1_TMGLOCK_THRISE 0xf45300ff | 2531 | #define TMGTHRISE REGx(R0900_P1_TMGTHRISE) |
2532 | #define F0900_P1_TMGLOCK_THRISE 0xf45300ff | ||
2518 | 2533 | ||
2519 | /*P1_TMGTHFALL*/ | 2534 | /*P1_TMGTHFALL*/ |
2520 | #define R0900_P1_TMGTHFALL 0xf454 | 2535 | #define R0900_P1_TMGTHFALL 0xf454 |
2521 | #define F0900_P1_TMGLOCK_THFALL 0xf45400ff | 2536 | #define TMGTHFALL REGx(R0900_P1_TMGTHFALL) |
2537 | #define F0900_P1_TMGLOCK_THFALL 0xf45400ff | ||
2522 | 2538 | ||
2523 | /*P1_SFRUPRATIO*/ | 2539 | /*P1_SFRUPRATIO*/ |
2524 | #define R0900_P1_SFRUPRATIO 0xf455 | 2540 | #define R0900_P1_SFRUPRATIO 0xf455 |
2525 | #define F0900_P1_SFR_UPRATIO 0xf45500ff | 2541 | #define SFRUPRATIO REGx(R0900_P1_SFRUPRATIO) |
2542 | #define F0900_P1_SFR_UPRATIO 0xf45500ff | ||
2526 | 2543 | ||
2527 | /*P1_SFRLOWRATIO*/ | 2544 | /*P1_SFRLOWRATIO*/ |
2528 | #define R0900_P1_SFRLOWRATIO 0xf456 | 2545 | #define R0900_P1_SFRLOWRATIO 0xf456 |
2529 | #define F0900_P1_SFR_LOWRATIO 0xf45600ff | 2546 | #define F0900_P1_SFR_LOWRATIO 0xf45600ff |
2530 | 2547 | ||
2531 | /*P1_KREFTMG*/ | 2548 | /*P1_KREFTMG*/ |
2532 | #define R0900_P1_KREFTMG 0xf458 | 2549 | #define R0900_P1_KREFTMG 0xf458 |
2533 | #define F0900_P1_KREF_TMG 0xf45800ff | 2550 | #define KREFTMG REGx(R0900_P1_KREFTMG) |
2551 | #define F0900_P1_KREF_TMG 0xf45800ff | ||
2534 | 2552 | ||
2535 | /*P1_SFRSTEP*/ | 2553 | /*P1_SFRSTEP*/ |
2536 | #define R0900_P1_SFRSTEP 0xf459 | 2554 | #define R0900_P1_SFRSTEP 0xf459 |
2537 | #define F0900_P1_SFR_SCANSTEP 0xf45900f0 | 2555 | #define SFRSTEP REGx(R0900_P1_SFRSTEP) |
2538 | #define F0900_P1_SFR_CENTERSTEP 0xf459000f | 2556 | #define F0900_P1_SFR_SCANSTEP 0xf45900f0 |
2557 | #define F0900_P1_SFR_CENTERSTEP 0xf459000f | ||
2539 | 2558 | ||
2540 | /*P1_TMGCFG2*/ | 2559 | /*P1_TMGCFG2*/ |
2541 | #define R0900_P1_TMGCFG2 0xf45a | 2560 | #define R0900_P1_TMGCFG2 0xf45a |
2542 | #define F0900_P1_DIS_AUTOSAMP 0xf45a0008 | 2561 | #define TMGCFG2 REGx(R0900_P1_TMGCFG2) |
2543 | #define F0900_P1_SCANINIT_QUART 0xf45a0004 | 2562 | #define F0900_P1_SFRRATIO_FINE 0xf45a0001 |
2544 | #define F0900_P1_NOTMG_DVBS1DERAT 0xf45a0002 | 2563 | |
2545 | #define F0900_P1_SFRRATIO_FINE 0xf45a0001 | 2564 | /*P1_KREFTMG2*/ |
2565 | #define R0900_P1_KREFTMG2 0xf45b | ||
2566 | #define KREFTMG2 REGx(R0900_P1_KREFTMG2) | ||
2567 | #define F0900_P1_KREF_TMG2 0xf45b00ff | ||
2546 | 2568 | ||
2547 | /*P1_SFRINIT1*/ | 2569 | /*P1_SFRINIT1*/ |
2548 | #define R0900_P1_SFRINIT1 0xf45e | 2570 | #define R0900_P1_SFRINIT1 0xf45e |
2549 | #define F0900_P1_SFR_INIT1 0xf45e00ff | 2571 | #define SFRINIT1 REGx(R0900_P1_SFRINIT1) |
2572 | #define F0900_P1_SFR_INIT1 0xf45e007f | ||
2550 | 2573 | ||
2551 | /*P1_SFRINIT0*/ | 2574 | /*P1_SFRINIT0*/ |
2552 | #define R0900_P1_SFRINIT0 0xf45f | 2575 | #define R0900_P1_SFRINIT0 0xf45f |
2553 | #define F0900_P1_SFR_INIT0 0xf45f00ff | 2576 | #define SFRINIT0 REGx(R0900_P1_SFRINIT0) |
2577 | #define F0900_P1_SFR_INIT0 0xf45f00ff | ||
2554 | 2578 | ||
2555 | /*P1_SFRUP1*/ | 2579 | /*P1_SFRUP1*/ |
2556 | #define R0900_P1_SFRUP1 0xf460 | 2580 | #define R0900_P1_SFRUP1 0xf460 |
2557 | #define F0900_P1_AUTO_GUP 0xf4600080 | 2581 | #define SFRUP1 REGx(R0900_P1_SFRUP1) |
2558 | #define F0900_P1_SYMB_FREQ_UP1 0xf460007f | 2582 | #define F0900_P1_AUTO_GUP 0xf4600080 |
2583 | #define AUTO_GUP FLDx(F0900_P1_AUTO_GUP) | ||
2584 | #define F0900_P1_SYMB_FREQ_UP1 0xf460007f | ||
2559 | 2585 | ||
2560 | /*P1_SFRUP0*/ | 2586 | /*P1_SFRUP0*/ |
2561 | #define R0900_P1_SFRUP0 0xf461 | 2587 | #define R0900_P1_SFRUP0 0xf461 |
2562 | #define F0900_P1_SYMB_FREQ_UP0 0xf46100ff | 2588 | #define SFRUP0 REGx(R0900_P1_SFRUP0) |
2589 | #define F0900_P1_SYMB_FREQ_UP0 0xf46100ff | ||
2563 | 2590 | ||
2564 | /*P1_SFRLOW1*/ | 2591 | /*P1_SFRLOW1*/ |
2565 | #define R0900_P1_SFRLOW1 0xf462 | 2592 | #define R0900_P1_SFRLOW1 0xf462 |
2566 | #define F0900_P1_AUTO_GLOW 0xf4620080 | 2593 | #define SFRLOW1 REGx(R0900_P1_SFRLOW1) |
2567 | #define F0900_P1_SYMB_FREQ_LOW1 0xf462007f | 2594 | #define F0900_P1_AUTO_GLOW 0xf4620080 |
2595 | #define AUTO_GLOW FLDx(F0900_P1_AUTO_GLOW) | ||
2596 | #define F0900_P1_SYMB_FREQ_LOW1 0xf462007f | ||
2568 | 2597 | ||
2569 | /*P1_SFRLOW0*/ | 2598 | /*P1_SFRLOW0*/ |
2570 | #define R0900_P1_SFRLOW0 0xf463 | 2599 | #define R0900_P1_SFRLOW0 0xf463 |
2571 | #define F0900_P1_SYMB_FREQ_LOW0 0xf46300ff | 2600 | #define SFRLOW0 REGx(R0900_P1_SFRLOW0) |
2601 | #define F0900_P1_SYMB_FREQ_LOW0 0xf46300ff | ||
2572 | 2602 | ||
2573 | /*P1_SFR3*/ | 2603 | /*P1_SFR3*/ |
2574 | #define R0900_P1_SFR3 0xf464 | 2604 | #define R0900_P1_SFR3 0xf464 |
2575 | #define F0900_P1_SYMB_FREQ3 0xf46400ff | 2605 | #define SFR3 REGx(R0900_P1_SFR3) |
2606 | #define F0900_P1_SYMB_FREQ3 0xf46400ff | ||
2607 | #define SYMB_FREQ3 FLDx(F0900_P1_SYMB_FREQ3) | ||
2576 | 2608 | ||
2577 | /*P1_SFR2*/ | 2609 | /*P1_SFR2*/ |
2578 | #define R0900_P1_SFR2 0xf465 | 2610 | #define R0900_P1_SFR2 0xf465 |
2579 | #define F0900_P1_SYMB_FREQ2 0xf46500ff | 2611 | #define SFR2 REGx(R0900_P1_SFR2) |
2612 | #define F0900_P1_SYMB_FREQ2 0xf46500ff | ||
2613 | #define SYMB_FREQ2 FLDx(F0900_P1_SYMB_FREQ2) | ||
2580 | 2614 | ||
2581 | /*P1_SFR1*/ | 2615 | /*P1_SFR1*/ |
2582 | #define R0900_P1_SFR1 0xf466 | 2616 | #define R0900_P1_SFR1 0xf466 |
2583 | #define F0900_P1_SYMB_FREQ1 0xf46600ff | 2617 | #define SFR1 REGx(R0900_P1_SFR1) |
2618 | #define F0900_P1_SYMB_FREQ1 0xf46600ff | ||
2619 | #define SYMB_FREQ1 FLDx(F0900_P1_SYMB_FREQ1) | ||
2584 | 2620 | ||
2585 | /*P1_SFR0*/ | 2621 | /*P1_SFR0*/ |
2586 | #define R0900_P1_SFR0 0xf467 | 2622 | #define R0900_P1_SFR0 0xf467 |
2587 | #define F0900_P1_SYMB_FREQ0 0xf46700ff | 2623 | #define SFR0 REGx(R0900_P1_SFR0) |
2624 | #define F0900_P1_SYMB_FREQ0 0xf46700ff | ||
2625 | #define SYMB_FREQ0 FLDx(F0900_P1_SYMB_FREQ0) | ||
2588 | 2626 | ||
2589 | /*P1_TMGREG2*/ | 2627 | /*P1_TMGREG2*/ |
2590 | #define R0900_P1_TMGREG2 0xf468 | 2628 | #define R0900_P1_TMGREG2 0xf468 |
2591 | #define F0900_P1_TMGREG2 0xf46800ff | 2629 | #define TMGREG2 REGx(R0900_P1_TMGREG2) |
2630 | #define F0900_P1_TMGREG2 0xf46800ff | ||
2592 | 2631 | ||
2593 | /*P1_TMGREG1*/ | 2632 | /*P1_TMGREG1*/ |
2594 | #define R0900_P1_TMGREG1 0xf469 | 2633 | #define R0900_P1_TMGREG1 0xf469 |
2595 | #define F0900_P1_TMGREG1 0xf46900ff | 2634 | #define TMGREG1 REGx(R0900_P1_TMGREG1) |
2635 | #define F0900_P1_TMGREG1 0xf46900ff | ||
2596 | 2636 | ||
2597 | /*P1_TMGREG0*/ | 2637 | /*P1_TMGREG0*/ |
2598 | #define R0900_P1_TMGREG0 0xf46a | 2638 | #define R0900_P1_TMGREG0 0xf46a |
2599 | #define F0900_P1_TMGREG0 0xf46a00ff | 2639 | #define TMGREG0 REGx(R0900_P1_TMGREG0) |
2640 | #define F0900_P1_TMGREG0 0xf46a00ff | ||
2600 | 2641 | ||
2601 | /*P1_TMGLOCK1*/ | 2642 | /*P1_TMGLOCK1*/ |
2602 | #define R0900_P1_TMGLOCK1 0xf46b | 2643 | #define R0900_P1_TMGLOCK1 0xf46b |
2603 | #define F0900_P1_TMGLOCK_LEVEL1 0xf46b01ff | 2644 | #define TMGLOCK1 REGx(R0900_P1_TMGLOCK1) |
2645 | #define F0900_P1_TMGLOCK_LEVEL1 0xf46b01ff | ||
2604 | 2646 | ||
2605 | /*P1_TMGLOCK0*/ | 2647 | /*P1_TMGLOCK0*/ |
2606 | #define R0900_P1_TMGLOCK0 0xf46c | 2648 | #define R0900_P1_TMGLOCK0 0xf46c |
2607 | #define F0900_P1_TMGLOCK_LEVEL0 0xf46c00ff | 2649 | #define TMGLOCK0 REGx(R0900_P1_TMGLOCK0) |
2650 | #define F0900_P1_TMGLOCK_LEVEL0 0xf46c00ff | ||
2608 | 2651 | ||
2609 | /*P1_TMGOBS*/ | 2652 | /*P1_TMGOBS*/ |
2610 | #define R0900_P1_TMGOBS 0xf46d | 2653 | #define R0900_P1_TMGOBS 0xf46d |
2611 | #define F0900_P1_ROLLOFF_STATUS 0xf46d00c0 | 2654 | #define TMGOBS REGx(R0900_P1_TMGOBS) |
2612 | #define F0900_P1_SCAN_SIGN 0xf46d0030 | 2655 | #define F0900_P1_ROLLOFF_STATUS 0xf46d00c0 |
2613 | #define F0900_P1_TMG_SCANNING 0xf46d0008 | 2656 | #define ROLLOFF_STATUS FLDx(F0900_P1_ROLLOFF_STATUS) |
2614 | #define F0900_P1_CHCENTERING_MODE 0xf46d0004 | ||
2615 | #define F0900_P1_TMG_SCANFAIL 0xf46d0002 | ||
2616 | 2657 | ||
2617 | /*P1_EQUALCFG*/ | 2658 | /*P1_EQUALCFG*/ |
2618 | #define R0900_P1_EQUALCFG 0xf46f | 2659 | #define R0900_P1_EQUALCFG 0xf46f |
2619 | #define F0900_P1_NOTMG_NEGALWAIT 0xf46f0080 | 2660 | #define EQUALCFG REGx(R0900_P1_EQUALCFG) |
2620 | #define F0900_P1_EQUAL_ON 0xf46f0040 | 2661 | #define F0900_P1_EQUAL_ON 0xf46f0040 |
2621 | #define F0900_P1_SEL_EQUALCOR 0xf46f0038 | 2662 | #define F0900_P1_MU_EQUALDFE 0xf46f0007 |
2622 | #define F0900_P1_MU_EQUALDFE 0xf46f0007 | ||
2623 | 2663 | ||
2624 | /*P1_EQUAI1*/ | 2664 | /*P1_EQUAI1*/ |
2625 | #define R0900_P1_EQUAI1 0xf470 | 2665 | #define R0900_P1_EQUAI1 0xf470 |
2626 | #define F0900_P1_EQUA_ACCI1 0xf47001ff | 2666 | #define EQUAI1 REGx(R0900_P1_EQUAI1) |
2667 | #define F0900_P1_EQUA_ACCI1 0xf47001ff | ||
2627 | 2668 | ||
2628 | /*P1_EQUAQ1*/ | 2669 | /*P1_EQUAQ1*/ |
2629 | #define R0900_P1_EQUAQ1 0xf471 | 2670 | #define R0900_P1_EQUAQ1 0xf471 |
2630 | #define F0900_P1_EQUA_ACCQ1 0xf47101ff | 2671 | #define EQUAQ1 REGx(R0900_P1_EQUAQ1) |
2672 | #define F0900_P1_EQUA_ACCQ1 0xf47101ff | ||
2631 | 2673 | ||
2632 | /*P1_EQUAI2*/ | 2674 | /*P1_EQUAI2*/ |
2633 | #define R0900_P1_EQUAI2 0xf472 | 2675 | #define R0900_P1_EQUAI2 0xf472 |
2634 | #define F0900_P1_EQUA_ACCI2 0xf47201ff | 2676 | #define EQUAI2 REGx(R0900_P1_EQUAI2) |
2677 | #define F0900_P1_EQUA_ACCI2 0xf47201ff | ||
2635 | 2678 | ||
2636 | /*P1_EQUAQ2*/ | 2679 | /*P1_EQUAQ2*/ |
2637 | #define R0900_P1_EQUAQ2 0xf473 | 2680 | #define R0900_P1_EQUAQ2 0xf473 |
2638 | #define F0900_P1_EQUA_ACCQ2 0xf47301ff | 2681 | #define EQUAQ2 REGx(R0900_P1_EQUAQ2) |
2682 | #define F0900_P1_EQUA_ACCQ2 0xf47301ff | ||
2639 | 2683 | ||
2640 | /*P1_EQUAI3*/ | 2684 | /*P1_EQUAI3*/ |
2641 | #define R0900_P1_EQUAI3 0xf474 | 2685 | #define R0900_P1_EQUAI3 0xf474 |
2642 | #define F0900_P1_EQUA_ACCI3 0xf47401ff | 2686 | #define EQUAI3 REGx(R0900_P1_EQUAI3) |
2687 | #define F0900_P1_EQUA_ACCI3 0xf47401ff | ||
2643 | 2688 | ||
2644 | /*P1_EQUAQ3*/ | 2689 | /*P1_EQUAQ3*/ |
2645 | #define R0900_P1_EQUAQ3 0xf475 | 2690 | #define R0900_P1_EQUAQ3 0xf475 |
2646 | #define F0900_P1_EQUA_ACCQ3 0xf47501ff | 2691 | #define EQUAQ3 REGx(R0900_P1_EQUAQ3) |
2692 | #define F0900_P1_EQUA_ACCQ3 0xf47501ff | ||
2647 | 2693 | ||
2648 | /*P1_EQUAI4*/ | 2694 | /*P1_EQUAI4*/ |
2649 | #define R0900_P1_EQUAI4 0xf476 | 2695 | #define R0900_P1_EQUAI4 0xf476 |
2650 | #define F0900_P1_EQUA_ACCI4 0xf47601ff | 2696 | #define EQUAI4 REGx(R0900_P1_EQUAI4) |
2697 | #define F0900_P1_EQUA_ACCI4 0xf47601ff | ||
2651 | 2698 | ||
2652 | /*P1_EQUAQ4*/ | 2699 | /*P1_EQUAQ4*/ |
2653 | #define R0900_P1_EQUAQ4 0xf477 | 2700 | #define R0900_P1_EQUAQ4 0xf477 |
2654 | #define F0900_P1_EQUA_ACCQ4 0xf47701ff | 2701 | #define EQUAQ4 REGx(R0900_P1_EQUAQ4) |
2702 | #define F0900_P1_EQUA_ACCQ4 0xf47701ff | ||
2655 | 2703 | ||
2656 | /*P1_EQUAI5*/ | 2704 | /*P1_EQUAI5*/ |
2657 | #define R0900_P1_EQUAI5 0xf478 | 2705 | #define R0900_P1_EQUAI5 0xf478 |
2658 | #define F0900_P1_EQUA_ACCI5 0xf47801ff | 2706 | #define EQUAI5 REGx(R0900_P1_EQUAI5) |
2707 | #define F0900_P1_EQUA_ACCI5 0xf47801ff | ||
2659 | 2708 | ||
2660 | /*P1_EQUAQ5*/ | 2709 | /*P1_EQUAQ5*/ |
2661 | #define R0900_P1_EQUAQ5 0xf479 | 2710 | #define R0900_P1_EQUAQ5 0xf479 |
2662 | #define F0900_P1_EQUA_ACCQ5 0xf47901ff | 2711 | #define EQUAQ5 REGx(R0900_P1_EQUAQ5) |
2712 | #define F0900_P1_EQUA_ACCQ5 0xf47901ff | ||
2663 | 2713 | ||
2664 | /*P1_EQUAI6*/ | 2714 | /*P1_EQUAI6*/ |
2665 | #define R0900_P1_EQUAI6 0xf47a | 2715 | #define R0900_P1_EQUAI6 0xf47a |
2666 | #define F0900_P1_EQUA_ACCI6 0xf47a01ff | 2716 | #define EQUAI6 REGx(R0900_P1_EQUAI6) |
2717 | #define F0900_P1_EQUA_ACCI6 0xf47a01ff | ||
2667 | 2718 | ||
2668 | /*P1_EQUAQ6*/ | 2719 | /*P1_EQUAQ6*/ |
2669 | #define R0900_P1_EQUAQ6 0xf47b | 2720 | #define R0900_P1_EQUAQ6 0xf47b |
2670 | #define F0900_P1_EQUA_ACCQ6 0xf47b01ff | 2721 | #define EQUAQ6 REGx(R0900_P1_EQUAQ6) |
2722 | #define F0900_P1_EQUA_ACCQ6 0xf47b01ff | ||
2671 | 2723 | ||
2672 | /*P1_EQUAI7*/ | 2724 | /*P1_EQUAI7*/ |
2673 | #define R0900_P1_EQUAI7 0xf47c | 2725 | #define R0900_P1_EQUAI7 0xf47c |
2674 | #define F0900_P1_EQUA_ACCI7 0xf47c01ff | 2726 | #define EQUAI7 REGx(R0900_P1_EQUAI7) |
2727 | #define F0900_P1_EQUA_ACCI7 0xf47c01ff | ||
2675 | 2728 | ||
2676 | /*P1_EQUAQ7*/ | 2729 | /*P1_EQUAQ7*/ |
2677 | #define R0900_P1_EQUAQ7 0xf47d | 2730 | #define R0900_P1_EQUAQ7 0xf47d |
2678 | #define F0900_P1_EQUA_ACCQ7 0xf47d01ff | 2731 | #define EQUAQ7 REGx(R0900_P1_EQUAQ7) |
2732 | #define F0900_P1_EQUA_ACCQ7 0xf47d01ff | ||
2679 | 2733 | ||
2680 | /*P1_EQUAI8*/ | 2734 | /*P1_EQUAI8*/ |
2681 | #define R0900_P1_EQUAI8 0xf47e | 2735 | #define R0900_P1_EQUAI8 0xf47e |
2682 | #define F0900_P1_EQUA_ACCI8 0xf47e01ff | 2736 | #define EQUAI8 REGx(R0900_P1_EQUAI8) |
2737 | #define F0900_P1_EQUA_ACCI8 0xf47e01ff | ||
2683 | 2738 | ||
2684 | /*P1_EQUAQ8*/ | 2739 | /*P1_EQUAQ8*/ |
2685 | #define R0900_P1_EQUAQ8 0xf47f | 2740 | #define R0900_P1_EQUAQ8 0xf47f |
2686 | #define F0900_P1_EQUA_ACCQ8 0xf47f01ff | 2741 | #define EQUAQ8 REGx(R0900_P1_EQUAQ8) |
2742 | #define F0900_P1_EQUA_ACCQ8 0xf47f01ff | ||
2687 | 2743 | ||
2688 | /*P1_NNOSDATAT1*/ | 2744 | /*P1_NNOSDATAT1*/ |
2689 | #define R0900_P1_NNOSDATAT1 0xf480 | 2745 | #define R0900_P1_NNOSDATAT1 0xf480 |
2690 | #define F0900_P1_NOSDATAT_NORMED1 0xf48000ff | 2746 | #define NNOSDATAT1 REGx(R0900_P1_NNOSDATAT1) |
2747 | #define F0900_P1_NOSDATAT_NORMED1 0xf48000ff | ||
2748 | #define NOSDATAT_NORMED1 FLDx(F0900_P1_NOSDATAT_NORMED1) | ||
2691 | 2749 | ||
2692 | /*P1_NNOSDATAT0*/ | 2750 | /*P1_NNOSDATAT0*/ |
2693 | #define R0900_P1_NNOSDATAT0 0xf481 | 2751 | #define R0900_P1_NNOSDATAT0 0xf481 |
2694 | #define F0900_P1_NOSDATAT_NORMED0 0xf48100ff | 2752 | #define NNOSDATAT0 REGx(R0900_P1_NNOSDATAT0) |
2753 | #define F0900_P1_NOSDATAT_NORMED0 0xf48100ff | ||
2754 | #define NOSDATAT_NORMED0 FLDx(F0900_P1_NOSDATAT_NORMED0) | ||
2695 | 2755 | ||
2696 | /*P1_NNOSDATA1*/ | 2756 | /*P1_NNOSDATA1*/ |
2697 | #define R0900_P1_NNOSDATA1 0xf482 | 2757 | #define R0900_P1_NNOSDATA1 0xf482 |
2698 | #define F0900_P1_NOSDATA_NORMED1 0xf48200ff | 2758 | #define NNOSDATA1 REGx(R0900_P1_NNOSDATA1) |
2759 | #define F0900_P1_NOSDATA_NORMED1 0xf48200ff | ||
2699 | 2760 | ||
2700 | /*P1_NNOSDATA0*/ | 2761 | /*P1_NNOSDATA0*/ |
2701 | #define R0900_P1_NNOSDATA0 0xf483 | 2762 | #define R0900_P1_NNOSDATA0 0xf483 |
2702 | #define F0900_P1_NOSDATA_NORMED0 0xf48300ff | 2763 | #define NNOSDATA0 REGx(R0900_P1_NNOSDATA0) |
2764 | #define F0900_P1_NOSDATA_NORMED0 0xf48300ff | ||
2703 | 2765 | ||
2704 | /*P1_NNOSPLHT1*/ | 2766 | /*P1_NNOSPLHT1*/ |
2705 | #define R0900_P1_NNOSPLHT1 0xf484 | 2767 | #define R0900_P1_NNOSPLHT1 0xf484 |
2706 | #define F0900_P1_NOSPLHT_NORMED1 0xf48400ff | 2768 | #define NNOSPLHT1 REGx(R0900_P1_NNOSPLHT1) |
2769 | #define F0900_P1_NOSPLHT_NORMED1 0xf48400ff | ||
2770 | #define NOSPLHT_NORMED1 FLDx(F0900_P1_NOSPLHT_NORMED1) | ||
2707 | 2771 | ||
2708 | /*P1_NNOSPLHT0*/ | 2772 | /*P1_NNOSPLHT0*/ |
2709 | #define R0900_P1_NNOSPLHT0 0xf485 | 2773 | #define R0900_P1_NNOSPLHT0 0xf485 |
2710 | #define F0900_P1_NOSPLHT_NORMED0 0xf48500ff | 2774 | #define NNOSPLHT0 REGx(R0900_P1_NNOSPLHT0) |
2775 | #define F0900_P1_NOSPLHT_NORMED0 0xf48500ff | ||
2776 | #define NOSPLHT_NORMED0 FLDx(F0900_P1_NOSPLHT_NORMED0) | ||
2711 | 2777 | ||
2712 | /*P1_NNOSPLH1*/ | 2778 | /*P1_NNOSPLH1*/ |
2713 | #define R0900_P1_NNOSPLH1 0xf486 | 2779 | #define R0900_P1_NNOSPLH1 0xf486 |
2714 | #define F0900_P1_NOSPLH_NORMED1 0xf48600ff | 2780 | #define NNOSPLH1 REGx(R0900_P1_NNOSPLH1) |
2781 | #define F0900_P1_NOSPLH_NORMED1 0xf48600ff | ||
2715 | 2782 | ||
2716 | /*P1_NNOSPLH0*/ | 2783 | /*P1_NNOSPLH0*/ |
2717 | #define R0900_P1_NNOSPLH0 0xf487 | 2784 | #define R0900_P1_NNOSPLH0 0xf487 |
2718 | #define F0900_P1_NOSPLH_NORMED0 0xf48700ff | 2785 | #define NNOSPLH0 REGx(R0900_P1_NNOSPLH0) |
2786 | #define F0900_P1_NOSPLH_NORMED0 0xf48700ff | ||
2719 | 2787 | ||
2720 | /*P1_NOSDATAT1*/ | 2788 | /*P1_NOSDATAT1*/ |
2721 | #define R0900_P1_NOSDATAT1 0xf488 | 2789 | #define R0900_P1_NOSDATAT1 0xf488 |
2722 | #define F0900_P1_NOSDATAT_UNNORMED1 0xf48800ff | 2790 | #define NOSDATAT1 REGx(R0900_P1_NOSDATAT1) |
2791 | #define F0900_P1_NOSDATAT_UNNORMED1 0xf48800ff | ||
2723 | 2792 | ||
2724 | /*P1_NOSDATAT0*/ | 2793 | /*P1_NOSDATAT0*/ |
2725 | #define R0900_P1_NOSDATAT0 0xf489 | 2794 | #define R0900_P1_NOSDATAT0 0xf489 |
2726 | #define F0900_P1_NOSDATAT_UNNORMED0 0xf48900ff | 2795 | #define NOSDATAT0 REGx(R0900_P1_NOSDATAT0) |
2796 | #define F0900_P1_NOSDATAT_UNNORMED0 0xf48900ff | ||
2727 | 2797 | ||
2728 | /*P1_NOSDATA1*/ | 2798 | /*P1_NOSDATA1*/ |
2729 | #define R0900_P1_NOSDATA1 0xf48a | 2799 | #define R0900_P1_NOSDATA1 0xf48a |
2730 | #define F0900_P1_NOSDATA_UNNORMED1 0xf48a00ff | 2800 | #define NOSDATA1 REGx(R0900_P1_NOSDATA1) |
2801 | #define F0900_P1_NOSDATA_UNNORMED1 0xf48a00ff | ||
2731 | 2802 | ||
2732 | /*P1_NOSDATA0*/ | 2803 | /*P1_NOSDATA0*/ |
2733 | #define R0900_P1_NOSDATA0 0xf48b | 2804 | #define R0900_P1_NOSDATA0 0xf48b |
2734 | #define F0900_P1_NOSDATA_UNNORMED0 0xf48b00ff | 2805 | #define NOSDATA0 REGx(R0900_P1_NOSDATA0) |
2806 | #define F0900_P1_NOSDATA_UNNORMED0 0xf48b00ff | ||
2735 | 2807 | ||
2736 | /*P1_NOSPLHT1*/ | 2808 | /*P1_NOSPLHT1*/ |
2737 | #define R0900_P1_NOSPLHT1 0xf48c | 2809 | #define R0900_P1_NOSPLHT1 0xf48c |
2738 | #define F0900_P1_NOSPLHT_UNNORMED1 0xf48c00ff | 2810 | #define NOSPLHT1 REGx(R0900_P1_NOSPLHT1) |
2811 | #define F0900_P1_NOSPLHT_UNNORMED1 0xf48c00ff | ||
2739 | 2812 | ||
2740 | /*P1_NOSPLHT0*/ | 2813 | /*P1_NOSPLHT0*/ |
2741 | #define R0900_P1_NOSPLHT0 0xf48d | 2814 | #define R0900_P1_NOSPLHT0 0xf48d |
2742 | #define F0900_P1_NOSPLHT_UNNORMED0 0xf48d00ff | 2815 | #define NOSPLHT0 REGx(R0900_P1_NOSPLHT0) |
2816 | #define F0900_P1_NOSPLHT_UNNORMED0 0xf48d00ff | ||
2743 | 2817 | ||
2744 | /*P1_NOSPLH1*/ | 2818 | /*P1_NOSPLH1*/ |
2745 | #define R0900_P1_NOSPLH1 0xf48e | 2819 | #define R0900_P1_NOSPLH1 0xf48e |
2746 | #define F0900_P1_NOSPLH_UNNORMED1 0xf48e00ff | 2820 | #define NOSPLH1 REGx(R0900_P1_NOSPLH1) |
2821 | #define F0900_P1_NOSPLH_UNNORMED1 0xf48e00ff | ||
2747 | 2822 | ||
2748 | /*P1_NOSPLH0*/ | 2823 | /*P1_NOSPLH0*/ |
2749 | #define R0900_P1_NOSPLH0 0xf48f | 2824 | #define R0900_P1_NOSPLH0 0xf48f |
2750 | #define F0900_P1_NOSPLH_UNNORMED0 0xf48f00ff | 2825 | #define NOSPLH0 REGx(R0900_P1_NOSPLH0) |
2826 | #define F0900_P1_NOSPLH_UNNORMED0 0xf48f00ff | ||
2751 | 2827 | ||
2752 | /*P1_CAR2CFG*/ | 2828 | /*P1_CAR2CFG*/ |
2753 | #define R0900_P1_CAR2CFG 0xf490 | 2829 | #define R0900_P1_CAR2CFG 0xf490 |
2754 | #define F0900_P1_DESCRAMB_OFF 0xf4900080 | 2830 | #define CAR2CFG REGx(R0900_P1_CAR2CFG) |
2755 | #define F0900_P1_PN4_SELECT 0xf4900040 | 2831 | #define F0900_P1_CARRIER3_DISABLE 0xf4900040 |
2756 | #define F0900_P1_CFR2_STOPDVBS1 0xf4900020 | 2832 | #define F0900_P1_ROTA2ON 0xf4900004 |
2757 | #define F0900_P1_STOP_CFR2UPDATE 0xf4900010 | 2833 | #define F0900_P1_PH_DET_ALGO2 0xf4900003 |
2758 | #define F0900_P1_STOP_NCO2UPDATE 0xf4900008 | 2834 | |
2759 | #define F0900_P1_ROTA2ON 0xf4900004 | 2835 | /*P1_CFR2CFR1*/ |
2760 | #define F0900_P1_PH_DET_ALGO2 0xf4900003 | 2836 | #define R0900_P1_CFR2CFR1 0xf491 |
2761 | 2837 | #define CFR2CFR1 REGx(R0900_P1_CFR2CFR1) | |
2762 | /*P1_ACLC2*/ | 2838 | #define F0900_P1_CFR2TOCFR1_DVBS1 0xf49100c0 |
2763 | #define R0900_P1_ACLC2 0xf491 | 2839 | #define F0900_P1_EN_S2CAR2CENTER 0xf4910020 |
2764 | #define F0900_P1_CAR2_PUNCT_ADERAT 0xf4910040 | 2840 | #define F0900_P1_DIS_BCHERRCFR2 0xf4910010 |
2765 | #define F0900_P1_CAR2_ALPHA_MANT 0xf4910030 | 2841 | #define F0900_P1_CFR2TOCFR1_BETA 0xf4910007 |
2766 | #define F0900_P1_CAR2_ALPHA_EXP 0xf491000f | ||
2767 | |||
2768 | /*P1_BCLC2*/ | ||
2769 | #define R0900_P1_BCLC2 0xf492 | ||
2770 | #define F0900_P1_DVBS2_NIP 0xf4920080 | ||
2771 | #define F0900_P1_CAR2_PUNCT_BDERAT 0xf4920040 | ||
2772 | #define F0900_P1_CAR2_BETA_MANT 0xf4920030 | ||
2773 | #define F0900_P1_CAR2_BETA_EXP 0xf492000f | ||
2774 | 2842 | ||
2775 | /*P1_CFR22*/ | 2843 | /*P1_CFR22*/ |
2776 | #define R0900_P1_CFR22 0xf493 | 2844 | #define R0900_P1_CFR22 0xf493 |
2777 | #define F0900_P1_CAR2_FREQ2 0xf49301ff | 2845 | #define CFR22 REGx(R0900_P1_CFR22) |
2846 | #define F0900_P1_CAR2_FREQ2 0xf49301ff | ||
2778 | 2847 | ||
2779 | /*P1_CFR21*/ | 2848 | /*P1_CFR21*/ |
2780 | #define R0900_P1_CFR21 0xf494 | 2849 | #define R0900_P1_CFR21 0xf494 |
2781 | #define F0900_P1_CAR2_FREQ1 0xf49400ff | 2850 | #define CFR21 REGx(R0900_P1_CFR21) |
2851 | #define F0900_P1_CAR2_FREQ1 0xf49400ff | ||
2782 | 2852 | ||
2783 | /*P1_CFR20*/ | 2853 | /*P1_CFR20*/ |
2784 | #define R0900_P1_CFR20 0xf495 | 2854 | #define R0900_P1_CFR20 0xf495 |
2785 | #define F0900_P1_CAR2_FREQ0 0xf49500ff | 2855 | #define CFR20 REGx(R0900_P1_CFR20) |
2856 | #define F0900_P1_CAR2_FREQ0 0xf49500ff | ||
2786 | 2857 | ||
2787 | /*P1_ACLC2S2Q*/ | 2858 | /*P1_ACLC2S2Q*/ |
2788 | #define R0900_P1_ACLC2S2Q 0xf497 | 2859 | #define R0900_P1_ACLC2S2Q 0xf497 |
2789 | #define F0900_P1_ENAB_SPSKSYMB 0xf4970080 | 2860 | #define ACLC2S2Q REGx(R0900_P1_ACLC2S2Q) |
2790 | #define F0900_P1_CAR2S2_QADERAT 0xf4970040 | 2861 | #define F0900_P1_ENAB_SPSKSYMB 0xf4970080 |
2791 | #define F0900_P1_CAR2S2_Q_ALPH_M 0xf4970030 | 2862 | #define F0900_P1_CAR2S2_Q_ALPH_M 0xf4970030 |
2792 | #define F0900_P1_CAR2S2_Q_ALPH_E 0xf497000f | 2863 | #define F0900_P1_CAR2S2_Q_ALPH_E 0xf497000f |
2793 | 2864 | ||
2794 | /*P1_ACLC2S28*/ | 2865 | /*P1_ACLC2S28*/ |
2795 | #define R0900_P1_ACLC2S28 0xf498 | 2866 | #define R0900_P1_ACLC2S28 0xf498 |
2796 | #define F0900_P1_OLDI3Q_MODE 0xf4980080 | 2867 | #define ACLC2S28 REGx(R0900_P1_ACLC2S28) |
2797 | #define F0900_P1_CAR2S2_8ADERAT 0xf4980040 | 2868 | #define F0900_P1_OLDI3Q_MODE 0xf4980080 |
2798 | #define F0900_P1_CAR2S2_8_ALPH_M 0xf4980030 | 2869 | #define F0900_P1_CAR2S2_8_ALPH_M 0xf4980030 |
2799 | #define F0900_P1_CAR2S2_8_ALPH_E 0xf498000f | 2870 | #define F0900_P1_CAR2S2_8_ALPH_E 0xf498000f |
2800 | 2871 | ||
2801 | /*P1_ACLC2S216A*/ | 2872 | /*P1_ACLC2S216A*/ |
2802 | #define R0900_P1_ACLC2S216A 0xf499 | 2873 | #define R0900_P1_ACLC2S216A 0xf499 |
2803 | #define F0900_P1_CAR2S2_16ADERAT 0xf4990040 | 2874 | #define ACLC2S216A REGx(R0900_P1_ACLC2S216A) |
2804 | #define F0900_P1_CAR2S2_16A_ALPH_M 0xf4990030 | 2875 | #define F0900_P1_DIS_C3STOPA2 0xf4990080 |
2805 | #define F0900_P1_CAR2S2_16A_ALPH_E 0xf499000f | 2876 | #define F0900_P1_CAR2S2_16ADERAT 0xf4990040 |
2877 | #define F0900_P1_CAR2S2_16A_ALPH_M 0xf4990030 | ||
2878 | #define F0900_P1_CAR2S2_16A_ALPH_E 0xf499000f | ||
2806 | 2879 | ||
2807 | /*P1_ACLC2S232A*/ | 2880 | /*P1_ACLC2S232A*/ |
2808 | #define R0900_P1_ACLC2S232A 0xf49a | 2881 | #define R0900_P1_ACLC2S232A 0xf49a |
2809 | #define F0900_P1_CAR2S2_32ADERAT 0xf49a0040 | 2882 | #define ACLC2S232A REGx(R0900_P1_ACLC2S232A) |
2810 | #define F0900_P1_CAR2S2_32A_ALPH_M 0xf49a0030 | 2883 | #define F0900_P1_CAR2S2_32ADERAT 0xf49a0040 |
2811 | #define F0900_P1_CAR2S2_32A_ALPH_E 0xf49a000f | 2884 | #define F0900_P1_CAR2S2_32A_ALPH_M 0xf49a0030 |
2885 | #define F0900_P1_CAR2S2_32A_ALPH_E 0xf49a000f | ||
2812 | 2886 | ||
2813 | /*P1_BCLC2S2Q*/ | 2887 | /*P1_BCLC2S2Q*/ |
2814 | #define R0900_P1_BCLC2S2Q 0xf49c | 2888 | #define R0900_P1_BCLC2S2Q 0xf49c |
2815 | #define F0900_P1_DVBS2S2Q_NIP 0xf49c0080 | 2889 | #define BCLC2S2Q REGx(R0900_P1_BCLC2S2Q) |
2816 | #define F0900_P1_CAR2S2_QBDERAT 0xf49c0040 | 2890 | #define F0900_P1_CAR2S2_Q_BETA_M 0xf49c0030 |
2817 | #define F0900_P1_CAR2S2_Q_BETA_M 0xf49c0030 | 2891 | #define F0900_P1_CAR2S2_Q_BETA_E 0xf49c000f |
2818 | #define F0900_P1_CAR2S2_Q_BETA_E 0xf49c000f | ||
2819 | 2892 | ||
2820 | /*P1_BCLC2S28*/ | 2893 | /*P1_BCLC2S28*/ |
2821 | #define R0900_P1_BCLC2S28 0xf49d | 2894 | #define R0900_P1_BCLC2S28 0xf49d |
2822 | #define F0900_P1_DVBS2S28_NIP 0xf49d0080 | 2895 | #define BCLC2S28 REGx(R0900_P1_BCLC2S28) |
2823 | #define F0900_P1_CAR2S2_8BDERAT 0xf49d0040 | 2896 | #define F0900_P1_CAR2S2_8_BETA_M 0xf49d0030 |
2824 | #define F0900_P1_CAR2S2_8_BETA_M 0xf49d0030 | 2897 | #define F0900_P1_CAR2S2_8_BETA_E 0xf49d000f |
2825 | #define F0900_P1_CAR2S2_8_BETA_E 0xf49d000f | ||
2826 | 2898 | ||
2827 | /*P1_BCLC2S216A*/ | 2899 | /*P1_BCLC2S216A*/ |
2828 | #define R0900_P1_BCLC2S216A 0xf49e | 2900 | #define R0900_P1_BCLC2S216A 0xf49e |
2829 | #define F0900_P1_DVBS2S216A_NIP 0xf49e0080 | 2901 | #define BCLC2S216A REGx(R0900_P1_BCLC2S216A) |
2830 | #define F0900_P1_CAR2S2_16BDERAT 0xf49e0040 | ||
2831 | #define F0900_P1_CAR2S2_16A_BETA_M 0xf49e0030 | ||
2832 | #define F0900_P1_CAR2S2_16A_BETA_E 0xf49e000f | ||
2833 | 2902 | ||
2834 | /*P1_BCLC2S232A*/ | 2903 | /*P1_BCLC2S232A*/ |
2835 | #define R0900_P1_BCLC2S232A 0xf49f | 2904 | #define R0900_P1_BCLC2S232A 0xf49f |
2836 | #define F0900_P1_DVBS2S232A_NIP 0xf49f0080 | 2905 | #define BCLC2S232A REGx(R0900_P1_BCLC2S232A) |
2837 | #define F0900_P1_CAR2S2_32BDERAT 0xf49f0040 | ||
2838 | #define F0900_P1_CAR2S2_32A_BETA_M 0xf49f0030 | ||
2839 | #define F0900_P1_CAR2S2_32A_BETA_E 0xf49f000f | ||
2840 | 2906 | ||
2841 | /*P1_PLROOT2*/ | 2907 | /*P1_PLROOT2*/ |
2842 | #define R0900_P1_PLROOT2 0xf4ac | 2908 | #define R0900_P1_PLROOT2 0xf4ac |
2843 | #define F0900_P1_SHORTFR_DISABLE 0xf4ac0080 | 2909 | #define PLROOT2 REGx(R0900_P1_PLROOT2) |
2844 | #define F0900_P1_LONGFR_DISABLE 0xf4ac0040 | 2910 | #define F0900_P1_PLSCRAMB_MODE 0xf4ac000c |
2845 | #define F0900_P1_DUMMYPL_DISABLE 0xf4ac0020 | 2911 | #define F0900_P1_PLSCRAMB_ROOT2 0xf4ac0003 |
2846 | #define F0900_P1_SHORTFR_AVOID 0xf4ac0010 | ||
2847 | #define F0900_P1_PLSCRAMB_MODE 0xf4ac000c | ||
2848 | #define F0900_P1_PLSCRAMB_ROOT2 0xf4ac0003 | ||
2849 | 2912 | ||
2850 | /*P1_PLROOT1*/ | 2913 | /*P1_PLROOT1*/ |
2851 | #define R0900_P1_PLROOT1 0xf4ad | 2914 | #define R0900_P1_PLROOT1 0xf4ad |
2852 | #define F0900_P1_PLSCRAMB_ROOT1 0xf4ad00ff | 2915 | #define PLROOT1 REGx(R0900_P1_PLROOT1) |
2916 | #define F0900_P1_PLSCRAMB_ROOT1 0xf4ad00ff | ||
2853 | 2917 | ||
2854 | /*P1_PLROOT0*/ | 2918 | /*P1_PLROOT0*/ |
2855 | #define R0900_P1_PLROOT0 0xf4ae | 2919 | #define R0900_P1_PLROOT0 0xf4ae |
2856 | #define F0900_P1_PLSCRAMB_ROOT0 0xf4ae00ff | 2920 | #define PLROOT0 REGx(R0900_P1_PLROOT0) |
2921 | #define F0900_P1_PLSCRAMB_ROOT0 0xf4ae00ff | ||
2857 | 2922 | ||
2858 | /*P1_MODCODLST0*/ | 2923 | /*P1_MODCODLST0*/ |
2859 | #define R0900_P1_MODCODLST0 0xf4b0 | 2924 | #define R0900_P1_MODCODLST0 0xf4b0 |
2860 | #define F0900_P1_EN_TOKEN31 0xf4b00080 | 2925 | #define MODCODLST0 REGx(R0900_P1_MODCODLST0) |
2861 | #define F0900_P1_SYNCTAG_SELECT 0xf4b00040 | ||
2862 | #define F0900_P1_MODCODRQ_MODE 0xf4b00030 | ||
2863 | 2926 | ||
2864 | /*P1_MODCODLST1*/ | 2927 | /*P1_MODCODLST1*/ |
2865 | #define R0900_P1_MODCODLST1 0xf4b1 | 2928 | #define R0900_P1_MODCODLST1 0xf4b1 |
2866 | #define F0900_P1_DIS_MODCOD29 0xf4b100f0 | 2929 | #define MODCODLST1 REGx(R0900_P1_MODCODLST1) |
2867 | #define F0900_P1_DIS_32PSK_9_10 0xf4b1000f | 2930 | #define F0900_P1_DIS_MODCOD29 0xf4b100f0 |
2931 | #define F0900_P1_DIS_32PSK_9_10 0xf4b1000f | ||
2868 | 2932 | ||
2869 | /*P1_MODCODLST2*/ | 2933 | /*P1_MODCODLST2*/ |
2870 | #define R0900_P1_MODCODLST2 0xf4b2 | 2934 | #define R0900_P1_MODCODLST2 0xf4b2 |
2871 | #define F0900_P1_DIS_32PSK_8_9 0xf4b200f0 | 2935 | #define MODCODLST2 REGx(R0900_P1_MODCODLST2) |
2872 | #define F0900_P1_DIS_32PSK_5_6 0xf4b2000f | 2936 | #define F0900_P1_DIS_32PSK_8_9 0xf4b200f0 |
2937 | #define F0900_P1_DIS_32PSK_5_6 0xf4b2000f | ||
2873 | 2938 | ||
2874 | /*P1_MODCODLST3*/ | 2939 | /*P1_MODCODLST3*/ |
2875 | #define R0900_P1_MODCODLST3 0xf4b3 | 2940 | #define R0900_P1_MODCODLST3 0xf4b3 |
2876 | #define F0900_P1_DIS_32PSK_4_5 0xf4b300f0 | 2941 | #define MODCODLST3 REGx(R0900_P1_MODCODLST3) |
2877 | #define F0900_P1_DIS_32PSK_3_4 0xf4b3000f | 2942 | #define F0900_P1_DIS_32PSK_4_5 0xf4b300f0 |
2943 | #define F0900_P1_DIS_32PSK_3_4 0xf4b3000f | ||
2878 | 2944 | ||
2879 | /*P1_MODCODLST4*/ | 2945 | /*P1_MODCODLST4*/ |
2880 | #define R0900_P1_MODCODLST4 0xf4b4 | 2946 | #define R0900_P1_MODCODLST4 0xf4b4 |
2881 | #define F0900_P1_DIS_16PSK_9_10 0xf4b400f0 | 2947 | #define MODCODLST4 REGx(R0900_P1_MODCODLST4) |
2882 | #define F0900_P1_DIS_16PSK_8_9 0xf4b4000f | 2948 | #define F0900_P1_DIS_16PSK_9_10 0xf4b400f0 |
2949 | #define F0900_P1_DIS_16PSK_8_9 0xf4b4000f | ||
2883 | 2950 | ||
2884 | /*P1_MODCODLST5*/ | 2951 | /*P1_MODCODLST5*/ |
2885 | #define R0900_P1_MODCODLST5 0xf4b5 | 2952 | #define R0900_P1_MODCODLST5 0xf4b5 |
2886 | #define F0900_P1_DIS_16PSK_5_6 0xf4b500f0 | 2953 | #define MODCODLST5 REGx(R0900_P1_MODCODLST5) |
2887 | #define F0900_P1_DIS_16PSK_4_5 0xf4b5000f | 2954 | #define F0900_P1_DIS_16PSK_5_6 0xf4b500f0 |
2955 | #define F0900_P1_DIS_16PSK_4_5 0xf4b5000f | ||
2888 | 2956 | ||
2889 | /*P1_MODCODLST6*/ | 2957 | /*P1_MODCODLST6*/ |
2890 | #define R0900_P1_MODCODLST6 0xf4b6 | 2958 | #define R0900_P1_MODCODLST6 0xf4b6 |
2891 | #define F0900_P1_DIS_16PSK_3_4 0xf4b600f0 | 2959 | #define MODCODLST6 REGx(R0900_P1_MODCODLST6) |
2892 | #define F0900_P1_DIS_16PSK_2_3 0xf4b6000f | 2960 | #define F0900_P1_DIS_16PSK_3_4 0xf4b600f0 |
2961 | #define F0900_P1_DIS_16PSK_2_3 0xf4b6000f | ||
2893 | 2962 | ||
2894 | /*P1_MODCODLST7*/ | 2963 | /*P1_MODCODLST7*/ |
2895 | #define R0900_P1_MODCODLST7 0xf4b7 | 2964 | #define R0900_P1_MODCODLST7 0xf4b7 |
2896 | #define F0900_P1_DIS_8P_9_10 0xf4b700f0 | 2965 | #define MODCODLST7 REGx(R0900_P1_MODCODLST7) |
2897 | #define F0900_P1_DIS_8P_8_9 0xf4b7000f | 2966 | #define F0900_P1_DIS_8P_9_10 0xf4b700f0 |
2967 | #define F0900_P1_DIS_8P_8_9 0xf4b7000f | ||
2898 | 2968 | ||
2899 | /*P1_MODCODLST8*/ | 2969 | /*P1_MODCODLST8*/ |
2900 | #define R0900_P1_MODCODLST8 0xf4b8 | 2970 | #define R0900_P1_MODCODLST8 0xf4b8 |
2901 | #define F0900_P1_DIS_8P_5_6 0xf4b800f0 | 2971 | #define MODCODLST8 REGx(R0900_P1_MODCODLST8) |
2902 | #define F0900_P1_DIS_8P_3_4 0xf4b8000f | 2972 | #define F0900_P1_DIS_8P_5_6 0xf4b800f0 |
2973 | #define F0900_P1_DIS_8P_3_4 0xf4b8000f | ||
2903 | 2974 | ||
2904 | /*P1_MODCODLST9*/ | 2975 | /*P1_MODCODLST9*/ |
2905 | #define R0900_P1_MODCODLST9 0xf4b9 | 2976 | #define R0900_P1_MODCODLST9 0xf4b9 |
2906 | #define F0900_P1_DIS_8P_2_3 0xf4b900f0 | 2977 | #define MODCODLST9 REGx(R0900_P1_MODCODLST9) |
2907 | #define F0900_P1_DIS_8P_3_5 0xf4b9000f | 2978 | #define F0900_P1_DIS_8P_2_3 0xf4b900f0 |
2979 | #define F0900_P1_DIS_8P_3_5 0xf4b9000f | ||
2908 | 2980 | ||
2909 | /*P1_MODCODLSTA*/ | 2981 | /*P1_MODCODLSTA*/ |
2910 | #define R0900_P1_MODCODLSTA 0xf4ba | 2982 | #define R0900_P1_MODCODLSTA 0xf4ba |
2911 | #define F0900_P1_DIS_QP_9_10 0xf4ba00f0 | 2983 | #define MODCODLSTA REGx(R0900_P1_MODCODLSTA) |
2912 | #define F0900_P1_DIS_QP_8_9 0xf4ba000f | 2984 | #define F0900_P1_DIS_QP_9_10 0xf4ba00f0 |
2985 | #define F0900_P1_DIS_QP_8_9 0xf4ba000f | ||
2913 | 2986 | ||
2914 | /*P1_MODCODLSTB*/ | 2987 | /*P1_MODCODLSTB*/ |
2915 | #define R0900_P1_MODCODLSTB 0xf4bb | 2988 | #define R0900_P1_MODCODLSTB 0xf4bb |
2916 | #define F0900_P1_DIS_QP_5_6 0xf4bb00f0 | 2989 | #define MODCODLSTB REGx(R0900_P1_MODCODLSTB) |
2917 | #define F0900_P1_DIS_QP_4_5 0xf4bb000f | 2990 | #define F0900_P1_DIS_QP_5_6 0xf4bb00f0 |
2991 | #define F0900_P1_DIS_QP_4_5 0xf4bb000f | ||
2918 | 2992 | ||
2919 | /*P1_MODCODLSTC*/ | 2993 | /*P1_MODCODLSTC*/ |
2920 | #define R0900_P1_MODCODLSTC 0xf4bc | 2994 | #define R0900_P1_MODCODLSTC 0xf4bc |
2921 | #define F0900_P1_DIS_QP_3_4 0xf4bc00f0 | 2995 | #define MODCODLSTC REGx(R0900_P1_MODCODLSTC) |
2922 | #define F0900_P1_DIS_QP_2_3 0xf4bc000f | 2996 | #define F0900_P1_DIS_QP_3_4 0xf4bc00f0 |
2997 | #define F0900_P1_DIS_QP_2_3 0xf4bc000f | ||
2923 | 2998 | ||
2924 | /*P1_MODCODLSTD*/ | 2999 | /*P1_MODCODLSTD*/ |
2925 | #define R0900_P1_MODCODLSTD 0xf4bd | 3000 | #define R0900_P1_MODCODLSTD 0xf4bd |
2926 | #define F0900_P1_DIS_QP_3_5 0xf4bd00f0 | 3001 | #define MODCODLSTD REGx(R0900_P1_MODCODLSTD) |
2927 | #define F0900_P1_DIS_QP_1_2 0xf4bd000f | 3002 | #define F0900_P1_DIS_QP_3_5 0xf4bd00f0 |
3003 | #define F0900_P1_DIS_QP_1_2 0xf4bd000f | ||
2928 | 3004 | ||
2929 | /*P1_MODCODLSTE*/ | 3005 | /*P1_MODCODLSTE*/ |
2930 | #define R0900_P1_MODCODLSTE 0xf4be | 3006 | #define R0900_P1_MODCODLSTE 0xf4be |
2931 | #define F0900_P1_DIS_QP_2_5 0xf4be00f0 | 3007 | #define MODCODLSTE REGx(R0900_P1_MODCODLSTE) |
2932 | #define F0900_P1_DIS_QP_1_3 0xf4be000f | 3008 | #define F0900_P1_DIS_QP_2_5 0xf4be00f0 |
3009 | #define F0900_P1_DIS_QP_1_3 0xf4be000f | ||
2933 | 3010 | ||
2934 | /*P1_MODCODLSTF*/ | 3011 | /*P1_MODCODLSTF*/ |
2935 | #define R0900_P1_MODCODLSTF 0xf4bf | 3012 | #define R0900_P1_MODCODLSTF 0xf4bf |
2936 | #define F0900_P1_DIS_QP_1_4 0xf4bf00f0 | 3013 | #define MODCODLSTF REGx(R0900_P1_MODCODLSTF) |
2937 | #define F0900_P1_DDEMOD_SET 0xf4bf0002 | 3014 | #define F0900_P1_DIS_QP_1_4 0xf4bf00f0 |
2938 | #define F0900_P1_DDEMOD_MASK 0xf4bf0001 | 3015 | |
3016 | /*P1_GAUSSR0*/ | ||
3017 | #define R0900_P1_GAUSSR0 0xf4c0 | ||
3018 | #define GAUSSR0 REGx(R0900_P1_GAUSSR0) | ||
3019 | #define F0900_P1_EN_CCIMODE 0xf4c00080 | ||
3020 | #define F0900_P1_R0_GAUSSIEN 0xf4c0007f | ||
3021 | |||
3022 | /*P1_CCIR0*/ | ||
3023 | #define R0900_P1_CCIR0 0xf4c1 | ||
3024 | #define CCIR0 REGx(R0900_P1_CCIR0) | ||
3025 | #define F0900_P1_CCIDETECT_PLHONLY 0xf4c10080 | ||
3026 | #define F0900_P1_R0_CCI 0xf4c1007f | ||
3027 | |||
3028 | /*P1_CCIQUANT*/ | ||
3029 | #define R0900_P1_CCIQUANT 0xf4c2 | ||
3030 | #define CCIQUANT REGx(R0900_P1_CCIQUANT) | ||
3031 | #define F0900_P1_CCI_BETA 0xf4c200e0 | ||
3032 | #define F0900_P1_CCI_QUANT 0xf4c2001f | ||
3033 | |||
3034 | /*P1_CCITHRES*/ | ||
3035 | #define R0900_P1_CCITHRES 0xf4c3 | ||
3036 | #define CCITHRES REGx(R0900_P1_CCITHRES) | ||
3037 | #define F0900_P1_CCI_THRESHOLD 0xf4c300ff | ||
3038 | |||
3039 | /*P1_CCIACC*/ | ||
3040 | #define R0900_P1_CCIACC 0xf4c4 | ||
3041 | #define CCIACC REGx(R0900_P1_CCIACC) | ||
3042 | #define F0900_P1_CCI_VALUE 0xf4c400ff | ||
2939 | 3043 | ||
2940 | /*P1_DMDRESCFG*/ | 3044 | /*P1_DMDRESCFG*/ |
2941 | #define R0900_P1_DMDRESCFG 0xf4c6 | 3045 | #define R0900_P1_DMDRESCFG 0xf4c6 |
2942 | #define F0900_P1_DMDRES_RESET 0xf4c60080 | 3046 | #define DMDRESCFG REGx(R0900_P1_DMDRESCFG) |
2943 | #define F0900_P1_DMDRES_NOISESQR 0xf4c60010 | 3047 | #define F0900_P1_DMDRES_RESET 0xf4c60080 |
2944 | #define F0900_P1_DMDRES_STRALL 0xf4c60008 | 3048 | #define F0900_P1_DMDRES_STRALL 0xf4c60008 |
2945 | #define F0900_P1_DMDRES_NEWONLY 0xf4c60004 | 3049 | #define F0900_P1_DMDRES_NEWONLY 0xf4c60004 |
2946 | #define F0900_P1_DMDRES_NOSTORE 0xf4c60002 | 3050 | #define F0900_P1_DMDRES_NOSTORE 0xf4c60002 |
2947 | #define F0900_P1_DMDRES_AGC2MEM 0xf4c60001 | ||
2948 | 3051 | ||
2949 | /*P1_DMDRESADR*/ | 3052 | /*P1_DMDRESADR*/ |
2950 | #define R0900_P1_DMDRESADR 0xf4c7 | 3053 | #define R0900_P1_DMDRESADR 0xf4c7 |
2951 | #define F0900_P1_SUSP_PREDCANAL 0xf4c70080 | 3054 | #define DMDRESADR REGx(R0900_P1_DMDRESADR) |
2952 | #define F0900_P1_DMDRES_VALIDCFR 0xf4c70040 | 3055 | #define F0900_P1_DMDRES_VALIDCFR 0xf4c70040 |
2953 | #define F0900_P1_DMDRES_MEMFULL 0xf4c70030 | 3056 | #define F0900_P1_DMDRES_MEMFULL 0xf4c70030 |
2954 | #define F0900_P1_DMDRES_RESNBR 0xf4c7000f | 3057 | #define F0900_P1_DMDRES_RESNBR 0xf4c7000f |
2955 | 3058 | ||
2956 | /*P1_DMDRESDATA7*/ | 3059 | /*P1_DMDRESDATA7*/ |
2957 | #define R0900_P1_DMDRESDATA7 0xf4c8 | 3060 | #define R0900_P1_DMDRESDATA7 0xf4c8 |
2958 | #define F0900_P1_DMDRES_DATA7 0xf4c800ff | 3061 | #define F0900_P1_DMDRES_DATA7 0xf4c800ff |
2959 | 3062 | ||
2960 | /*P1_DMDRESDATA6*/ | 3063 | /*P1_DMDRESDATA6*/ |
2961 | #define R0900_P1_DMDRESDATA6 0xf4c9 | 3064 | #define R0900_P1_DMDRESDATA6 0xf4c9 |
2962 | #define F0900_P1_DMDRES_DATA6 0xf4c900ff | 3065 | #define F0900_P1_DMDRES_DATA6 0xf4c900ff |
2963 | 3066 | ||
2964 | /*P1_DMDRESDATA5*/ | 3067 | /*P1_DMDRESDATA5*/ |
2965 | #define R0900_P1_DMDRESDATA5 0xf4ca | 3068 | #define R0900_P1_DMDRESDATA5 0xf4ca |
2966 | #define F0900_P1_DMDRES_DATA5 0xf4ca00ff | 3069 | #define F0900_P1_DMDRES_DATA5 0xf4ca00ff |
2967 | 3070 | ||
2968 | /*P1_DMDRESDATA4*/ | 3071 | /*P1_DMDRESDATA4*/ |
2969 | #define R0900_P1_DMDRESDATA4 0xf4cb | 3072 | #define R0900_P1_DMDRESDATA4 0xf4cb |
2970 | #define F0900_P1_DMDRES_DATA4 0xf4cb00ff | 3073 | #define F0900_P1_DMDRES_DATA4 0xf4cb00ff |
2971 | 3074 | ||
2972 | /*P1_DMDRESDATA3*/ | 3075 | /*P1_DMDRESDATA3*/ |
2973 | #define R0900_P1_DMDRESDATA3 0xf4cc | 3076 | #define R0900_P1_DMDRESDATA3 0xf4cc |
2974 | #define F0900_P1_DMDRES_DATA3 0xf4cc00ff | 3077 | #define F0900_P1_DMDRES_DATA3 0xf4cc00ff |
2975 | 3078 | ||
2976 | /*P1_DMDRESDATA2*/ | 3079 | /*P1_DMDRESDATA2*/ |
2977 | #define R0900_P1_DMDRESDATA2 0xf4cd | 3080 | #define R0900_P1_DMDRESDATA2 0xf4cd |
2978 | #define F0900_P1_DMDRES_DATA2 0xf4cd00ff | 3081 | #define F0900_P1_DMDRES_DATA2 0xf4cd00ff |
2979 | 3082 | ||
2980 | /*P1_DMDRESDATA1*/ | 3083 | /*P1_DMDRESDATA1*/ |
2981 | #define R0900_P1_DMDRESDATA1 0xf4ce | 3084 | #define R0900_P1_DMDRESDATA1 0xf4ce |
2982 | #define F0900_P1_DMDRES_DATA1 0xf4ce00ff | 3085 | #define F0900_P1_DMDRES_DATA1 0xf4ce00ff |
2983 | 3086 | ||
2984 | /*P1_DMDRESDATA0*/ | 3087 | /*P1_DMDRESDATA0*/ |
2985 | #define R0900_P1_DMDRESDATA0 0xf4cf | 3088 | #define R0900_P1_DMDRESDATA0 0xf4cf |
2986 | #define F0900_P1_DMDRES_DATA0 0xf4cf00ff | 3089 | #define F0900_P1_DMDRES_DATA0 0xf4cf00ff |
2987 | 3090 | ||
2988 | /*P1_FFEI1*/ | 3091 | /*P1_FFEI1*/ |
2989 | #define R0900_P1_FFEI1 0xf4d0 | 3092 | #define R0900_P1_FFEI1 0xf4d0 |
2990 | #define F0900_P1_FFE_ACCI1 0xf4d001ff | 3093 | #define FFEI1 REGx(R0900_P1_FFEI1) |
3094 | #define F0900_P1_FFE_ACCI1 0xf4d001ff | ||
2991 | 3095 | ||
2992 | /*P1_FFEQ1*/ | 3096 | /*P1_FFEQ1*/ |
2993 | #define R0900_P1_FFEQ1 0xf4d1 | 3097 | #define R0900_P1_FFEQ1 0xf4d1 |
2994 | #define F0900_P1_FFE_ACCQ1 0xf4d101ff | 3098 | #define FFEQ1 REGx(R0900_P1_FFEQ1) |
3099 | #define F0900_P1_FFE_ACCQ1 0xf4d101ff | ||
2995 | 3100 | ||
2996 | /*P1_FFEI2*/ | 3101 | /*P1_FFEI2*/ |
2997 | #define R0900_P1_FFEI2 0xf4d2 | 3102 | #define R0900_P1_FFEI2 0xf4d2 |
2998 | #define F0900_P1_FFE_ACCI2 0xf4d201ff | 3103 | #define FFEI2 REGx(R0900_P1_FFEI2) |
3104 | #define F0900_P1_FFE_ACCI2 0xf4d201ff | ||
2999 | 3105 | ||
3000 | /*P1_FFEQ2*/ | 3106 | /*P1_FFEQ2*/ |
3001 | #define R0900_P1_FFEQ2 0xf4d3 | 3107 | #define R0900_P1_FFEQ2 0xf4d3 |
3002 | #define F0900_P1_FFE_ACCQ2 0xf4d301ff | 3108 | #define FFEQ2 REGx(R0900_P1_FFEQ2) |
3109 | #define F0900_P1_FFE_ACCQ2 0xf4d301ff | ||
3003 | 3110 | ||
3004 | /*P1_FFEI3*/ | 3111 | /*P1_FFEI3*/ |
3005 | #define R0900_P1_FFEI3 0xf4d4 | 3112 | #define R0900_P1_FFEI3 0xf4d4 |
3006 | #define F0900_P1_FFE_ACCI3 0xf4d401ff | 3113 | #define FFEI3 REGx(R0900_P1_FFEI3) |
3114 | #define F0900_P1_FFE_ACCI3 0xf4d401ff | ||
3007 | 3115 | ||
3008 | /*P1_FFEQ3*/ | 3116 | /*P1_FFEQ3*/ |
3009 | #define R0900_P1_FFEQ3 0xf4d5 | 3117 | #define R0900_P1_FFEQ3 0xf4d5 |
3010 | #define F0900_P1_FFE_ACCQ3 0xf4d501ff | 3118 | #define FFEQ3 REGx(R0900_P1_FFEQ3) |
3119 | #define F0900_P1_FFE_ACCQ3 0xf4d501ff | ||
3011 | 3120 | ||
3012 | /*P1_FFEI4*/ | 3121 | /*P1_FFEI4*/ |
3013 | #define R0900_P1_FFEI4 0xf4d6 | 3122 | #define R0900_P1_FFEI4 0xf4d6 |
3014 | #define F0900_P1_FFE_ACCI4 0xf4d601ff | 3123 | #define FFEI4 REGx(R0900_P1_FFEI4) |
3124 | #define F0900_P1_FFE_ACCI4 0xf4d601ff | ||
3015 | 3125 | ||
3016 | /*P1_FFEQ4*/ | 3126 | /*P1_FFEQ4*/ |
3017 | #define R0900_P1_FFEQ4 0xf4d7 | 3127 | #define R0900_P1_FFEQ4 0xf4d7 |
3018 | #define F0900_P1_FFE_ACCQ4 0xf4d701ff | 3128 | #define FFEQ4 REGx(R0900_P1_FFEQ4) |
3129 | #define F0900_P1_FFE_ACCQ4 0xf4d701ff | ||
3019 | 3130 | ||
3020 | /*P1_FFECFG*/ | 3131 | /*P1_FFECFG*/ |
3021 | #define R0900_P1_FFECFG 0xf4d8 | 3132 | #define R0900_P1_FFECFG 0xf4d8 |
3022 | #define F0900_P1_EQUALFFE_ON 0xf4d80040 | 3133 | #define FFECFG REGx(R0900_P1_FFECFG) |
3023 | #define F0900_P1_EQUAL_USEDSYMB 0xf4d80030 | 3134 | #define F0900_P1_EQUALFFE_ON 0xf4d80040 |
3024 | #define F0900_P1_MU_EQUALFFE 0xf4d80007 | 3135 | #define F0900_P1_MU_EQUALFFE 0xf4d80007 |
3025 | 3136 | ||
3026 | /*P1_TNRCFG*/ | 3137 | /*P1_TNRCFG*/ |
3027 | #define R0900_P1_TNRCFG 0xf4e0 | 3138 | #define R0900_P1_TNRCFG 0xf4e0 |
3028 | #define F0900_P1_TUN_ACKFAIL 0xf4e00080 | 3139 | #define TNRCFG REGx(R0900_P1_TNRCFG) |
3029 | #define F0900_P1_TUN_TYPE 0xf4e00070 | 3140 | #define F0900_P1_TUN_ACKFAIL 0xf4e00080 |
3030 | #define F0900_P1_TUN_SECSTOP 0xf4e00008 | 3141 | #define F0900_P1_TUN_TYPE 0xf4e00070 |
3031 | #define F0900_P1_TUN_VCOSRCH 0xf4e00004 | 3142 | #define F0900_P1_TUN_SECSTOP 0xf4e00008 |
3032 | #define F0900_P1_TUN_MADDRESS 0xf4e00003 | 3143 | #define F0900_P1_TUN_VCOSRCH 0xf4e00004 |
3144 | #define F0900_P1_TUN_MADDRESS 0xf4e00003 | ||
3033 | 3145 | ||
3034 | /*P1_TNRCFG2*/ | 3146 | /*P1_TNRCFG2*/ |
3035 | #define R0900_P1_TNRCFG2 0xf4e1 | 3147 | #define R0900_P1_TNRCFG2 0xf4e1 |
3036 | #define F0900_P1_TUN_IQSWAP 0xf4e10080 | 3148 | #define TNRCFG2 REGx(R0900_P1_TNRCFG2) |
3037 | #define F0900_P1_STB6110_STEP2MHZ 0xf4e10040 | 3149 | #define F0900_P1_TUN_IQSWAP 0xf4e10080 |
3038 | #define F0900_P1_STB6120_DBLI2C 0xf4e10020 | 3150 | #define F0900_P1_DIS_BWCALC 0xf4e10004 |
3039 | #define F0900_P1_DIS_FCCK 0xf4e10010 | 3151 | #define F0900_P1_SHORT_WAITSTATES 0xf4e10002 |
3040 | #define F0900_P1_DIS_LPEN 0xf4e10008 | ||
3041 | #define F0900_P1_DIS_BWCALC 0xf4e10004 | ||
3042 | #define F0900_P1_SHORT_WAITSTATES 0xf4e10002 | ||
3043 | #define F0900_P1_DIS_2BWAGC1 0xf4e10001 | ||
3044 | 3152 | ||
3045 | /*P1_TNRXTAL*/ | 3153 | /*P1_TNRXTAL*/ |
3046 | #define R0900_P1_TNRXTAL 0xf4e4 | 3154 | #define R0900_P1_TNRXTAL 0xf4e4 |
3047 | #define F0900_P1_TUN_MCLKDECIMAL 0xf4e400e0 | 3155 | #define TNRXTAL REGx(R0900_P1_TNRXTAL) |
3048 | #define F0900_P1_TUN_XTALFREQ 0xf4e4001f | 3156 | #define F0900_P1_TUN_XTALFREQ 0xf4e4001f |
3049 | 3157 | ||
3050 | /*P1_TNRSTEPS*/ | 3158 | /*P1_TNRSTEPS*/ |
3051 | #define R0900_P1_TNRSTEPS 0xf4e7 | 3159 | #define R0900_P1_TNRSTEPS 0xf4e7 |
3052 | #define F0900_P1_TUNER_BW1P6 0xf4e70080 | 3160 | #define TNRSTEPS REGx(R0900_P1_TNRSTEPS) |
3053 | #define F0900_P1_BWINC_OFFSET 0xf4e70070 | 3161 | #define F0900_P1_TUNER_BW0P125 0xf4e70080 |
3054 | #define F0900_P1_SOFTSTEP_RNG 0xf4e70008 | 3162 | #define F0900_P1_BWINC_OFFSET 0xf4e70170 |
3055 | #define F0900_P1_TUN_BWOFFSET 0xf4e70107 | 3163 | #define F0900_P1_SOFTSTEP_RNG 0xf4e70008 |
3164 | #define F0900_P1_TUN_BWOFFSET 0xf4e70007 | ||
3056 | 3165 | ||
3057 | /*P1_TNRGAIN*/ | 3166 | /*P1_TNRGAIN*/ |
3058 | #define R0900_P1_TNRGAIN 0xf4e8 | 3167 | #define R0900_P1_TNRGAIN 0xf4e8 |
3059 | #define F0900_P1_TUN_KDIVEN 0xf4e800c0 | 3168 | #define TNRGAIN REGx(R0900_P1_TNRGAIN) |
3060 | #define F0900_P1_STB6X00_OCK 0xf4e80030 | 3169 | #define F0900_P1_TUN_KDIVEN 0xf4e800c0 |
3061 | #define F0900_P1_TUN_GAIN 0xf4e8000f | 3170 | #define F0900_P1_STB6X00_OCK 0xf4e80030 |
3171 | #define F0900_P1_TUN_GAIN 0xf4e8000f | ||
3062 | 3172 | ||
3063 | /*P1_TNRRF1*/ | 3173 | /*P1_TNRRF1*/ |
3064 | #define R0900_P1_TNRRF1 0xf4e9 | 3174 | #define R0900_P1_TNRRF1 0xf4e9 |
3065 | #define F0900_P1_TUN_RFFREQ2 0xf4e900ff | 3175 | #define TNRRF1 REGx(R0900_P1_TNRRF1) |
3176 | #define F0900_P1_TUN_RFFREQ2 0xf4e900ff | ||
3177 | #define TUN_RFFREQ2 FLDx(F0900_P1_TUN_RFFREQ2) | ||
3066 | 3178 | ||
3067 | /*P1_TNRRF0*/ | 3179 | /*P1_TNRRF0*/ |
3068 | #define R0900_P1_TNRRF0 0xf4ea | 3180 | #define R0900_P1_TNRRF0 0xf4ea |
3069 | #define F0900_P1_TUN_RFFREQ1 0xf4ea00ff | 3181 | #define TNRRF0 REGx(R0900_P1_TNRRF0) |
3182 | #define F0900_P1_TUN_RFFREQ1 0xf4ea00ff | ||
3183 | #define TUN_RFFREQ1 FLDx(F0900_P1_TUN_RFFREQ1) | ||
3070 | 3184 | ||
3071 | /*P1_TNRBW*/ | 3185 | /*P1_TNRBW*/ |
3072 | #define R0900_P1_TNRBW 0xf4eb | 3186 | #define R0900_P1_TNRBW 0xf4eb |
3073 | #define F0900_P1_TUN_RFFREQ0 0xf4eb00c0 | 3187 | #define TNRBW REGx(R0900_P1_TNRBW) |
3074 | #define F0900_P1_TUN_BW 0xf4eb003f | 3188 | #define F0900_P1_TUN_RFFREQ0 0xf4eb00c0 |
3189 | #define TUN_RFFREQ0 FLDx(F0900_P1_TUN_RFFREQ0) | ||
3190 | #define F0900_P1_TUN_BW 0xf4eb003f | ||
3191 | #define TUN_BW FLDx(F0900_P1_TUN_BW) | ||
3075 | 3192 | ||
3076 | /*P1_TNRADJ*/ | 3193 | /*P1_TNRADJ*/ |
3077 | #define R0900_P1_TNRADJ 0xf4ec | 3194 | #define R0900_P1_TNRADJ 0xf4ec |
3078 | #define F0900_P1_STB61X0_RCLK 0xf4ec0080 | 3195 | #define TNRADJ REGx(R0900_P1_TNRADJ) |
3079 | #define F0900_P1_STB61X0_CALTIME 0xf4ec0040 | 3196 | #define F0900_P1_STB61X0_CALTIME 0xf4ec0040 |
3080 | #define F0900_P1_STB6X00_DLB 0xf4ec0038 | ||
3081 | #define F0900_P1_STB6000_FCL 0xf4ec0007 | ||
3082 | 3197 | ||
3083 | /*P1_TNRCTL2*/ | 3198 | /*P1_TNRCTL2*/ |
3084 | #define R0900_P1_TNRCTL2 0xf4ed | 3199 | #define R0900_P1_TNRCTL2 0xf4ed |
3085 | #define F0900_P1_STB61X0_LCP1_RCCKOFF 0xf4ed0080 | 3200 | #define TNRCTL2 REGx(R0900_P1_TNRCTL2) |
3086 | #define F0900_P1_STB61X0_LCP0 0xf4ed0040 | 3201 | #define F0900_P1_STB61X0_RCCKOFF 0xf4ed0080 |
3087 | #define F0900_P1_STB61X0_XTOUT_RFOUTS 0xf4ed0020 | 3202 | #define F0900_P1_STB61X0_ICP_SDOFF 0xf4ed0040 |
3088 | #define F0900_P1_STB61X0_XTON_MCKDV 0xf4ed0010 | 3203 | #define F0900_P1_STB61X0_DCLOOPOFF 0xf4ed0020 |
3089 | #define F0900_P1_STB61X0_CALOFF_DCOFF 0xf4ed0008 | 3204 | #define F0900_P1_STB61X0_REFOUTSEL 0xf4ed0010 |
3090 | #define F0900_P1_STB6110_LPT 0xf4ed0004 | 3205 | #define F0900_P1_STB61X0_CALOFF 0xf4ed0008 |
3091 | #define F0900_P1_STB6110_RX 0xf4ed0002 | 3206 | #define F0900_P1_STB6XX0_LPT_BEN 0xf4ed0004 |
3092 | #define F0900_P1_STB6110_SYN 0xf4ed0001 | 3207 | #define F0900_P1_STB6XX0_RX_OSCP 0xf4ed0002 |
3208 | #define F0900_P1_STB6XX0_SYN 0xf4ed0001 | ||
3093 | 3209 | ||
3094 | /*P1_TNRCFG3*/ | 3210 | /*P1_TNRCFG3*/ |
3095 | #define R0900_P1_TNRCFG3 0xf4ee | 3211 | #define R0900_P1_TNRCFG3 0xf4ee |
3096 | #define F0900_P1_STB6120_DISCTRL1 0xf4ee0080 | 3212 | #define TNRCFG3 REGx(R0900_P1_TNRCFG3) |
3097 | #define F0900_P1_STB6120_INVORDER 0xf4ee0040 | 3213 | #define F0900_P1_TUN_PLLFREQ 0xf4ee001c |
3098 | #define F0900_P1_STB6120_ENCTRL6 0xf4ee0020 | 3214 | #define F0900_P1_TUN_I2CFREQ_MODE 0xf4ee0003 |
3099 | #define F0900_P1_TUN_PLLFREQ 0xf4ee001c | ||
3100 | #define F0900_P1_TUN_I2CFREQ_MODE 0xf4ee0003 | ||
3101 | 3215 | ||
3102 | /*P1_TNRLAUNCH*/ | 3216 | /*P1_TNRLAUNCH*/ |
3103 | #define R0900_P1_TNRLAUNCH 0xf4f0 | 3217 | #define R0900_P1_TNRLAUNCH 0xf4f0 |
3218 | #define TNRLAUNCH REGx(R0900_P1_TNRLAUNCH) | ||
3104 | 3219 | ||
3105 | /*P1_TNRLD*/ | 3220 | /*P1_TNRLD*/ |
3106 | #define R0900_P1_TNRLD 0xf4f0 | 3221 | #define R0900_P1_TNRLD 0xf4f0 |
3107 | #define F0900_P1_TUNLD_VCOING 0xf4f00080 | 3222 | #define TNRLD REGx(R0900_P1_TNRLD) |
3108 | #define F0900_P1_TUN_REG1FAIL 0xf4f00040 | 3223 | #define F0900_P1_TUNLD_VCOING 0xf4f00080 |
3109 | #define F0900_P1_TUN_REG2FAIL 0xf4f00020 | 3224 | #define F0900_P1_TUN_REG1FAIL 0xf4f00040 |
3110 | #define F0900_P1_TUN_REG3FAIL 0xf4f00010 | 3225 | #define F0900_P1_TUN_REG2FAIL 0xf4f00020 |
3111 | #define F0900_P1_TUN_REG4FAIL 0xf4f00008 | 3226 | #define F0900_P1_TUN_REG3FAIL 0xf4f00010 |
3112 | #define F0900_P1_TUN_REG5FAIL 0xf4f00004 | 3227 | #define F0900_P1_TUN_REG4FAIL 0xf4f00008 |
3113 | #define F0900_P1_TUN_BWING 0xf4f00002 | 3228 | #define F0900_P1_TUN_REG5FAIL 0xf4f00004 |
3114 | #define F0900_P1_TUN_LOCKED 0xf4f00001 | 3229 | #define F0900_P1_TUN_BWING 0xf4f00002 |
3230 | #define F0900_P1_TUN_LOCKED 0xf4f00001 | ||
3115 | 3231 | ||
3116 | /*P1_TNROBSL*/ | 3232 | /*P1_TNROBSL*/ |
3117 | #define R0900_P1_TNROBSL 0xf4f6 | 3233 | #define R0900_P1_TNROBSL 0xf4f6 |
3118 | #define F0900_P1_TUN_I2CABORTED 0xf4f60080 | 3234 | #define TNROBSL REGx(R0900_P1_TNROBSL) |
3119 | #define F0900_P1_TUN_LPEN 0xf4f60040 | 3235 | #define F0900_P1_TUN_I2CABORTED 0xf4f60080 |
3120 | #define F0900_P1_TUN_FCCK 0xf4f60020 | 3236 | #define F0900_P1_TUN_LPEN 0xf4f60040 |
3121 | #define F0900_P1_TUN_I2CLOCKED 0xf4f60010 | 3237 | #define F0900_P1_TUN_FCCK 0xf4f60020 |
3122 | #define F0900_P1_TUN_PROGDONE 0xf4f6000c | 3238 | #define F0900_P1_TUN_I2CLOCKED 0xf4f60010 |
3123 | #define F0900_P1_TUN_RFRESTE1 0xf4f60003 | 3239 | #define F0900_P1_TUN_PROGDONE 0xf4f6000c |
3240 | #define F0900_P1_TUN_RFRESTE1 0xf4f60003 | ||
3241 | #define TUN_RFRESTE1 FLDx(F0900_P1_TUN_RFRESTE1) | ||
3124 | 3242 | ||
3125 | /*P1_TNRRESTE*/ | 3243 | /*P1_TNRRESTE*/ |
3126 | #define R0900_P1_TNRRESTE 0xf4f7 | 3244 | #define R0900_P1_TNRRESTE 0xf4f7 |
3127 | #define F0900_P1_TUN_RFRESTE0 0xf4f700ff | 3245 | #define TNRRESTE REGx(R0900_P1_TNRRESTE) |
3246 | #define F0900_P1_TUN_RFRESTE0 0xf4f700ff | ||
3247 | #define TUN_RFRESTE0 FLDx(F0900_P1_TUN_RFRESTE0) | ||
3128 | 3248 | ||
3129 | /*P1_SMAPCOEF7*/ | 3249 | /*P1_SMAPCOEF7*/ |
3130 | #define R0900_P1_SMAPCOEF7 0xf500 | 3250 | #define R0900_P1_SMAPCOEF7 0xf500 |
3131 | #define F0900_P1_DIS_QSCALE 0xf5000080 | 3251 | #define SMAPCOEF7 REGx(R0900_P1_SMAPCOEF7) |
3132 | #define F0900_P1_SMAPCOEF_Q_LLR12 0xf500017f | 3252 | #define F0900_P1_DIS_QSCALE 0xf5000080 |
3253 | #define F0900_P1_SMAPCOEF_Q_LLR12 0xf500017f | ||
3133 | 3254 | ||
3134 | /*P1_SMAPCOEF6*/ | 3255 | /*P1_SMAPCOEF6*/ |
3135 | #define R0900_P1_SMAPCOEF6 0xf501 | 3256 | #define R0900_P1_SMAPCOEF6 0xf501 |
3136 | #define F0900_P1_DIS_NEWSCALE 0xf5010008 | 3257 | #define SMAPCOEF6 REGx(R0900_P1_SMAPCOEF6) |
3137 | #define F0900_P1_ADJ_8PSKLLR1 0xf5010004 | 3258 | #define F0900_P1_ADJ_8PSKLLR1 0xf5010004 |
3138 | #define F0900_P1_OLD_8PSKLLR1 0xf5010002 | 3259 | #define F0900_P1_OLD_8PSKLLR1 0xf5010002 |
3139 | #define F0900_P1_DIS_AB8PSK 0xf5010001 | 3260 | #define F0900_P1_DIS_AB8PSK 0xf5010001 |
3140 | 3261 | ||
3141 | /*P1_SMAPCOEF5*/ | 3262 | /*P1_SMAPCOEF5*/ |
3142 | #define R0900_P1_SMAPCOEF5 0xf502 | 3263 | #define R0900_P1_SMAPCOEF5 0xf502 |
3143 | #define F0900_P1_DIS_8SCALE 0xf5020080 | 3264 | #define SMAPCOEF5 REGx(R0900_P1_SMAPCOEF5) |
3144 | #define F0900_P1_SMAPCOEF_8P_LLR23 0xf502017f | 3265 | #define F0900_P1_DIS_8SCALE 0xf5020080 |
3266 | #define F0900_P1_SMAPCOEF_8P_LLR23 0xf502017f | ||
3267 | |||
3268 | /*P1_NCO2MAX1*/ | ||
3269 | #define R0900_P1_NCO2MAX1 0xf514 | ||
3270 | #define NCO2MAX1 REGx(R0900_P1_NCO2MAX1) | ||
3271 | #define F0900_P1_TETA2_MAXVABS1 0xf51400ff | ||
3272 | |||
3273 | /*P1_NCO2MAX0*/ | ||
3274 | #define R0900_P1_NCO2MAX0 0xf515 | ||
3275 | #define NCO2MAX0 REGx(R0900_P1_NCO2MAX0) | ||
3276 | #define F0900_P1_TETA2_MAXVABS0 0xf51500ff | ||
3277 | |||
3278 | /*P1_NCO2FR1*/ | ||
3279 | #define R0900_P1_NCO2FR1 0xf516 | ||
3280 | #define NCO2FR1 REGx(R0900_P1_NCO2FR1) | ||
3281 | #define F0900_P1_NCO2FINAL_ANGLE1 0xf51600ff | ||
3282 | |||
3283 | /*P1_NCO2FR0*/ | ||
3284 | #define R0900_P1_NCO2FR0 0xf517 | ||
3285 | #define NCO2FR0 REGx(R0900_P1_NCO2FR0) | ||
3286 | #define F0900_P1_NCO2FINAL_ANGLE0 0xf51700ff | ||
3287 | |||
3288 | /*P1_CFR2AVRGE1*/ | ||
3289 | #define R0900_P1_CFR2AVRGE1 0xf518 | ||
3290 | #define CFR2AVRGE1 REGx(R0900_P1_CFR2AVRGE1) | ||
3291 | #define F0900_P1_I2C_CFR2AVERAGE1 0xf51800ff | ||
3292 | |||
3293 | /*P1_CFR2AVRGE0*/ | ||
3294 | #define R0900_P1_CFR2AVRGE0 0xf519 | ||
3295 | #define CFR2AVRGE0 REGx(R0900_P1_CFR2AVRGE0) | ||
3296 | #define F0900_P1_I2C_CFR2AVERAGE0 0xf51900ff | ||
3145 | 3297 | ||
3146 | /*P1_DMDPLHSTAT*/ | 3298 | /*P1_DMDPLHSTAT*/ |
3147 | #define R0900_P1_DMDPLHSTAT 0xf520 | 3299 | #define R0900_P1_DMDPLHSTAT 0xf520 |
3148 | #define F0900_P1_PLH_STATISTIC 0xf52000ff | 3300 | #define DMDPLHSTAT REGx(R0900_P1_DMDPLHSTAT) |
3301 | #define F0900_P1_PLH_STATISTIC 0xf52000ff | ||
3149 | 3302 | ||
3150 | /*P1_LOCKTIME3*/ | 3303 | /*P1_LOCKTIME3*/ |
3151 | #define R0900_P1_LOCKTIME3 0xf522 | 3304 | #define R0900_P1_LOCKTIME3 0xf522 |
3152 | #define F0900_P1_DEMOD_LOCKTIME3 0xf52200ff | 3305 | #define LOCKTIME3 REGx(R0900_P1_LOCKTIME3) |
3306 | #define F0900_P1_DEMOD_LOCKTIME3 0xf52200ff | ||
3153 | 3307 | ||
3154 | /*P1_LOCKTIME2*/ | 3308 | /*P1_LOCKTIME2*/ |
3155 | #define R0900_P1_LOCKTIME2 0xf523 | 3309 | #define R0900_P1_LOCKTIME2 0xf523 |
3156 | #define F0900_P1_DEMOD_LOCKTIME2 0xf52300ff | 3310 | #define LOCKTIME2 REGx(R0900_P1_LOCKTIME2) |
3311 | #define F0900_P1_DEMOD_LOCKTIME2 0xf52300ff | ||
3157 | 3312 | ||
3158 | /*P1_LOCKTIME1*/ | 3313 | /*P1_LOCKTIME1*/ |
3159 | #define R0900_P1_LOCKTIME1 0xf524 | 3314 | #define R0900_P1_LOCKTIME1 0xf524 |
3160 | #define F0900_P1_DEMOD_LOCKTIME1 0xf52400ff | 3315 | #define LOCKTIME1 REGx(R0900_P1_LOCKTIME1) |
3316 | #define F0900_P1_DEMOD_LOCKTIME1 0xf52400ff | ||
3161 | 3317 | ||
3162 | /*P1_LOCKTIME0*/ | 3318 | /*P1_LOCKTIME0*/ |
3163 | #define R0900_P1_LOCKTIME0 0xf525 | 3319 | #define R0900_P1_LOCKTIME0 0xf525 |
3164 | #define F0900_P1_DEMOD_LOCKTIME0 0xf52500ff | 3320 | #define LOCKTIME0 REGx(R0900_P1_LOCKTIME0) |
3321 | #define F0900_P1_DEMOD_LOCKTIME0 0xf52500ff | ||
3165 | 3322 | ||
3166 | /*P1_VITSCALE*/ | 3323 | /*P1_VITSCALE*/ |
3167 | #define R0900_P1_VITSCALE 0xf532 | 3324 | #define R0900_P1_VITSCALE 0xf532 |
3168 | #define F0900_P1_NVTH_NOSRANGE 0xf5320080 | 3325 | #define VITSCALE REGx(R0900_P1_VITSCALE) |
3169 | #define F0900_P1_VERROR_MAXMODE 0xf5320040 | 3326 | #define F0900_P1_NVTH_NOSRANGE 0xf5320080 |
3170 | #define F0900_P1_KDIV_MODE 0xf5320030 | 3327 | #define F0900_P1_VERROR_MAXMODE 0xf5320040 |
3171 | #define F0900_P1_NSLOWSN_LOCKED 0xf5320008 | 3328 | #define F0900_P1_NSLOWSN_LOCKED 0xf5320008 |
3172 | #define F0900_P1_DELOCK_PRFLOSS 0xf5320004 | 3329 | #define F0900_P1_DIS_RSFLOCK 0xf5320002 |
3173 | #define F0900_P1_DIS_RSFLOCK 0xf5320002 | ||
3174 | 3330 | ||
3175 | /*P1_FECM*/ | 3331 | /*P1_FECM*/ |
3176 | #define R0900_P1_FECM 0xf533 | 3332 | #define R0900_P1_FECM 0xf533 |
3177 | #define F0900_P1_DSS_DVB 0xf5330080 | 3333 | #define FECM REGx(R0900_P1_FECM) |
3178 | #define F0900_P1_DEMOD_BYPASS 0xf5330040 | 3334 | #define F0900_P1_DSS_DVB 0xf5330080 |
3179 | #define F0900_P1_CMP_SLOWMODE 0xf5330020 | 3335 | #define DSS_DVB FLDx(F0900_P1_DSS_DVB) |
3180 | #define F0900_P1_DSS_SRCH 0xf5330010 | 3336 | #define F0900_P1_DSS_SRCH 0xf5330010 |
3181 | #define F0900_P1_DIFF_MODEVIT 0xf5330004 | 3337 | #define F0900_P1_SYNCVIT 0xf5330002 |
3182 | #define F0900_P1_SYNCVIT 0xf5330002 | 3338 | #define F0900_P1_IQINV 0xf5330001 |
3183 | #define F0900_P1_IQINV 0xf5330001 | 3339 | #define IQINV FLDx(F0900_P1_IQINV) |
3184 | 3340 | ||
3185 | /*P1_VTH12*/ | 3341 | /*P1_VTH12*/ |
3186 | #define R0900_P1_VTH12 0xf534 | 3342 | #define R0900_P1_VTH12 0xf534 |
3187 | #define F0900_P1_VTH12 0xf53400ff | 3343 | #define VTH12 REGx(R0900_P1_VTH12) |
3344 | #define F0900_P1_VTH12 0xf53400ff | ||
3188 | 3345 | ||
3189 | /*P1_VTH23*/ | 3346 | /*P1_VTH23*/ |
3190 | #define R0900_P1_VTH23 0xf535 | 3347 | #define R0900_P1_VTH23 0xf535 |
3191 | #define F0900_P1_VTH23 0xf53500ff | 3348 | #define VTH23 REGx(R0900_P1_VTH23) |
3349 | #define F0900_P1_VTH23 0xf53500ff | ||
3192 | 3350 | ||
3193 | /*P1_VTH34*/ | 3351 | /*P1_VTH34*/ |
3194 | #define R0900_P1_VTH34 0xf536 | 3352 | #define R0900_P1_VTH34 0xf536 |
3195 | #define F0900_P1_VTH34 0xf53600ff | 3353 | #define VTH34 REGx(R0900_P1_VTH34) |
3354 | #define F0900_P1_VTH34 0xf53600ff | ||
3196 | 3355 | ||
3197 | /*P1_VTH56*/ | 3356 | /*P1_VTH56*/ |
3198 | #define R0900_P1_VTH56 0xf537 | 3357 | #define R0900_P1_VTH56 0xf537 |
3199 | #define F0900_P1_VTH56 0xf53700ff | 3358 | #define VTH56 REGx(R0900_P1_VTH56) |
3359 | #define F0900_P1_VTH56 0xf53700ff | ||
3200 | 3360 | ||
3201 | /*P1_VTH67*/ | 3361 | /*P1_VTH67*/ |
3202 | #define R0900_P1_VTH67 0xf538 | 3362 | #define R0900_P1_VTH67 0xf538 |
3203 | #define F0900_P1_VTH67 0xf53800ff | 3363 | #define VTH67 REGx(R0900_P1_VTH67) |
3364 | #define F0900_P1_VTH67 0xf53800ff | ||
3204 | 3365 | ||
3205 | /*P1_VTH78*/ | 3366 | /*P1_VTH78*/ |
3206 | #define R0900_P1_VTH78 0xf539 | 3367 | #define R0900_P1_VTH78 0xf539 |
3207 | #define F0900_P1_VTH78 0xf53900ff | 3368 | #define VTH78 REGx(R0900_P1_VTH78) |
3369 | #define F0900_P1_VTH78 0xf53900ff | ||
3208 | 3370 | ||
3209 | /*P1_VITCURPUN*/ | 3371 | /*P1_VITCURPUN*/ |
3210 | #define R0900_P1_VITCURPUN 0xf53a | 3372 | #define R0900_P1_VITCURPUN 0xf53a |
3211 | #define F0900_P1_VIT_MAPPING 0xf53a00e0 | 3373 | #define VITCURPUN REGx(R0900_P1_VITCURPUN) |
3212 | #define F0900_P1_VIT_CURPUN 0xf53a001f | 3374 | #define F0900_P1_VIT_CURPUN 0xf53a001f |
3375 | #define VIT_CURPUN FLDx(F0900_P1_VIT_CURPUN) | ||
3213 | 3376 | ||
3214 | /*P1_VERROR*/ | 3377 | /*P1_VERROR*/ |
3215 | #define R0900_P1_VERROR 0xf53b | 3378 | #define R0900_P1_VERROR 0xf53b |
3216 | #define F0900_P1_REGERR_VIT 0xf53b00ff | 3379 | #define VERROR REGx(R0900_P1_VERROR) |
3380 | #define F0900_P1_REGERR_VIT 0xf53b00ff | ||
3217 | 3381 | ||
3218 | /*P1_PRVIT*/ | 3382 | /*P1_PRVIT*/ |
3219 | #define R0900_P1_PRVIT 0xf53c | 3383 | #define R0900_P1_PRVIT 0xf53c |
3220 | #define F0900_P1_DIS_VTHLOCK 0xf53c0040 | 3384 | #define PRVIT REGx(R0900_P1_PRVIT) |
3221 | #define F0900_P1_E7_8VIT 0xf53c0020 | 3385 | #define F0900_P1_DIS_VTHLOCK 0xf53c0040 |
3222 | #define F0900_P1_E6_7VIT 0xf53c0010 | 3386 | #define F0900_P1_E7_8VIT 0xf53c0020 |
3223 | #define F0900_P1_E5_6VIT 0xf53c0008 | 3387 | #define F0900_P1_E6_7VIT 0xf53c0010 |
3224 | #define F0900_P1_E3_4VIT 0xf53c0004 | 3388 | #define F0900_P1_E5_6VIT 0xf53c0008 |
3225 | #define F0900_P1_E2_3VIT 0xf53c0002 | 3389 | #define F0900_P1_E3_4VIT 0xf53c0004 |
3226 | #define F0900_P1_E1_2VIT 0xf53c0001 | 3390 | #define F0900_P1_E2_3VIT 0xf53c0002 |
3391 | #define F0900_P1_E1_2VIT 0xf53c0001 | ||
3227 | 3392 | ||
3228 | /*P1_VAVSRVIT*/ | 3393 | /*P1_VAVSRVIT*/ |
3229 | #define R0900_P1_VAVSRVIT 0xf53d | 3394 | #define R0900_P1_VAVSRVIT 0xf53d |
3230 | #define F0900_P1_AMVIT 0xf53d0080 | 3395 | #define VAVSRVIT REGx(R0900_P1_VAVSRVIT) |
3231 | #define F0900_P1_FROZENVIT 0xf53d0040 | 3396 | #define F0900_P1_AMVIT 0xf53d0080 |
3232 | #define F0900_P1_SNVIT 0xf53d0030 | 3397 | #define F0900_P1_FROZENVIT 0xf53d0040 |
3233 | #define F0900_P1_TOVVIT 0xf53d000c | 3398 | #define F0900_P1_SNVIT 0xf53d0030 |
3234 | #define F0900_P1_HYPVIT 0xf53d0003 | 3399 | #define F0900_P1_TOVVIT 0xf53d000c |
3400 | #define F0900_P1_HYPVIT 0xf53d0003 | ||
3235 | 3401 | ||
3236 | /*P1_VSTATUSVIT*/ | 3402 | /*P1_VSTATUSVIT*/ |
3237 | #define R0900_P1_VSTATUSVIT 0xf53e | 3403 | #define R0900_P1_VSTATUSVIT 0xf53e |
3238 | #define F0900_P1_VITERBI_ON 0xf53e0080 | 3404 | #define VSTATUSVIT REGx(R0900_P1_VSTATUSVIT) |
3239 | #define F0900_P1_END_LOOPVIT 0xf53e0040 | 3405 | #define F0900_P1_PRFVIT 0xf53e0010 |
3240 | #define F0900_P1_VITERBI_DEPRF 0xf53e0020 | 3406 | #define PRFVIT FLDx(F0900_P1_PRFVIT) |
3241 | #define F0900_P1_PRFVIT 0xf53e0010 | 3407 | #define F0900_P1_LOCKEDVIT 0xf53e0008 |
3242 | #define F0900_P1_LOCKEDVIT 0xf53e0008 | 3408 | #define LOCKEDVIT FLDx(F0900_P1_LOCKEDVIT) |
3243 | #define F0900_P1_VITERBI_DELOCK 0xf53e0004 | ||
3244 | #define F0900_P1_VIT_DEMODSEL 0xf53e0002 | ||
3245 | #define F0900_P1_VITERBI_COMPOUT 0xf53e0001 | ||
3246 | 3409 | ||
3247 | /*P1_VTHINUSE*/ | 3410 | /*P1_VTHINUSE*/ |
3248 | #define R0900_P1_VTHINUSE 0xf53f | 3411 | #define R0900_P1_VTHINUSE 0xf53f |
3249 | #define F0900_P1_VIT_INUSE 0xf53f00ff | 3412 | #define VTHINUSE REGx(R0900_P1_VTHINUSE) |
3413 | #define F0900_P1_VIT_INUSE 0xf53f00ff | ||
3250 | 3414 | ||
3251 | /*P1_KDIV12*/ | 3415 | /*P1_KDIV12*/ |
3252 | #define R0900_P1_KDIV12 0xf540 | 3416 | #define R0900_P1_KDIV12 0xf540 |
3253 | #define F0900_P1_KDIV12_MANUAL 0xf5400080 | 3417 | #define KDIV12 REGx(R0900_P1_KDIV12) |
3254 | #define F0900_P1_K_DIVIDER_12 0xf540007f | 3418 | #define F0900_P1_K_DIVIDER_12 0xf540007f |
3255 | 3419 | ||
3256 | /*P1_KDIV23*/ | 3420 | /*P1_KDIV23*/ |
3257 | #define R0900_P1_KDIV23 0xf541 | 3421 | #define R0900_P1_KDIV23 0xf541 |
3258 | #define F0900_P1_KDIV23_MANUAL 0xf5410080 | 3422 | #define KDIV23 REGx(R0900_P1_KDIV23) |
3259 | #define F0900_P1_K_DIVIDER_23 0xf541007f | 3423 | #define F0900_P1_K_DIVIDER_23 0xf541007f |
3260 | 3424 | ||
3261 | /*P1_KDIV34*/ | 3425 | /*P1_KDIV34*/ |
3262 | #define R0900_P1_KDIV34 0xf542 | 3426 | #define R0900_P1_KDIV34 0xf542 |
3263 | #define F0900_P1_KDIV34_MANUAL 0xf5420080 | 3427 | #define KDIV34 REGx(R0900_P1_KDIV34) |
3264 | #define F0900_P1_K_DIVIDER_34 0xf542007f | 3428 | #define F0900_P1_K_DIVIDER_34 0xf542007f |
3265 | 3429 | ||
3266 | /*P1_KDIV56*/ | 3430 | /*P1_KDIV56*/ |
3267 | #define R0900_P1_KDIV56 0xf543 | 3431 | #define R0900_P1_KDIV56 0xf543 |
3268 | #define F0900_P1_KDIV56_MANUAL 0xf5430080 | 3432 | #define KDIV56 REGx(R0900_P1_KDIV56) |
3269 | #define F0900_P1_K_DIVIDER_56 0xf543007f | 3433 | #define F0900_P1_K_DIVIDER_56 0xf543007f |
3270 | 3434 | ||
3271 | /*P1_KDIV67*/ | 3435 | /*P1_KDIV67*/ |
3272 | #define R0900_P1_KDIV67 0xf544 | 3436 | #define R0900_P1_KDIV67 0xf544 |
3273 | #define F0900_P1_KDIV67_MANUAL 0xf5440080 | 3437 | #define KDIV67 REGx(R0900_P1_KDIV67) |
3274 | #define F0900_P1_K_DIVIDER_67 0xf544007f | 3438 | #define F0900_P1_K_DIVIDER_67 0xf544007f |
3275 | 3439 | ||
3276 | /*P1_KDIV78*/ | 3440 | /*P1_KDIV78*/ |
3277 | #define R0900_P1_KDIV78 0xf545 | 3441 | #define R0900_P1_KDIV78 0xf545 |
3278 | #define F0900_P1_KDIV78_MANUAL 0xf5450080 | 3442 | #define KDIV78 REGx(R0900_P1_KDIV78) |
3279 | #define F0900_P1_K_DIVIDER_78 0xf545007f | 3443 | #define F0900_P1_K_DIVIDER_78 0xf545007f |
3280 | 3444 | ||
3281 | /*P1_PDELCTRL1*/ | 3445 | /*P1_PDELCTRL1*/ |
3282 | #define R0900_P1_PDELCTRL1 0xf550 | 3446 | #define R0900_P1_PDELCTRL1 0xf550 |
3283 | #define F0900_P1_INV_MISMASK 0xf5500080 | 3447 | #define PDELCTRL1 REGx(R0900_P1_PDELCTRL1) |
3284 | #define F0900_P1_FORCE_ACCEPTED 0xf5500040 | 3448 | #define F0900_P1_INV_MISMASK 0xf5500080 |
3285 | #define F0900_P1_FILTER_EN 0xf5500020 | 3449 | #define F0900_P1_FILTER_EN 0xf5500020 |
3286 | #define F0900_P1_FORCE_PKTDELINUSE 0xf5500010 | 3450 | #define F0900_P1_EN_MIS00 0xf5500002 |
3287 | #define F0900_P1_HYSTEN 0xf5500008 | 3451 | #define F0900_P1_ALGOSWRST 0xf5500001 |
3288 | #define F0900_P1_HYSTSWRST 0xf5500004 | 3452 | #define ALGOSWRST FLDx(F0900_P1_ALGOSWRST) |
3289 | #define F0900_P1_EN_MIS00 0xf5500002 | ||
3290 | #define F0900_P1_ALGOSWRST 0xf5500001 | ||
3291 | 3453 | ||
3292 | /*P1_PDELCTRL2*/ | 3454 | /*P1_PDELCTRL2*/ |
3293 | #define R0900_P1_PDELCTRL2 0xf551 | 3455 | #define R0900_P1_PDELCTRL2 0xf551 |
3294 | #define F0900_P1_FORCE_CONTINUOUS 0xf5510080 | 3456 | #define PDELCTRL2 REGx(R0900_P1_PDELCTRL2) |
3295 | #define F0900_P1_RESET_UPKO_COUNT 0xf5510040 | 3457 | #define F0900_P1_RESET_UPKO_COUNT 0xf5510040 |
3296 | #define F0900_P1_USER_PKTDELIN_NB 0xf5510020 | 3458 | #define RESET_UPKO_COUNT FLDx(F0900_P1_RESET_UPKO_COUNT) |
3297 | #define F0900_P1_FORCE_LOCKED 0xf5510010 | 3459 | #define F0900_P1_FRAME_MODE 0xf5510002 |
3298 | #define F0900_P1_DATA_UNBBSCRAM 0xf5510008 | 3460 | #define F0900_P1_NOBCHERRFLG_USE 0xf5510001 |
3299 | #define F0900_P1_FORCE_LONGPKT 0xf5510004 | ||
3300 | #define F0900_P1_FRAME_MODE 0xf5510002 | ||
3301 | 3461 | ||
3302 | /*P1_HYSTTHRESH*/ | 3462 | /*P1_HYSTTHRESH*/ |
3303 | #define R0900_P1_HYSTTHRESH 0xf554 | 3463 | #define R0900_P1_HYSTTHRESH 0xf554 |
3304 | #define F0900_P1_UNLCK_THRESH 0xf55400f0 | 3464 | #define HYSTTHRESH REGx(R0900_P1_HYSTTHRESH) |
3305 | #define F0900_P1_DELIN_LCK_THRESH 0xf554000f | 3465 | #define F0900_P1_UNLCK_THRESH 0xf55400f0 |
3466 | #define F0900_P1_DELIN_LCK_THRESH 0xf554000f | ||
3306 | 3467 | ||
3307 | /*P1_ISIENTRY*/ | 3468 | /*P1_ISIENTRY*/ |
3308 | #define R0900_P1_ISIENTRY 0xf55e | 3469 | #define R0900_P1_ISIENTRY 0xf55e |
3309 | #define F0900_P1_ISI_ENTRY 0xf55e00ff | 3470 | #define ISIENTRY REGx(R0900_P1_ISIENTRY) |
3471 | #define F0900_P1_ISI_ENTRY 0xf55e00ff | ||
3310 | 3472 | ||
3311 | /*P1_ISIBITENA*/ | 3473 | /*P1_ISIBITENA*/ |
3312 | #define R0900_P1_ISIBITENA 0xf55f | 3474 | #define R0900_P1_ISIBITENA 0xf55f |
3313 | #define F0900_P1_ISI_BIT_EN 0xf55f00ff | 3475 | #define ISIBITENA REGx(R0900_P1_ISIBITENA) |
3476 | #define F0900_P1_ISI_BIT_EN 0xf55f00ff | ||
3314 | 3477 | ||
3315 | /*P1_MATSTR1*/ | 3478 | /*P1_MATSTR1*/ |
3316 | #define R0900_P1_MATSTR1 0xf560 | 3479 | #define R0900_P1_MATSTR1 0xf560 |
3317 | #define F0900_P1_MATYPE_CURRENT1 0xf56000ff | 3480 | #define MATSTR1 REGx(R0900_P1_MATSTR1) |
3481 | #define F0900_P1_MATYPE_CURRENT1 0xf56000ff | ||
3318 | 3482 | ||
3319 | /*P1_MATSTR0*/ | 3483 | /*P1_MATSTR0*/ |
3320 | #define R0900_P1_MATSTR0 0xf561 | 3484 | #define R0900_P1_MATSTR0 0xf561 |
3321 | #define F0900_P1_MATYPE_CURRENT0 0xf56100ff | 3485 | #define MATSTR0 REGx(R0900_P1_MATSTR0) |
3486 | #define F0900_P1_MATYPE_CURRENT0 0xf56100ff | ||
3322 | 3487 | ||
3323 | /*P1_UPLSTR1*/ | 3488 | /*P1_UPLSTR1*/ |
3324 | #define R0900_P1_UPLSTR1 0xf562 | 3489 | #define R0900_P1_UPLSTR1 0xf562 |
3325 | #define F0900_P1_UPL_CURRENT1 0xf56200ff | 3490 | #define UPLSTR1 REGx(R0900_P1_UPLSTR1) |
3491 | #define F0900_P1_UPL_CURRENT1 0xf56200ff | ||
3326 | 3492 | ||
3327 | /*P1_UPLSTR0*/ | 3493 | /*P1_UPLSTR0*/ |
3328 | #define R0900_P1_UPLSTR0 0xf563 | 3494 | #define R0900_P1_UPLSTR0 0xf563 |
3329 | #define F0900_P1_UPL_CURRENT0 0xf56300ff | 3495 | #define UPLSTR0 REGx(R0900_P1_UPLSTR0) |
3496 | #define F0900_P1_UPL_CURRENT0 0xf56300ff | ||
3330 | 3497 | ||
3331 | /*P1_DFLSTR1*/ | 3498 | /*P1_DFLSTR1*/ |
3332 | #define R0900_P1_DFLSTR1 0xf564 | 3499 | #define R0900_P1_DFLSTR1 0xf564 |
3333 | #define F0900_P1_DFL_CURRENT1 0xf56400ff | 3500 | #define DFLSTR1 REGx(R0900_P1_DFLSTR1) |
3501 | #define F0900_P1_DFL_CURRENT1 0xf56400ff | ||
3334 | 3502 | ||
3335 | /*P1_DFLSTR0*/ | 3503 | /*P1_DFLSTR0*/ |
3336 | #define R0900_P1_DFLSTR0 0xf565 | 3504 | #define R0900_P1_DFLSTR0 0xf565 |
3337 | #define F0900_P1_DFL_CURRENT0 0xf56500ff | 3505 | #define DFLSTR0 REGx(R0900_P1_DFLSTR0) |
3506 | #define F0900_P1_DFL_CURRENT0 0xf56500ff | ||
3338 | 3507 | ||
3339 | /*P1_SYNCSTR*/ | 3508 | /*P1_SYNCSTR*/ |
3340 | #define R0900_P1_SYNCSTR 0xf566 | 3509 | #define R0900_P1_SYNCSTR 0xf566 |
3341 | #define F0900_P1_SYNC_CURRENT 0xf56600ff | 3510 | #define SYNCSTR REGx(R0900_P1_SYNCSTR) |
3511 | #define F0900_P1_SYNC_CURRENT 0xf56600ff | ||
3342 | 3512 | ||
3343 | /*P1_SYNCDSTR1*/ | 3513 | /*P1_SYNCDSTR1*/ |
3344 | #define R0900_P1_SYNCDSTR1 0xf567 | 3514 | #define R0900_P1_SYNCDSTR1 0xf567 |
3345 | #define F0900_P1_SYNCD_CURRENT1 0xf56700ff | 3515 | #define SYNCDSTR1 REGx(R0900_P1_SYNCDSTR1) |
3516 | #define F0900_P1_SYNCD_CURRENT1 0xf56700ff | ||
3346 | 3517 | ||
3347 | /*P1_SYNCDSTR0*/ | 3518 | /*P1_SYNCDSTR0*/ |
3348 | #define R0900_P1_SYNCDSTR0 0xf568 | 3519 | #define R0900_P1_SYNCDSTR0 0xf568 |
3349 | #define F0900_P1_SYNCD_CURRENT0 0xf56800ff | 3520 | #define SYNCDSTR0 REGx(R0900_P1_SYNCDSTR0) |
3521 | #define F0900_P1_SYNCD_CURRENT0 0xf56800ff | ||
3350 | 3522 | ||
3351 | /*P1_PDELSTATUS1*/ | 3523 | /*P1_PDELSTATUS1*/ |
3352 | #define R0900_P1_PDELSTATUS1 0xf569 | 3524 | #define R0900_P1_PDELSTATUS1 0xf569 |
3353 | #define F0900_P1_PKTDELIN_DELOCK 0xf5690080 | 3525 | #define F0900_P1_PKTDELIN_DELOCK 0xf5690080 |
3354 | #define F0900_P1_SYNCDUPDFL_BADDFL 0xf5690040 | 3526 | #define F0900_P1_SYNCDUPDFL_BADDFL 0xf5690040 |
3355 | #define F0900_P1_CONTINUOUS_STREAM 0xf5690020 | 3527 | #define F0900_P1_CONTINUOUS_STREAM 0xf5690020 |
3356 | #define F0900_P1_UNACCEPTED_STREAM 0xf5690010 | 3528 | #define F0900_P1_UNACCEPTED_STREAM 0xf5690010 |
3357 | #define F0900_P1_BCH_ERROR_FLAG 0xf5690008 | 3529 | #define F0900_P1_BCH_ERROR_FLAG 0xf5690008 |
3358 | #define F0900_P1_BBHCRCKO 0xf5690004 | 3530 | #define F0900_P1_PKTDELIN_LOCK 0xf5690002 |
3359 | #define F0900_P1_PKTDELIN_LOCK 0xf5690002 | 3531 | #define PKTDELIN_LOCK FLDx(F0900_P1_PKTDELIN_LOCK) |
3360 | #define F0900_P1_FIRST_LOCK 0xf5690001 | 3532 | #define F0900_P1_FIRST_LOCK 0xf5690001 |
3361 | 3533 | ||
3362 | /*P1_PDELSTATUS2*/ | 3534 | /*P1_PDELSTATUS2*/ |
3363 | #define R0900_P1_PDELSTATUS2 0xf56a | 3535 | #define R0900_P1_PDELSTATUS2 0xf56a |
3364 | #define F0900_P1_PKTDEL_DEMODSEL 0xf56a0080 | 3536 | #define F0900_P1_FRAME_MODCOD 0xf56a007c |
3365 | #define F0900_P1_FRAME_MODCOD 0xf56a007c | 3537 | #define F0900_P1_FRAME_TYPE 0xf56a0003 |
3366 | #define F0900_P1_FRAME_TYPE 0xf56a0003 | ||
3367 | 3538 | ||
3368 | /*P1_BBFCRCKO1*/ | 3539 | /*P1_BBFCRCKO1*/ |
3369 | #define R0900_P1_BBFCRCKO1 0xf56b | 3540 | #define R0900_P1_BBFCRCKO1 0xf56b |
3370 | #define F0900_P1_BBHCRC_KOCNT1 0xf56b00ff | 3541 | #define BBFCRCKO1 REGx(R0900_P1_BBFCRCKO1) |
3542 | #define F0900_P1_BBHCRC_KOCNT1 0xf56b00ff | ||
3371 | 3543 | ||
3372 | /*P1_BBFCRCKO0*/ | 3544 | /*P1_BBFCRCKO0*/ |
3373 | #define R0900_P1_BBFCRCKO0 0xf56c | 3545 | #define R0900_P1_BBFCRCKO0 0xf56c |
3374 | #define F0900_P1_BBHCRC_KOCNT0 0xf56c00ff | 3546 | #define BBFCRCKO0 REGx(R0900_P1_BBFCRCKO0) |
3547 | #define F0900_P1_BBHCRC_KOCNT0 0xf56c00ff | ||
3375 | 3548 | ||
3376 | /*P1_UPCRCKO1*/ | 3549 | /*P1_UPCRCKO1*/ |
3377 | #define R0900_P1_UPCRCKO1 0xf56d | 3550 | #define R0900_P1_UPCRCKO1 0xf56d |
3378 | #define F0900_P1_PKTCRC_KOCNT1 0xf56d00ff | 3551 | #define UPCRCKO1 REGx(R0900_P1_UPCRCKO1) |
3552 | #define F0900_P1_PKTCRC_KOCNT1 0xf56d00ff | ||
3379 | 3553 | ||
3380 | /*P1_UPCRCKO0*/ | 3554 | /*P1_UPCRCKO0*/ |
3381 | #define R0900_P1_UPCRCKO0 0xf56e | 3555 | #define R0900_P1_UPCRCKO0 0xf56e |
3382 | #define F0900_P1_PKTCRC_KOCNT0 0xf56e00ff | 3556 | #define UPCRCKO0 REGx(R0900_P1_UPCRCKO0) |
3557 | #define F0900_P1_PKTCRC_KOCNT0 0xf56e00ff | ||
3558 | |||
3559 | /*P1_PDELCTRL3*/ | ||
3560 | #define R0900_P1_PDELCTRL3 0xf56f | ||
3561 | #define PDELCTRL3 REGx(R0900_P1_PDELCTRL3) | ||
3562 | #define F0900_P1_PKTDEL_CONTFAIL 0xf56f0080 | ||
3563 | #define F0900_P1_NOFIFO_BCHERR 0xf56f0020 | ||
3383 | 3564 | ||
3384 | /*P1_TSSTATEM*/ | 3565 | /*P1_TSSTATEM*/ |
3385 | #define R0900_P1_TSSTATEM 0xf570 | 3566 | #define R0900_P1_TSSTATEM 0xf570 |
3386 | #define F0900_P1_TSDIL_ON 0xf5700080 | 3567 | #define TSSTATEM REGx(R0900_P1_TSSTATEM) |
3387 | #define F0900_P1_TSSKIPRS_ON 0xf5700040 | 3568 | #define F0900_P1_TSDIL_ON 0xf5700080 |
3388 | #define F0900_P1_TSRS_ON 0xf5700020 | 3569 | #define F0900_P1_TSRS_ON 0xf5700020 |
3389 | #define F0900_P1_TSDESCRAMB_ON 0xf5700010 | 3570 | #define F0900_P1_TSDESCRAMB_ON 0xf5700010 |
3390 | #define F0900_P1_TSFRAME_MODE 0xf5700008 | 3571 | #define F0900_P1_TSFRAME_MODE 0xf5700008 |
3391 | #define F0900_P1_TS_DISABLE 0xf5700004 | 3572 | #define F0900_P1_TS_DISABLE 0xf5700004 |
3392 | #define F0900_P1_TSACM_MODE 0xf5700002 | 3573 | #define F0900_P1_TSOUT_NOSYNC 0xf5700001 |
3393 | #define F0900_P1_TSOUT_NOSYNC 0xf5700001 | ||
3394 | 3574 | ||
3395 | /*P1_TSCFGH*/ | 3575 | /*P1_TSCFGH*/ |
3396 | #define R0900_P1_TSCFGH 0xf572 | 3576 | #define R0900_P1_TSCFGH 0xf572 |
3397 | #define F0900_P1_TSFIFO_DVBCI 0xf5720080 | 3577 | #define TSCFGH REGx(R0900_P1_TSCFGH) |
3398 | #define F0900_P1_TSFIFO_SERIAL 0xf5720040 | 3578 | #define F0900_P1_TSFIFO_DVBCI 0xf5720080 |
3399 | #define F0900_P1_TSFIFO_TEIUPDATE 0xf5720020 | 3579 | #define F0900_P1_TSFIFO_SERIAL 0xf5720040 |
3400 | #define F0900_P1_TSFIFO_DUTY50 0xf5720010 | 3580 | #define F0900_P1_TSFIFO_TEIUPDATE 0xf5720020 |
3401 | #define F0900_P1_TSFIFO_HSGNLOUT 0xf5720008 | 3581 | #define F0900_P1_TSFIFO_DUTY50 0xf5720010 |
3402 | #define F0900_P1_TSFIFO_ERRMODE 0xf5720006 | 3582 | #define F0900_P1_TSFIFO_HSGNLOUT 0xf5720008 |
3403 | #define F0900_P1_RST_HWARE 0xf5720001 | 3583 | #define F0900_P1_TSFIFO_ERRMODE 0xf5720006 |
3584 | #define F0900_P1_RST_HWARE 0xf5720001 | ||
3585 | #define RST_HWARE FLDx(F0900_P1_RST_HWARE) | ||
3404 | 3586 | ||
3405 | /*P1_TSCFGM*/ | 3587 | /*P1_TSCFGM*/ |
3406 | #define R0900_P1_TSCFGM 0xf573 | 3588 | #define R0900_P1_TSCFGM 0xf573 |
3407 | #define F0900_P1_TSFIFO_MANSPEED 0xf57300c0 | 3589 | #define TSCFGM REGx(R0900_P1_TSCFGM) |
3408 | #define F0900_P1_TSFIFO_PERMDATA 0xf5730020 | 3590 | #define F0900_P1_TSFIFO_MANSPEED 0xf57300c0 |
3409 | #define F0900_P1_TSFIFO_NONEWSGNL 0xf5730010 | 3591 | #define F0900_P1_TSFIFO_PERMDATA 0xf5730020 |
3410 | #define F0900_P1_TSFIFO_BITSPEED 0xf5730008 | 3592 | #define F0900_P1_TSFIFO_DPUNACT 0xf5730002 |
3411 | #define F0900_P1_NPD_SPECDVBS2 0xf5730004 | 3593 | #define F0900_P1_TSFIFO_INVDATA 0xf5730001 |
3412 | #define F0900_P1_TSFIFO_STOPCKDIS 0xf5730002 | ||
3413 | #define F0900_P1_TSFIFO_INVDATA 0xf5730001 | ||
3414 | 3594 | ||
3415 | /*P1_TSCFGL*/ | 3595 | /*P1_TSCFGL*/ |
3416 | #define R0900_P1_TSCFGL 0xf574 | 3596 | #define R0900_P1_TSCFGL 0xf574 |
3417 | #define F0900_P1_TSFIFO_BCLKDEL1CK 0xf57400c0 | 3597 | #define TSCFGL REGx(R0900_P1_TSCFGL) |
3418 | #define F0900_P1_BCHERROR_MODE 0xf5740030 | 3598 | #define F0900_P1_TSFIFO_BCLKDEL1CK 0xf57400c0 |
3419 | #define F0900_P1_TSFIFO_NSGNL2DATA 0xf5740008 | 3599 | #define F0900_P1_BCHERROR_MODE 0xf5740030 |
3420 | #define F0900_P1_TSFIFO_EMBINDVB 0xf5740004 | 3600 | #define F0900_P1_TSFIFO_NSGNL2DATA 0xf5740008 |
3421 | #define F0900_P1_TSFIFO_DPUNACT 0xf5740002 | 3601 | #define F0900_P1_TSFIFO_EMBINDVB 0xf5740004 |
3422 | #define F0900_P1_TSFIFO_NPDOFF 0xf5740001 | 3602 | #define F0900_P1_TSFIFO_BITSPEED 0xf5740003 |
3423 | 3603 | ||
3424 | /*P1_TSINSDELH*/ | 3604 | /*P1_TSINSDELH*/ |
3425 | #define R0900_P1_TSINSDELH 0xf576 | 3605 | #define R0900_P1_TSINSDELH 0xf576 |
3426 | #define F0900_P1_TSDEL_SYNCBYTE 0xf5760080 | 3606 | #define TSINSDELH REGx(R0900_P1_TSINSDELH) |
3427 | #define F0900_P1_TSDEL_XXHEADER 0xf5760040 | 3607 | #define F0900_P1_TSDEL_SYNCBYTE 0xf5760080 |
3428 | #define F0900_P1_TSDEL_BBHEADER 0xf5760020 | 3608 | #define F0900_P1_TSDEL_XXHEADER 0xf5760040 |
3429 | #define F0900_P1_TSDEL_DATAFIELD 0xf5760010 | 3609 | #define F0900_P1_TSDEL_BBHEADER 0xf5760020 |
3430 | #define F0900_P1_TSINSDEL_ISCR 0xf5760008 | 3610 | #define F0900_P1_TSDEL_DATAFIELD 0xf5760010 |
3431 | #define F0900_P1_TSINSDEL_NPD 0xf5760004 | 3611 | #define F0900_P1_TSINSDEL_ISCR 0xf5760008 |
3432 | #define F0900_P1_TSINSDEL_RSPARITY 0xf5760002 | 3612 | #define F0900_P1_TSINSDEL_NPD 0xf5760004 |
3433 | #define F0900_P1_TSINSDEL_CRC8 0xf5760001 | 3613 | #define F0900_P1_TSINSDEL_RSPARITY 0xf5760002 |
3614 | #define F0900_P1_TSINSDEL_CRC8 0xf5760001 | ||
3615 | |||
3616 | /*P1_TSDIVN*/ | ||
3617 | #define R0900_P1_TSDIVN 0xf579 | ||
3618 | #define TSDIVN REGx(R0900_P1_TSDIVN) | ||
3619 | #define F0900_P1_TSFIFO_SPEEDMODE 0xf57900c0 | ||
3620 | |||
3621 | /*P1_TSCFG4*/ | ||
3622 | #define R0900_P1_TSCFG4 0xf57a | ||
3623 | #define TSCFG4 REGx(R0900_P1_TSCFG4) | ||
3624 | #define F0900_P1_TSFIFO_TSSPEEDMODE 0xf57a00c0 | ||
3434 | 3625 | ||
3435 | /*P1_TSSPEED*/ | 3626 | /*P1_TSSPEED*/ |
3436 | #define R0900_P1_TSSPEED 0xf580 | 3627 | #define R0900_P1_TSSPEED 0xf580 |
3437 | #define F0900_P1_TSFIFO_OUTSPEED 0xf58000ff | 3628 | #define TSSPEED REGx(R0900_P1_TSSPEED) |
3629 | #define F0900_P1_TSFIFO_OUTSPEED 0xf58000ff | ||
3438 | 3630 | ||
3439 | /*P1_TSSTATUS*/ | 3631 | /*P1_TSSTATUS*/ |
3440 | #define R0900_P1_TSSTATUS 0xf581 | 3632 | #define R0900_P1_TSSTATUS 0xf581 |
3441 | #define F0900_P1_TSFIFO_LINEOK 0xf5810080 | 3633 | #define TSSTATUS REGx(R0900_P1_TSSTATUS) |
3442 | #define F0900_P1_TSFIFO_ERROR 0xf5810040 | 3634 | #define F0900_P1_TSFIFO_LINEOK 0xf5810080 |
3443 | #define F0900_P1_TSFIFO_DATA7 0xf5810020 | 3635 | #define TSFIFO_LINEOK FLDx(F0900_P1_TSFIFO_LINEOK) |
3444 | #define F0900_P1_TSFIFO_NOSYNC 0xf5810010 | 3636 | #define F0900_P1_TSFIFO_ERROR 0xf5810040 |
3445 | #define F0900_P1_ISCR_INITIALIZED 0xf5810008 | 3637 | #define F0900_P1_DIL_READY 0xf5810001 |
3446 | #define F0900_P1_ISCR_UPDATED 0xf5810004 | ||
3447 | #define F0900_P1_SOFFIFO_UNREGUL 0xf5810002 | ||
3448 | #define F0900_P1_DIL_READY 0xf5810001 | ||
3449 | 3638 | ||
3450 | /*P1_TSSTATUS2*/ | 3639 | /*P1_TSSTATUS2*/ |
3451 | #define R0900_P1_TSSTATUS2 0xf582 | 3640 | #define R0900_P1_TSSTATUS2 0xf582 |
3452 | #define F0900_P1_TSFIFO_DEMODSEL 0xf5820080 | 3641 | #define TSSTATUS2 REGx(R0900_P1_TSSTATUS2) |
3453 | #define F0900_P1_TSFIFOSPEED_STORE 0xf5820040 | 3642 | #define F0900_P1_TSFIFO_DEMODSEL 0xf5820080 |
3454 | #define F0900_P1_DILXX_RESET 0xf5820020 | 3643 | #define F0900_P1_TSFIFOSPEED_STORE 0xf5820040 |
3455 | #define F0900_P1_TSSERIAL_IMPOS 0xf5820010 | 3644 | #define F0900_P1_DILXX_RESET 0xf5820020 |
3456 | #define F0900_P1_TSFIFO_LINENOK 0xf5820008 | 3645 | #define F0900_P1_TSSERIAL_IMPOS 0xf5820010 |
3457 | #define F0900_P1_BITSPEED_EVENT 0xf5820004 | 3646 | #define F0900_P1_SCRAMBDETECT 0xf5820002 |
3458 | #define F0900_P1_SCRAMBDETECT 0xf5820002 | ||
3459 | #define F0900_P1_ULDTV67_FALSELOCK 0xf5820001 | ||
3460 | 3647 | ||
3461 | /*P1_TSBITRATE1*/ | 3648 | /*P1_TSBITRATE1*/ |
3462 | #define R0900_P1_TSBITRATE1 0xf583 | 3649 | #define R0900_P1_TSBITRATE1 0xf583 |
3463 | #define F0900_P1_TSFIFO_BITRATE1 0xf58300ff | 3650 | #define TSBITRATE1 REGx(R0900_P1_TSBITRATE1) |
3651 | #define F0900_P1_TSFIFO_BITRATE1 0xf58300ff | ||
3464 | 3652 | ||
3465 | /*P1_TSBITRATE0*/ | 3653 | /*P1_TSBITRATE0*/ |
3466 | #define R0900_P1_TSBITRATE0 0xf584 | 3654 | #define R0900_P1_TSBITRATE0 0xf584 |
3467 | #define F0900_P1_TSFIFO_BITRATE0 0xf58400ff | 3655 | #define TSBITRATE0 REGx(R0900_P1_TSBITRATE0) |
3656 | #define F0900_P1_TSFIFO_BITRATE0 0xf58400ff | ||
3468 | 3657 | ||
3469 | /*P1_ERRCTRL1*/ | 3658 | /*P1_ERRCTRL1*/ |
3470 | #define R0900_P1_ERRCTRL1 0xf598 | 3659 | #define R0900_P1_ERRCTRL1 0xf598 |
3471 | #define F0900_P1_ERR_SOURCE1 0xf59800f0 | 3660 | #define ERRCTRL1 REGx(R0900_P1_ERRCTRL1) |
3472 | #define F0900_P1_NUM_EVENT1 0xf5980007 | 3661 | #define F0900_P1_ERR_SOURCE1 0xf59800f0 |
3662 | #define F0900_P1_NUM_EVENT1 0xf5980007 | ||
3473 | 3663 | ||
3474 | /*P1_ERRCNT12*/ | 3664 | /*P1_ERRCNT12*/ |
3475 | #define R0900_P1_ERRCNT12 0xf599 | 3665 | #define R0900_P1_ERRCNT12 0xf599 |
3476 | #define F0900_P1_ERRCNT1_OLDVALUE 0xf5990080 | 3666 | #define ERRCNT12 REGx(R0900_P1_ERRCNT12) |
3477 | #define F0900_P1_ERR_CNT12 0xf599007f | 3667 | #define F0900_P1_ERRCNT1_OLDVALUE 0xf5990080 |
3668 | #define F0900_P1_ERR_CNT12 0xf599007f | ||
3669 | #define ERR_CNT12 FLDx(F0900_P1_ERR_CNT12) | ||
3478 | 3670 | ||
3479 | /*P1_ERRCNT11*/ | 3671 | /*P1_ERRCNT11*/ |
3480 | #define R0900_P1_ERRCNT11 0xf59a | 3672 | #define R0900_P1_ERRCNT11 0xf59a |
3481 | #define F0900_P1_ERR_CNT11 0xf59a00ff | 3673 | #define ERRCNT11 REGx(R0900_P1_ERRCNT11) |
3674 | #define F0900_P1_ERR_CNT11 0xf59a00ff | ||
3675 | #define ERR_CNT11 FLDx(F0900_P1_ERR_CNT11) | ||
3482 | 3676 | ||
3483 | /*P1_ERRCNT10*/ | 3677 | /*P1_ERRCNT10*/ |
3484 | #define R0900_P1_ERRCNT10 0xf59b | 3678 | #define R0900_P1_ERRCNT10 0xf59b |
3485 | #define F0900_P1_ERR_CNT10 0xf59b00ff | 3679 | #define ERRCNT10 REGx(R0900_P1_ERRCNT10) |
3680 | #define F0900_P1_ERR_CNT10 0xf59b00ff | ||
3681 | #define ERR_CNT10 FLDx(F0900_P1_ERR_CNT10) | ||
3486 | 3682 | ||
3487 | /*P1_ERRCTRL2*/ | 3683 | /*P1_ERRCTRL2*/ |
3488 | #define R0900_P1_ERRCTRL2 0xf59c | 3684 | #define R0900_P1_ERRCTRL2 0xf59c |
3489 | #define F0900_P1_ERR_SOURCE2 0xf59c00f0 | 3685 | #define ERRCTRL2 REGx(R0900_P1_ERRCTRL2) |
3490 | #define F0900_P1_NUM_EVENT2 0xf59c0007 | 3686 | #define F0900_P1_ERR_SOURCE2 0xf59c00f0 |
3687 | #define F0900_P1_NUM_EVENT2 0xf59c0007 | ||
3491 | 3688 | ||
3492 | /*P1_ERRCNT22*/ | 3689 | /*P1_ERRCNT22*/ |
3493 | #define R0900_P1_ERRCNT22 0xf59d | 3690 | #define R0900_P1_ERRCNT22 0xf59d |
3494 | #define F0900_P1_ERRCNT2_OLDVALUE 0xf59d0080 | 3691 | #define ERRCNT22 REGx(R0900_P1_ERRCNT22) |
3495 | #define F0900_P1_ERR_CNT22 0xf59d007f | 3692 | #define F0900_P1_ERRCNT2_OLDVALUE 0xf59d0080 |
3693 | #define F0900_P1_ERR_CNT22 0xf59d007f | ||
3694 | #define ERR_CNT22 FLDx(F0900_P1_ERR_CNT22) | ||
3496 | 3695 | ||
3497 | /*P1_ERRCNT21*/ | 3696 | /*P1_ERRCNT21*/ |
3498 | #define R0900_P1_ERRCNT21 0xf59e | 3697 | #define R0900_P1_ERRCNT21 0xf59e |
3499 | #define F0900_P1_ERR_CNT21 0xf59e00ff | 3698 | #define ERRCNT21 REGx(R0900_P1_ERRCNT21) |
3699 | #define F0900_P1_ERR_CNT21 0xf59e00ff | ||
3700 | #define ERR_CNT21 FLDx(F0900_P1_ERR_CNT21) | ||
3500 | 3701 | ||
3501 | /*P1_ERRCNT20*/ | 3702 | /*P1_ERRCNT20*/ |
3502 | #define R0900_P1_ERRCNT20 0xf59f | 3703 | #define R0900_P1_ERRCNT20 0xf59f |
3503 | #define F0900_P1_ERR_CNT20 0xf59f00ff | 3704 | #define ERRCNT20 REGx(R0900_P1_ERRCNT20) |
3705 | #define F0900_P1_ERR_CNT20 0xf59f00ff | ||
3706 | #define ERR_CNT20 FLDx(F0900_P1_ERR_CNT20) | ||
3504 | 3707 | ||
3505 | /*P1_FECSPY*/ | 3708 | /*P1_FECSPY*/ |
3506 | #define R0900_P1_FECSPY 0xf5a0 | 3709 | #define R0900_P1_FECSPY 0xf5a0 |
3507 | #define F0900_P1_SPY_ENABLE 0xf5a00080 | 3710 | #define FECSPY REGx(R0900_P1_FECSPY) |
3508 | #define F0900_P1_NO_SYNCBYTE 0xf5a00040 | 3711 | #define F0900_P1_SPY_ENABLE 0xf5a00080 |
3509 | #define F0900_P1_SERIAL_MODE 0xf5a00020 | 3712 | #define F0900_P1_NO_SYNCBYTE 0xf5a00040 |
3510 | #define F0900_P1_UNUSUAL_PACKET 0xf5a00010 | 3713 | #define F0900_P1_SERIAL_MODE 0xf5a00020 |
3511 | #define F0900_P1_BER_PACKMODE 0xf5a00008 | 3714 | #define F0900_P1_UNUSUAL_PACKET 0xf5a00010 |
3512 | #define F0900_P1_BERMETER_LMODE 0xf5a00002 | 3715 | #define F0900_P1_BERMETER_DATAMODE 0xf5a00008 |
3513 | #define F0900_P1_BERMETER_RESET 0xf5a00001 | 3716 | #define F0900_P1_BERMETER_LMODE 0xf5a00002 |
3717 | #define F0900_P1_BERMETER_RESET 0xf5a00001 | ||
3514 | 3718 | ||
3515 | /*P1_FSPYCFG*/ | 3719 | /*P1_FSPYCFG*/ |
3516 | #define R0900_P1_FSPYCFG 0xf5a1 | 3720 | #define R0900_P1_FSPYCFG 0xf5a1 |
3517 | #define F0900_P1_FECSPY_INPUT 0xf5a100c0 | 3721 | #define FSPYCFG REGx(R0900_P1_FSPYCFG) |
3518 | #define F0900_P1_RST_ON_ERROR 0xf5a10020 | 3722 | #define F0900_P1_FECSPY_INPUT 0xf5a100c0 |
3519 | #define F0900_P1_ONE_SHOT 0xf5a10010 | 3723 | #define F0900_P1_RST_ON_ERROR 0xf5a10020 |
3520 | #define F0900_P1_I2C_MODE 0xf5a1000c | 3724 | #define F0900_P1_ONE_SHOT 0xf5a10010 |
3521 | #define F0900_P1_SPY_HYSTERESIS 0xf5a10003 | 3725 | #define F0900_P1_I2C_MODE 0xf5a1000c |
3726 | #define F0900_P1_SPY_HYSTERESIS 0xf5a10003 | ||
3522 | 3727 | ||
3523 | /*P1_FSPYDATA*/ | 3728 | /*P1_FSPYDATA*/ |
3524 | #define R0900_P1_FSPYDATA 0xf5a2 | 3729 | #define R0900_P1_FSPYDATA 0xf5a2 |
3525 | #define F0900_P1_SPY_STUFFING 0xf5a20080 | 3730 | #define FSPYDATA REGx(R0900_P1_FSPYDATA) |
3526 | #define F0900_P1_NOERROR_PKTJITTER 0xf5a20040 | 3731 | #define F0900_P1_SPY_STUFFING 0xf5a20080 |
3527 | #define F0900_P1_SPY_CNULLPKT 0xf5a20020 | 3732 | #define F0900_P1_SPY_CNULLPKT 0xf5a20020 |
3528 | #define F0900_P1_SPY_OUTDATA_MODE 0xf5a2001f | 3733 | #define F0900_P1_SPY_OUTDATA_MODE 0xf5a2001f |
3529 | 3734 | ||
3530 | /*P1_FSPYOUT*/ | 3735 | /*P1_FSPYOUT*/ |
3531 | #define R0900_P1_FSPYOUT 0xf5a3 | 3736 | #define R0900_P1_FSPYOUT 0xf5a3 |
3532 | #define F0900_P1_FSPY_DIRECT 0xf5a30080 | 3737 | #define FSPYOUT REGx(R0900_P1_FSPYOUT) |
3533 | #define F0900_P1_SPY_OUTDATA_BUS 0xf5a30038 | 3738 | #define F0900_P1_FSPY_DIRECT 0xf5a30080 |
3534 | #define F0900_P1_STUFF_MODE 0xf5a30007 | 3739 | #define F0900_P1_STUFF_MODE 0xf5a30007 |
3535 | 3740 | ||
3536 | /*P1_FSTATUS*/ | 3741 | /*P1_FSTATUS*/ |
3537 | #define R0900_P1_FSTATUS 0xf5a4 | 3742 | #define R0900_P1_FSTATUS 0xf5a4 |
3538 | #define F0900_P1_SPY_ENDSIM 0xf5a40080 | 3743 | #define FSTATUS REGx(R0900_P1_FSTATUS) |
3539 | #define F0900_P1_VALID_SIM 0xf5a40040 | 3744 | #define F0900_P1_SPY_ENDSIM 0xf5a40080 |
3540 | #define F0900_P1_FOUND_SIGNAL 0xf5a40020 | 3745 | #define F0900_P1_VALID_SIM 0xf5a40040 |
3541 | #define F0900_P1_DSS_SYNCBYTE 0xf5a40010 | 3746 | #define F0900_P1_FOUND_SIGNAL 0xf5a40020 |
3542 | #define F0900_P1_RESULT_STATE 0xf5a4000f | 3747 | #define F0900_P1_DSS_SYNCBYTE 0xf5a40010 |
3748 | #define F0900_P1_RESULT_STATE 0xf5a4000f | ||
3543 | 3749 | ||
3544 | /*P1_FBERCPT4*/ | 3750 | /*P1_FBERCPT4*/ |
3545 | #define R0900_P1_FBERCPT4 0xf5a8 | 3751 | #define R0900_P1_FBERCPT4 0xf5a8 |
3546 | #define F0900_P1_FBERMETER_CPT4 0xf5a800ff | 3752 | #define FBERCPT4 REGx(R0900_P1_FBERCPT4) |
3753 | #define F0900_P1_FBERMETER_CPT4 0xf5a800ff | ||
3547 | 3754 | ||
3548 | /*P1_FBERCPT3*/ | 3755 | /*P1_FBERCPT3*/ |
3549 | #define R0900_P1_FBERCPT3 0xf5a9 | 3756 | #define R0900_P1_FBERCPT3 0xf5a9 |
3550 | #define F0900_P1_FBERMETER_CPT3 0xf5a900ff | 3757 | #define FBERCPT3 REGx(R0900_P1_FBERCPT3) |
3758 | #define F0900_P1_FBERMETER_CPT3 0xf5a900ff | ||
3551 | 3759 | ||
3552 | /*P1_FBERCPT2*/ | 3760 | /*P1_FBERCPT2*/ |
3553 | #define R0900_P1_FBERCPT2 0xf5aa | 3761 | #define R0900_P1_FBERCPT2 0xf5aa |
3554 | #define F0900_P1_FBERMETER_CPT2 0xf5aa00ff | 3762 | #define FBERCPT2 REGx(R0900_P1_FBERCPT2) |
3763 | #define F0900_P1_FBERMETER_CPT2 0xf5aa00ff | ||
3555 | 3764 | ||
3556 | /*P1_FBERCPT1*/ | 3765 | /*P1_FBERCPT1*/ |
3557 | #define R0900_P1_FBERCPT1 0xf5ab | 3766 | #define R0900_P1_FBERCPT1 0xf5ab |
3558 | #define F0900_P1_FBERMETER_CPT1 0xf5ab00ff | 3767 | #define FBERCPT1 REGx(R0900_P1_FBERCPT1) |
3768 | #define F0900_P1_FBERMETER_CPT1 0xf5ab00ff | ||
3559 | 3769 | ||
3560 | /*P1_FBERCPT0*/ | 3770 | /*P1_FBERCPT0*/ |
3561 | #define R0900_P1_FBERCPT0 0xf5ac | 3771 | #define R0900_P1_FBERCPT0 0xf5ac |
3562 | #define F0900_P1_FBERMETER_CPT0 0xf5ac00ff | 3772 | #define FBERCPT0 REGx(R0900_P1_FBERCPT0) |
3773 | #define F0900_P1_FBERMETER_CPT0 0xf5ac00ff | ||
3563 | 3774 | ||
3564 | /*P1_FBERERR2*/ | 3775 | /*P1_FBERERR2*/ |
3565 | #define R0900_P1_FBERERR2 0xf5ad | 3776 | #define R0900_P1_FBERERR2 0xf5ad |
3566 | #define F0900_P1_FBERMETER_ERR2 0xf5ad00ff | 3777 | #define FBERERR2 REGx(R0900_P1_FBERERR2) |
3778 | #define F0900_P1_FBERMETER_ERR2 0xf5ad00ff | ||
3567 | 3779 | ||
3568 | /*P1_FBERERR1*/ | 3780 | /*P1_FBERERR1*/ |
3569 | #define R0900_P1_FBERERR1 0xf5ae | 3781 | #define R0900_P1_FBERERR1 0xf5ae |
3570 | #define F0900_P1_FBERMETER_ERR1 0xf5ae00ff | 3782 | #define FBERERR1 REGx(R0900_P1_FBERERR1) |
3783 | #define F0900_P1_FBERMETER_ERR1 0xf5ae00ff | ||
3571 | 3784 | ||
3572 | /*P1_FBERERR0*/ | 3785 | /*P1_FBERERR0*/ |
3573 | #define R0900_P1_FBERERR0 0xf5af | 3786 | #define R0900_P1_FBERERR0 0xf5af |
3574 | #define F0900_P1_FBERMETER_ERR0 0xf5af00ff | 3787 | #define FBERERR0 REGx(R0900_P1_FBERERR0) |
3788 | #define F0900_P1_FBERMETER_ERR0 0xf5af00ff | ||
3575 | 3789 | ||
3576 | /*P1_FSPYBER*/ | 3790 | /*P1_FSPYBER*/ |
3577 | #define R0900_P1_FSPYBER 0xf5b2 | 3791 | #define R0900_P1_FSPYBER 0xf5b2 |
3578 | #define F0900_P1_FSPYOBS_XORREAD 0xf5b20040 | 3792 | #define FSPYBER REGx(R0900_P1_FSPYBER) |
3579 | #define F0900_P1_FSPYBER_OBSMODE 0xf5b20020 | 3793 | #define F0900_P1_FSPYBER_SYNCBYTE 0xf5b20010 |
3580 | #define F0900_P1_FSPYBER_SYNCBYTE 0xf5b20010 | 3794 | #define F0900_P1_FSPYBER_UNSYNC 0xf5b20008 |
3581 | #define F0900_P1_FSPYBER_UNSYNC 0xf5b20008 | 3795 | #define F0900_P1_FSPYBER_CTIME 0xf5b20007 |
3582 | #define F0900_P1_FSPYBER_CTIME 0xf5b20007 | 3796 | |
3583 | 3797 | /*RCCFG2*/ | |
3584 | /*RCCFGH*/ | 3798 | #define R0900_RCCFG2 0xf600 |
3585 | #define R0900_RCCFGH 0xf600 | ||
3586 | #define F0900_TSRCFIFO_DVBCI 0xf6000080 | ||
3587 | #define F0900_TSRCFIFO_SERIAL 0xf6000040 | ||
3588 | #define F0900_TSRCFIFO_DISABLE 0xf6000020 | ||
3589 | #define F0900_TSFIFO_2TORC 0xf6000010 | ||
3590 | #define F0900_TSRCFIFO_HSGNLOUT 0xf6000008 | ||
3591 | #define F0900_TSRCFIFO_ERRMODE 0xf6000006 | ||
3592 | 3799 | ||
3593 | /*TSGENERAL*/ | 3800 | /*TSGENERAL*/ |
3594 | #define R0900_TSGENERAL 0xf630 | 3801 | #define R0900_TSGENERAL 0xf630 |
3595 | #define F0900_TSFIFO_BCLK1ALL 0xf6300020 | 3802 | #define F0900_TSFIFO_DISTS2PAR 0xf6300040 |
3596 | #define F0900_MUXSTREAM_OUTMODE 0xf6300008 | 3803 | #define F0900_MUXSTREAM_OUTMODE 0xf6300008 |
3597 | #define F0900_TSFIFO_PERMPARAL 0xf6300006 | 3804 | #define F0900_TSFIFO_PERMPARAL 0xf6300006 |
3598 | #define F0900_RST_REEDSOLO 0xf6300001 | ||
3599 | 3805 | ||
3600 | /*TSGENERAL1X*/ | 3806 | /*TSGENERAL1X*/ |
3601 | #define R0900_TSGENERAL1X 0xf670 | 3807 | #define R0900_TSGENERAL1X 0xf670 |
3602 | #define F0900_TSFIFO1X_BCLK1ALL 0xf6700020 | ||
3603 | #define F0900_MUXSTREAM1X_OUTMODE 0xf6700008 | ||
3604 | #define F0900_TSFIFO1X_PERMPARAL 0xf6700006 | ||
3605 | #define F0900_RST1X_REEDSOLO 0xf6700001 | ||
3606 | 3808 | ||
3607 | /*NBITER_NF4*/ | 3809 | /*NBITER_NF4*/ |
3608 | #define R0900_NBITER_NF4 0xfa03 | 3810 | #define R0900_NBITER_NF4 0xfa03 |
3609 | #define F0900_NBITER_NF_QP_1_2 0xfa0300ff | 3811 | #define F0900_NBITER_NF_QP_1_2 0xfa0300ff |
3610 | 3812 | ||
3611 | /*NBITER_NF5*/ | 3813 | /*NBITER_NF5*/ |
3612 | #define R0900_NBITER_NF5 0xfa04 | 3814 | #define R0900_NBITER_NF5 0xfa04 |
3613 | #define F0900_NBITER_NF_QP_3_5 0xfa0400ff | 3815 | #define F0900_NBITER_NF_QP_3_5 0xfa0400ff |
3614 | 3816 | ||
3615 | /*NBITER_NF6*/ | 3817 | /*NBITER_NF6*/ |
3616 | #define R0900_NBITER_NF6 0xfa05 | 3818 | #define R0900_NBITER_NF6 0xfa05 |
3617 | #define F0900_NBITER_NF_QP_2_3 0xfa0500ff | 3819 | #define F0900_NBITER_NF_QP_2_3 0xfa0500ff |
3618 | 3820 | ||
3619 | /*NBITER_NF7*/ | 3821 | /*NBITER_NF7*/ |
3620 | #define R0900_NBITER_NF7 0xfa06 | 3822 | #define R0900_NBITER_NF7 0xfa06 |
3621 | #define F0900_NBITER_NF_QP_3_4 0xfa0600ff | 3823 | #define F0900_NBITER_NF_QP_3_4 0xfa0600ff |
3622 | 3824 | ||
3623 | /*NBITER_NF8*/ | 3825 | /*NBITER_NF8*/ |
3624 | #define R0900_NBITER_NF8 0xfa07 | 3826 | #define R0900_NBITER_NF8 0xfa07 |
3625 | #define F0900_NBITER_NF_QP_4_5 0xfa0700ff | 3827 | #define F0900_NBITER_NF_QP_4_5 0xfa0700ff |
3626 | 3828 | ||
3627 | /*NBITER_NF9*/ | 3829 | /*NBITER_NF9*/ |
3628 | #define R0900_NBITER_NF9 0xfa08 | 3830 | #define R0900_NBITER_NF9 0xfa08 |
3629 | #define F0900_NBITER_NF_QP_5_6 0xfa0800ff | 3831 | #define F0900_NBITER_NF_QP_5_6 0xfa0800ff |
3630 | 3832 | ||
3631 | /*NBITER_NF10*/ | 3833 | /*NBITER_NF10*/ |
3632 | #define R0900_NBITER_NF10 0xfa09 | 3834 | #define R0900_NBITER_NF10 0xfa09 |
3633 | #define F0900_NBITER_NF_QP_8_9 0xfa0900ff | 3835 | #define F0900_NBITER_NF_QP_8_9 0xfa0900ff |
3634 | 3836 | ||
3635 | /*NBITER_NF11*/ | 3837 | /*NBITER_NF11*/ |
3636 | #define R0900_NBITER_NF11 0xfa0a | 3838 | #define R0900_NBITER_NF11 0xfa0a |
3637 | #define F0900_NBITER_NF_QP_9_10 0xfa0a00ff | 3839 | #define F0900_NBITER_NF_QP_9_10 0xfa0a00ff |
3638 | 3840 | ||
3639 | /*NBITER_NF12*/ | 3841 | /*NBITER_NF12*/ |
3640 | #define R0900_NBITER_NF12 0xfa0b | 3842 | #define R0900_NBITER_NF12 0xfa0b |
3641 | #define F0900_NBITER_NF_8P_3_5 0xfa0b00ff | 3843 | #define F0900_NBITER_NF_8P_3_5 0xfa0b00ff |
3642 | 3844 | ||
3643 | /*NBITER_NF13*/ | 3845 | /*NBITER_NF13*/ |
3644 | #define R0900_NBITER_NF13 0xfa0c | 3846 | #define R0900_NBITER_NF13 0xfa0c |
3645 | #define F0900_NBITER_NF_8P_2_3 0xfa0c00ff | 3847 | #define F0900_NBITER_NF_8P_2_3 0xfa0c00ff |
3646 | 3848 | ||
3647 | /*NBITER_NF14*/ | 3849 | /*NBITER_NF14*/ |
3648 | #define R0900_NBITER_NF14 0xfa0d | 3850 | #define R0900_NBITER_NF14 0xfa0d |
3649 | #define F0900_NBITER_NF_8P_3_4 0xfa0d00ff | 3851 | #define F0900_NBITER_NF_8P_3_4 0xfa0d00ff |
3650 | 3852 | ||
3651 | /*NBITER_NF15*/ | 3853 | /*NBITER_NF15*/ |
3652 | #define R0900_NBITER_NF15 0xfa0e | 3854 | #define R0900_NBITER_NF15 0xfa0e |
3653 | #define F0900_NBITER_NF_8P_5_6 0xfa0e00ff | 3855 | #define F0900_NBITER_NF_8P_5_6 0xfa0e00ff |
3654 | 3856 | ||
3655 | /*NBITER_NF16*/ | 3857 | /*NBITER_NF16*/ |
3656 | #define R0900_NBITER_NF16 0xfa0f | 3858 | #define R0900_NBITER_NF16 0xfa0f |
3657 | #define F0900_NBITER_NF_8P_8_9 0xfa0f00ff | 3859 | #define F0900_NBITER_NF_8P_8_9 0xfa0f00ff |
3658 | 3860 | ||
3659 | /*NBITER_NF17*/ | 3861 | /*NBITER_NF17*/ |
3660 | #define R0900_NBITER_NF17 0xfa10 | 3862 | #define R0900_NBITER_NF17 0xfa10 |
3661 | #define F0900_NBITER_NF_8P_9_10 0xfa1000ff | 3863 | #define F0900_NBITER_NF_8P_9_10 0xfa1000ff |
3662 | 3864 | ||
3663 | /*NBITERNOERR*/ | 3865 | /*NBITERNOERR*/ |
3664 | #define R0900_NBITERNOERR 0xfa3f | 3866 | #define R0900_NBITERNOERR 0xfa3f |
3665 | #define F0900_NBITER_STOP_CRIT 0xfa3f000f | 3867 | #define F0900_NBITER_STOP_CRIT 0xfa3f000f |
3666 | 3868 | ||
3667 | /*GAINLLR_NF4*/ | 3869 | /*GAINLLR_NF4*/ |
3668 | #define R0900_GAINLLR_NF4 0xfa43 | 3870 | #define R0900_GAINLLR_NF4 0xfa43 |
3669 | #define F0900_GAINLLR_NF_QP_1_2 0xfa43007f | 3871 | #define F0900_GAINLLR_NF_QP_1_2 0xfa43007f |
3670 | 3872 | ||
3671 | /*GAINLLR_NF5*/ | 3873 | /*GAINLLR_NF5*/ |
3672 | #define R0900_GAINLLR_NF5 0xfa44 | 3874 | #define R0900_GAINLLR_NF5 0xfa44 |
3673 | #define F0900_GAINLLR_NF_QP_3_5 0xfa44007f | 3875 | #define F0900_GAINLLR_NF_QP_3_5 0xfa44007f |
3674 | 3876 | ||
3675 | /*GAINLLR_NF6*/ | 3877 | /*GAINLLR_NF6*/ |
3676 | #define R0900_GAINLLR_NF6 0xfa45 | 3878 | #define R0900_GAINLLR_NF6 0xfa45 |
3677 | #define F0900_GAINLLR_NF_QP_2_3 0xfa45007f | 3879 | #define F0900_GAINLLR_NF_QP_2_3 0xfa45007f |
3678 | 3880 | ||
3679 | /*GAINLLR_NF7*/ | 3881 | /*GAINLLR_NF7*/ |
3680 | #define R0900_GAINLLR_NF7 0xfa46 | 3882 | #define R0900_GAINLLR_NF7 0xfa46 |
3681 | #define F0900_GAINLLR_NF_QP_3_4 0xfa46007f | 3883 | #define F0900_GAINLLR_NF_QP_3_4 0xfa46007f |
3682 | 3884 | ||
3683 | /*GAINLLR_NF8*/ | 3885 | /*GAINLLR_NF8*/ |
3684 | #define R0900_GAINLLR_NF8 0xfa47 | 3886 | #define R0900_GAINLLR_NF8 0xfa47 |
3685 | #define F0900_GAINLLR_NF_QP_4_5 0xfa47007f | 3887 | #define F0900_GAINLLR_NF_QP_4_5 0xfa47007f |
3686 | 3888 | ||
3687 | /*GAINLLR_NF9*/ | 3889 | /*GAINLLR_NF9*/ |
3688 | #define R0900_GAINLLR_NF9 0xfa48 | 3890 | #define R0900_GAINLLR_NF9 0xfa48 |
3689 | #define F0900_GAINLLR_NF_QP_5_6 0xfa48007f | 3891 | #define F0900_GAINLLR_NF_QP_5_6 0xfa48007f |
3690 | 3892 | ||
3691 | /*GAINLLR_NF10*/ | 3893 | /*GAINLLR_NF10*/ |
3692 | #define R0900_GAINLLR_NF10 0xfa49 | 3894 | #define R0900_GAINLLR_NF10 0xfa49 |
3693 | #define F0900_GAINLLR_NF_QP_8_9 0xfa49007f | 3895 | #define F0900_GAINLLR_NF_QP_8_9 0xfa49007f |
3694 | 3896 | ||
3695 | /*GAINLLR_NF11*/ | 3897 | /*GAINLLR_NF11*/ |
3696 | #define R0900_GAINLLR_NF11 0xfa4a | 3898 | #define R0900_GAINLLR_NF11 0xfa4a |
3697 | #define F0900_GAINLLR_NF_QP_9_10 0xfa4a007f | 3899 | #define F0900_GAINLLR_NF_QP_9_10 0xfa4a007f |
3698 | 3900 | ||
3699 | /*GAINLLR_NF12*/ | 3901 | /*GAINLLR_NF12*/ |
3700 | #define R0900_GAINLLR_NF12 0xfa4b | 3902 | #define R0900_GAINLLR_NF12 0xfa4b |
3701 | #define F0900_GAINLLR_NF_8P_3_5 0xfa4b007f | 3903 | #define F0900_GAINLLR_NF_8P_3_5 0xfa4b007f |
3702 | 3904 | ||
3703 | /*GAINLLR_NF13*/ | 3905 | /*GAINLLR_NF13*/ |
3704 | #define R0900_GAINLLR_NF13 0xfa4c | 3906 | #define R0900_GAINLLR_NF13 0xfa4c |
3705 | #define F0900_GAINLLR_NF_8P_2_3 0xfa4c007f | 3907 | #define F0900_GAINLLR_NF_8P_2_3 0xfa4c007f |
3706 | 3908 | ||
3707 | /*GAINLLR_NF14*/ | 3909 | /*GAINLLR_NF14*/ |
3708 | #define R0900_GAINLLR_NF14 0xfa4d | 3910 | #define R0900_GAINLLR_NF14 0xfa4d |
3709 | #define F0900_GAINLLR_NF_8P_3_4 0xfa4d007f | 3911 | #define F0900_GAINLLR_NF_8P_3_4 0xfa4d007f |
3710 | 3912 | ||
3711 | /*GAINLLR_NF15*/ | 3913 | /*GAINLLR_NF15*/ |
3712 | #define R0900_GAINLLR_NF15 0xfa4e | 3914 | #define R0900_GAINLLR_NF15 0xfa4e |
3713 | #define F0900_GAINLLR_NF_8P_5_6 0xfa4e007f | 3915 | #define F0900_GAINLLR_NF_8P_5_6 0xfa4e007f |
3714 | 3916 | ||
3715 | /*GAINLLR_NF16*/ | 3917 | /*GAINLLR_NF16*/ |
3716 | #define R0900_GAINLLR_NF16 0xfa4f | 3918 | #define R0900_GAINLLR_NF16 0xfa4f |
3717 | #define F0900_GAINLLR_NF_8P_8_9 0xfa4f007f | 3919 | #define F0900_GAINLLR_NF_8P_8_9 0xfa4f007f |
3718 | 3920 | ||
3719 | /*GAINLLR_NF17*/ | 3921 | /*GAINLLR_NF17*/ |
3720 | #define R0900_GAINLLR_NF17 0xfa50 | 3922 | #define R0900_GAINLLR_NF17 0xfa50 |
3721 | #define F0900_GAINLLR_NF_8P_9_10 0xfa50007f | 3923 | #define F0900_GAINLLR_NF_8P_9_10 0xfa50007f |
3722 | 3924 | ||
3723 | /*CFGEXT*/ | 3925 | /*CFGEXT*/ |
3724 | #define R0900_CFGEXT 0xfa80 | 3926 | #define R0900_CFGEXT 0xfa80 |
3725 | #define F0900_STAGMODE 0xfa800080 | 3927 | #define F0900_STAGMODE 0xfa800080 |
3726 | #define F0900_BYPBCH 0xfa800040 | 3928 | #define F0900_BYPBCH 0xfa800040 |
3727 | #define F0900_BYPLDPC 0xfa800020 | 3929 | #define F0900_BYPLDPC 0xfa800020 |
3728 | #define F0900_LDPCMODE 0xfa800010 | 3930 | #define F0900_LDPCMODE 0xfa800010 |
3729 | #define F0900_INVLLRSIGN 0xfa800008 | 3931 | #define F0900_INVLLRSIGN 0xfa800008 |
3730 | #define F0900_SHORTMULT 0xfa800004 | 3932 | #define F0900_SHORTMULT 0xfa800004 |
3731 | #define F0900_EXTERNTX 0xfa800001 | 3933 | #define F0900_EXTERNTX 0xfa800001 |
3732 | 3934 | ||
3733 | /*GENCFG*/ | 3935 | /*GENCFG*/ |
3734 | #define R0900_GENCFG 0xfa86 | 3936 | #define R0900_GENCFG 0xfa86 |
3735 | #define F0900_BROADCAST 0xfa860010 | 3937 | #define F0900_BROADCAST 0xfa860010 |
3736 | #define F0900_NOSHFRD2 0xfa860008 | 3938 | #define F0900_PRIORITY 0xfa860002 |
3737 | #define F0900_BCHERRFLAG 0xfa860004 | 3939 | #define F0900_DDEMOD 0xfa860001 |
3738 | #define F0900_PRIORITY 0xfa860002 | ||
3739 | #define F0900_DDEMOD 0xfa860001 | ||
3740 | 3940 | ||
3741 | /*LDPCERR1*/ | 3941 | /*LDPCERR1*/ |
3742 | #define R0900_LDPCERR1 0xfa96 | 3942 | #define R0900_LDPCERR1 0xfa96 |
3743 | #define F0900_LDPC_ERRORS_COUNTER1 0xfa9600ff | 3943 | #define F0900_LDPC_ERRORS_COUNTER1 0xfa9600ff |
3744 | 3944 | ||
3745 | /*LDPCERR0*/ | 3945 | /*LDPCERR0*/ |
3746 | #define R0900_LDPCERR0 0xfa97 | 3946 | #define R0900_LDPCERR0 0xfa97 |
3747 | #define F0900_LDPC_ERRORS_COUNTER0 0xfa9700ff | 3947 | #define F0900_LDPC_ERRORS_COUNTER0 0xfa9700ff |
3748 | 3948 | ||
3749 | /*BCHERR*/ | 3949 | /*BCHERR*/ |
3750 | #define R0900_BCHERR 0xfa98 | 3950 | #define R0900_BCHERR 0xfa98 |
3751 | #define F0900_ERRORFLAG 0xfa980010 | 3951 | #define F0900_ERRORFLAG 0xfa980010 |
3752 | #define F0900_BCH_ERRORS_COUNTER 0xfa98000f | 3952 | #define F0900_BCH_ERRORS_COUNTER 0xfa98000f |
3753 | 3953 | ||
3754 | /*TSTRES0*/ | 3954 | /*TSTRES0*/ |
3755 | #define R0900_TSTRES0 0xff11 | 3955 | #define R0900_TSTRES0 0xff11 |
3756 | #define F0900_FRESFEC 0xff110080 | 3956 | #define F0900_FRESFEC 0xff110080 |
3757 | #define F0900_FRESTS 0xff110040 | 3957 | |
3758 | #define F0900_FRESVIT1 0xff110020 | 3958 | /*P2_TCTL4*/ |
3759 | #define F0900_FRESVIT2 0xff110010 | 3959 | #define R0900_P2_TCTL4 0xff28 |
3760 | #define F0900_FRESSYM1 0xff110008 | 3960 | #define F0900_P2_PN4_SELECT 0xff280020 |
3761 | #define F0900_FRESSYM2 0xff110004 | 3961 | |
3762 | #define F0900_FRESMAS 0xff110002 | 3962 | /*P1_TCTL4*/ |
3763 | #define F0900_FRESINT 0xff110001 | 3963 | #define R0900_P1_TCTL4 0xff48 |
3964 | #define TCTL4 shiftx(R0900_P1_TCTL4, demod, 0x20) | ||
3965 | #define F0900_P1_PN4_SELECT 0xff480020 | ||
3764 | 3966 | ||
3765 | /*P2_TSTDISRX*/ | 3967 | /*P2_TSTDISRX*/ |
3766 | #define R0900_P2_TSTDISRX 0xff65 | 3968 | #define R0900_P2_TSTDISRX 0xff65 |
3767 | #define F0900_P2_EN_DISRX 0xff650080 | 3969 | #define F0900_P2_PIN_SELECT1 0xff650008 |
3768 | #define F0900_P2_TST_CURRSRC 0xff650040 | ||
3769 | #define F0900_P2_IN_DIGSIGNAL 0xff650020 | ||
3770 | #define F0900_P2_HIZ_CURRENTSRC 0xff650010 | ||
3771 | #define F0900_TST_P2_PIN_SELECT 0xff650008 | ||
3772 | #define F0900_P2_TST_DISRX 0xff650007 | ||
3773 | 3970 | ||
3774 | /*P1_TSTDISRX*/ | 3971 | /*P1_TSTDISRX*/ |
3775 | #define R0900_P1_TSTDISRX 0xff67 | 3972 | #define R0900_P1_TSTDISRX 0xff67 |
3776 | #define F0900_P1_EN_DISRX 0xff670080 | 3973 | #define TSTDISRX shiftx(R0900_P1_TSTDISRX, demod, 2) |
3777 | #define F0900_P1_TST_CURRSRC 0xff670040 | 3974 | #define F0900_P1_PIN_SELECT1 0xff670008 |
3778 | #define F0900_P1_IN_DIGSIGNAL 0xff670020 | 3975 | #define PIN_SELECT1 shiftx(F0900_P1_PIN_SELECT1, demod, 0x20000) |
3779 | #define F0900_P1_HIZ_CURRENTSRC 0xff670010 | 3976 | |
3780 | #define F0900_TST_P1_PIN_SELECT 0xff670008 | 3977 | #define STV0900_NBREGS 723 |
3781 | #define F0900_P1_TST_DISRX 0xff670007 | 3978 | #define STV0900_NBFIELDS 1420 |
3782 | |||
3783 | #define STV0900_NBREGS 684 | ||
3784 | #define STV0900_NBFIELDS 1702 | ||
3785 | 3979 | ||
3786 | #endif | 3980 | #endif |
3787 | 3981 | ||
diff --git a/drivers/media/dvb/frontends/stv0900_sw.c b/drivers/media/dvb/frontends/stv0900_sw.c index 962fde1437ce..ba0709b2d433 100644 --- a/drivers/media/dvb/frontends/stv0900_sw.c +++ b/drivers/media/dvb/frontends/stv0900_sw.c | |||
@@ -27,56 +27,45 @@ | |||
27 | #include "stv0900_reg.h" | 27 | #include "stv0900_reg.h" |
28 | #include "stv0900_priv.h" | 28 | #include "stv0900_priv.h" |
29 | 29 | ||
30 | int stv0900_check_signal_presence(struct stv0900_internal *i_params, | 30 | s32 shiftx(s32 x, int demod, s32 shift) |
31 | { | ||
32 | if (demod == 1) | ||
33 | return x - shift; | ||
34 | |||
35 | return x; | ||
36 | } | ||
37 | |||
38 | int stv0900_check_signal_presence(struct stv0900_internal *intp, | ||
31 | enum fe_stv0900_demod_num demod) | 39 | enum fe_stv0900_demod_num demod) |
32 | { | 40 | { |
33 | s32 carr_offset, | 41 | s32 carr_offset, |
34 | agc2_integr, | 42 | agc2_integr, |
35 | max_carrier; | 43 | max_carrier; |
36 | 44 | ||
37 | int no_signal; | 45 | int no_signal = FALSE; |
38 | 46 | ||
39 | switch (demod) { | 47 | carr_offset = (stv0900_read_reg(intp, CFR2) << 8) |
40 | case STV0900_DEMOD_1: | 48 | | stv0900_read_reg(intp, CFR1); |
41 | default: | 49 | carr_offset = ge2comp(carr_offset, 16); |
42 | carr_offset = (stv0900_read_reg(i_params, R0900_P1_CFR2) << 8) | 50 | agc2_integr = (stv0900_read_reg(intp, AGC2I1) << 8) |
43 | | stv0900_read_reg(i_params, | 51 | | stv0900_read_reg(intp, AGC2I0); |
44 | R0900_P1_CFR1); | 52 | max_carrier = intp->srch_range[demod] / 1000; |
45 | carr_offset = ge2comp(carr_offset, 16); | ||
46 | agc2_integr = (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8) | ||
47 | | stv0900_read_reg(i_params, | ||
48 | R0900_P1_AGC2I0); | ||
49 | max_carrier = i_params->dmd1_srch_range / 1000; | ||
50 | break; | ||
51 | case STV0900_DEMOD_2: | ||
52 | carr_offset = (stv0900_read_reg(i_params, R0900_P2_CFR2) << 8) | ||
53 | | stv0900_read_reg(i_params, | ||
54 | R0900_P2_CFR1); | ||
55 | carr_offset = ge2comp(carr_offset, 16); | ||
56 | agc2_integr = (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8) | ||
57 | | stv0900_read_reg(i_params, | ||
58 | R0900_P2_AGC2I0); | ||
59 | max_carrier = i_params->dmd2_srch_range / 1000; | ||
60 | break; | ||
61 | } | ||
62 | 53 | ||
63 | max_carrier += (max_carrier / 10); | 54 | max_carrier += (max_carrier / 10); |
64 | max_carrier = 65536 * (max_carrier / 2); | 55 | max_carrier = 65536 * (max_carrier / 2); |
65 | max_carrier /= i_params->mclk / 1000; | 56 | max_carrier /= intp->mclk / 1000; |
66 | if (max_carrier > 0x4000) | 57 | if (max_carrier > 0x4000) |
67 | max_carrier = 0x4000; | 58 | max_carrier = 0x4000; |
68 | 59 | ||
69 | if ((agc2_integr > 0x2000) | 60 | if ((agc2_integr > 0x2000) |
70 | || (carr_offset > + 2*max_carrier) | 61 | || (carr_offset > (2 * max_carrier)) |
71 | || (carr_offset < -2*max_carrier)) | 62 | || (carr_offset < (-2 * max_carrier))) |
72 | no_signal = TRUE; | 63 | no_signal = TRUE; |
73 | else | ||
74 | no_signal = FALSE; | ||
75 | 64 | ||
76 | return no_signal; | 65 | return no_signal; |
77 | } | 66 | } |
78 | 67 | ||
79 | static void stv0900_get_sw_loop_params(struct stv0900_internal *i_params, | 68 | static void stv0900_get_sw_loop_params(struct stv0900_internal *intp, |
80 | s32 *frequency_inc, s32 *sw_timeout, | 69 | s32 *frequency_inc, s32 *sw_timeout, |
81 | s32 *steps, | 70 | s32 *steps, |
82 | enum fe_stv0900_demod_num demod) | 71 | enum fe_stv0900_demod_num demod) |
@@ -85,30 +74,19 @@ static void stv0900_get_sw_loop_params(struct stv0900_internal *i_params, | |||
85 | 74 | ||
86 | enum fe_stv0900_search_standard standard; | 75 | enum fe_stv0900_search_standard standard; |
87 | 76 | ||
88 | switch (demod) { | 77 | srate = intp->symbol_rate[demod]; |
89 | case STV0900_DEMOD_1: | 78 | max_carrier = intp->srch_range[demod] / 1000; |
90 | default: | 79 | max_carrier += max_carrier / 10; |
91 | srate = i_params->dmd1_symbol_rate; | 80 | standard = intp->srch_standard[demod]; |
92 | max_carrier = i_params->dmd1_srch_range / 1000; | ||
93 | max_carrier += max_carrier / 10; | ||
94 | standard = i_params->dmd1_srch_standard; | ||
95 | break; | ||
96 | case STV0900_DEMOD_2: | ||
97 | srate = i_params->dmd2_symbol_rate; | ||
98 | max_carrier = i_params->dmd2_srch_range / 1000; | ||
99 | max_carrier += max_carrier / 10; | ||
100 | standard = i_params->dmd2_srch_stndrd; | ||
101 | break; | ||
102 | } | ||
103 | 81 | ||
104 | max_carrier = 65536 * (max_carrier / 2); | 82 | max_carrier = 65536 * (max_carrier / 2); |
105 | max_carrier /= i_params->mclk / 1000; | 83 | max_carrier /= intp->mclk / 1000; |
106 | 84 | ||
107 | if (max_carrier > 0x4000) | 85 | if (max_carrier > 0x4000) |
108 | max_carrier = 0x4000; | 86 | max_carrier = 0x4000; |
109 | 87 | ||
110 | freq_inc = srate; | 88 | freq_inc = srate; |
111 | freq_inc /= i_params->mclk >> 10; | 89 | freq_inc /= intp->mclk >> 10; |
112 | freq_inc = freq_inc << 6; | 90 | freq_inc = freq_inc << 6; |
113 | 91 | ||
114 | switch (standard) { | 92 | switch (standard) { |
@@ -154,7 +132,7 @@ static void stv0900_get_sw_loop_params(struct stv0900_internal *i_params, | |||
154 | 132 | ||
155 | } | 133 | } |
156 | 134 | ||
157 | static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params, | 135 | static int stv0900_search_carr_sw_loop(struct stv0900_internal *intp, |
158 | s32 FreqIncr, s32 Timeout, int zigzag, | 136 | s32 FreqIncr, s32 Timeout, int zigzag, |
159 | s32 MaxStep, enum fe_stv0900_demod_num demod) | 137 | s32 MaxStep, enum fe_stv0900_demod_num demod) |
160 | { | 138 | { |
@@ -164,20 +142,11 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params, | |||
164 | freqOffset, | 142 | freqOffset, |
165 | max_carrier; | 143 | max_carrier; |
166 | 144 | ||
167 | switch (demod) { | 145 | max_carrier = intp->srch_range[demod] / 1000; |
168 | case STV0900_DEMOD_1: | 146 | max_carrier += (max_carrier / 10); |
169 | default: | ||
170 | max_carrier = i_params->dmd1_srch_range / 1000; | ||
171 | max_carrier += (max_carrier / 10); | ||
172 | break; | ||
173 | case STV0900_DEMOD_2: | ||
174 | max_carrier = i_params->dmd2_srch_range / 1000; | ||
175 | max_carrier += (max_carrier / 10); | ||
176 | break; | ||
177 | } | ||
178 | 147 | ||
179 | max_carrier = 65536 * (max_carrier / 2); | 148 | max_carrier = 65536 * (max_carrier / 2); |
180 | max_carrier /= i_params->mclk / 1000; | 149 | max_carrier /= intp->mclk / 1000; |
181 | 150 | ||
182 | if (max_carrier > 0x4000) | 151 | if (max_carrier > 0x4000) |
183 | max_carrier = 0x4000; | 152 | max_carrier = 0x4000; |
@@ -190,40 +159,15 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params, | |||
190 | stepCpt = 0; | 159 | stepCpt = 0; |
191 | 160 | ||
192 | do { | 161 | do { |
193 | switch (demod) { | 162 | stv0900_write_reg(intp, DMDISTATE, 0x1c); |
194 | case STV0900_DEMOD_1: | 163 | stv0900_write_reg(intp, CFRINIT1, (freqOffset / 256) & 0xff); |
195 | default: | 164 | stv0900_write_reg(intp, CFRINIT0, freqOffset & 0xff); |
196 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C); | 165 | stv0900_write_reg(intp, DMDISTATE, 0x18); |
197 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, | 166 | stv0900_write_bits(intp, ALGOSWRST, 1); |
198 | (freqOffset / 256) & 0xFF); | 167 | |
199 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, | 168 | if (intp->chip_id == 0x12) { |
200 | freqOffset & 0xFF); | 169 | stv0900_write_bits(intp, RST_HWARE, 1); |
201 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); | 170 | stv0900_write_bits(intp, RST_HWARE, 0); |
202 | stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 1); | ||
203 | |||
204 | if (i_params->chip_id == 0x12) { | ||
205 | stv0900_write_bits(i_params, | ||
206 | F0900_P1_RST_HWARE, 1); | ||
207 | stv0900_write_bits(i_params, | ||
208 | F0900_P1_RST_HWARE, 0); | ||
209 | } | ||
210 | break; | ||
211 | case STV0900_DEMOD_2: | ||
212 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C); | ||
213 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, | ||
214 | (freqOffset / 256) & 0xFF); | ||
215 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, | ||
216 | freqOffset & 0xFF); | ||
217 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); | ||
218 | stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 1); | ||
219 | |||
220 | if (i_params->chip_id == 0x12) { | ||
221 | stv0900_write_bits(i_params, | ||
222 | F0900_P2_RST_HWARE, 1); | ||
223 | stv0900_write_bits(i_params, | ||
224 | F0900_P2_RST_HWARE, 0); | ||
225 | } | ||
226 | break; | ||
227 | } | 171 | } |
228 | 172 | ||
229 | if (zigzag == TRUE) { | 173 | if (zigzag == TRUE) { |
@@ -235,8 +179,8 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params, | |||
235 | freqOffset += + 2 * FreqIncr; | 179 | freqOffset += + 2 * FreqIncr; |
236 | 180 | ||
237 | stepCpt++; | 181 | stepCpt++; |
238 | lock = stv0900_get_demod_lock(i_params, demod, Timeout); | 182 | lock = stv0900_get_demod_lock(intp, demod, Timeout); |
239 | no_signal = stv0900_check_signal_presence(i_params, demod); | 183 | no_signal = stv0900_check_signal_presence(intp, demod); |
240 | 184 | ||
241 | } while ((lock == FALSE) | 185 | } while ((lock == FALSE) |
242 | && (no_signal == FALSE) | 186 | && (no_signal == FALSE) |
@@ -244,269 +188,138 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params, | |||
244 | && ((freqOffset + FreqIncr) > -max_carrier) | 188 | && ((freqOffset + FreqIncr) > -max_carrier) |
245 | && (stepCpt < MaxStep)); | 189 | && (stepCpt < MaxStep)); |
246 | 190 | ||
247 | switch (demod) { | 191 | stv0900_write_bits(intp, ALGOSWRST, 0); |
248 | case STV0900_DEMOD_1: | ||
249 | default: | ||
250 | stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 0); | ||
251 | break; | ||
252 | case STV0900_DEMOD_2: | ||
253 | stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 0); | ||
254 | break; | ||
255 | } | ||
256 | 192 | ||
257 | return lock; | 193 | return lock; |
258 | } | 194 | } |
259 | 195 | ||
260 | int stv0900_sw_algo(struct stv0900_internal *i_params, | 196 | static int stv0900_sw_algo(struct stv0900_internal *intp, |
261 | enum fe_stv0900_demod_num demod) | 197 | enum fe_stv0900_demod_num demod) |
262 | { | 198 | { |
263 | int lock = FALSE; | 199 | int lock = FALSE, |
264 | 200 | no_signal, | |
265 | int no_signal, | 201 | zigzag; |
266 | zigzag; | 202 | s32 s2fw, |
267 | s32 dvbs2_fly_wheel; | 203 | fqc_inc, |
268 | 204 | sft_stp_tout, | |
269 | s32 freqIncrement, softStepTimeout, trialCounter, max_steps; | 205 | trial_cntr, |
270 | 206 | max_steps; | |
271 | stv0900_get_sw_loop_params(i_params, &freqIncrement, &softStepTimeout, | 207 | |
208 | stv0900_get_sw_loop_params(intp, &fqc_inc, &sft_stp_tout, | ||
272 | &max_steps, demod); | 209 | &max_steps, demod); |
273 | switch (demod) { | 210 | switch (intp->srch_standard[demod]) { |
274 | case STV0900_DEMOD_1: | 211 | case STV0900_SEARCH_DVBS1: |
275 | default: | 212 | case STV0900_SEARCH_DSS: |
276 | switch (i_params->dmd1_srch_standard) { | 213 | if (intp->chip_id >= 0x20) |
277 | case STV0900_SEARCH_DVBS1: | 214 | stv0900_write_reg(intp, CARFREQ, 0x3b); |
278 | case STV0900_SEARCH_DSS: | 215 | else |
279 | if (i_params->chip_id >= 0x20) | 216 | stv0900_write_reg(intp, CARFREQ, 0xef); |
280 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, | ||
281 | 0x3B); | ||
282 | else | ||
283 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, | ||
284 | 0xef); | ||
285 | |||
286 | stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 0x49); | ||
287 | zigzag = FALSE; | ||
288 | break; | ||
289 | case STV0900_SEARCH_DVBS2: | ||
290 | if (i_params->chip_id >= 0x20) | ||
291 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, | ||
292 | 0x79); | ||
293 | else | ||
294 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, | ||
295 | 0x68); | ||
296 | 217 | ||
297 | stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, | 218 | stv0900_write_reg(intp, DMDCFGMD, 0x49); |
298 | 0x89); | 219 | zigzag = FALSE; |
220 | break; | ||
221 | case STV0900_SEARCH_DVBS2: | ||
222 | if (intp->chip_id >= 0x20) | ||
223 | stv0900_write_reg(intp, CORRELABS, 0x79); | ||
224 | else | ||
225 | stv0900_write_reg(intp, CORRELABS, 0x68); | ||
299 | 226 | ||
300 | zigzag = TRUE; | 227 | stv0900_write_reg(intp, DMDCFGMD, 0x89); |
301 | break; | ||
302 | case STV0900_AUTO_SEARCH: | ||
303 | default: | ||
304 | if (i_params->chip_id >= 0x20) { | ||
305 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, | ||
306 | 0x3B); | ||
307 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, | ||
308 | 0x79); | ||
309 | } else { | ||
310 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, | ||
311 | 0xef); | ||
312 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, | ||
313 | 0x68); | ||
314 | } | ||
315 | 228 | ||
316 | stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, | 229 | zigzag = TRUE; |
317 | 0xc9); | 230 | break; |
318 | zigzag = FALSE; | 231 | case STV0900_AUTO_SEARCH: |
319 | break; | 232 | default: |
233 | if (intp->chip_id >= 0x20) { | ||
234 | stv0900_write_reg(intp, CARFREQ, 0x3b); | ||
235 | stv0900_write_reg(intp, CORRELABS, 0x79); | ||
236 | } else { | ||
237 | stv0900_write_reg(intp, CARFREQ, 0xef); | ||
238 | stv0900_write_reg(intp, CORRELABS, 0x68); | ||
320 | } | 239 | } |
321 | 240 | ||
322 | trialCounter = 0; | 241 | stv0900_write_reg(intp, DMDCFGMD, 0xc9); |
323 | do { | 242 | zigzag = FALSE; |
324 | lock = stv0900_search_carr_sw_loop(i_params, | ||
325 | freqIncrement, | ||
326 | softStepTimeout, | ||
327 | zigzag, | ||
328 | max_steps, | ||
329 | demod); | ||
330 | no_signal = stv0900_check_signal_presence(i_params, | ||
331 | demod); | ||
332 | trialCounter++; | ||
333 | if ((lock == TRUE) | ||
334 | || (no_signal == TRUE) | ||
335 | || (trialCounter == 2)) { | ||
336 | |||
337 | if (i_params->chip_id >= 0x20) { | ||
338 | stv0900_write_reg(i_params, | ||
339 | R0900_P1_CARFREQ, | ||
340 | 0x49); | ||
341 | stv0900_write_reg(i_params, | ||
342 | R0900_P1_CORRELABS, | ||
343 | 0x9e); | ||
344 | } else { | ||
345 | stv0900_write_reg(i_params, | ||
346 | R0900_P1_CARFREQ, | ||
347 | 0xed); | ||
348 | stv0900_write_reg(i_params, | ||
349 | R0900_P1_CORRELABS, | ||
350 | 0x88); | ||
351 | } | ||
352 | |||
353 | if ((lock == TRUE) && (stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS2_FOUND)) { | ||
354 | msleep(softStepTimeout); | ||
355 | dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P1_FLYWHEEL_CPT); | ||
356 | |||
357 | if (dvbs2_fly_wheel < 0xd) { | ||
358 | msleep(softStepTimeout); | ||
359 | dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P1_FLYWHEEL_CPT); | ||
360 | } | ||
361 | |||
362 | if (dvbs2_fly_wheel < 0xd) { | ||
363 | lock = FALSE; | ||
364 | |||
365 | if (trialCounter < 2) { | ||
366 | if (i_params->chip_id >= 0x20) | ||
367 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x79); | ||
368 | else | ||
369 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x68); | ||
370 | |||
371 | stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 0x89); | ||
372 | } | ||
373 | } | ||
374 | } | ||
375 | } | ||
376 | |||
377 | } while ((lock == FALSE) | ||
378 | && (trialCounter < 2) | ||
379 | && (no_signal == FALSE)); | ||
380 | |||
381 | break; | 243 | break; |
382 | case STV0900_DEMOD_2: | 244 | } |
383 | switch (i_params->dmd2_srch_stndrd) { | ||
384 | case STV0900_SEARCH_DVBS1: | ||
385 | case STV0900_SEARCH_DSS: | ||
386 | if (i_params->chip_id >= 0x20) | ||
387 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, | ||
388 | 0x3b); | ||
389 | else | ||
390 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, | ||
391 | 0xef); | ||
392 | |||
393 | stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, | ||
394 | 0x49); | ||
395 | zigzag = FALSE; | ||
396 | break; | ||
397 | case STV0900_SEARCH_DVBS2: | ||
398 | if (i_params->chip_id >= 0x20) | ||
399 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, | ||
400 | 0x79); | ||
401 | else | ||
402 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, | ||
403 | 0x68); | ||
404 | 245 | ||
405 | stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0x89); | 246 | trial_cntr = 0; |
406 | zigzag = TRUE; | 247 | do { |
407 | break; | 248 | lock = stv0900_search_carr_sw_loop(intp, |
408 | case STV0900_AUTO_SEARCH: | 249 | fqc_inc, |
409 | default: | 250 | sft_stp_tout, |
410 | if (i_params->chip_id >= 0x20) { | 251 | zigzag, |
411 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, | 252 | max_steps, |
412 | 0x3b); | 253 | demod); |
413 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, | 254 | no_signal = stv0900_check_signal_presence(intp, demod); |
414 | 0x79); | 255 | trial_cntr++; |
256 | if ((lock == TRUE) | ||
257 | || (no_signal == TRUE) | ||
258 | || (trial_cntr == 2)) { | ||
259 | |||
260 | if (intp->chip_id >= 0x20) { | ||
261 | stv0900_write_reg(intp, CARFREQ, 0x49); | ||
262 | stv0900_write_reg(intp, CORRELABS, 0x9e); | ||
415 | } else { | 263 | } else { |
416 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, | 264 | stv0900_write_reg(intp, CARFREQ, 0xed); |
417 | 0xef); | 265 | stv0900_write_reg(intp, CORRELABS, 0x88); |
418 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, | ||
419 | 0x68); | ||
420 | } | 266 | } |
421 | 267 | ||
422 | stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0xc9); | 268 | if ((stv0900_get_bits(intp, HEADER_MODE) == |
423 | 269 | STV0900_DVBS2_FOUND) && | |
424 | zigzag = FALSE; | 270 | (lock == TRUE)) { |
425 | break; | 271 | msleep(sft_stp_tout); |
426 | } | 272 | s2fw = stv0900_get_bits(intp, FLYWHEEL_CPT); |
427 | |||
428 | trialCounter = 0; | ||
429 | 273 | ||
430 | do { | 274 | if (s2fw < 0xd) { |
431 | lock = stv0900_search_carr_sw_loop(i_params, | 275 | msleep(sft_stp_tout); |
432 | freqIncrement, | 276 | s2fw = stv0900_get_bits(intp, |
433 | softStepTimeout, | 277 | FLYWHEEL_CPT); |
434 | zigzag, | ||
435 | max_steps, | ||
436 | demod); | ||
437 | no_signal = stv0900_check_signal_presence(i_params, | ||
438 | demod); | ||
439 | trialCounter++; | ||
440 | if ((lock == TRUE) | ||
441 | || (no_signal == TRUE) | ||
442 | || (trialCounter == 2)) { | ||
443 | if (i_params->chip_id >= 0x20) { | ||
444 | stv0900_write_reg(i_params, | ||
445 | R0900_P2_CARFREQ, | ||
446 | 0x49); | ||
447 | stv0900_write_reg(i_params, | ||
448 | R0900_P2_CORRELABS, | ||
449 | 0x9e); | ||
450 | } else { | ||
451 | stv0900_write_reg(i_params, | ||
452 | R0900_P2_CARFREQ, | ||
453 | 0xed); | ||
454 | stv0900_write_reg(i_params, | ||
455 | R0900_P2_CORRELABS, | ||
456 | 0x88); | ||
457 | } | 278 | } |
458 | 279 | ||
459 | if ((lock == TRUE) && (stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS2_FOUND)) { | 280 | if (s2fw < 0xd) { |
460 | msleep(softStepTimeout); | 281 | lock = FALSE; |
461 | dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P2_FLYWHEEL_CPT); | ||
462 | if (dvbs2_fly_wheel < 0xd) { | ||
463 | msleep(softStepTimeout); | ||
464 | dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P2_FLYWHEEL_CPT); | ||
465 | } | ||
466 | 282 | ||
467 | if (dvbs2_fly_wheel < 0xd) { | 283 | if (trial_cntr < 2) { |
468 | lock = FALSE; | 284 | if (intp->chip_id >= 0x20) |
469 | if (trialCounter < 2) { | 285 | stv0900_write_reg(intp, |
470 | if (i_params->chip_id >= 0x20) | 286 | CORRELABS, |
471 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x79); | 287 | 0x79); |
472 | else | 288 | else |
473 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x68); | 289 | stv0900_write_reg(intp, |
290 | CORRELABS, | ||
291 | 0x68); | ||
474 | 292 | ||
475 | stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0x89); | 293 | stv0900_write_reg(intp, |
476 | } | 294 | DMDCFGMD, |
295 | 0x89); | ||
477 | } | 296 | } |
478 | } | 297 | } |
479 | } | 298 | } |
299 | } | ||
480 | 300 | ||
481 | } while ((lock == FALSE) && (trialCounter < 2) && (no_signal == FALSE)); | 301 | } while ((lock == FALSE) |
482 | 302 | && (trial_cntr < 2) | |
483 | break; | 303 | && (no_signal == FALSE)); |
484 | } | ||
485 | 304 | ||
486 | return lock; | 305 | return lock; |
487 | } | 306 | } |
488 | 307 | ||
489 | static u32 stv0900_get_symbol_rate(struct stv0900_internal *i_params, | 308 | static u32 stv0900_get_symbol_rate(struct stv0900_internal *intp, |
490 | u32 mclk, | 309 | u32 mclk, |
491 | enum fe_stv0900_demod_num demod) | 310 | enum fe_stv0900_demod_num demod) |
492 | { | 311 | { |
493 | s32 sfr_field3, sfr_field2, sfr_field1, sfr_field0, | 312 | s32 rem1, rem2, intval1, intval2, srate; |
494 | rem1, rem2, intval1, intval2, srate; | 313 | |
495 | 314 | srate = (stv0900_get_bits(intp, SYMB_FREQ3) << 24) + | |
496 | dmd_reg(sfr_field3, F0900_P1_SYMB_FREQ3, F0900_P2_SYMB_FREQ3); | 315 | (stv0900_get_bits(intp, SYMB_FREQ2) << 16) + |
497 | dmd_reg(sfr_field2, F0900_P1_SYMB_FREQ2, F0900_P2_SYMB_FREQ2); | 316 | (stv0900_get_bits(intp, SYMB_FREQ1) << 8) + |
498 | dmd_reg(sfr_field1, F0900_P1_SYMB_FREQ1, F0900_P2_SYMB_FREQ1); | 317 | (stv0900_get_bits(intp, SYMB_FREQ0)); |
499 | dmd_reg(sfr_field0, F0900_P1_SYMB_FREQ0, F0900_P2_SYMB_FREQ0); | ||
500 | |||
501 | srate = (stv0900_get_bits(i_params, sfr_field3) << 24) + | ||
502 | (stv0900_get_bits(i_params, sfr_field2) << 16) + | ||
503 | (stv0900_get_bits(i_params, sfr_field1) << 8) + | ||
504 | (stv0900_get_bits(i_params, sfr_field0)); | ||
505 | dprintk("lock: srate=%d r0=0x%x r1=0x%x r2=0x%x r3=0x%x \n", | 318 | dprintk("lock: srate=%d r0=0x%x r1=0x%x r2=0x%x r3=0x%x \n", |
506 | srate, stv0900_get_bits(i_params, sfr_field0), | 319 | srate, stv0900_get_bits(intp, SYMB_FREQ0), |
507 | stv0900_get_bits(i_params, sfr_field1), | 320 | stv0900_get_bits(intp, SYMB_FREQ1), |
508 | stv0900_get_bits(i_params, sfr_field2), | 321 | stv0900_get_bits(intp, SYMB_FREQ2), |
509 | stv0900_get_bits(i_params, sfr_field3)); | 322 | stv0900_get_bits(intp, SYMB_FREQ3)); |
510 | 323 | ||
511 | intval1 = (mclk) >> 16; | 324 | intval1 = (mclk) >> 16; |
512 | intval2 = (srate) >> 16; | 325 | intval2 = (srate) >> 16; |
@@ -520,18 +333,15 @@ static u32 stv0900_get_symbol_rate(struct stv0900_internal *i_params, | |||
520 | return srate; | 333 | return srate; |
521 | } | 334 | } |
522 | 335 | ||
523 | static void stv0900_set_symbol_rate(struct stv0900_internal *i_params, | 336 | static void stv0900_set_symbol_rate(struct stv0900_internal *intp, |
524 | u32 mclk, u32 srate, | 337 | u32 mclk, u32 srate, |
525 | enum fe_stv0900_demod_num demod) | 338 | enum fe_stv0900_demod_num demod) |
526 | { | 339 | { |
527 | s32 sfr_init_reg; | ||
528 | u32 symb; | 340 | u32 symb; |
529 | 341 | ||
530 | dprintk(KERN_INFO "%s: Mclk %d, SR %d, Dmd %d\n", __func__, mclk, | 342 | dprintk("%s: Mclk %d, SR %d, Dmd %d\n", __func__, mclk, |
531 | srate, demod); | 343 | srate, demod); |
532 | 344 | ||
533 | dmd_reg(sfr_init_reg, R0900_P1_SFRINIT1, R0900_P2_SFRINIT1); | ||
534 | |||
535 | if (srate > 60000000) { | 345 | if (srate > 60000000) { |
536 | symb = srate << 4; | 346 | symb = srate << 4; |
537 | symb /= (mclk >> 12); | 347 | symb /= (mclk >> 12); |
@@ -543,19 +353,16 @@ static void stv0900_set_symbol_rate(struct stv0900_internal *i_params, | |||
543 | symb /= (mclk >> 7); | 353 | symb /= (mclk >> 7); |
544 | } | 354 | } |
545 | 355 | ||
546 | stv0900_write_reg(i_params, sfr_init_reg, (symb >> 8) & 0x7F); | 356 | stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0x7f); |
547 | stv0900_write_reg(i_params, sfr_init_reg + 1, (symb & 0xFF)); | 357 | stv0900_write_reg(intp, SFRINIT1 + 1, (symb & 0xff)); |
548 | } | 358 | } |
549 | 359 | ||
550 | static void stv0900_set_max_symbol_rate(struct stv0900_internal *i_params, | 360 | static void stv0900_set_max_symbol_rate(struct stv0900_internal *intp, |
551 | u32 mclk, u32 srate, | 361 | u32 mclk, u32 srate, |
552 | enum fe_stv0900_demod_num demod) | 362 | enum fe_stv0900_demod_num demod) |
553 | { | 363 | { |
554 | s32 sfr_max_reg; | ||
555 | u32 symb; | 364 | u32 symb; |
556 | 365 | ||
557 | dmd_reg(sfr_max_reg, R0900_P1_SFRUP1, R0900_P2_SFRUP1); | ||
558 | |||
559 | srate = 105 * (srate / 100); | 366 | srate = 105 * (srate / 100); |
560 | 367 | ||
561 | if (srate > 60000000) { | 368 | if (srate > 60000000) { |
@@ -570,23 +377,20 @@ static void stv0900_set_max_symbol_rate(struct stv0900_internal *i_params, | |||
570 | } | 377 | } |
571 | 378 | ||
572 | if (symb < 0x7fff) { | 379 | if (symb < 0x7fff) { |
573 | stv0900_write_reg(i_params, sfr_max_reg, (symb >> 8) & 0x7F); | 380 | stv0900_write_reg(intp, SFRUP1, (symb >> 8) & 0x7f); |
574 | stv0900_write_reg(i_params, sfr_max_reg + 1, (symb & 0xFF)); | 381 | stv0900_write_reg(intp, SFRUP1 + 1, (symb & 0xff)); |
575 | } else { | 382 | } else { |
576 | stv0900_write_reg(i_params, sfr_max_reg, 0x7F); | 383 | stv0900_write_reg(intp, SFRUP1, 0x7f); |
577 | stv0900_write_reg(i_params, sfr_max_reg + 1, 0xFF); | 384 | stv0900_write_reg(intp, SFRUP1 + 1, 0xff); |
578 | } | 385 | } |
579 | } | 386 | } |
580 | 387 | ||
581 | static void stv0900_set_min_symbol_rate(struct stv0900_internal *i_params, | 388 | static void stv0900_set_min_symbol_rate(struct stv0900_internal *intp, |
582 | u32 mclk, u32 srate, | 389 | u32 mclk, u32 srate, |
583 | enum fe_stv0900_demod_num demod) | 390 | enum fe_stv0900_demod_num demod) |
584 | { | 391 | { |
585 | s32 sfr_min_reg; | ||
586 | u32 symb; | 392 | u32 symb; |
587 | 393 | ||
588 | dmd_reg(sfr_min_reg, R0900_P1_SFRLOW1, R0900_P2_SFRLOW1); | ||
589 | |||
590 | srate = 95 * (srate / 100); | 394 | srate = 95 * (srate / 100); |
591 | if (srate > 60000000) { | 395 | if (srate > 60000000) { |
592 | symb = srate << 4; | 396 | symb = srate << 4; |
@@ -601,22 +405,20 @@ static void stv0900_set_min_symbol_rate(struct stv0900_internal *i_params, | |||
601 | symb /= (mclk >> 7); | 405 | symb /= (mclk >> 7); |
602 | } | 406 | } |
603 | 407 | ||
604 | stv0900_write_reg(i_params, sfr_min_reg, (symb >> 8) & 0xFF); | 408 | stv0900_write_reg(intp, SFRLOW1, (symb >> 8) & 0xff); |
605 | stv0900_write_reg(i_params, sfr_min_reg + 1, (symb & 0xFF)); | 409 | stv0900_write_reg(intp, SFRLOW1 + 1, (symb & 0xff)); |
606 | } | 410 | } |
607 | 411 | ||
608 | static s32 stv0900_get_timing_offst(struct stv0900_internal *i_params, | 412 | static s32 stv0900_get_timing_offst(struct stv0900_internal *intp, |
609 | u32 srate, | 413 | u32 srate, |
610 | enum fe_stv0900_demod_num demod) | 414 | enum fe_stv0900_demod_num demod) |
611 | { | 415 | { |
612 | s32 tmgreg, | 416 | s32 timingoffset; |
613 | timingoffset; | ||
614 | 417 | ||
615 | dmd_reg(tmgreg, R0900_P1_TMGREG2, R0900_P2_TMGREG2); | ||
616 | 418 | ||
617 | timingoffset = (stv0900_read_reg(i_params, tmgreg) << 16) + | 419 | timingoffset = (stv0900_read_reg(intp, TMGREG2) << 16) + |
618 | (stv0900_read_reg(i_params, tmgreg + 1) << 8) + | 420 | (stv0900_read_reg(intp, TMGREG2 + 1) << 8) + |
619 | (stv0900_read_reg(i_params, tmgreg + 2)); | 421 | (stv0900_read_reg(intp, TMGREG2 + 2)); |
620 | 422 | ||
621 | timingoffset = ge2comp(timingoffset, 24); | 423 | timingoffset = ge2comp(timingoffset, 24); |
622 | 424 | ||
@@ -630,22 +432,19 @@ static s32 stv0900_get_timing_offst(struct stv0900_internal *i_params, | |||
630 | return timingoffset; | 432 | return timingoffset; |
631 | } | 433 | } |
632 | 434 | ||
633 | static void stv0900_set_dvbs2_rolloff(struct stv0900_internal *i_params, | 435 | static void stv0900_set_dvbs2_rolloff(struct stv0900_internal *intp, |
634 | enum fe_stv0900_demod_num demod) | 436 | enum fe_stv0900_demod_num demod) |
635 | { | 437 | { |
636 | s32 rolloff, man_fld, matstr_reg, rolloff_ctl_fld; | 438 | s32 rolloff; |
637 | 439 | ||
638 | dmd_reg(man_fld, F0900_P1_MANUAL_ROLLOFF, F0900_P2_MANUAL_ROLLOFF); | 440 | if (intp->chip_id == 0x10) { |
639 | dmd_reg(matstr_reg, R0900_P1_MATSTR1, R0900_P2_MATSTR1); | 441 | stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1); |
640 | dmd_reg(rolloff_ctl_fld, F0900_P1_ROLLOFF_CONTROL, | 442 | rolloff = stv0900_read_reg(intp, MATSTR1) & 0x03; |
641 | F0900_P2_ROLLOFF_CONTROL); | 443 | stv0900_write_bits(intp, ROLLOFF_CONTROL, rolloff); |
642 | 444 | } else if (intp->chip_id <= 0x20) | |
643 | if (i_params->chip_id == 0x10) { | 445 | stv0900_write_bits(intp, MANUALSX_ROLLOFF, 0); |
644 | stv0900_write_bits(i_params, man_fld, 1); | 446 | else /* cut 3.0 */ |
645 | rolloff = stv0900_read_reg(i_params, matstr_reg) & 0x03; | 447 | stv0900_write_bits(intp, MANUALS2_ROLLOFF, 0); |
646 | stv0900_write_bits(i_params, rolloff_ctl_fld, rolloff); | ||
647 | } else | ||
648 | stv0900_write_bits(i_params, man_fld, 0); | ||
649 | } | 448 | } |
650 | 449 | ||
651 | static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro) | 450 | static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro) |
@@ -668,84 +467,47 @@ static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro) | |||
668 | return srate + (srate * rolloff) / 100; | 467 | return srate + (srate * rolloff) / 100; |
669 | } | 468 | } |
670 | 469 | ||
671 | static int stv0900_check_timing_lock(struct stv0900_internal *i_params, | 470 | static int stv0900_check_timing_lock(struct stv0900_internal *intp, |
672 | enum fe_stv0900_demod_num demod) | 471 | enum fe_stv0900_demod_num demod) |
673 | { | 472 | { |
674 | int timingLock = FALSE; | 473 | int timingLock = FALSE; |
675 | s32 i, | 474 | s32 i, |
676 | timingcpt = 0; | 475 | timingcpt = 0; |
677 | u8 carFreq, | 476 | u8 car_freq, |
678 | tmgTHhigh, | 477 | tmg_th_high, |
679 | tmgTHLow; | 478 | tmg_th_low; |
680 | 479 | ||
681 | switch (demod) { | 480 | car_freq = stv0900_read_reg(intp, CARFREQ); |
682 | case STV0900_DEMOD_1: | 481 | tmg_th_high = stv0900_read_reg(intp, TMGTHRISE); |
683 | default: | 482 | tmg_th_low = stv0900_read_reg(intp, TMGTHFALL); |
684 | carFreq = stv0900_read_reg(i_params, R0900_P1_CARFREQ); | 483 | stv0900_write_reg(intp, TMGTHRISE, 0x20); |
685 | tmgTHhigh = stv0900_read_reg(i_params, R0900_P1_TMGTHRISE); | 484 | stv0900_write_reg(intp, TMGTHFALL, 0x0); |
686 | tmgTHLow = stv0900_read_reg(i_params, R0900_P1_TMGTHFALL); | 485 | stv0900_write_bits(intp, CFR_AUTOSCAN, 0); |
687 | stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0x20); | 486 | stv0900_write_reg(intp, RTC, 0x80); |
688 | stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0x0); | 487 | stv0900_write_reg(intp, RTCS2, 0x40); |
689 | stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); | 488 | stv0900_write_reg(intp, CARFREQ, 0x0); |
690 | stv0900_write_reg(i_params, R0900_P1_RTC, 0x80); | 489 | stv0900_write_reg(intp, CFRINIT1, 0x0); |
691 | stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x40); | 490 | stv0900_write_reg(intp, CFRINIT0, 0x0); |
692 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x0); | 491 | stv0900_write_reg(intp, AGC2REF, 0x65); |
693 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0x0); | 492 | stv0900_write_reg(intp, DMDISTATE, 0x18); |
694 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0x0); | 493 | msleep(7); |
695 | stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x65); | 494 | |
696 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); | 495 | for (i = 0; i < 10; i++) { |
697 | msleep(7); | 496 | if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2) |
698 | 497 | timingcpt++; | |
699 | for (i = 0; i < 10; i++) { | 498 | |
700 | if (stv0900_get_bits(i_params, F0900_P1_TMGLOCK_QUALITY) >= 2) | 499 | msleep(1); |
701 | timingcpt++; | 500 | } |
702 | |||
703 | msleep(1); | ||
704 | } | ||
705 | |||
706 | if (timingcpt >= 3) | ||
707 | timingLock = TRUE; | ||
708 | |||
709 | stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38); | ||
710 | stv0900_write_reg(i_params, R0900_P1_RTC, 0x88); | ||
711 | stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x68); | ||
712 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, carFreq); | ||
713 | stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, tmgTHhigh); | ||
714 | stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, tmgTHLow); | ||
715 | break; | ||
716 | case STV0900_DEMOD_2: | ||
717 | carFreq = stv0900_read_reg(i_params, R0900_P2_CARFREQ); | ||
718 | tmgTHhigh = stv0900_read_reg(i_params, R0900_P2_TMGTHRISE); | ||
719 | tmgTHLow = stv0900_read_reg(i_params, R0900_P2_TMGTHFALL); | ||
720 | stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0x20); | ||
721 | stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0); | ||
722 | stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); | ||
723 | stv0900_write_reg(i_params, R0900_P2_RTC, 0x80); | ||
724 | stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x40); | ||
725 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x0); | ||
726 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0x0); | ||
727 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0x0); | ||
728 | stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x65); | ||
729 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); | ||
730 | msleep(5); | ||
731 | for (i = 0; i < 10; i++) { | ||
732 | if (stv0900_get_bits(i_params, F0900_P2_TMGLOCK_QUALITY) >= 2) | ||
733 | timingcpt++; | ||
734 | 501 | ||
735 | msleep(1); | 502 | if (timingcpt >= 3) |
736 | } | 503 | timingLock = TRUE; |
737 | 504 | ||
738 | if (timingcpt >= 3) | 505 | stv0900_write_reg(intp, AGC2REF, 0x38); |
739 | timingLock = TRUE; | 506 | stv0900_write_reg(intp, RTC, 0x88); |
740 | 507 | stv0900_write_reg(intp, RTCS2, 0x68); | |
741 | stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38); | 508 | stv0900_write_reg(intp, CARFREQ, car_freq); |
742 | stv0900_write_reg(i_params, R0900_P2_RTC, 0x88); | 509 | stv0900_write_reg(intp, TMGTHRISE, tmg_th_high); |
743 | stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x68); | 510 | stv0900_write_reg(intp, TMGTHFALL, tmg_th_low); |
744 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, carFreq); | ||
745 | stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, tmgTHhigh); | ||
746 | stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, tmgTHLow); | ||
747 | break; | ||
748 | } | ||
749 | 511 | ||
750 | return timingLock; | 512 | return timingLock; |
751 | } | 513 | } |
@@ -754,142 +516,119 @@ static int stv0900_get_demod_cold_lock(struct dvb_frontend *fe, | |||
754 | s32 demod_timeout) | 516 | s32 demod_timeout) |
755 | { | 517 | { |
756 | struct stv0900_state *state = fe->demodulator_priv; | 518 | struct stv0900_state *state = fe->demodulator_priv; |
757 | struct stv0900_internal *i_params = state->internal; | 519 | struct stv0900_internal *intp = state->internal; |
758 | enum fe_stv0900_demod_num demod = state->demod; | 520 | enum fe_stv0900_demod_num demod = state->demod; |
521 | int lock = FALSE, | ||
522 | d = demod; | ||
523 | s32 srate, | ||
524 | search_range, | ||
525 | locktimeout, | ||
526 | currier_step, | ||
527 | nb_steps, | ||
528 | current_step, | ||
529 | direction, | ||
530 | tuner_freq, | ||
531 | timeout, | ||
532 | freq; | ||
759 | 533 | ||
760 | int lock = FALSE; | 534 | srate = intp->symbol_rate[d]; |
761 | s32 srate, search_range, locktimeout, | 535 | search_range = intp->srch_range[d]; |
762 | currier_step, nb_steps, current_step, | ||
763 | direction, tuner_freq, timeout; | ||
764 | |||
765 | switch (demod) { | ||
766 | case STV0900_DEMOD_1: | ||
767 | default: | ||
768 | srate = i_params->dmd1_symbol_rate; | ||
769 | search_range = i_params->dmd1_srch_range; | ||
770 | break; | ||
771 | |||
772 | case STV0900_DEMOD_2: | ||
773 | srate = i_params->dmd2_symbol_rate; | ||
774 | search_range = i_params->dmd2_srch_range; | ||
775 | break; | ||
776 | } | ||
777 | 536 | ||
778 | if (srate >= 10000000) | 537 | if (srate >= 10000000) |
779 | locktimeout = demod_timeout / 3; | 538 | locktimeout = demod_timeout / 3; |
780 | else | 539 | else |
781 | locktimeout = demod_timeout / 2; | 540 | locktimeout = demod_timeout / 2; |
782 | 541 | ||
783 | lock = stv0900_get_demod_lock(i_params, demod, locktimeout); | 542 | lock = stv0900_get_demod_lock(intp, d, locktimeout); |
784 | |||
785 | if (lock == FALSE) { | ||
786 | if (srate >= 10000000) { | ||
787 | if (stv0900_check_timing_lock(i_params, demod) == TRUE) { | ||
788 | switch (demod) { | ||
789 | case STV0900_DEMOD_1: | ||
790 | default: | ||
791 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f); | ||
792 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15); | ||
793 | break; | ||
794 | case STV0900_DEMOD_2: | ||
795 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f); | ||
796 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15); | ||
797 | break; | ||
798 | } | ||
799 | 543 | ||
800 | lock = stv0900_get_demod_lock(i_params, demod, demod_timeout); | 544 | if (lock != FALSE) |
801 | } else | 545 | return lock; |
802 | lock = FALSE; | 546 | |
803 | } else { | 547 | if (srate >= 10000000) { |
804 | if (srate <= 4000000) | 548 | if (stv0900_check_timing_lock(intp, d) == TRUE) { |
805 | currier_step = 1000; | 549 | stv0900_write_reg(intp, DMDISTATE, 0x1f); |
806 | else if (srate <= 7000000) | 550 | stv0900_write_reg(intp, DMDISTATE, 0x15); |
807 | currier_step = 2000; | 551 | lock = stv0900_get_demod_lock(intp, d, demod_timeout); |
808 | else if (srate <= 10000000) | 552 | } else |
809 | currier_step = 3000; | 553 | lock = FALSE; |
810 | else | 554 | |
811 | currier_step = 5000; | 555 | return lock; |
812 | 556 | } | |
813 | nb_steps = ((search_range / 1000) / currier_step); | 557 | |
814 | nb_steps /= 2; | 558 | if (intp->chip_id <= 0x20) { |
815 | nb_steps = (2 * (nb_steps + 1)); | 559 | if (srate <= 1000000) |
816 | if (nb_steps < 0) | 560 | currier_step = 500; |
817 | nb_steps = 2; | 561 | else if (srate <= 4000000) |
818 | else if (nb_steps > 12) | 562 | currier_step = 1000; |
819 | nb_steps = 12; | 563 | else if (srate <= 7000000) |
820 | 564 | currier_step = 2000; | |
821 | current_step = 1; | 565 | else if (srate <= 10000000) |
822 | direction = 1; | 566 | currier_step = 3000; |
567 | else | ||
568 | currier_step = 5000; | ||
569 | |||
570 | if (srate >= 2000000) { | ||
823 | timeout = (demod_timeout / 3); | 571 | timeout = (demod_timeout / 3); |
824 | if (timeout > 1000) | 572 | if (timeout > 1000) |
825 | timeout = 1000; | 573 | timeout = 1000; |
574 | } else | ||
575 | timeout = (demod_timeout / 2); | ||
576 | } else { | ||
577 | /*cut 3.0 */ | ||
578 | currier_step = srate / 4000; | ||
579 | timeout = (demod_timeout * 3) / 4; | ||
580 | } | ||
826 | 581 | ||
827 | switch (demod) { | 582 | nb_steps = ((search_range / 1000) / currier_step); |
828 | case STV0900_DEMOD_1: | ||
829 | default: | ||
830 | if (lock == FALSE) { | ||
831 | tuner_freq = i_params->tuner1_freq; | ||
832 | i_params->tuner1_bw = stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + i_params->dmd1_symbol_rate; | ||
833 | 583 | ||
834 | while ((current_step <= nb_steps) && (lock == FALSE)) { | 584 | if ((nb_steps % 2) != 0) |
585 | nb_steps += 1; | ||
835 | 586 | ||
836 | if (direction > 0) | 587 | if (nb_steps <= 0) |
837 | tuner_freq += (current_step * currier_step); | 588 | nb_steps = 2; |
838 | else | 589 | else if (nb_steps > 12) |
839 | tuner_freq -= (current_step * currier_step); | 590 | nb_steps = 12; |
840 | |||
841 | stv0900_set_tuner(fe, tuner_freq, i_params->tuner1_bw); | ||
842 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C); | ||
843 | if (i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS2) { | ||
844 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0); | ||
845 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0); | ||
846 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); | ||
847 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1); | ||
848 | } | ||
849 | |||
850 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0); | ||
851 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0); | ||
852 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F); | ||
853 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15); | ||
854 | lock = stv0900_get_demod_lock(i_params, demod, timeout); | ||
855 | direction *= -1; | ||
856 | current_step++; | ||
857 | } | ||
858 | } | ||
859 | break; | ||
860 | case STV0900_DEMOD_2: | ||
861 | if (lock == FALSE) { | ||
862 | tuner_freq = i_params->tuner2_freq; | ||
863 | i_params->tuner2_bw = stv0900_carrier_width(srate, i_params->rolloff) + srate; | ||
864 | 591 | ||
865 | while ((current_step <= nb_steps) && (lock == FALSE)) { | 592 | current_step = 1; |
593 | direction = 1; | ||
866 | 594 | ||
867 | if (direction > 0) | 595 | if (intp->chip_id <= 0x20) { |
868 | tuner_freq += (current_step * currier_step); | 596 | tuner_freq = intp->freq[d]; |
869 | else | 597 | intp->bw[d] = stv0900_carrier_width(intp->symbol_rate[d], |
870 | tuner_freq -= (current_step * currier_step); | 598 | intp->rolloff) + intp->symbol_rate[d]; |
871 | 599 | } else | |
872 | stv0900_set_tuner(fe, tuner_freq, i_params->tuner2_bw); | 600 | tuner_freq = 0; |
873 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C); | 601 | |
874 | if (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS2) { | 602 | while ((current_step <= nb_steps) && (lock == FALSE)) { |
875 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0); | 603 | if (direction > 0) |
876 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); | 604 | tuner_freq += (current_step * currier_step); |
877 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); | 605 | else |
878 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1); | 606 | tuner_freq -= (current_step * currier_step); |
879 | } | 607 | |
880 | 608 | if (intp->chip_id <= 0x20) { | |
881 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0); | 609 | if (intp->tuner_type[d] == 3) |
882 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0); | 610 | stv0900_set_tuner_auto(intp, tuner_freq, |
883 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); | 611 | intp->bw[d], demod); |
884 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15); | 612 | else |
885 | lock = stv0900_get_demod_lock(i_params, demod, timeout); | 613 | stv0900_set_tuner(fe, tuner_freq, intp->bw[d]); |
886 | direction *= -1; | 614 | |
887 | current_step++; | 615 | stv0900_write_reg(intp, DMDISTATE, 0x1c); |
888 | } | 616 | stv0900_write_reg(intp, CFRINIT1, 0); |
889 | } | 617 | stv0900_write_reg(intp, CFRINIT0, 0); |
890 | break; | 618 | stv0900_write_reg(intp, DMDISTATE, 0x1f); |
891 | } | 619 | stv0900_write_reg(intp, DMDISTATE, 0x15); |
620 | } else { | ||
621 | stv0900_write_reg(intp, DMDISTATE, 0x1c); | ||
622 | freq = (tuner_freq * 65536) / (intp->mclk / 1000); | ||
623 | stv0900_write_bits(intp, CFR_INIT1, MSB(freq)); | ||
624 | stv0900_write_bits(intp, CFR_INIT0, LSB(freq)); | ||
625 | stv0900_write_reg(intp, DMDISTATE, 0x1f); | ||
626 | stv0900_write_reg(intp, DMDISTATE, 0x05); | ||
892 | } | 627 | } |
628 | |||
629 | lock = stv0900_get_demod_lock(intp, d, timeout); | ||
630 | direction *= -1; | ||
631 | current_step++; | ||
893 | } | 632 | } |
894 | 633 | ||
895 | return lock; | 634 | return lock; |
@@ -931,9 +670,7 @@ static void stv0900_get_lock_timeout(s32 *demod_timeout, s32 *fec_timeout, | |||
931 | } else if (srate <= 20000000) { | 670 | } else if (srate <= 20000000) { |
932 | (*demod_timeout) = 400; | 671 | (*demod_timeout) = 400; |
933 | (*fec_timeout) = 130; | 672 | (*fec_timeout) = 130; |
934 | } | 673 | } else { |
935 | |||
936 | else { | ||
937 | (*demod_timeout) = 300; | 674 | (*demod_timeout) = 300; |
938 | (*fec_timeout) = 100; | 675 | (*fec_timeout) = 100; |
939 | } | 676 | } |
@@ -946,95 +683,77 @@ static void stv0900_get_lock_timeout(s32 *demod_timeout, s32 *fec_timeout, | |||
946 | (*demod_timeout) /= 2; | 683 | (*demod_timeout) /= 2; |
947 | } | 684 | } |
948 | 685 | ||
949 | static void stv0900_set_viterbi_tracq(struct stv0900_internal *i_params, | 686 | static void stv0900_set_viterbi_tracq(struct stv0900_internal *intp, |
950 | enum fe_stv0900_demod_num demod) | 687 | enum fe_stv0900_demod_num demod) |
951 | { | 688 | { |
952 | 689 | ||
953 | s32 vth_reg; | 690 | s32 vth_reg = VTH12; |
954 | 691 | ||
955 | dprintk(KERN_INFO "%s\n", __func__); | 692 | dprintk("%s\n", __func__); |
956 | 693 | ||
957 | dmd_reg(vth_reg, R0900_P1_VTH12, R0900_P2_VTH12); | 694 | stv0900_write_reg(intp, vth_reg++, 0xd0); |
958 | 695 | stv0900_write_reg(intp, vth_reg++, 0x7d); | |
959 | stv0900_write_reg(i_params, vth_reg++, 0xd0); | 696 | stv0900_write_reg(intp, vth_reg++, 0x53); |
960 | stv0900_write_reg(i_params, vth_reg++, 0x7d); | 697 | stv0900_write_reg(intp, vth_reg++, 0x2f); |
961 | stv0900_write_reg(i_params, vth_reg++, 0x53); | 698 | stv0900_write_reg(intp, vth_reg++, 0x24); |
962 | stv0900_write_reg(i_params, vth_reg++, 0x2F); | 699 | stv0900_write_reg(intp, vth_reg++, 0x1f); |
963 | stv0900_write_reg(i_params, vth_reg++, 0x24); | ||
964 | stv0900_write_reg(i_params, vth_reg++, 0x1F); | ||
965 | } | 700 | } |
966 | 701 | ||
967 | static void stv0900_set_viterbi_standard(struct stv0900_internal *i_params, | 702 | static void stv0900_set_viterbi_standard(struct stv0900_internal *intp, |
968 | enum fe_stv0900_search_standard Standard, | 703 | enum fe_stv0900_search_standard standard, |
969 | enum fe_stv0900_fec PunctureRate, | 704 | enum fe_stv0900_fec fec, |
970 | enum fe_stv0900_demod_num demod) | 705 | enum fe_stv0900_demod_num demod) |
971 | { | 706 | { |
707 | dprintk("%s: ViterbiStandard = ", __func__); | ||
972 | 708 | ||
973 | s32 fecmReg, | 709 | switch (standard) { |
974 | prvitReg; | ||
975 | |||
976 | dprintk(KERN_INFO "%s: ViterbiStandard = ", __func__); | ||
977 | |||
978 | switch (demod) { | ||
979 | case STV0900_DEMOD_1: | ||
980 | default: | ||
981 | fecmReg = R0900_P1_FECM; | ||
982 | prvitReg = R0900_P1_PRVIT; | ||
983 | break; | ||
984 | case STV0900_DEMOD_2: | ||
985 | fecmReg = R0900_P2_FECM; | ||
986 | prvitReg = R0900_P2_PRVIT; | ||
987 | break; | ||
988 | } | ||
989 | |||
990 | switch (Standard) { | ||
991 | case STV0900_AUTO_SEARCH: | 710 | case STV0900_AUTO_SEARCH: |
992 | dprintk("Auto\n"); | 711 | dprintk("Auto\n"); |
993 | stv0900_write_reg(i_params, fecmReg, 0x10); | 712 | stv0900_write_reg(intp, FECM, 0x10); |
994 | stv0900_write_reg(i_params, prvitReg, 0x3F); | 713 | stv0900_write_reg(intp, PRVIT, 0x3f); |
995 | break; | 714 | break; |
996 | case STV0900_SEARCH_DVBS1: | 715 | case STV0900_SEARCH_DVBS1: |
997 | dprintk("DVBS1\n"); | 716 | dprintk("DVBS1\n"); |
998 | stv0900_write_reg(i_params, fecmReg, 0x00); | 717 | stv0900_write_reg(intp, FECM, 0x00); |
999 | switch (PunctureRate) { | 718 | switch (fec) { |
1000 | case STV0900_FEC_UNKNOWN: | 719 | case STV0900_FEC_UNKNOWN: |
1001 | default: | 720 | default: |
1002 | stv0900_write_reg(i_params, prvitReg, 0x2F); | 721 | stv0900_write_reg(intp, PRVIT, 0x2f); |
1003 | break; | 722 | break; |
1004 | case STV0900_FEC_1_2: | 723 | case STV0900_FEC_1_2: |
1005 | stv0900_write_reg(i_params, prvitReg, 0x01); | 724 | stv0900_write_reg(intp, PRVIT, 0x01); |
1006 | break; | 725 | break; |
1007 | case STV0900_FEC_2_3: | 726 | case STV0900_FEC_2_3: |
1008 | stv0900_write_reg(i_params, prvitReg, 0x02); | 727 | stv0900_write_reg(intp, PRVIT, 0x02); |
1009 | break; | 728 | break; |
1010 | case STV0900_FEC_3_4: | 729 | case STV0900_FEC_3_4: |
1011 | stv0900_write_reg(i_params, prvitReg, 0x04); | 730 | stv0900_write_reg(intp, PRVIT, 0x04); |
1012 | break; | 731 | break; |
1013 | case STV0900_FEC_5_6: | 732 | case STV0900_FEC_5_6: |
1014 | stv0900_write_reg(i_params, prvitReg, 0x08); | 733 | stv0900_write_reg(intp, PRVIT, 0x08); |
1015 | break; | 734 | break; |
1016 | case STV0900_FEC_7_8: | 735 | case STV0900_FEC_7_8: |
1017 | stv0900_write_reg(i_params, prvitReg, 0x20); | 736 | stv0900_write_reg(intp, PRVIT, 0x20); |
1018 | break; | 737 | break; |
1019 | } | 738 | } |
1020 | 739 | ||
1021 | break; | 740 | break; |
1022 | case STV0900_SEARCH_DSS: | 741 | case STV0900_SEARCH_DSS: |
1023 | dprintk("DSS\n"); | 742 | dprintk("DSS\n"); |
1024 | stv0900_write_reg(i_params, fecmReg, 0x80); | 743 | stv0900_write_reg(intp, FECM, 0x80); |
1025 | switch (PunctureRate) { | 744 | switch (fec) { |
1026 | case STV0900_FEC_UNKNOWN: | 745 | case STV0900_FEC_UNKNOWN: |
1027 | default: | 746 | default: |
1028 | stv0900_write_reg(i_params, prvitReg, 0x13); | 747 | stv0900_write_reg(intp, PRVIT, 0x13); |
1029 | break; | 748 | break; |
1030 | case STV0900_FEC_1_2: | 749 | case STV0900_FEC_1_2: |
1031 | stv0900_write_reg(i_params, prvitReg, 0x01); | 750 | stv0900_write_reg(intp, PRVIT, 0x01); |
1032 | break; | 751 | break; |
1033 | case STV0900_FEC_2_3: | 752 | case STV0900_FEC_2_3: |
1034 | stv0900_write_reg(i_params, prvitReg, 0x02); | 753 | stv0900_write_reg(intp, PRVIT, 0x02); |
1035 | break; | 754 | break; |
1036 | case STV0900_FEC_6_7: | 755 | case STV0900_FEC_6_7: |
1037 | stv0900_write_reg(i_params, prvitReg, 0x10); | 756 | stv0900_write_reg(intp, PRVIT, 0x10); |
1038 | break; | 757 | break; |
1039 | } | 758 | } |
1040 | break; | 759 | break; |
@@ -1043,340 +762,285 @@ static void stv0900_set_viterbi_standard(struct stv0900_internal *i_params, | |||
1043 | } | 762 | } |
1044 | } | 763 | } |
1045 | 764 | ||
1046 | static void stv0900_track_optimization(struct dvb_frontend *fe) | 765 | static enum fe_stv0900_fec stv0900_get_vit_fec(struct stv0900_internal *intp, |
766 | enum fe_stv0900_demod_num demod) | ||
1047 | { | 767 | { |
1048 | struct stv0900_state *state = fe->demodulator_priv; | 768 | enum fe_stv0900_fec prate; |
1049 | struct stv0900_internal *i_params = state->internal; | 769 | s32 rate_fld = stv0900_get_bits(intp, VIT_CURPUN); |
1050 | enum fe_stv0900_demod_num demod = state->demod; | ||
1051 | 770 | ||
1052 | s32 srate, pilots, aclc, freq1, freq0, | 771 | switch (rate_fld) { |
1053 | i = 0, timed, timef, blindTunSw = 0; | 772 | case 13: |
773 | prate = STV0900_FEC_1_2; | ||
774 | break; | ||
775 | case 18: | ||
776 | prate = STV0900_FEC_2_3; | ||
777 | break; | ||
778 | case 21: | ||
779 | prate = STV0900_FEC_3_4; | ||
780 | break; | ||
781 | case 24: | ||
782 | prate = STV0900_FEC_5_6; | ||
783 | break; | ||
784 | case 25: | ||
785 | prate = STV0900_FEC_6_7; | ||
786 | break; | ||
787 | case 26: | ||
788 | prate = STV0900_FEC_7_8; | ||
789 | break; | ||
790 | default: | ||
791 | prate = STV0900_FEC_UNKNOWN; | ||
792 | break; | ||
793 | } | ||
1054 | 794 | ||
1055 | enum fe_stv0900_rolloff rolloff; | 795 | return prate; |
1056 | enum fe_stv0900_modcode foundModcod; | 796 | } |
1057 | 797 | ||
1058 | dprintk(KERN_INFO "%s\n", __func__); | 798 | static void stv0900_set_dvbs1_track_car_loop(struct stv0900_internal *intp, |
799 | enum fe_stv0900_demod_num demod, | ||
800 | u32 srate) | ||
801 | { | ||
802 | if (intp->chip_id >= 0x30) { | ||
803 | if (srate >= 15000000) { | ||
804 | stv0900_write_reg(intp, ACLC, 0x2b); | ||
805 | stv0900_write_reg(intp, BCLC, 0x1a); | ||
806 | } else if ((srate >= 7000000) && (15000000 > srate)) { | ||
807 | stv0900_write_reg(intp, ACLC, 0x0c); | ||
808 | stv0900_write_reg(intp, BCLC, 0x1b); | ||
809 | } else if (srate < 7000000) { | ||
810 | stv0900_write_reg(intp, ACLC, 0x2c); | ||
811 | stv0900_write_reg(intp, BCLC, 0x1c); | ||
812 | } | ||
1059 | 813 | ||
1060 | srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | 814 | } else { /*cut 2.0 and 1.x*/ |
1061 | srate += stv0900_get_timing_offst(i_params, srate, demod); | 815 | stv0900_write_reg(intp, ACLC, 0x1a); |
816 | stv0900_write_reg(intp, BCLC, 0x09); | ||
817 | } | ||
1062 | 818 | ||
1063 | switch (demod) { | 819 | } |
1064 | case STV0900_DEMOD_1: | ||
1065 | default: | ||
1066 | switch (i_params->dmd1_rslts.standard) { | ||
1067 | case STV0900_DVBS1_STANDARD: | ||
1068 | if (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH) { | ||
1069 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); | ||
1070 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0); | ||
1071 | } | ||
1072 | 820 | ||
1073 | stv0900_write_bits(i_params, F0900_P1_ROLLOFF_CONTROL, i_params->rolloff); | 821 | static void stv0900_track_optimization(struct dvb_frontend *fe) |
1074 | stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1); | 822 | { |
1075 | stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75); | 823 | struct stv0900_state *state = fe->demodulator_priv; |
1076 | break; | 824 | struct stv0900_internal *intp = state->internal; |
1077 | case STV0900_DSS_STANDARD: | 825 | enum fe_stv0900_demod_num demod = state->demod; |
1078 | if (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH) { | ||
1079 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); | ||
1080 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0); | ||
1081 | } | ||
1082 | 826 | ||
1083 | stv0900_write_bits(i_params, F0900_P1_ROLLOFF_CONTROL, i_params->rolloff); | 827 | s32 srate, |
1084 | stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1); | 828 | pilots, |
1085 | stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75); | 829 | aclc, |
1086 | break; | 830 | freq1, |
1087 | case STV0900_DVBS2_STANDARD: | 831 | freq0, |
1088 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0); | 832 | i = 0, |
1089 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1); | 833 | timed, |
1090 | stv0900_write_reg(i_params, R0900_P1_ACLC, 0); | 834 | timef, |
1091 | stv0900_write_reg(i_params, R0900_P1_BCLC, 0); | 835 | blind_tun_sw = 0, |
1092 | if (i_params->dmd1_rslts.frame_length == STV0900_LONG_FRAME) { | 836 | modulation; |
1093 | foundModcod = stv0900_get_bits(i_params, F0900_P1_DEMOD_MODCOD); | ||
1094 | pilots = stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE) & 0x01; | ||
1095 | aclc = stv0900_get_optim_carr_loop(srate, foundModcod, pilots, i_params->chip_id); | ||
1096 | if (foundModcod <= STV0900_QPSK_910) | ||
1097 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, aclc); | ||
1098 | else if (foundModcod <= STV0900_8PSK_910) { | ||
1099 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a); | ||
1100 | stv0900_write_reg(i_params, R0900_P1_ACLC2S28, aclc); | ||
1101 | } | ||
1102 | 837 | ||
1103 | if ((i_params->demod_mode == STV0900_SINGLE) && (foundModcod > STV0900_8PSK_910)) { | 838 | enum fe_stv0900_rolloff rolloff; |
1104 | if (foundModcod <= STV0900_16APSK_910) { | 839 | enum fe_stv0900_modcode foundModcod; |
1105 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a); | ||
1106 | stv0900_write_reg(i_params, R0900_P1_ACLC2S216A, aclc); | ||
1107 | } else if (foundModcod <= STV0900_32APSK_910) { | ||
1108 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a); | ||
1109 | stv0900_write_reg(i_params, R0900_P1_ACLC2S232A, aclc); | ||
1110 | } | ||
1111 | } | ||
1112 | 840 | ||
1113 | } else { | 841 | dprintk("%s\n", __func__); |
1114 | aclc = stv0900_get_optim_short_carr_loop(srate, i_params->dmd1_rslts.modulation, i_params->chip_id); | ||
1115 | if (i_params->dmd1_rslts.modulation == STV0900_QPSK) | ||
1116 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, aclc); | ||
1117 | |||
1118 | else if (i_params->dmd1_rslts.modulation == STV0900_8PSK) { | ||
1119 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a); | ||
1120 | stv0900_write_reg(i_params, R0900_P1_ACLC2S28, aclc); | ||
1121 | } else if (i_params->dmd1_rslts.modulation == STV0900_16APSK) { | ||
1122 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a); | ||
1123 | stv0900_write_reg(i_params, R0900_P1_ACLC2S216A, aclc); | ||
1124 | } else if (i_params->dmd1_rslts.modulation == STV0900_32APSK) { | ||
1125 | stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a); | ||
1126 | stv0900_write_reg(i_params, R0900_P1_ACLC2S232A, aclc); | ||
1127 | } | ||
1128 | 842 | ||
1129 | } | 843 | srate = stv0900_get_symbol_rate(intp, intp->mclk, demod); |
844 | srate += stv0900_get_timing_offst(intp, srate, demod); | ||
1130 | 845 | ||
1131 | if (i_params->chip_id <= 0x11) { | 846 | switch (intp->result[demod].standard) { |
1132 | if (i_params->demod_mode != STV0900_SINGLE) | 847 | case STV0900_DVBS1_STANDARD: |
1133 | stv0900_activate_s2_modcode(i_params, demod); | 848 | case STV0900_DSS_STANDARD: |
849 | dprintk("%s: found DVB-S or DSS\n", __func__); | ||
850 | if (intp->srch_standard[demod] == STV0900_AUTO_SEARCH) { | ||
851 | stv0900_write_bits(intp, DVBS1_ENABLE, 1); | ||
852 | stv0900_write_bits(intp, DVBS2_ENABLE, 0); | ||
853 | } | ||
1134 | 854 | ||
1135 | } | 855 | stv0900_write_bits(intp, ROLLOFF_CONTROL, intp->rolloff); |
856 | stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1); | ||
1136 | 857 | ||
1137 | stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x67); | 858 | if (intp->chip_id < 0x30) { |
1138 | break; | 859 | stv0900_write_reg(intp, ERRCTRL1, 0x75); |
1139 | case STV0900_UNKNOWN_STANDARD: | ||
1140 | default: | ||
1141 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); | ||
1142 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1); | ||
1143 | break; | 860 | break; |
1144 | } | 861 | } |
1145 | 862 | ||
1146 | freq1 = stv0900_read_reg(i_params, R0900_P1_CFR2); | 863 | if (stv0900_get_vit_fec(intp, demod) == STV0900_FEC_1_2) { |
1147 | freq0 = stv0900_read_reg(i_params, R0900_P1_CFR1); | 864 | stv0900_write_reg(intp, GAUSSR0, 0x98); |
1148 | rolloff = stv0900_get_bits(i_params, F0900_P1_ROLLOFF_STATUS); | 865 | stv0900_write_reg(intp, CCIR0, 0x18); |
1149 | if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) { | 866 | } else { |
1150 | stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x00); | 867 | stv0900_write_reg(intp, GAUSSR0, 0x18); |
1151 | stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 0); | 868 | stv0900_write_reg(intp, CCIR0, 0x18); |
1152 | stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); | ||
1153 | stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01); | ||
1154 | stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod); | ||
1155 | stv0900_set_max_symbol_rate(i_params, i_params->mclk, srate, demod); | ||
1156 | stv0900_set_min_symbol_rate(i_params, i_params->mclk, srate, demod); | ||
1157 | blindTunSw = 1; | ||
1158 | } | 869 | } |
1159 | 870 | ||
1160 | if (i_params->chip_id >= 0x20) { | 871 | stv0900_write_reg(intp, ERRCTRL1, 0x75); |
1161 | if ((i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS1) || (i_params->dmd1_srch_standard == STV0900_SEARCH_DSS) || (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH)) { | 872 | break; |
1162 | stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0a); | 873 | case STV0900_DVBS2_STANDARD: |
1163 | stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x0); | 874 | dprintk("%s: found DVB-S2\n", __func__); |
875 | stv0900_write_bits(intp, DVBS1_ENABLE, 0); | ||
876 | stv0900_write_bits(intp, DVBS2_ENABLE, 1); | ||
877 | stv0900_write_reg(intp, ACLC, 0); | ||
878 | stv0900_write_reg(intp, BCLC, 0); | ||
879 | if (intp->result[demod].frame_len == STV0900_LONG_FRAME) { | ||
880 | foundModcod = stv0900_get_bits(intp, DEMOD_MODCOD); | ||
881 | pilots = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01; | ||
882 | aclc = stv0900_get_optim_carr_loop(srate, | ||
883 | foundModcod, | ||
884 | pilots, | ||
885 | intp->chip_id); | ||
886 | if (foundModcod <= STV0900_QPSK_910) | ||
887 | stv0900_write_reg(intp, ACLC2S2Q, aclc); | ||
888 | else if (foundModcod <= STV0900_8PSK_910) { | ||
889 | stv0900_write_reg(intp, ACLC2S2Q, 0x2a); | ||
890 | stv0900_write_reg(intp, ACLC2S28, aclc); | ||
1164 | } | 891 | } |
1165 | } | ||
1166 | |||
1167 | if (i_params->chip_id < 0x20) | ||
1168 | stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x08); | ||
1169 | |||
1170 | if (i_params->chip_id == 0x10) | ||
1171 | stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0x0A); | ||
1172 | 892 | ||
1173 | stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38); | 893 | if ((intp->demod_mode == STV0900_SINGLE) && |
1174 | 894 | (foundModcod > STV0900_8PSK_910)) { | |
1175 | if ((i_params->chip_id >= 0x20) || (blindTunSw == 1) || (i_params->dmd1_symbol_rate < 10000000)) { | 895 | if (foundModcod <= STV0900_16APSK_910) { |
1176 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); | 896 | stv0900_write_reg(intp, ACLC2S2Q, 0x2a); |
1177 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); | 897 | stv0900_write_reg(intp, ACLC2S216A, |
1178 | i_params->tuner1_bw = stv0900_carrier_width(srate, i_params->rolloff) + 10000000; | 898 | aclc); |
1179 | 899 | } else if (foundModcod <= STV0900_32APSK_910) { | |
1180 | if ((i_params->chip_id >= 0x20) || (blindTunSw == 1)) { | 900 | stv0900_write_reg(intp, ACLC2S2Q, 0x2a); |
1181 | if (i_params->dmd1_srch_algo != STV0900_WARM_START) | 901 | stv0900_write_reg(intp, ACLC2S232A, |
1182 | stv0900_set_bandwidth(fe, i_params->tuner1_bw); | 902 | aclc); |
903 | } | ||
1183 | } | 904 | } |
1184 | 905 | ||
1185 | if ((i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd1_symbol_rate < 10000000)) | 906 | } else { |
1186 | msleep(50); | 907 | modulation = intp->result[demod].modulation; |
1187 | else | 908 | aclc = stv0900_get_optim_short_carr_loop(srate, |
1188 | msleep(5); | 909 | modulation, intp->chip_id); |
1189 | 910 | if (modulation == STV0900_QPSK) | |
1190 | stv0900_get_lock_timeout(&timed, &timef, srate, STV0900_WARM_START); | 911 | stv0900_write_reg(intp, ACLC2S2Q, aclc); |
1191 | 912 | else if (modulation == STV0900_8PSK) { | |
1192 | if (stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) { | 913 | stv0900_write_reg(intp, ACLC2S2Q, 0x2a); |
1193 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F); | 914 | stv0900_write_reg(intp, ACLC2S28, aclc); |
1194 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); | 915 | } else if (modulation == STV0900_16APSK) { |
1195 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); | 916 | stv0900_write_reg(intp, ACLC2S2Q, 0x2a); |
1196 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); | 917 | stv0900_write_reg(intp, ACLC2S216A, aclc); |
1197 | i = 0; | 918 | } else if (modulation == STV0900_32APSK) { |
1198 | while ((stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) && (i <= 2)) { | 919 | stv0900_write_reg(intp, ACLC2S2Q, 0x2a); |
1199 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F); | 920 | stv0900_write_reg(intp, ACLC2S232A, aclc); |
1200 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); | ||
1201 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); | ||
1202 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); | ||
1203 | i++; | ||
1204 | } | ||
1205 | } | 921 | } |
1206 | 922 | ||
1207 | } | 923 | } |
1208 | 924 | ||
1209 | if (i_params->chip_id >= 0x20) | 925 | if (intp->chip_id <= 0x11) { |
1210 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x49); | 926 | if (intp->demod_mode != STV0900_SINGLE) |
927 | stv0900_activate_s2_modcod(intp, demod); | ||
1211 | 928 | ||
1212 | if ((i_params->dmd1_rslts.standard == STV0900_DVBS1_STANDARD) || (i_params->dmd1_rslts.standard == STV0900_DSS_STANDARD)) | 929 | } |
1213 | stv0900_set_viterbi_tracq(i_params, demod); | ||
1214 | 930 | ||
931 | stv0900_write_reg(intp, ERRCTRL1, 0x67); | ||
1215 | break; | 932 | break; |
933 | case STV0900_UNKNOWN_STANDARD: | ||
934 | default: | ||
935 | dprintk("%s: found unknown standard\n", __func__); | ||
936 | stv0900_write_bits(intp, DVBS1_ENABLE, 1); | ||
937 | stv0900_write_bits(intp, DVBS2_ENABLE, 1); | ||
938 | break; | ||
939 | } | ||
1216 | 940 | ||
1217 | case STV0900_DEMOD_2: | 941 | freq1 = stv0900_read_reg(intp, CFR2); |
1218 | switch (i_params->dmd2_rslts.standard) { | 942 | freq0 = stv0900_read_reg(intp, CFR1); |
1219 | case STV0900_DVBS1_STANDARD: | 943 | rolloff = stv0900_get_bits(intp, ROLLOFF_STATUS); |
1220 | 944 | if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) { | |
1221 | if (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH) { | 945 | stv0900_write_reg(intp, SFRSTEP, 0x00); |
1222 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); | 946 | stv0900_write_bits(intp, SCAN_ENABLE, 0); |
1223 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); | 947 | stv0900_write_bits(intp, CFR_AUTOSCAN, 0); |
1224 | } | 948 | stv0900_write_reg(intp, TMGCFG2, 0xc1); |
1225 | 949 | stv0900_set_symbol_rate(intp, intp->mclk, srate, demod); | |
1226 | stv0900_write_bits(i_params, F0900_P2_ROLLOFF_CONTROL, i_params->rolloff); | 950 | blind_tun_sw = 1; |
1227 | stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1); | 951 | if (intp->result[demod].standard != STV0900_DVBS2_STANDARD) |
1228 | stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75); | 952 | stv0900_set_dvbs1_track_car_loop(intp, demod, srate); |
1229 | break; | ||
1230 | case STV0900_DSS_STANDARD: | ||
1231 | if (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH) { | ||
1232 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); | ||
1233 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); | ||
1234 | } | ||
1235 | |||
1236 | stv0900_write_bits(i_params, F0900_P2_ROLLOFF_CONTROL, i_params->rolloff); | ||
1237 | stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1); | ||
1238 | stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75); | ||
1239 | break; | ||
1240 | case STV0900_DVBS2_STANDARD: | ||
1241 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0); | ||
1242 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1); | ||
1243 | stv0900_write_reg(i_params, R0900_P2_ACLC, 0); | ||
1244 | stv0900_write_reg(i_params, R0900_P2_BCLC, 0); | ||
1245 | if (i_params->dmd2_rslts.frame_length == STV0900_LONG_FRAME) { | ||
1246 | foundModcod = stv0900_get_bits(i_params, F0900_P2_DEMOD_MODCOD); | ||
1247 | pilots = stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE) & 0x01; | ||
1248 | aclc = stv0900_get_optim_carr_loop(srate, foundModcod, pilots, i_params->chip_id); | ||
1249 | if (foundModcod <= STV0900_QPSK_910) | ||
1250 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, aclc); | ||
1251 | else if (foundModcod <= STV0900_8PSK_910) { | ||
1252 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a); | ||
1253 | stv0900_write_reg(i_params, R0900_P2_ACLC2S28, aclc); | ||
1254 | } | ||
1255 | 953 | ||
1256 | if ((i_params->demod_mode == STV0900_SINGLE) && (foundModcod > STV0900_8PSK_910)) { | 954 | } |
1257 | if (foundModcod <= STV0900_16APSK_910) { | ||
1258 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a); | ||
1259 | stv0900_write_reg(i_params, R0900_P2_ACLC2S216A, aclc); | ||
1260 | } else if (foundModcod <= STV0900_32APSK_910) { | ||
1261 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a); | ||
1262 | stv0900_write_reg(i_params, R0900_P2_ACLC2S232A, aclc); | ||
1263 | } | ||
1264 | 955 | ||
1265 | } | 956 | if (intp->chip_id >= 0x20) { |
957 | if ((intp->srch_standard[demod] == STV0900_SEARCH_DVBS1) || | ||
958 | (intp->srch_standard[demod] == | ||
959 | STV0900_SEARCH_DSS) || | ||
960 | (intp->srch_standard[demod] == | ||
961 | STV0900_AUTO_SEARCH)) { | ||
962 | stv0900_write_reg(intp, VAVSRVIT, 0x0a); | ||
963 | stv0900_write_reg(intp, VITSCALE, 0x0); | ||
964 | } | ||
965 | } | ||
1266 | 966 | ||
1267 | } else { | 967 | if (intp->chip_id < 0x20) |
1268 | aclc = stv0900_get_optim_short_carr_loop(srate, | 968 | stv0900_write_reg(intp, CARHDR, 0x08); |
1269 | i_params->dmd2_rslts.modulation, | ||
1270 | i_params->chip_id); | ||
1271 | |||
1272 | if (i_params->dmd2_rslts.modulation == STV0900_QPSK) | ||
1273 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, aclc); | ||
1274 | |||
1275 | else if (i_params->dmd2_rslts.modulation == STV0900_8PSK) { | ||
1276 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a); | ||
1277 | stv0900_write_reg(i_params, R0900_P2_ACLC2S28, aclc); | ||
1278 | } else if (i_params->dmd2_rslts.modulation == STV0900_16APSK) { | ||
1279 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a); | ||
1280 | stv0900_write_reg(i_params, R0900_P2_ACLC2S216A, aclc); | ||
1281 | } else if (i_params->dmd2_rslts.modulation == STV0900_32APSK) { | ||
1282 | stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a); | ||
1283 | stv0900_write_reg(i_params, R0900_P2_ACLC2S232A, aclc); | ||
1284 | } | ||
1285 | } | ||
1286 | 969 | ||
1287 | stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x67); | 970 | if (intp->chip_id == 0x10) |
971 | stv0900_write_reg(intp, CORRELEXP, 0x0a); | ||
1288 | 972 | ||
1289 | break; | 973 | stv0900_write_reg(intp, AGC2REF, 0x38); |
1290 | case STV0900_UNKNOWN_STANDARD: | ||
1291 | default: | ||
1292 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); | ||
1293 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1); | ||
1294 | break; | ||
1295 | } | ||
1296 | 974 | ||
1297 | freq1 = stv0900_read_reg(i_params, R0900_P2_CFR2); | 975 | if ((intp->chip_id >= 0x20) || |
1298 | freq0 = stv0900_read_reg(i_params, R0900_P2_CFR1); | 976 | (blind_tun_sw == 1) || |
1299 | rolloff = stv0900_get_bits(i_params, F0900_P2_ROLLOFF_STATUS); | 977 | (intp->symbol_rate[demod] < 10000000)) { |
1300 | if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) { | 978 | stv0900_write_reg(intp, CFRINIT1, freq1); |
1301 | stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x00); | 979 | stv0900_write_reg(intp, CFRINIT0, freq0); |
1302 | stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 0); | 980 | intp->bw[demod] = stv0900_carrier_width(srate, |
1303 | stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); | 981 | intp->rolloff) + 10000000; |
1304 | stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01); | ||
1305 | stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod); | ||
1306 | stv0900_set_max_symbol_rate(i_params, i_params->mclk, srate, demod); | ||
1307 | stv0900_set_min_symbol_rate(i_params, i_params->mclk, srate, demod); | ||
1308 | blindTunSw = 1; | ||
1309 | } | ||
1310 | 982 | ||
1311 | if (i_params->chip_id >= 0x20) { | 983 | if ((intp->chip_id >= 0x20) || (blind_tun_sw == 1)) { |
1312 | if ((i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS1) || (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DSS) || (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH)) { | 984 | if (intp->srch_algo[demod] != STV0900_WARM_START) { |
1313 | stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0a); | 985 | if (intp->tuner_type[demod] == 3) |
1314 | stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x0); | 986 | stv0900_set_tuner_auto(intp, |
987 | intp->freq[demod], | ||
988 | intp->bw[demod], | ||
989 | demod); | ||
990 | else | ||
991 | stv0900_set_bandwidth(fe, | ||
992 | intp->bw[demod]); | ||
1315 | } | 993 | } |
1316 | } | 994 | } |
1317 | 995 | ||
1318 | if (i_params->chip_id < 0x20) | 996 | if ((intp->srch_algo[demod] == STV0900_BLIND_SEARCH) || |
1319 | stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x08); | 997 | (intp->symbol_rate[demod] < 10000000)) |
1320 | 998 | msleep(50); | |
1321 | if (i_params->chip_id == 0x10) | 999 | else |
1322 | stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0x0a); | 1000 | msleep(5); |
1323 | |||
1324 | stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38); | ||
1325 | if ((i_params->chip_id >= 0x20) || (blindTunSw == 1) || (i_params->dmd2_symbol_rate < 10000000)) { | ||
1326 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1); | ||
1327 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0); | ||
1328 | i_params->tuner2_bw = stv0900_carrier_width(srate, i_params->rolloff) + 10000000; | ||
1329 | 1001 | ||
1330 | if ((i_params->chip_id >= 0x20) || (blindTunSw == 1)) { | 1002 | stv0900_get_lock_timeout(&timed, &timef, srate, |
1331 | if (i_params->dmd2_srch_algo != STV0900_WARM_START) | 1003 | STV0900_WARM_START); |
1332 | stv0900_set_bandwidth(fe, i_params->tuner2_bw); | ||
1333 | } | ||
1334 | 1004 | ||
1335 | if ((i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd2_symbol_rate < 10000000)) | 1005 | if (stv0900_get_demod_lock(intp, demod, timed / 2) == FALSE) { |
1336 | msleep(50); | 1006 | stv0900_write_reg(intp, DMDISTATE, 0x1f); |
1337 | else | 1007 | stv0900_write_reg(intp, CFRINIT1, freq1); |
1338 | msleep(5); | 1008 | stv0900_write_reg(intp, CFRINIT0, freq0); |
1339 | 1009 | stv0900_write_reg(intp, DMDISTATE, 0x18); | |
1340 | stv0900_get_lock_timeout(&timed, &timef, srate, STV0900_WARM_START); | 1010 | i = 0; |
1341 | if (stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) { | 1011 | while ((stv0900_get_demod_lock(intp, |
1342 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); | 1012 | demod, |
1343 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1); | 1013 | timed / 2) == FALSE) && |
1344 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0); | 1014 | (i <= 2)) { |
1345 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); | 1015 | stv0900_write_reg(intp, DMDISTATE, 0x1f); |
1346 | i = 0; | 1016 | stv0900_write_reg(intp, CFRINIT1, freq1); |
1347 | while ((stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) && (i <= 2)) { | 1017 | stv0900_write_reg(intp, CFRINIT0, freq0); |
1348 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); | 1018 | stv0900_write_reg(intp, DMDISTATE, 0x18); |
1349 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1); | 1019 | i++; |
1350 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0); | ||
1351 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); | ||
1352 | i++; | ||
1353 | } | ||
1354 | } | 1020 | } |
1355 | } | 1021 | } |
1356 | 1022 | ||
1357 | if (i_params->chip_id >= 0x20) | 1023 | } |
1358 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x49); | ||
1359 | 1024 | ||
1360 | if ((i_params->dmd2_rslts.standard == STV0900_DVBS1_STANDARD) || (i_params->dmd2_rslts.standard == STV0900_DSS_STANDARD)) | 1025 | if (intp->chip_id >= 0x20) |
1361 | stv0900_set_viterbi_tracq(i_params, demod); | 1026 | stv0900_write_reg(intp, CARFREQ, 0x49); |
1027 | |||
1028 | if ((intp->result[demod].standard == STV0900_DVBS1_STANDARD) || | ||
1029 | (intp->result[demod].standard == STV0900_DSS_STANDARD)) | ||
1030 | stv0900_set_viterbi_tracq(intp, demod); | ||
1362 | 1031 | ||
1363 | break; | ||
1364 | } | ||
1365 | } | 1032 | } |
1366 | 1033 | ||
1367 | static int stv0900_get_fec_lock(struct stv0900_internal *i_params, enum fe_stv0900_demod_num demod, s32 time_out) | 1034 | static int stv0900_get_fec_lock(struct stv0900_internal *intp, |
1035 | enum fe_stv0900_demod_num demod, s32 time_out) | ||
1368 | { | 1036 | { |
1369 | s32 timer = 0, lock = 0, header_field, pktdelin_field, lock_vit_field; | 1037 | s32 timer = 0, lock = 0; |
1370 | 1038 | ||
1371 | enum fe_stv0900_search_state dmd_state; | 1039 | enum fe_stv0900_search_state dmd_state; |
1372 | 1040 | ||
1373 | dprintk(KERN_INFO "%s\n", __func__); | 1041 | dprintk("%s\n", __func__); |
1374 | |||
1375 | dmd_reg(header_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); | ||
1376 | dmd_reg(pktdelin_field, F0900_P1_PKTDELIN_LOCK, F0900_P2_PKTDELIN_LOCK); | ||
1377 | dmd_reg(lock_vit_field, F0900_P1_LOCKEDVIT, F0900_P2_LOCKEDVIT); | ||
1378 | 1042 | ||
1379 | dmd_state = stv0900_get_bits(i_params, header_field); | 1043 | dmd_state = stv0900_get_bits(intp, HEADER_MODE); |
1380 | 1044 | ||
1381 | while ((timer < time_out) && (lock == 0)) { | 1045 | while ((timer < time_out) && (lock == 0)) { |
1382 | switch (dmd_state) { | 1046 | switch (dmd_state) { |
@@ -1386,10 +1050,10 @@ static int stv0900_get_fec_lock(struct stv0900_internal *i_params, enum fe_stv09 | |||
1386 | lock = 0; | 1050 | lock = 0; |
1387 | break; | 1051 | break; |
1388 | case STV0900_DVBS2_FOUND: | 1052 | case STV0900_DVBS2_FOUND: |
1389 | lock = stv0900_get_bits(i_params, pktdelin_field); | 1053 | lock = stv0900_get_bits(intp, PKTDELIN_LOCK); |
1390 | break; | 1054 | break; |
1391 | case STV0900_DVBS_FOUND: | 1055 | case STV0900_DVBS_FOUND: |
1392 | lock = stv0900_get_bits(i_params, lock_vit_field); | 1056 | lock = stv0900_get_bits(intp, LOCKEDVIT); |
1393 | break; | 1057 | break; |
1394 | } | 1058 | } |
1395 | 1059 | ||
@@ -1400,46 +1064,44 @@ static int stv0900_get_fec_lock(struct stv0900_internal *i_params, enum fe_stv09 | |||
1400 | } | 1064 | } |
1401 | 1065 | ||
1402 | if (lock) | 1066 | if (lock) |
1403 | dprintk("DEMOD FEC LOCK OK\n"); | 1067 | dprintk("%s: DEMOD FEC LOCK OK\n", __func__); |
1404 | else | 1068 | else |
1405 | dprintk("DEMOD FEC LOCK FAIL\n"); | 1069 | dprintk("%s: DEMOD FEC LOCK FAIL\n", __func__); |
1406 | 1070 | ||
1407 | return lock; | 1071 | return lock; |
1408 | } | 1072 | } |
1409 | 1073 | ||
1410 | static int stv0900_wait_for_lock(struct stv0900_internal *i_params, | 1074 | static int stv0900_wait_for_lock(struct stv0900_internal *intp, |
1411 | enum fe_stv0900_demod_num demod, | 1075 | enum fe_stv0900_demod_num demod, |
1412 | s32 dmd_timeout, s32 fec_timeout) | 1076 | s32 dmd_timeout, s32 fec_timeout) |
1413 | { | 1077 | { |
1414 | 1078 | ||
1415 | s32 timer = 0, lock = 0, str_merg_rst_fld, str_merg_lock_fld; | 1079 | s32 timer = 0, lock = 0; |
1416 | 1080 | ||
1417 | dprintk(KERN_INFO "%s\n", __func__); | 1081 | dprintk("%s\n", __func__); |
1418 | 1082 | ||
1419 | dmd_reg(str_merg_rst_fld, F0900_P1_RST_HWARE, F0900_P2_RST_HWARE); | 1083 | lock = stv0900_get_demod_lock(intp, demod, dmd_timeout); |
1420 | dmd_reg(str_merg_lock_fld, F0900_P1_TSFIFO_LINEOK, F0900_P2_TSFIFO_LINEOK); | ||
1421 | |||
1422 | lock = stv0900_get_demod_lock(i_params, demod, dmd_timeout); | ||
1423 | 1084 | ||
1424 | if (lock) | 1085 | if (lock) |
1425 | lock = lock && stv0900_get_fec_lock(i_params, demod, fec_timeout); | 1086 | lock = lock && stv0900_get_fec_lock(intp, demod, fec_timeout); |
1426 | 1087 | ||
1427 | if (lock) { | 1088 | if (lock) { |
1428 | lock = 0; | 1089 | lock = 0; |
1429 | 1090 | ||
1430 | dprintk(KERN_INFO "%s: Timer = %d, time_out = %d\n", __func__, timer, fec_timeout); | 1091 | dprintk("%s: Timer = %d, time_out = %d\n", |
1092 | __func__, timer, fec_timeout); | ||
1431 | 1093 | ||
1432 | while ((timer < fec_timeout) && (lock == 0)) { | 1094 | while ((timer < fec_timeout) && (lock == 0)) { |
1433 | lock = stv0900_get_bits(i_params, str_merg_lock_fld); | 1095 | lock = stv0900_get_bits(intp, TSFIFO_LINEOK); |
1434 | msleep(1); | 1096 | msleep(1); |
1435 | timer++; | 1097 | timer++; |
1436 | } | 1098 | } |
1437 | } | 1099 | } |
1438 | 1100 | ||
1439 | if (lock) | 1101 | if (lock) |
1440 | dprintk(KERN_INFO "%s: DEMOD LOCK OK\n", __func__); | 1102 | dprintk("%s: DEMOD LOCK OK\n", __func__); |
1441 | else | 1103 | else |
1442 | dprintk(KERN_INFO "%s: DEMOD LOCK FAIL\n", __func__); | 1104 | dprintk("%s: DEMOD LOCK FAIL\n", __func__); |
1443 | 1105 | ||
1444 | if (lock) | 1106 | if (lock) |
1445 | return TRUE; | 1107 | return TRUE; |
@@ -1451,43 +1113,43 @@ enum fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe, | |||
1451 | enum fe_stv0900_demod_num demod) | 1113 | enum fe_stv0900_demod_num demod) |
1452 | { | 1114 | { |
1453 | struct stv0900_state *state = fe->demodulator_priv; | 1115 | struct stv0900_state *state = fe->demodulator_priv; |
1454 | struct stv0900_internal *i_params = state->internal; | 1116 | struct stv0900_internal *intp = state->internal; |
1455 | enum fe_stv0900_tracking_standard fnd_standard; | 1117 | enum fe_stv0900_tracking_standard fnd_standard; |
1456 | s32 state_field, | ||
1457 | dss_dvb_field; | ||
1458 | |||
1459 | dprintk(KERN_INFO "%s\n", __func__); | ||
1460 | 1118 | ||
1461 | dmd_reg(state_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); | 1119 | int hdr_mode = stv0900_get_bits(intp, HEADER_MODE); |
1462 | dmd_reg(dss_dvb_field, F0900_P1_DSS_DVB, F0900_P2_DSS_DVB); | ||
1463 | 1120 | ||
1464 | if (stv0900_get_bits(i_params, state_field) == 2) | 1121 | switch (hdr_mode) { |
1122 | case 2: | ||
1465 | fnd_standard = STV0900_DVBS2_STANDARD; | 1123 | fnd_standard = STV0900_DVBS2_STANDARD; |
1466 | 1124 | break; | |
1467 | else if (stv0900_get_bits(i_params, state_field) == 3) { | 1125 | case 3: |
1468 | if (stv0900_get_bits(i_params, dss_dvb_field) == 1) | 1126 | if (stv0900_get_bits(intp, DSS_DVB) == 1) |
1469 | fnd_standard = STV0900_DSS_STANDARD; | 1127 | fnd_standard = STV0900_DSS_STANDARD; |
1470 | else | 1128 | else |
1471 | fnd_standard = STV0900_DVBS1_STANDARD; | 1129 | fnd_standard = STV0900_DVBS1_STANDARD; |
1472 | } else | 1130 | |
1131 | break; | ||
1132 | default: | ||
1473 | fnd_standard = STV0900_UNKNOWN_STANDARD; | 1133 | fnd_standard = STV0900_UNKNOWN_STANDARD; |
1134 | } | ||
1135 | |||
1136 | dprintk("%s: standard %d\n", __func__, fnd_standard); | ||
1474 | 1137 | ||
1475 | return fnd_standard; | 1138 | return fnd_standard; |
1476 | } | 1139 | } |
1477 | 1140 | ||
1478 | static s32 stv0900_get_carr_freq(struct stv0900_internal *i_params, u32 mclk, | 1141 | static s32 stv0900_get_carr_freq(struct stv0900_internal *intp, u32 mclk, |
1479 | enum fe_stv0900_demod_num demod) | 1142 | enum fe_stv0900_demod_num demod) |
1480 | { | 1143 | { |
1481 | s32 cfr_field2, cfr_field1, cfr_field0, | 1144 | s32 derot, |
1482 | derot, rem1, rem2, intval1, intval2; | 1145 | rem1, |
1483 | 1146 | rem2, | |
1484 | dmd_reg(cfr_field2, F0900_P1_CAR_FREQ2, F0900_P2_CAR_FREQ2); | 1147 | intval1, |
1485 | dmd_reg(cfr_field1, F0900_P1_CAR_FREQ1, F0900_P2_CAR_FREQ1); | 1148 | intval2; |
1486 | dmd_reg(cfr_field0, F0900_P1_CAR_FREQ0, F0900_P2_CAR_FREQ0); | ||
1487 | 1149 | ||
1488 | derot = (stv0900_get_bits(i_params, cfr_field2) << 16) + | 1150 | derot = (stv0900_get_bits(intp, CAR_FREQ2) << 16) + |
1489 | (stv0900_get_bits(i_params, cfr_field1) << 8) + | 1151 | (stv0900_get_bits(intp, CAR_FREQ1) << 8) + |
1490 | (stv0900_get_bits(i_params, cfr_field0)); | 1152 | (stv0900_get_bits(intp, CAR_FREQ0)); |
1491 | 1153 | ||
1492 | derot = ge2comp(derot, 24); | 1154 | derot = ge2comp(derot, 24); |
1493 | intval1 = mclk >> 12; | 1155 | intval1 = mclk >> 12; |
@@ -1505,7 +1167,7 @@ static u32 stv0900_get_tuner_freq(struct dvb_frontend *fe) | |||
1505 | { | 1167 | { |
1506 | struct dvb_frontend_ops *frontend_ops = NULL; | 1168 | struct dvb_frontend_ops *frontend_ops = NULL; |
1507 | struct dvb_tuner_ops *tuner_ops = NULL; | 1169 | struct dvb_tuner_ops *tuner_ops = NULL; |
1508 | u32 frequency = 0; | 1170 | u32 freq = 0; |
1509 | 1171 | ||
1510 | if (&fe->ops) | 1172 | if (&fe->ops) |
1511 | frontend_ops = &fe->ops; | 1173 | frontend_ops = &fe->ops; |
@@ -1514,304 +1176,170 @@ static u32 stv0900_get_tuner_freq(struct dvb_frontend *fe) | |||
1514 | tuner_ops = &frontend_ops->tuner_ops; | 1176 | tuner_ops = &frontend_ops->tuner_ops; |
1515 | 1177 | ||
1516 | if (tuner_ops->get_frequency) { | 1178 | if (tuner_ops->get_frequency) { |
1517 | if ((tuner_ops->get_frequency(fe, &frequency)) < 0) | 1179 | if ((tuner_ops->get_frequency(fe, &freq)) < 0) |
1518 | dprintk("%s: Invalid parameter\n", __func__); | 1180 | dprintk("%s: Invalid parameter\n", __func__); |
1519 | else | 1181 | else |
1520 | dprintk("%s: Frequency=%d\n", __func__, frequency); | 1182 | dprintk("%s: Frequency=%d\n", __func__, freq); |
1521 | 1183 | ||
1522 | } | 1184 | } |
1523 | 1185 | ||
1524 | return frequency; | 1186 | return freq; |
1525 | } | ||
1526 | |||
1527 | static enum fe_stv0900_fec stv0900_get_vit_fec(struct stv0900_internal *i_params, | ||
1528 | enum fe_stv0900_demod_num demod) | ||
1529 | { | ||
1530 | s32 rate_fld, vit_curpun_fld; | ||
1531 | enum fe_stv0900_fec prate; | ||
1532 | |||
1533 | dmd_reg(vit_curpun_fld, F0900_P1_VIT_CURPUN, F0900_P2_VIT_CURPUN); | ||
1534 | rate_fld = stv0900_get_bits(i_params, vit_curpun_fld); | ||
1535 | |||
1536 | switch (rate_fld) { | ||
1537 | case 13: | ||
1538 | prate = STV0900_FEC_1_2; | ||
1539 | break; | ||
1540 | case 18: | ||
1541 | prate = STV0900_FEC_2_3; | ||
1542 | break; | ||
1543 | case 21: | ||
1544 | prate = STV0900_FEC_3_4; | ||
1545 | break; | ||
1546 | case 24: | ||
1547 | prate = STV0900_FEC_5_6; | ||
1548 | break; | ||
1549 | case 25: | ||
1550 | prate = STV0900_FEC_6_7; | ||
1551 | break; | ||
1552 | case 26: | ||
1553 | prate = STV0900_FEC_7_8; | ||
1554 | break; | ||
1555 | default: | ||
1556 | prate = STV0900_FEC_UNKNOWN; | ||
1557 | break; | ||
1558 | } | ||
1559 | |||
1560 | return prate; | ||
1561 | } | 1187 | } |
1562 | 1188 | ||
1563 | static enum fe_stv0900_signal_type stv0900_get_signal_params(struct dvb_frontend *fe) | 1189 | static enum |
1190 | fe_stv0900_signal_type stv0900_get_signal_params(struct dvb_frontend *fe) | ||
1564 | { | 1191 | { |
1565 | struct stv0900_state *state = fe->demodulator_priv; | 1192 | struct stv0900_state *state = fe->demodulator_priv; |
1566 | struct stv0900_internal *i_params = state->internal; | 1193 | struct stv0900_internal *intp = state->internal; |
1567 | enum fe_stv0900_demod_num demod = state->demod; | 1194 | enum fe_stv0900_demod_num demod = state->demod; |
1568 | enum fe_stv0900_signal_type range = STV0900_OUTOFRANGE; | 1195 | enum fe_stv0900_signal_type range = STV0900_OUTOFRANGE; |
1569 | s32 offsetFreq, | 1196 | struct stv0900_signal_info *result = &intp->result[demod]; |
1570 | srate_offset, | 1197 | s32 offsetFreq, |
1571 | i = 0; | 1198 | srate_offset; |
1199 | int i = 0, | ||
1200 | d = demod; | ||
1572 | 1201 | ||
1573 | u8 timing; | 1202 | u8 timing; |
1574 | 1203 | ||
1575 | msleep(5); | 1204 | msleep(5); |
1576 | switch (demod) { | 1205 | if (intp->srch_algo[d] == STV0900_BLIND_SEARCH) { |
1577 | case STV0900_DEMOD_1: | 1206 | timing = stv0900_read_reg(intp, TMGREG2); |
1578 | default: | 1207 | i = 0; |
1579 | if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) { | 1208 | stv0900_write_reg(intp, SFRSTEP, 0x5c); |
1580 | timing = stv0900_read_reg(i_params, R0900_P1_TMGREG2); | 1209 | |
1581 | i = 0; | 1210 | while ((i <= 50) && (timing != 0) && (timing != 0xff)) { |
1582 | stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x5c); | 1211 | timing = stv0900_read_reg(intp, TMGREG2); |
1583 | 1212 | msleep(5); | |
1584 | while ((i <= 50) && (timing != 0) && (timing != 0xFF)) { | 1213 | i += 5; |
1585 | timing = stv0900_read_reg(i_params, R0900_P1_TMGREG2); | ||
1586 | msleep(5); | ||
1587 | i += 5; | ||
1588 | } | ||
1589 | } | ||
1590 | |||
1591 | i_params->dmd1_rslts.standard = stv0900_get_standard(fe, demod); | ||
1592 | i_params->dmd1_rslts.frequency = stv0900_get_tuner_freq(fe); | ||
1593 | offsetFreq = stv0900_get_carr_freq(i_params, i_params->mclk, demod) / 1000; | ||
1594 | i_params->dmd1_rslts.frequency += offsetFreq; | ||
1595 | i_params->dmd1_rslts.symbol_rate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | ||
1596 | srate_offset = stv0900_get_timing_offst(i_params, i_params->dmd1_rslts.symbol_rate, demod); | ||
1597 | i_params->dmd1_rslts.symbol_rate += srate_offset; | ||
1598 | i_params->dmd1_rslts.fec = stv0900_get_vit_fec(i_params, demod); | ||
1599 | i_params->dmd1_rslts.modcode = stv0900_get_bits(i_params, F0900_P1_DEMOD_MODCOD); | ||
1600 | i_params->dmd1_rslts.pilot = stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE) & 0x01; | ||
1601 | i_params->dmd1_rslts.frame_length = ((u32)stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE)) >> 1; | ||
1602 | i_params->dmd1_rslts.rolloff = stv0900_get_bits(i_params, F0900_P1_ROLLOFF_STATUS); | ||
1603 | switch (i_params->dmd1_rslts.standard) { | ||
1604 | case STV0900_DVBS2_STANDARD: | ||
1605 | i_params->dmd1_rslts.spectrum = stv0900_get_bits(i_params, F0900_P1_SPECINV_DEMOD); | ||
1606 | if (i_params->dmd1_rslts.modcode <= STV0900_QPSK_910) | ||
1607 | i_params->dmd1_rslts.modulation = STV0900_QPSK; | ||
1608 | else if (i_params->dmd1_rslts.modcode <= STV0900_8PSK_910) | ||
1609 | i_params->dmd1_rslts.modulation = STV0900_8PSK; | ||
1610 | else if (i_params->dmd1_rslts.modcode <= STV0900_16APSK_910) | ||
1611 | i_params->dmd1_rslts.modulation = STV0900_16APSK; | ||
1612 | else if (i_params->dmd1_rslts.modcode <= STV0900_32APSK_910) | ||
1613 | i_params->dmd1_rslts.modulation = STV0900_32APSK; | ||
1614 | else | ||
1615 | i_params->dmd1_rslts.modulation = STV0900_UNKNOWN; | ||
1616 | break; | ||
1617 | case STV0900_DVBS1_STANDARD: | ||
1618 | case STV0900_DSS_STANDARD: | ||
1619 | i_params->dmd1_rslts.spectrum = stv0900_get_bits(i_params, F0900_P1_IQINV); | ||
1620 | i_params->dmd1_rslts.modulation = STV0900_QPSK; | ||
1621 | break; | ||
1622 | default: | ||
1623 | break; | ||
1624 | } | 1214 | } |
1215 | } | ||
1625 | 1216 | ||
1626 | if ((i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd1_symbol_rate < 10000000)) { | 1217 | result->standard = stv0900_get_standard(fe, d); |
1627 | offsetFreq = i_params->dmd1_rslts.frequency - i_params->tuner1_freq; | 1218 | if (intp->tuner_type[demod] == 3) |
1628 | i_params->tuner1_freq = stv0900_get_tuner_freq(fe); | 1219 | result->frequency = stv0900_get_freq_auto(intp, d); |
1629 | if (ABS(offsetFreq) <= ((i_params->dmd1_srch_range / 2000) + 500)) | 1220 | else |
1630 | range = STV0900_RANGEOK; | 1221 | result->frequency = stv0900_get_tuner_freq(fe); |
1631 | else | 1222 | |
1632 | if (ABS(offsetFreq) <= (stv0900_carrier_width(i_params->dmd1_rslts.symbol_rate, i_params->dmd1_rslts.rolloff) / 2000)) | 1223 | offsetFreq = stv0900_get_carr_freq(intp, intp->mclk, d) / 1000; |
1633 | range = STV0900_RANGEOK; | 1224 | result->frequency += offsetFreq; |
1634 | else | 1225 | result->symbol_rate = stv0900_get_symbol_rate(intp, intp->mclk, d); |
1635 | range = STV0900_OUTOFRANGE; | 1226 | srate_offset = stv0900_get_timing_offst(intp, result->symbol_rate, d); |
1636 | 1227 | result->symbol_rate += srate_offset; | |
1637 | } else { | 1228 | result->fec = stv0900_get_vit_fec(intp, d); |
1638 | if (ABS(offsetFreq) <= ((i_params->dmd1_srch_range / 2000) + 500)) | 1229 | result->modcode = stv0900_get_bits(intp, DEMOD_MODCOD); |
1639 | range = STV0900_RANGEOK; | 1230 | result->pilot = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01; |
1640 | else | 1231 | result->frame_len = ((u32)stv0900_get_bits(intp, DEMOD_TYPE)) >> 1; |
1641 | range = STV0900_OUTOFRANGE; | 1232 | result->rolloff = stv0900_get_bits(intp, ROLLOFF_STATUS); |
1642 | } | 1233 | |
1234 | dprintk("%s: modcode=0x%x \n", __func__, result->modcode); | ||
1235 | |||
1236 | switch (result->standard) { | ||
1237 | case STV0900_DVBS2_STANDARD: | ||
1238 | result->spectrum = stv0900_get_bits(intp, SPECINV_DEMOD); | ||
1239 | if (result->modcode <= STV0900_QPSK_910) | ||
1240 | result->modulation = STV0900_QPSK; | ||
1241 | else if (result->modcode <= STV0900_8PSK_910) | ||
1242 | result->modulation = STV0900_8PSK; | ||
1243 | else if (result->modcode <= STV0900_16APSK_910) | ||
1244 | result->modulation = STV0900_16APSK; | ||
1245 | else if (result->modcode <= STV0900_32APSK_910) | ||
1246 | result->modulation = STV0900_32APSK; | ||
1247 | else | ||
1248 | result->modulation = STV0900_UNKNOWN; | ||
1643 | break; | 1249 | break; |
1644 | case STV0900_DEMOD_2: | 1250 | case STV0900_DVBS1_STANDARD: |
1645 | if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) { | 1251 | case STV0900_DSS_STANDARD: |
1646 | timing = stv0900_read_reg(i_params, R0900_P2_TMGREG2); | 1252 | result->spectrum = stv0900_get_bits(intp, IQINV); |
1647 | i = 0; | 1253 | result->modulation = STV0900_QPSK; |
1648 | stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x5c); | 1254 | break; |
1649 | 1255 | default: | |
1650 | while ((i <= 50) && (timing != 0) && (timing != 0xff)) { | 1256 | break; |
1651 | timing = stv0900_read_reg(i_params, R0900_P2_TMGREG2); | 1257 | } |
1652 | msleep(5); | ||
1653 | i += 5; | ||
1654 | } | ||
1655 | } | ||
1656 | 1258 | ||
1657 | i_params->dmd2_rslts.standard = stv0900_get_standard(fe, demod); | 1259 | if ((intp->srch_algo[d] == STV0900_BLIND_SEARCH) || |
1658 | i_params->dmd2_rslts.frequency = stv0900_get_tuner_freq(fe); | 1260 | (intp->symbol_rate[d] < 10000000)) { |
1659 | offsetFreq = stv0900_get_carr_freq(i_params, i_params->mclk, demod) / 1000; | 1261 | offsetFreq = result->frequency - intp->freq[d]; |
1660 | i_params->dmd2_rslts.frequency += offsetFreq; | 1262 | if (intp->tuner_type[demod] == 3) |
1661 | i_params->dmd2_rslts.symbol_rate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | 1263 | intp->freq[d] = stv0900_get_freq_auto(intp, d); |
1662 | srate_offset = stv0900_get_timing_offst(i_params, i_params->dmd2_rslts.symbol_rate, demod); | 1264 | else |
1663 | i_params->dmd2_rslts.symbol_rate += srate_offset; | 1265 | intp->freq[d] = stv0900_get_tuner_freq(fe); |
1664 | i_params->dmd2_rslts.fec = stv0900_get_vit_fec(i_params, demod); | ||
1665 | i_params->dmd2_rslts.modcode = stv0900_get_bits(i_params, F0900_P2_DEMOD_MODCOD); | ||
1666 | i_params->dmd2_rslts.pilot = stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE) & 0x01; | ||
1667 | i_params->dmd2_rslts.frame_length = ((u32)stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE)) >> 1; | ||
1668 | i_params->dmd2_rslts.rolloff = stv0900_get_bits(i_params, F0900_P2_ROLLOFF_STATUS); | ||
1669 | switch (i_params->dmd2_rslts.standard) { | ||
1670 | case STV0900_DVBS2_STANDARD: | ||
1671 | i_params->dmd2_rslts.spectrum = stv0900_get_bits(i_params, F0900_P2_SPECINV_DEMOD); | ||
1672 | if (i_params->dmd2_rslts.modcode <= STV0900_QPSK_910) | ||
1673 | i_params->dmd2_rslts.modulation = STV0900_QPSK; | ||
1674 | else if (i_params->dmd2_rslts.modcode <= STV0900_8PSK_910) | ||
1675 | i_params->dmd2_rslts.modulation = STV0900_8PSK; | ||
1676 | else if (i_params->dmd2_rslts.modcode <= STV0900_16APSK_910) | ||
1677 | i_params->dmd2_rslts.modulation = STV0900_16APSK; | ||
1678 | else if (i_params->dmd2_rslts.modcode <= STV0900_32APSK_910) | ||
1679 | i_params->dmd2_rslts.modulation = STV0900_32APSK; | ||
1680 | else | ||
1681 | i_params->dmd2_rslts.modulation = STV0900_UNKNOWN; | ||
1682 | break; | ||
1683 | case STV0900_DVBS1_STANDARD: | ||
1684 | case STV0900_DSS_STANDARD: | ||
1685 | i_params->dmd2_rslts.spectrum = stv0900_get_bits(i_params, F0900_P2_IQINV); | ||
1686 | i_params->dmd2_rslts.modulation = STV0900_QPSK; | ||
1687 | break; | ||
1688 | default: | ||
1689 | break; | ||
1690 | } | ||
1691 | 1266 | ||
1692 | if ((i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd2_symbol_rate < 10000000)) { | 1267 | if (ABS(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500)) |
1693 | offsetFreq = i_params->dmd2_rslts.frequency - i_params->tuner2_freq; | 1268 | range = STV0900_RANGEOK; |
1694 | i_params->tuner2_freq = stv0900_get_tuner_freq(fe); | 1269 | else if (ABS(offsetFreq) <= |
1270 | (stv0900_carrier_width(result->symbol_rate, | ||
1271 | result->rolloff) / 2000)) | ||
1272 | range = STV0900_RANGEOK; | ||
1695 | 1273 | ||
1696 | if (ABS(offsetFreq) <= ((i_params->dmd2_srch_range / 2000) + 500)) | 1274 | } else if (ABS(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500)) |
1697 | range = STV0900_RANGEOK; | 1275 | range = STV0900_RANGEOK; |
1698 | else | ||
1699 | if (ABS(offsetFreq) <= (stv0900_carrier_width(i_params->dmd2_rslts.symbol_rate, i_params->dmd2_rslts.rolloff) / 2000)) | ||
1700 | range = STV0900_RANGEOK; | ||
1701 | else | ||
1702 | range = STV0900_OUTOFRANGE; | ||
1703 | } else { | ||
1704 | if (ABS(offsetFreq) <= ((i_params->dmd2_srch_range / 2000) + 500)) | ||
1705 | range = STV0900_RANGEOK; | ||
1706 | else | ||
1707 | range = STV0900_OUTOFRANGE; | ||
1708 | } | ||
1709 | 1276 | ||
1710 | break; | 1277 | dprintk("%s: range %d\n", __func__, range); |
1711 | } | ||
1712 | 1278 | ||
1713 | return range; | 1279 | return range; |
1714 | } | 1280 | } |
1715 | 1281 | ||
1716 | static enum fe_stv0900_signal_type stv0900_dvbs1_acq_workaround(struct dvb_frontend *fe) | 1282 | static enum |
1283 | fe_stv0900_signal_type stv0900_dvbs1_acq_workaround(struct dvb_frontend *fe) | ||
1717 | { | 1284 | { |
1718 | struct stv0900_state *state = fe->demodulator_priv; | 1285 | struct stv0900_state *state = fe->demodulator_priv; |
1719 | struct stv0900_internal *i_params = state->internal; | 1286 | struct stv0900_internal *intp = state->internal; |
1720 | enum fe_stv0900_demod_num demod = state->demod; | 1287 | enum fe_stv0900_demod_num demod = state->demod; |
1721 | |||
1722 | s32 srate, demod_timeout, | ||
1723 | fec_timeout, freq1, freq0; | ||
1724 | enum fe_stv0900_signal_type signal_type = STV0900_NODATA; | 1288 | enum fe_stv0900_signal_type signal_type = STV0900_NODATA; |
1725 | 1289 | ||
1726 | switch (demod) { | 1290 | s32 srate, |
1727 | case STV0900_DEMOD_1: | 1291 | demod_timeout, |
1728 | default: | 1292 | fec_timeout, |
1729 | i_params->dmd1_rslts.locked = FALSE; | 1293 | freq1, |
1730 | if (stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS_FOUND) { | 1294 | freq0; |
1731 | srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | 1295 | |
1732 | srate += stv0900_get_timing_offst(i_params, srate, demod); | 1296 | intp->result[demod].locked = FALSE; |
1733 | if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) | 1297 | |
1734 | stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod); | 1298 | if (stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) { |
1735 | 1299 | srate = stv0900_get_symbol_rate(intp, intp->mclk, demod); | |
1736 | stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, srate, STV0900_WARM_START); | 1300 | srate += stv0900_get_timing_offst(intp, srate, demod); |
1737 | freq1 = stv0900_read_reg(i_params, R0900_P1_CFR2); | 1301 | if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) |
1738 | freq0 = stv0900_read_reg(i_params, R0900_P1_CFR1); | 1302 | stv0900_set_symbol_rate(intp, intp->mclk, srate, demod); |
1739 | stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); | 1303 | |
1740 | stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, STV0900_IQ_FORCE_SWAPPED); | 1304 | stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, |
1741 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C); | 1305 | srate, STV0900_WARM_START); |
1742 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); | 1306 | freq1 = stv0900_read_reg(intp, CFR2); |
1743 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); | 1307 | freq0 = stv0900_read_reg(intp, CFR1); |
1744 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); | 1308 | stv0900_write_bits(intp, CFR_AUTOSCAN, 0); |
1745 | if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) { | 1309 | stv0900_write_bits(intp, SPECINV_CONTROL, |
1746 | i_params->dmd1_rslts.locked = TRUE; | 1310 | STV0900_IQ_FORCE_SWAPPED); |
1747 | signal_type = stv0900_get_signal_params(fe); | 1311 | stv0900_write_reg(intp, DMDISTATE, 0x1c); |
1748 | stv0900_track_optimization(fe); | 1312 | stv0900_write_reg(intp, CFRINIT1, freq1); |
1749 | } else { | 1313 | stv0900_write_reg(intp, CFRINIT0, freq0); |
1750 | stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, STV0900_IQ_FORCE_NORMAL); | 1314 | stv0900_write_reg(intp, DMDISTATE, 0x18); |
1751 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1c); | 1315 | if (stv0900_wait_for_lock(intp, demod, |
1752 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); | 1316 | demod_timeout, fec_timeout) == TRUE) { |
1753 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); | 1317 | intp->result[demod].locked = TRUE; |
1754 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); | 1318 | signal_type = stv0900_get_signal_params(fe); |
1755 | if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) { | 1319 | stv0900_track_optimization(fe); |
1756 | i_params->dmd1_rslts.locked = TRUE; | 1320 | } else { |
1757 | signal_type = stv0900_get_signal_params(fe); | 1321 | stv0900_write_bits(intp, SPECINV_CONTROL, |
1758 | stv0900_track_optimization(fe); | 1322 | STV0900_IQ_FORCE_NORMAL); |
1759 | } | 1323 | stv0900_write_reg(intp, DMDISTATE, 0x1c); |
1760 | 1324 | stv0900_write_reg(intp, CFRINIT1, freq1); | |
1761 | } | 1325 | stv0900_write_reg(intp, CFRINIT0, freq0); |
1762 | 1326 | stv0900_write_reg(intp, DMDISTATE, 0x18); | |
1763 | } else | 1327 | if (stv0900_wait_for_lock(intp, demod, |
1764 | i_params->dmd1_rslts.locked = FALSE; | 1328 | demod_timeout, fec_timeout) == TRUE) { |
1765 | 1329 | intp->result[demod].locked = TRUE; | |
1766 | break; | ||
1767 | case STV0900_DEMOD_2: | ||
1768 | i_params->dmd2_rslts.locked = FALSE; | ||
1769 | if (stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS_FOUND) { | ||
1770 | srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | ||
1771 | srate += stv0900_get_timing_offst(i_params, srate, demod); | ||
1772 | |||
1773 | if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) | ||
1774 | stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod); | ||
1775 | |||
1776 | stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, srate, STV0900_WARM_START); | ||
1777 | freq1 = stv0900_read_reg(i_params, R0900_P2_CFR2); | ||
1778 | freq0 = stv0900_read_reg(i_params, R0900_P2_CFR1); | ||
1779 | stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); | ||
1780 | stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, STV0900_IQ_FORCE_SWAPPED); | ||
1781 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C); | ||
1782 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1); | ||
1783 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0); | ||
1784 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); | ||
1785 | |||
1786 | if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) { | ||
1787 | i_params->dmd2_rslts.locked = TRUE; | ||
1788 | signal_type = stv0900_get_signal_params(fe); | 1330 | signal_type = stv0900_get_signal_params(fe); |
1789 | stv0900_track_optimization(fe); | 1331 | stv0900_track_optimization(fe); |
1790 | } else { | ||
1791 | stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, STV0900_IQ_FORCE_NORMAL); | ||
1792 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1c); | ||
1793 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1); | ||
1794 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0); | ||
1795 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); | ||
1796 | |||
1797 | if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) { | ||
1798 | i_params->dmd2_rslts.locked = TRUE; | ||
1799 | signal_type = stv0900_get_signal_params(fe); | ||
1800 | stv0900_track_optimization(fe); | ||
1801 | } | ||
1802 | |||
1803 | } | 1332 | } |
1804 | 1333 | ||
1805 | } else | 1334 | } |
1806 | i_params->dmd1_rslts.locked = FALSE; | ||
1807 | 1335 | ||
1808 | break; | 1336 | } else |
1809 | } | 1337 | intp->result[demod].locked = FALSE; |
1810 | 1338 | ||
1811 | return signal_type; | 1339 | return signal_type; |
1812 | } | 1340 | } |
1813 | 1341 | ||
1814 | static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *i_params, | 1342 | static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *intp, |
1815 | enum fe_stv0900_demod_num demod) | 1343 | enum fe_stv0900_demod_num demod) |
1816 | { | 1344 | { |
1817 | u32 minagc2level = 0xffff, | 1345 | u32 minagc2level = 0xffff, |
@@ -1820,105 +1348,54 @@ static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *i_params, | |||
1820 | 1348 | ||
1821 | s32 i, j, nb_steps, direction; | 1349 | s32 i, j, nb_steps, direction; |
1822 | 1350 | ||
1823 | dprintk(KERN_INFO "%s\n", __func__); | 1351 | dprintk("%s\n", __func__); |
1824 | |||
1825 | switch (demod) { | ||
1826 | case STV0900_DEMOD_1: | ||
1827 | default: | ||
1828 | stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38); | ||
1829 | stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 1); | ||
1830 | stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 1); | ||
1831 | |||
1832 | stv0900_write_reg(i_params, R0900_P1_SFRUP1, 0x83); | ||
1833 | stv0900_write_reg(i_params, R0900_P1_SFRUP0, 0xc0); | ||
1834 | |||
1835 | stv0900_write_reg(i_params, R0900_P1_SFRLOW1, 0x82); | ||
1836 | stv0900_write_reg(i_params, R0900_P1_SFRLOW0, 0xa0); | ||
1837 | stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x0); | ||
1838 | 1352 | ||
1839 | stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod); | 1353 | stv0900_write_reg(intp, AGC2REF, 0x38); |
1840 | nb_steps = -1 + (i_params->dmd1_srch_range / 1000000); | 1354 | stv0900_write_bits(intp, SCAN_ENABLE, 0); |
1841 | nb_steps /= 2; | 1355 | stv0900_write_bits(intp, CFR_AUTOSCAN, 0); |
1842 | nb_steps = (2 * nb_steps) + 1; | ||
1843 | 1356 | ||
1844 | if (nb_steps < 0) | 1357 | stv0900_write_bits(intp, AUTO_GUP, 1); |
1845 | nb_steps = 1; | 1358 | stv0900_write_bits(intp, AUTO_GLOW, 1); |
1846 | 1359 | ||
1847 | direction = 1; | 1360 | stv0900_write_reg(intp, DMDT0M, 0x0); |
1848 | 1361 | ||
1849 | freq_step = (1000000 << 8) / (i_params->mclk >> 8); | 1362 | stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod); |
1363 | nb_steps = -1 + (intp->srch_range[demod] / 1000000); | ||
1364 | nb_steps /= 2; | ||
1365 | nb_steps = (2 * nb_steps) + 1; | ||
1850 | 1366 | ||
1851 | init_freq = 0; | 1367 | if (nb_steps < 0) |
1368 | nb_steps = 1; | ||
1852 | 1369 | ||
1853 | for (i = 0; i < nb_steps; i++) { | 1370 | direction = 1; |
1854 | if (direction > 0) | ||
1855 | init_freq = init_freq + (freq_step * i); | ||
1856 | else | ||
1857 | init_freq = init_freq - (freq_step * i); | ||
1858 | 1371 | ||
1859 | direction *= -1; | 1372 | freq_step = (1000000 << 8) / (intp->mclk >> 8); |
1860 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5C); | ||
1861 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, (init_freq >> 8) & 0xff); | ||
1862 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, init_freq & 0xff); | ||
1863 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x58); | ||
1864 | msleep(10); | ||
1865 | agc2level = 0; | ||
1866 | 1373 | ||
1867 | for (j = 0; j < 10; j++) | 1374 | init_freq = 0; |
1868 | agc2level += (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8) | ||
1869 | | stv0900_read_reg(i_params, R0900_P1_AGC2I0); | ||
1870 | 1375 | ||
1871 | agc2level /= 10; | 1376 | for (i = 0; i < nb_steps; i++) { |
1872 | 1377 | if (direction > 0) | |
1873 | if (agc2level < minagc2level) | 1378 | init_freq = init_freq + (freq_step * i); |
1874 | minagc2level = agc2level; | 1379 | else |
1875 | } | 1380 | init_freq = init_freq - (freq_step * i); |
1876 | break; | ||
1877 | case STV0900_DEMOD_2: | ||
1878 | stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38); | ||
1879 | stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 1); | ||
1880 | stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 1); | ||
1881 | stv0900_write_reg(i_params, R0900_P2_SFRUP1, 0x83); | ||
1882 | stv0900_write_reg(i_params, R0900_P2_SFRUP0, 0xc0); | ||
1883 | stv0900_write_reg(i_params, R0900_P2_SFRLOW1, 0x82); | ||
1884 | stv0900_write_reg(i_params, R0900_P2_SFRLOW0, 0xa0); | ||
1885 | stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x0); | ||
1886 | stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod); | ||
1887 | nb_steps = -1 + (i_params->dmd2_srch_range / 1000000); | ||
1888 | nb_steps /= 2; | ||
1889 | nb_steps = (2 * nb_steps) + 1; | ||
1890 | |||
1891 | if (nb_steps < 0) | ||
1892 | nb_steps = 1; | ||
1893 | |||
1894 | direction = 1; | ||
1895 | freq_step = (1000000 << 8) / (i_params->mclk >> 8); | ||
1896 | init_freq = 0; | ||
1897 | for (i = 0; i < nb_steps; i++) { | ||
1898 | if (direction > 0) | ||
1899 | init_freq = init_freq + (freq_step * i); | ||
1900 | else | ||
1901 | init_freq = init_freq - (freq_step * i); | ||
1902 | 1381 | ||
1903 | direction *= -1; | 1382 | direction *= -1; |
1383 | stv0900_write_reg(intp, DMDISTATE, 0x5C); | ||
1384 | stv0900_write_reg(intp, CFRINIT1, (init_freq >> 8) & 0xff); | ||
1385 | stv0900_write_reg(intp, CFRINIT0, init_freq & 0xff); | ||
1386 | stv0900_write_reg(intp, DMDISTATE, 0x58); | ||
1387 | msleep(10); | ||
1388 | agc2level = 0; | ||
1904 | 1389 | ||
1905 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5C); | 1390 | for (j = 0; j < 10; j++) |
1906 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, (init_freq >> 8) & 0xff); | 1391 | agc2level += (stv0900_read_reg(intp, AGC2I1) << 8) |
1907 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, init_freq & 0xff); | 1392 | | stv0900_read_reg(intp, AGC2I0); |
1908 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x58); | ||
1909 | 1393 | ||
1910 | msleep(10); | 1394 | agc2level /= 10; |
1911 | agc2level = 0; | ||
1912 | for (j = 0; j < 10; j++) | ||
1913 | agc2level += (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8) | ||
1914 | | stv0900_read_reg(i_params, R0900_P2_AGC2I0); | ||
1915 | 1395 | ||
1916 | agc2level /= 10; | 1396 | if (agc2level < minagc2level) |
1397 | minagc2level = agc2level; | ||
1917 | 1398 | ||
1918 | if (agc2level < minagc2level) | ||
1919 | minagc2level = agc2level; | ||
1920 | } | ||
1921 | break; | ||
1922 | } | 1399 | } |
1923 | 1400 | ||
1924 | return (u16)minagc2level; | 1401 | return (u16)minagc2level; |
@@ -1927,336 +1404,197 @@ static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *i_params, | |||
1927 | static u32 stv0900_search_srate_coarse(struct dvb_frontend *fe) | 1404 | static u32 stv0900_search_srate_coarse(struct dvb_frontend *fe) |
1928 | { | 1405 | { |
1929 | struct stv0900_state *state = fe->demodulator_priv; | 1406 | struct stv0900_state *state = fe->demodulator_priv; |
1930 | struct stv0900_internal *i_params = state->internal; | 1407 | struct stv0900_internal *intp = state->internal; |
1931 | enum fe_stv0900_demod_num demod = state->demod; | 1408 | enum fe_stv0900_demod_num demod = state->demod; |
1932 | int timingLock = FALSE; | 1409 | int timing_lck = FALSE; |
1933 | s32 i, timingcpt = 0, | 1410 | s32 i, timingcpt = 0, |
1934 | direction = 1, | 1411 | direction = 1, |
1935 | nb_steps, | 1412 | nb_steps, |
1936 | current_step = 0, | 1413 | current_step = 0, |
1937 | tuner_freq; | 1414 | tuner_freq; |
1415 | u32 agc2_th, | ||
1416 | coarse_srate = 0, | ||
1417 | agc2_integr = 0, | ||
1418 | currier_step = 1200; | ||
1938 | 1419 | ||
1939 | u32 coarse_srate = 0, agc2_integr = 0, currier_step = 1200; | 1420 | if (intp->chip_id >= 0x30) |
1940 | 1421 | agc2_th = 0x2e00; | |
1941 | switch (demod) { | 1422 | else |
1942 | case STV0900_DEMOD_1: | 1423 | agc2_th = 0x1f00; |
1943 | default: | 1424 | |
1944 | stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x1F); | 1425 | stv0900_write_bits(intp, DEMOD_MODE, 0x1f); |
1945 | stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0x12); | 1426 | stv0900_write_reg(intp, TMGCFG, 0x12); |
1946 | stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0xf0); | 1427 | stv0900_write_reg(intp, TMGTHRISE, 0xf0); |
1947 | stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0xe0); | 1428 | stv0900_write_reg(intp, TMGTHFALL, 0xe0); |
1948 | stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 1); | 1429 | stv0900_write_bits(intp, SCAN_ENABLE, 1); |
1949 | stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 1); | 1430 | stv0900_write_bits(intp, CFR_AUTOSCAN, 1); |
1950 | stv0900_write_reg(i_params, R0900_P1_SFRUP1, 0x83); | 1431 | stv0900_write_reg(intp, SFRUP1, 0x83); |
1951 | stv0900_write_reg(i_params, R0900_P1_SFRUP0, 0xc0); | 1432 | stv0900_write_reg(intp, SFRUP0, 0xc0); |
1952 | stv0900_write_reg(i_params, R0900_P1_SFRLOW1, 0x82); | 1433 | stv0900_write_reg(intp, SFRLOW1, 0x82); |
1953 | stv0900_write_reg(i_params, R0900_P1_SFRLOW0, 0xa0); | 1434 | stv0900_write_reg(intp, SFRLOW0, 0xa0); |
1954 | stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x0); | 1435 | stv0900_write_reg(intp, DMDT0M, 0x0); |
1955 | stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x50); | 1436 | stv0900_write_reg(intp, AGC2REF, 0x50); |
1956 | 1437 | ||
1957 | if (i_params->chip_id >= 0x20) { | 1438 | if (intp->chip_id >= 0x30) { |
1958 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x6a); | 1439 | stv0900_write_reg(intp, CARFREQ, 0x99); |
1959 | stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x95); | 1440 | stv0900_write_reg(intp, SFRSTEP, 0x98); |
1960 | } else { | 1441 | } else if (intp->chip_id >= 0x20) { |
1961 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed); | 1442 | stv0900_write_reg(intp, CARFREQ, 0x6a); |
1962 | stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x73); | 1443 | stv0900_write_reg(intp, SFRSTEP, 0x95); |
1963 | } | 1444 | } else { |
1445 | stv0900_write_reg(intp, CARFREQ, 0xed); | ||
1446 | stv0900_write_reg(intp, SFRSTEP, 0x73); | ||
1447 | } | ||
1964 | 1448 | ||
1965 | if (i_params->dmd1_symbol_rate <= 2000000) | 1449 | if (intp->symbol_rate[demod] <= 2000000) |
1966 | currier_step = 1000; | 1450 | currier_step = 1000; |
1967 | else if (i_params->dmd1_symbol_rate <= 5000000) | 1451 | else if (intp->symbol_rate[demod] <= 5000000) |
1968 | currier_step = 2000; | 1452 | currier_step = 2000; |
1969 | else if (i_params->dmd1_symbol_rate <= 12000000) | 1453 | else if (intp->symbol_rate[demod] <= 12000000) |
1970 | currier_step = 3000; | 1454 | currier_step = 3000; |
1971 | else | 1455 | else |
1972 | currier_step = 5000; | 1456 | currier_step = 5000; |
1973 | 1457 | ||
1974 | nb_steps = -1 + ((i_params->dmd1_srch_range / 1000) / currier_step); | 1458 | nb_steps = -1 + ((intp->srch_range[demod] / 1000) / currier_step); |
1975 | nb_steps /= 2; | 1459 | nb_steps /= 2; |
1976 | nb_steps = (2 * nb_steps) + 1; | 1460 | nb_steps = (2 * nb_steps) + 1; |
1977 | |||
1978 | if (nb_steps < 0) | ||
1979 | nb_steps = 1; | ||
1980 | |||
1981 | else if (nb_steps > 10) { | ||
1982 | nb_steps = 11; | ||
1983 | currier_step = (i_params->dmd1_srch_range / 1000) / 10; | ||
1984 | } | ||
1985 | |||
1986 | current_step = 0; | ||
1987 | |||
1988 | direction = 1; | ||
1989 | tuner_freq = i_params->tuner1_freq; | ||
1990 | |||
1991 | while ((timingLock == FALSE) && (current_step < nb_steps)) { | ||
1992 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5F); | ||
1993 | stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x0); | ||
1994 | |||
1995 | msleep(50); | ||
1996 | |||
1997 | for (i = 0; i < 10; i++) { | ||
1998 | if (stv0900_get_bits(i_params, F0900_P1_TMGLOCK_QUALITY) >= 2) | ||
1999 | timingcpt++; | ||
2000 | |||
2001 | agc2_integr += (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8) | stv0900_read_reg(i_params, R0900_P1_AGC2I0); | ||
2002 | |||
2003 | } | ||
2004 | |||
2005 | agc2_integr /= 10; | ||
2006 | coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | ||
2007 | current_step++; | ||
2008 | direction *= -1; | ||
2009 | |||
2010 | dprintk("lock: I2C_DEMOD_MODE_FIELD =0. Search started. tuner freq=%d agc2=0x%x srate_coarse=%d tmg_cpt=%d\n", tuner_freq, agc2_integr, coarse_srate, timingcpt); | ||
2011 | 1461 | ||
2012 | if ((timingcpt >= 5) && (agc2_integr < 0x1F00) && (coarse_srate < 55000000) && (coarse_srate > 850000)) { | 1462 | if (nb_steps < 0) |
2013 | timingLock = TRUE; | 1463 | nb_steps = 1; |
2014 | } | 1464 | else if (nb_steps > 10) { |
2015 | 1465 | nb_steps = 11; | |
2016 | else if (current_step < nb_steps) { | 1466 | currier_step = (intp->srch_range[demod] / 1000) / 10; |
2017 | if (direction > 0) | 1467 | } |
2018 | tuner_freq += (current_step * currier_step); | ||
2019 | else | ||
2020 | tuner_freq -= (current_step * currier_step); | ||
2021 | 1468 | ||
2022 | stv0900_set_tuner(fe, tuner_freq, i_params->tuner1_bw); | 1469 | current_step = 0; |
2023 | } | 1470 | direction = 1; |
2024 | } | ||
2025 | 1471 | ||
2026 | if (timingLock == FALSE) | 1472 | tuner_freq = intp->freq[demod]; |
2027 | coarse_srate = 0; | ||
2028 | else | ||
2029 | coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | ||
2030 | break; | ||
2031 | case STV0900_DEMOD_2: | ||
2032 | stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x1F); | ||
2033 | stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0x12); | ||
2034 | stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0xf0); | ||
2035 | stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0xe0); | ||
2036 | stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 1); | ||
2037 | stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 1); | ||
2038 | stv0900_write_reg(i_params, R0900_P2_SFRUP1, 0x83); | ||
2039 | stv0900_write_reg(i_params, R0900_P2_SFRUP0, 0xc0); | ||
2040 | stv0900_write_reg(i_params, R0900_P2_SFRLOW1, 0x82); | ||
2041 | stv0900_write_reg(i_params, R0900_P2_SFRLOW0, 0xa0); | ||
2042 | stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x0); | ||
2043 | stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x50); | ||
2044 | |||
2045 | if (i_params->chip_id >= 0x20) { | ||
2046 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x6a); | ||
2047 | stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x95); | ||
2048 | } else { | ||
2049 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed); | ||
2050 | stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x73); | ||
2051 | } | ||
2052 | 1473 | ||
2053 | if (i_params->dmd2_symbol_rate <= 2000000) | 1474 | while ((timing_lck == FALSE) && (current_step < nb_steps)) { |
2054 | currier_step = 1000; | 1475 | stv0900_write_reg(intp, DMDISTATE, 0x5f); |
2055 | else if (i_params->dmd2_symbol_rate <= 5000000) | 1476 | stv0900_write_bits(intp, DEMOD_MODE, 0); |
2056 | currier_step = 2000; | ||
2057 | else if (i_params->dmd2_symbol_rate <= 12000000) | ||
2058 | currier_step = 3000; | ||
2059 | else | ||
2060 | currier_step = 5000; | ||
2061 | 1477 | ||
1478 | msleep(50); | ||
2062 | 1479 | ||
2063 | nb_steps = -1 + ((i_params->dmd2_srch_range / 1000) / currier_step); | 1480 | for (i = 0; i < 10; i++) { |
2064 | nb_steps /= 2; | 1481 | if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2) |
2065 | nb_steps = (2 * nb_steps) + 1; | 1482 | timingcpt++; |
2066 | 1483 | ||
2067 | if (nb_steps < 0) | 1484 | agc2_integr += (stv0900_read_reg(intp, AGC2I1) << 8) | |
2068 | nb_steps = 1; | 1485 | stv0900_read_reg(intp, AGC2I0); |
2069 | else if (nb_steps > 10) { | ||
2070 | nb_steps = 11; | ||
2071 | currier_step = (i_params->dmd2_srch_range / 1000) / 10; | ||
2072 | } | 1486 | } |
2073 | 1487 | ||
2074 | current_step = 0; | 1488 | agc2_integr /= 10; |
2075 | direction = 1; | 1489 | coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod); |
2076 | tuner_freq = i_params->tuner2_freq; | 1490 | current_step++; |
2077 | 1491 | direction *= -1; | |
2078 | while ((timingLock == FALSE) && (current_step < nb_steps)) { | 1492 | |
2079 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5F); | 1493 | dprintk("lock: I2C_DEMOD_MODE_FIELD =0. Search started." |
2080 | stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x0); | 1494 | " tuner freq=%d agc2=0x%x srate_coarse=%d tmg_cpt=%d\n", |
2081 | 1495 | tuner_freq, agc2_integr, coarse_srate, timingcpt); | |
2082 | msleep(50); | 1496 | |
2083 | timingcpt = 0; | 1497 | if ((timingcpt >= 5) && |
2084 | 1498 | (agc2_integr < agc2_th) && | |
2085 | for (i = 0; i < 20; i++) { | 1499 | (coarse_srate < 55000000) && |
2086 | if (stv0900_get_bits(i_params, F0900_P2_TMGLOCK_QUALITY) >= 2) | 1500 | (coarse_srate > 850000)) |
2087 | timingcpt++; | 1501 | timing_lck = TRUE; |
2088 | agc2_integr += (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8) | 1502 | else if (current_step < nb_steps) { |
2089 | | stv0900_read_reg(i_params, R0900_P2_AGC2I0); | 1503 | if (direction > 0) |
2090 | } | 1504 | tuner_freq += (current_step * currier_step); |
2091 | 1505 | else | |
2092 | agc2_integr /= 20; | 1506 | tuner_freq -= (current_step * currier_step); |
2093 | coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | ||
2094 | if ((timingcpt >= 10) && (agc2_integr < 0x1F00) && (coarse_srate < 55000000) && (coarse_srate > 850000)) | ||
2095 | timingLock = TRUE; | ||
2096 | else { | ||
2097 | current_step++; | ||
2098 | direction *= -1; | ||
2099 | |||
2100 | if (direction > 0) | ||
2101 | tuner_freq += (current_step * currier_step); | ||
2102 | else | ||
2103 | tuner_freq -= (current_step * currier_step); | ||
2104 | 1507 | ||
2105 | stv0900_set_tuner(fe, tuner_freq, i_params->tuner2_bw); | 1508 | if (intp->tuner_type[demod] == 3) |
2106 | } | 1509 | stv0900_set_tuner_auto(intp, tuner_freq, |
1510 | intp->bw[demod], demod); | ||
1511 | else | ||
1512 | stv0900_set_tuner(fe, tuner_freq, | ||
1513 | intp->bw[demod]); | ||
2107 | } | 1514 | } |
2108 | |||
2109 | if (timingLock == FALSE) | ||
2110 | coarse_srate = 0; | ||
2111 | else | ||
2112 | coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | ||
2113 | break; | ||
2114 | } | 1515 | } |
2115 | 1516 | ||
1517 | if (timing_lck == FALSE) | ||
1518 | coarse_srate = 0; | ||
1519 | else | ||
1520 | coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod); | ||
1521 | |||
2116 | return coarse_srate; | 1522 | return coarse_srate; |
2117 | } | 1523 | } |
2118 | 1524 | ||
2119 | static u32 stv0900_search_srate_fine(struct dvb_frontend *fe) | 1525 | static u32 stv0900_search_srate_fine(struct dvb_frontend *fe) |
2120 | { | 1526 | { |
2121 | struct stv0900_state *state = fe->demodulator_priv; | 1527 | struct stv0900_state *state = fe->demodulator_priv; |
2122 | struct stv0900_internal *i_params = state->internal; | 1528 | struct stv0900_internal *intp = state->internal; |
2123 | enum fe_stv0900_demod_num demod = state->demod; | 1529 | enum fe_stv0900_demod_num demod = state->demod; |
2124 | u32 coarse_srate, | 1530 | u32 coarse_srate, |
2125 | coarse_freq, | 1531 | coarse_freq, |
2126 | symb; | 1532 | symb, |
1533 | symbmax, | ||
1534 | symbmin, | ||
1535 | symbcomp; | ||
1536 | |||
1537 | coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod); | ||
1538 | |||
1539 | if (coarse_srate > 3000000) { | ||
1540 | symbmax = 13 * (coarse_srate / 10); | ||
1541 | symbmax = (symbmax / 1000) * 65536; | ||
1542 | symbmax /= (intp->mclk / 1000); | ||
1543 | |||
1544 | symbmin = 10 * (coarse_srate / 13); | ||
1545 | symbmin = (symbmin / 1000)*65536; | ||
1546 | symbmin /= (intp->mclk / 1000); | ||
1547 | |||
1548 | symb = (coarse_srate / 1000) * 65536; | ||
1549 | symb /= (intp->mclk / 1000); | ||
1550 | } else { | ||
1551 | symbmax = 13 * (coarse_srate / 10); | ||
1552 | symbmax = (symbmax / 100) * 65536; | ||
1553 | symbmax /= (intp->mclk / 100); | ||
2127 | 1554 | ||
2128 | coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); | 1555 | symbmin = 10 * (coarse_srate / 14); |
1556 | symbmin = (symbmin / 100) * 65536; | ||
1557 | symbmin /= (intp->mclk / 100); | ||
2129 | 1558 | ||
2130 | switch (demod) { | 1559 | symb = (coarse_srate / 100) * 65536; |
2131 | case STV0900_DEMOD_1: | 1560 | symb /= (intp->mclk / 100); |
2132 | default: | 1561 | } |
2133 | coarse_freq = (stv0900_read_reg(i_params, R0900_P1_CFR2) << 8) | ||
2134 | | stv0900_read_reg(i_params, R0900_P1_CFR1); | ||
2135 | symb = 13 * (coarse_srate / 10); | ||
2136 | |||
2137 | if (symb < i_params->dmd1_symbol_rate) | ||
2138 | coarse_srate = 0; | ||
2139 | else { | ||
2140 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F); | ||
2141 | stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01); | ||
2142 | stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0x20); | ||
2143 | stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0x00); | ||
2144 | stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0xd2); | ||
2145 | stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); | ||
2146 | |||
2147 | if (i_params->chip_id >= 0x20) | ||
2148 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x49); | ||
2149 | else | ||
2150 | stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed); | ||
2151 | |||
2152 | if (coarse_srate > 3000000) { | ||
2153 | symb = 13 * (coarse_srate / 10); | ||
2154 | symb = (symb / 1000) * 65536; | ||
2155 | symb /= (i_params->mclk / 1000); | ||
2156 | stv0900_write_reg(i_params, R0900_P1_SFRUP1, (symb >> 8) & 0x7F); | ||
2157 | stv0900_write_reg(i_params, R0900_P1_SFRUP0, (symb & 0xFF)); | ||
2158 | |||
2159 | symb = 10 * (coarse_srate / 13); | ||
2160 | symb = (symb / 1000) * 65536; | ||
2161 | symb /= (i_params->mclk / 1000); | ||
2162 | |||
2163 | stv0900_write_reg(i_params, R0900_P1_SFRLOW1, (symb >> 8) & 0x7F); | ||
2164 | stv0900_write_reg(i_params, R0900_P1_SFRLOW0, (symb & 0xFF)); | ||
2165 | |||
2166 | symb = (coarse_srate / 1000) * 65536; | ||
2167 | symb /= (i_params->mclk / 1000); | ||
2168 | stv0900_write_reg(i_params, R0900_P1_SFRINIT1, (symb >> 8) & 0xFF); | ||
2169 | stv0900_write_reg(i_params, R0900_P1_SFRINIT0, (symb & 0xFF)); | ||
2170 | } else { | ||
2171 | symb = 13 * (coarse_srate / 10); | ||
2172 | symb = (symb / 100) * 65536; | ||
2173 | symb /= (i_params->mclk / 100); | ||
2174 | stv0900_write_reg(i_params, R0900_P1_SFRUP1, (symb >> 8) & 0x7F); | ||
2175 | stv0900_write_reg(i_params, R0900_P1_SFRUP0, (symb & 0xFF)); | ||
2176 | |||
2177 | symb = 10 * (coarse_srate / 14); | ||
2178 | symb = (symb / 100) * 65536; | ||
2179 | symb /= (i_params->mclk / 100); | ||
2180 | stv0900_write_reg(i_params, R0900_P1_SFRLOW1, (symb >> 8) & 0x7F); | ||
2181 | stv0900_write_reg(i_params, R0900_P1_SFRLOW0, (symb & 0xFF)); | ||
2182 | |||
2183 | symb = (coarse_srate / 100) * 65536; | ||
2184 | symb /= (i_params->mclk / 100); | ||
2185 | stv0900_write_reg(i_params, R0900_P1_SFRINIT1, (symb >> 8) & 0xFF); | ||
2186 | stv0900_write_reg(i_params, R0900_P1_SFRINIT0, (symb & 0xFF)); | ||
2187 | } | ||
2188 | 1562 | ||
2189 | stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x20); | 1563 | symbcomp = 13 * (coarse_srate / 10); |
2190 | stv0900_write_reg(i_params, R0900_P1_CFRINIT1, (coarse_freq >> 8) & 0xff); | 1564 | coarse_freq = (stv0900_read_reg(intp, CFR2) << 8) |
2191 | stv0900_write_reg(i_params, R0900_P1_CFRINIT0, coarse_freq & 0xff); | 1565 | | stv0900_read_reg(intp, CFR1); |
2192 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15); | 1566 | |
2193 | } | 1567 | if (symbcomp < intp->symbol_rate[demod]) |
2194 | break; | 1568 | coarse_srate = 0; |
2195 | case STV0900_DEMOD_2: | 1569 | else { |
2196 | coarse_freq = (stv0900_read_reg(i_params, R0900_P2_CFR2) << 8) | 1570 | stv0900_write_reg(intp, DMDISTATE, 0x1f); |
2197 | | stv0900_read_reg(i_params, R0900_P2_CFR1); | 1571 | stv0900_write_reg(intp, TMGCFG2, 0xc1); |
2198 | 1572 | stv0900_write_reg(intp, TMGTHRISE, 0x20); | |
2199 | symb = 13 * (coarse_srate / 10); | 1573 | stv0900_write_reg(intp, TMGTHFALL, 0x00); |
2200 | 1574 | stv0900_write_reg(intp, TMGCFG, 0xd2); | |
2201 | if (symb < i_params->dmd2_symbol_rate) | 1575 | stv0900_write_bits(intp, CFR_AUTOSCAN, 0); |
2202 | coarse_srate = 0; | 1576 | stv0900_write_reg(intp, AGC2REF, 0x38); |
2203 | else { | 1577 | |
2204 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); | 1578 | if (intp->chip_id >= 0x30) |
2205 | stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01); | 1579 | stv0900_write_reg(intp, CARFREQ, 0x79); |
2206 | stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0x20); | 1580 | else if (intp->chip_id >= 0x20) |
2207 | stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0x00); | 1581 | stv0900_write_reg(intp, CARFREQ, 0x49); |
2208 | stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0xd2); | 1582 | else |
2209 | stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); | 1583 | stv0900_write_reg(intp, CARFREQ, 0xed); |
2210 | |||
2211 | if (i_params->chip_id >= 0x20) | ||
2212 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x49); | ||
2213 | else | ||
2214 | stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed); | ||
2215 | |||
2216 | if (coarse_srate > 3000000) { | ||
2217 | symb = 13 * (coarse_srate / 10); | ||
2218 | symb = (symb / 1000) * 65536; | ||
2219 | symb /= (i_params->mclk / 1000); | ||
2220 | stv0900_write_reg(i_params, R0900_P2_SFRUP1, (symb >> 8) & 0x7F); | ||
2221 | stv0900_write_reg(i_params, R0900_P2_SFRUP0, (symb & 0xFF)); | ||
2222 | |||
2223 | symb = 10 * (coarse_srate / 13); | ||
2224 | symb = (symb / 1000) * 65536; | ||
2225 | symb /= (i_params->mclk / 1000); | ||
2226 | |||
2227 | stv0900_write_reg(i_params, R0900_P2_SFRLOW1, (symb >> 8) & 0x7F); | ||
2228 | stv0900_write_reg(i_params, R0900_P2_SFRLOW0, (symb & 0xFF)); | ||
2229 | |||
2230 | symb = (coarse_srate / 1000) * 65536; | ||
2231 | symb /= (i_params->mclk / 1000); | ||
2232 | stv0900_write_reg(i_params, R0900_P2_SFRINIT1, (symb >> 8) & 0xFF); | ||
2233 | stv0900_write_reg(i_params, R0900_P2_SFRINIT0, (symb & 0xFF)); | ||
2234 | } else { | ||
2235 | symb = 13 * (coarse_srate / 10); | ||
2236 | symb = (symb / 100) * 65536; | ||
2237 | symb /= (i_params->mclk / 100); | ||
2238 | stv0900_write_reg(i_params, R0900_P2_SFRUP1, (symb >> 8) & 0x7F); | ||
2239 | stv0900_write_reg(i_params, R0900_P2_SFRUP0, (symb & 0xFF)); | ||
2240 | |||
2241 | symb = 10 * (coarse_srate / 14); | ||
2242 | symb = (symb / 100) * 65536; | ||
2243 | symb /= (i_params->mclk / 100); | ||
2244 | stv0900_write_reg(i_params, R0900_P2_SFRLOW1, (symb >> 8) & 0x7F); | ||
2245 | stv0900_write_reg(i_params, R0900_P2_SFRLOW0, (symb & 0xFF)); | ||
2246 | |||
2247 | symb = (coarse_srate / 100) * 65536; | ||
2248 | symb /= (i_params->mclk / 100); | ||
2249 | stv0900_write_reg(i_params, R0900_P2_SFRINIT1, (symb >> 8) & 0xFF); | ||
2250 | stv0900_write_reg(i_params, R0900_P2_SFRINIT0, (symb & 0xFF)); | ||
2251 | } | ||
2252 | 1584 | ||
2253 | stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x20); | 1585 | stv0900_write_reg(intp, SFRUP1, (symbmax >> 8) & 0x7f); |
2254 | stv0900_write_reg(i_params, R0900_P2_CFRINIT1, (coarse_freq >> 8) & 0xff); | 1586 | stv0900_write_reg(intp, SFRUP0, (symbmax & 0xff)); |
2255 | stv0900_write_reg(i_params, R0900_P2_CFRINIT0, coarse_freq & 0xff); | ||
2256 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15); | ||
2257 | } | ||
2258 | 1587 | ||
2259 | break; | 1588 | stv0900_write_reg(intp, SFRLOW1, (symbmin >> 8) & 0x7f); |
1589 | stv0900_write_reg(intp, SFRLOW0, (symbmin & 0xff)); | ||
1590 | |||
1591 | stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0xff); | ||
1592 | stv0900_write_reg(intp, SFRINIT0, (symb & 0xff)); | ||
1593 | |||
1594 | stv0900_write_reg(intp, DMDT0M, 0x20); | ||
1595 | stv0900_write_reg(intp, CFRINIT1, (coarse_freq >> 8) & 0xff); | ||
1596 | stv0900_write_reg(intp, CFRINIT0, coarse_freq & 0xff); | ||
1597 | stv0900_write_reg(intp, DMDISTATE, 0x15); | ||
2260 | } | 1598 | } |
2261 | 1599 | ||
2262 | return coarse_srate; | 1600 | return coarse_srate; |
@@ -2265,163 +1603,136 @@ static u32 stv0900_search_srate_fine(struct dvb_frontend *fe) | |||
2265 | static int stv0900_blind_search_algo(struct dvb_frontend *fe) | 1603 | static int stv0900_blind_search_algo(struct dvb_frontend *fe) |
2266 | { | 1604 | { |
2267 | struct stv0900_state *state = fe->demodulator_priv; | 1605 | struct stv0900_state *state = fe->demodulator_priv; |
2268 | struct stv0900_internal *i_params = state->internal; | 1606 | struct stv0900_internal *intp = state->internal; |
2269 | enum fe_stv0900_demod_num demod = state->demod; | 1607 | enum fe_stv0900_demod_num demod = state->demod; |
2270 | u8 k_ref_tmg, k_ref_tmg_max, k_ref_tmg_min; | 1608 | u8 k_ref_tmg, |
2271 | u32 coarse_srate; | 1609 | k_ref_tmg_max, |
2272 | int lock = FALSE, coarse_fail = FALSE; | 1610 | k_ref_tmg_min; |
2273 | s32 demod_timeout = 500, fec_timeout = 50, kref_tmg_reg, fail_cpt, i, agc2_overflow; | 1611 | u32 coarse_srate, |
2274 | u16 agc2_integr; | 1612 | agc2_th; |
2275 | u8 dstatus2; | 1613 | int lock = FALSE, |
2276 | 1614 | coarse_fail = FALSE; | |
2277 | dprintk(KERN_INFO "%s\n", __func__); | 1615 | s32 demod_timeout = 500, |
2278 | 1616 | fec_timeout = 50, | |
2279 | if (i_params->chip_id < 0x20) { | 1617 | fail_cpt, |
1618 | i, | ||
1619 | agc2_overflow; | ||
1620 | u16 agc2_int; | ||
1621 | u8 dstatus2; | ||
1622 | |||
1623 | dprintk("%s\n", __func__); | ||
1624 | |||
1625 | if (intp->chip_id < 0x20) { | ||
2280 | k_ref_tmg_max = 233; | 1626 | k_ref_tmg_max = 233; |
2281 | k_ref_tmg_min = 143; | 1627 | k_ref_tmg_min = 143; |
2282 | } else { | 1628 | } else { |
2283 | k_ref_tmg_max = 120; | 1629 | k_ref_tmg_max = 110; |
2284 | k_ref_tmg_min = 30; | 1630 | k_ref_tmg_min = 10; |
2285 | } | 1631 | } |
2286 | 1632 | ||
2287 | agc2_integr = stv0900_blind_check_agc2_min_level(i_params, demod); | 1633 | if (intp->chip_id <= 0x20) |
2288 | 1634 | agc2_th = STV0900_BLIND_SEARCH_AGC2_TH; | |
2289 | if (agc2_integr > STV0900_BLIND_SEARCH_AGC2_TH) { | 1635 | else |
2290 | lock = FALSE; | 1636 | agc2_th = STV0900_BLIND_SEARCH_AGC2_TH_CUT30; |
2291 | |||
2292 | } else { | ||
2293 | switch (demod) { | ||
2294 | case STV0900_DEMOD_1: | ||
2295 | default: | ||
2296 | if (i_params->chip_id == 0x10) | ||
2297 | stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0xAA); | ||
2298 | |||
2299 | if (i_params->chip_id < 0x20) | ||
2300 | stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x55); | ||
2301 | |||
2302 | stv0900_write_reg(i_params, R0900_P1_CARCFG, 0xC4); | ||
2303 | stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x44); | ||
2304 | |||
2305 | if (i_params->chip_id >= 0x20) { | ||
2306 | stv0900_write_reg(i_params, R0900_P1_EQUALCFG, 0x41); | ||
2307 | stv0900_write_reg(i_params, R0900_P1_FFECFG, 0x41); | ||
2308 | stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x82); | ||
2309 | stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0); | ||
2310 | } | ||
2311 | |||
2312 | kref_tmg_reg = R0900_P1_KREFTMG; | ||
2313 | break; | ||
2314 | case STV0900_DEMOD_2: | ||
2315 | if (i_params->chip_id == 0x10) | ||
2316 | stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0xAA); | ||
2317 | |||
2318 | if (i_params->chip_id < 0x20) | ||
2319 | stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x55); | ||
2320 | 1637 | ||
2321 | stv0900_write_reg(i_params, R0900_P2_CARCFG, 0xC4); | 1638 | agc2_int = stv0900_blind_check_agc2_min_level(intp, demod); |
2322 | stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x44); | ||
2323 | 1639 | ||
2324 | if (i_params->chip_id >= 0x20) { | 1640 | dprintk("%s agc2_int=%d agc2_th=%d \n", __func__, agc2_int, agc2_th); |
2325 | stv0900_write_reg(i_params, R0900_P2_EQUALCFG, 0x41); | 1641 | if (agc2_int > agc2_th) |
2326 | stv0900_write_reg(i_params, R0900_P2_FFECFG, 0x41); | 1642 | return FALSE; |
2327 | stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x82); | ||
2328 | stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0); | ||
2329 | } | ||
2330 | 1643 | ||
2331 | kref_tmg_reg = R0900_P2_KREFTMG; | 1644 | if (intp->chip_id == 0x10) |
2332 | break; | 1645 | stv0900_write_reg(intp, CORRELEXP, 0xaa); |
2333 | } | ||
2334 | 1646 | ||
2335 | k_ref_tmg = k_ref_tmg_max; | 1647 | if (intp->chip_id < 0x20) |
1648 | stv0900_write_reg(intp, CARHDR, 0x55); | ||
1649 | else | ||
1650 | stv0900_write_reg(intp, CARHDR, 0x20); | ||
2336 | 1651 | ||
2337 | do { | 1652 | if (intp->chip_id <= 0x20) |
2338 | stv0900_write_reg(i_params, kref_tmg_reg, k_ref_tmg); | 1653 | stv0900_write_reg(intp, CARCFG, 0xc4); |
2339 | if (stv0900_search_srate_coarse(fe) != 0) { | 1654 | else |
2340 | coarse_srate = stv0900_search_srate_fine(fe); | 1655 | stv0900_write_reg(intp, CARCFG, 0x6); |
2341 | 1656 | ||
2342 | if (coarse_srate != 0) { | 1657 | stv0900_write_reg(intp, RTCS2, 0x44); |
2343 | stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, coarse_srate, STV0900_BLIND_SEARCH); | ||
2344 | lock = stv0900_get_demod_lock(i_params, demod, demod_timeout); | ||
2345 | } else | ||
2346 | lock = FALSE; | ||
2347 | } else { | ||
2348 | fail_cpt = 0; | ||
2349 | agc2_overflow = 0; | ||
2350 | 1658 | ||
2351 | switch (demod) { | 1659 | if (intp->chip_id >= 0x20) { |
2352 | case STV0900_DEMOD_1: | 1660 | stv0900_write_reg(intp, EQUALCFG, 0x41); |
2353 | default: | 1661 | stv0900_write_reg(intp, FFECFG, 0x41); |
2354 | for (i = 0; i < 10; i++) { | 1662 | stv0900_write_reg(intp, VITSCALE, 0x82); |
2355 | agc2_integr = (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8) | 1663 | stv0900_write_reg(intp, VAVSRVIT, 0x0); |
2356 | | stv0900_read_reg(i_params, R0900_P1_AGC2I0); | 1664 | } |
2357 | 1665 | ||
2358 | if (agc2_integr >= 0xff00) | 1666 | k_ref_tmg = k_ref_tmg_max; |
2359 | agc2_overflow++; | ||
2360 | 1667 | ||
2361 | dstatus2 = stv0900_read_reg(i_params, R0900_P1_DSTATUS2); | 1668 | do { |
1669 | stv0900_write_reg(intp, KREFTMG, k_ref_tmg); | ||
1670 | if (stv0900_search_srate_coarse(fe) != 0) { | ||
1671 | coarse_srate = stv0900_search_srate_fine(fe); | ||
1672 | |||
1673 | if (coarse_srate != 0) { | ||
1674 | stv0900_get_lock_timeout(&demod_timeout, | ||
1675 | &fec_timeout, | ||
1676 | coarse_srate, | ||
1677 | STV0900_BLIND_SEARCH); | ||
1678 | lock = stv0900_get_demod_lock(intp, | ||
1679 | demod, | ||
1680 | demod_timeout); | ||
1681 | } else | ||
1682 | lock = FALSE; | ||
1683 | } else { | ||
1684 | fail_cpt = 0; | ||
1685 | agc2_overflow = 0; | ||
2362 | 1686 | ||
2363 | if (((dstatus2 & 0x1) == 0x1) && ((dstatus2 >> 7) == 1)) | 1687 | for (i = 0; i < 10; i++) { |
2364 | fail_cpt++; | 1688 | agc2_int = (stv0900_read_reg(intp, AGC2I1) << 8) |
2365 | } | 1689 | | stv0900_read_reg(intp, AGC2I0); |
2366 | break; | ||
2367 | case STV0900_DEMOD_2: | ||
2368 | for (i = 0; i < 10; i++) { | ||
2369 | agc2_integr = (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8) | ||
2370 | | stv0900_read_reg(i_params, R0900_P2_AGC2I0); | ||
2371 | 1690 | ||
2372 | if (agc2_integr >= 0xff00) | 1691 | if (agc2_int >= 0xff00) |
2373 | agc2_overflow++; | 1692 | agc2_overflow++; |
2374 | 1693 | ||
2375 | dstatus2 = stv0900_read_reg(i_params, R0900_P2_DSTATUS2); | 1694 | dstatus2 = stv0900_read_reg(intp, DSTATUS2); |
2376 | 1695 | ||
2377 | if (((dstatus2 & 0x1) == 0x1) && ((dstatus2 >> 7) == 1)) | 1696 | if (((dstatus2 & 0x1) == 0x1) && |
2378 | fail_cpt++; | 1697 | ((dstatus2 >> 7) == 1)) |
2379 | } | 1698 | fail_cpt++; |
2380 | break; | 1699 | } |
2381 | } | ||
2382 | 1700 | ||
2383 | if ((fail_cpt > 7) || (agc2_overflow > 7)) | 1701 | if ((fail_cpt > 7) || (agc2_overflow > 7)) |
2384 | coarse_fail = TRUE; | 1702 | coarse_fail = TRUE; |
2385 | 1703 | ||
2386 | lock = FALSE; | 1704 | lock = FALSE; |
2387 | } | 1705 | } |
2388 | k_ref_tmg -= 30; | 1706 | k_ref_tmg -= 30; |
2389 | } while ((k_ref_tmg >= k_ref_tmg_min) && (lock == FALSE) && (coarse_fail == FALSE)); | 1707 | } while ((k_ref_tmg >= k_ref_tmg_min) && |
2390 | } | 1708 | (lock == FALSE) && |
1709 | (coarse_fail == FALSE)); | ||
2391 | 1710 | ||
2392 | return lock; | 1711 | return lock; |
2393 | } | 1712 | } |
2394 | 1713 | ||
2395 | static void stv0900_set_viterbi_acq(struct stv0900_internal *i_params, | 1714 | static void stv0900_set_viterbi_acq(struct stv0900_internal *intp, |
2396 | enum fe_stv0900_demod_num demod) | 1715 | enum fe_stv0900_demod_num demod) |
2397 | { | 1716 | { |
2398 | s32 vth_reg; | 1717 | s32 vth_reg = VTH12; |
2399 | 1718 | ||
2400 | dprintk(KERN_INFO "%s\n", __func__); | 1719 | dprintk("%s\n", __func__); |
2401 | 1720 | ||
2402 | dmd_reg(vth_reg, R0900_P1_VTH12, R0900_P2_VTH12); | 1721 | stv0900_write_reg(intp, vth_reg++, 0x96); |
2403 | 1722 | stv0900_write_reg(intp, vth_reg++, 0x64); | |
2404 | stv0900_write_reg(i_params, vth_reg++, 0x96); | 1723 | stv0900_write_reg(intp, vth_reg++, 0x36); |
2405 | stv0900_write_reg(i_params, vth_reg++, 0x64); | 1724 | stv0900_write_reg(intp, vth_reg++, 0x23); |
2406 | stv0900_write_reg(i_params, vth_reg++, 0x36); | 1725 | stv0900_write_reg(intp, vth_reg++, 0x1e); |
2407 | stv0900_write_reg(i_params, vth_reg++, 0x23); | 1726 | stv0900_write_reg(intp, vth_reg++, 0x19); |
2408 | stv0900_write_reg(i_params, vth_reg++, 0x1E); | ||
2409 | stv0900_write_reg(i_params, vth_reg++, 0x19); | ||
2410 | } | 1727 | } |
2411 | 1728 | ||
2412 | static void stv0900_set_search_standard(struct stv0900_internal *i_params, | 1729 | static void stv0900_set_search_standard(struct stv0900_internal *intp, |
2413 | enum fe_stv0900_demod_num demod) | 1730 | enum fe_stv0900_demod_num demod) |
2414 | { | 1731 | { |
2415 | 1732 | ||
2416 | int sstndrd; | 1733 | dprintk("%s\n", __func__); |
2417 | |||
2418 | dprintk(KERN_INFO "%s\n", __func__); | ||
2419 | 1734 | ||
2420 | sstndrd = i_params->dmd1_srch_standard; | 1735 | switch (intp->srch_standard[demod]) { |
2421 | if (demod == 1) | ||
2422 | sstndrd = i_params->dmd2_srch_stndrd; | ||
2423 | |||
2424 | switch (sstndrd) { | ||
2425 | case STV0900_SEARCH_DVBS1: | 1736 | case STV0900_SEARCH_DVBS1: |
2426 | dprintk("Search Standard = DVBS1\n"); | 1737 | dprintk("Search Standard = DVBS1\n"); |
2427 | break; | 1738 | break; |
@@ -2436,129 +1747,74 @@ static void stv0900_set_search_standard(struct stv0900_internal *i_params, | |||
2436 | break; | 1747 | break; |
2437 | } | 1748 | } |
2438 | 1749 | ||
2439 | switch (demod) { | 1750 | switch (intp->srch_standard[demod]) { |
2440 | case STV0900_DEMOD_1: | 1751 | case STV0900_SEARCH_DVBS1: |
2441 | default: | 1752 | case STV0900_SEARCH_DSS: |
2442 | switch (i_params->dmd1_srch_standard) { | 1753 | stv0900_write_bits(intp, DVBS1_ENABLE, 1); |
2443 | case STV0900_SEARCH_DVBS1: | 1754 | stv0900_write_bits(intp, DVBS2_ENABLE, 0); |
2444 | case STV0900_SEARCH_DSS: | 1755 | stv0900_write_bits(intp, STOP_CLKVIT, 0); |
2445 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); | 1756 | stv0900_set_dvbs1_track_car_loop(intp, |
2446 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0); | 1757 | demod, |
2447 | 1758 | intp->symbol_rate[demod]); | |
2448 | stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 0); | 1759 | stv0900_write_reg(intp, CAR2CFG, 0x22); |
2449 | stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a); | 1760 | |
2450 | stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09); | 1761 | stv0900_set_viterbi_acq(intp, demod); |
2451 | stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x22); | 1762 | stv0900_set_viterbi_standard(intp, |
2452 | 1763 | intp->srch_standard[demod], | |
2453 | stv0900_set_viterbi_acq(i_params, demod); | 1764 | intp->fec[demod], demod); |
2454 | stv0900_set_viterbi_standard(i_params, | ||
2455 | i_params->dmd1_srch_standard, | ||
2456 | i_params->dmd1_fec, demod); | ||
2457 | |||
2458 | break; | ||
2459 | case STV0900_SEARCH_DVBS2: | ||
2460 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0); | ||
2461 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0); | ||
2462 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); | ||
2463 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1); | ||
2464 | stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 1); | ||
2465 | stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a); | ||
2466 | stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09); | ||
2467 | stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x26); | ||
2468 | if (i_params->demod_mode != STV0900_SINGLE) { | ||
2469 | if (i_params->chip_id <= 0x11) | ||
2470 | stv0900_stop_all_s2_modcod(i_params, demod); | ||
2471 | else | ||
2472 | stv0900_activate_s2_modcode(i_params, demod); | ||
2473 | |||
2474 | } else | ||
2475 | stv0900_activate_s2_modcode_single(i_params, demod); | ||
2476 | |||
2477 | stv0900_set_viterbi_tracq(i_params, demod); | ||
2478 | |||
2479 | break; | ||
2480 | case STV0900_AUTO_SEARCH: | ||
2481 | default: | ||
2482 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0); | ||
2483 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0); | ||
2484 | stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); | ||
2485 | stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1); | ||
2486 | stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 0); | ||
2487 | stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a); | ||
2488 | stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09); | ||
2489 | stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x26); | ||
2490 | if (i_params->demod_mode != STV0900_SINGLE) { | ||
2491 | if (i_params->chip_id <= 0x11) | ||
2492 | stv0900_stop_all_s2_modcod(i_params, demod); | ||
2493 | else | ||
2494 | stv0900_activate_s2_modcode(i_params, demod); | ||
2495 | 1765 | ||
2496 | } else | 1766 | break; |
2497 | stv0900_activate_s2_modcode_single(i_params, demod); | 1767 | case STV0900_SEARCH_DVBS2: |
1768 | stv0900_write_bits(intp, DVBS1_ENABLE, 0); | ||
1769 | stv0900_write_bits(intp, DVBS2_ENABLE, 1); | ||
1770 | stv0900_write_bits(intp, STOP_CLKVIT, 1); | ||
1771 | stv0900_write_reg(intp, ACLC, 0x1a); | ||
1772 | stv0900_write_reg(intp, BCLC, 0x09); | ||
1773 | if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/ | ||
1774 | stv0900_write_reg(intp, CAR2CFG, 0x26); | ||
1775 | else | ||
1776 | stv0900_write_reg(intp, CAR2CFG, 0x66); | ||
2498 | 1777 | ||
2499 | if (i_params->dmd1_symbol_rate >= 2000000) | 1778 | if (intp->demod_mode != STV0900_SINGLE) { |
2500 | stv0900_set_viterbi_acq(i_params, demod); | 1779 | if (intp->chip_id <= 0x11) |
1780 | stv0900_stop_all_s2_modcod(intp, demod); | ||
2501 | else | 1781 | else |
2502 | stv0900_set_viterbi_tracq(i_params, demod); | 1782 | stv0900_activate_s2_modcod(intp, demod); |
2503 | 1783 | ||
2504 | stv0900_set_viterbi_standard(i_params, i_params->dmd1_srch_standard, i_params->dmd1_fec, demod); | 1784 | } else |
1785 | stv0900_activate_s2_modcod_single(intp, demod); | ||
2505 | 1786 | ||
2506 | break; | 1787 | stv0900_set_viterbi_tracq(intp, demod); |
2507 | } | ||
2508 | break; | ||
2509 | case STV0900_DEMOD_2: | ||
2510 | switch (i_params->dmd2_srch_stndrd) { | ||
2511 | case STV0900_SEARCH_DVBS1: | ||
2512 | case STV0900_SEARCH_DSS: | ||
2513 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); | ||
2514 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); | ||
2515 | stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 0); | ||
2516 | stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a); | ||
2517 | stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09); | ||
2518 | stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x22); | ||
2519 | stv0900_set_viterbi_acq(i_params, demod); | ||
2520 | stv0900_set_viterbi_standard(i_params, i_params->dmd2_srch_stndrd, i_params->dmd2_fec, demod); | ||
2521 | break; | ||
2522 | case STV0900_SEARCH_DVBS2: | ||
2523 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0); | ||
2524 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); | ||
2525 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); | ||
2526 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1); | ||
2527 | stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 1); | ||
2528 | stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a); | ||
2529 | stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09); | ||
2530 | stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x26); | ||
2531 | if (i_params->demod_mode != STV0900_SINGLE) | ||
2532 | stv0900_activate_s2_modcode(i_params, demod); | ||
2533 | else | ||
2534 | stv0900_activate_s2_modcode_single(i_params, demod); | ||
2535 | 1788 | ||
2536 | stv0900_set_viterbi_tracq(i_params, demod); | 1789 | break; |
2537 | break; | 1790 | case STV0900_AUTO_SEARCH: |
2538 | case STV0900_AUTO_SEARCH: | 1791 | default: |
2539 | default: | 1792 | stv0900_write_bits(intp, DVBS1_ENABLE, 1); |
2540 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0); | 1793 | stv0900_write_bits(intp, DVBS2_ENABLE, 1); |
2541 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); | 1794 | stv0900_write_bits(intp, STOP_CLKVIT, 0); |
2542 | stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); | 1795 | stv0900_write_reg(intp, ACLC, 0x1a); |
2543 | stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1); | 1796 | stv0900_write_reg(intp, BCLC, 0x09); |
2544 | stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 0); | 1797 | stv0900_set_dvbs1_track_car_loop(intp, |
2545 | stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a); | 1798 | demod, |
2546 | stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09); | 1799 | intp->symbol_rate[demod]); |
2547 | stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x26); | 1800 | if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/ |
2548 | if (i_params->demod_mode != STV0900_SINGLE) | 1801 | stv0900_write_reg(intp, CAR2CFG, 0x26); |
2549 | stv0900_activate_s2_modcode(i_params, demod); | 1802 | else |
2550 | else | 1803 | stv0900_write_reg(intp, CAR2CFG, 0x66); |
2551 | stv0900_activate_s2_modcode_single(i_params, demod); | ||
2552 | 1804 | ||
2553 | if (i_params->dmd2_symbol_rate >= 2000000) | 1805 | if (intp->demod_mode != STV0900_SINGLE) { |
2554 | stv0900_set_viterbi_acq(i_params, demod); | 1806 | if (intp->chip_id <= 0x11) |
1807 | stv0900_stop_all_s2_modcod(intp, demod); | ||
2555 | else | 1808 | else |
2556 | stv0900_set_viterbi_tracq(i_params, demod); | 1809 | stv0900_activate_s2_modcod(intp, demod); |
2557 | 1810 | ||
2558 | stv0900_set_viterbi_standard(i_params, i_params->dmd2_srch_stndrd, i_params->dmd2_fec, demod); | 1811 | } else |
1812 | stv0900_activate_s2_modcod_single(intp, demod); | ||
2559 | 1813 | ||
2560 | break; | 1814 | stv0900_set_viterbi_tracq(intp, demod); |
2561 | } | 1815 | stv0900_set_viterbi_standard(intp, |
1816 | intp->srch_standard[demod], | ||
1817 | intp->fec[demod], demod); | ||
2562 | 1818 | ||
2563 | break; | 1819 | break; |
2564 | } | 1820 | } |
@@ -2567,10 +1823,11 @@ static void stv0900_set_search_standard(struct stv0900_internal *i_params, | |||
2567 | enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe) | 1823 | enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe) |
2568 | { | 1824 | { |
2569 | struct stv0900_state *state = fe->demodulator_priv; | 1825 | struct stv0900_state *state = fe->demodulator_priv; |
2570 | struct stv0900_internal *i_params = state->internal; | 1826 | struct stv0900_internal *intp = state->internal; |
2571 | enum fe_stv0900_demod_num demod = state->demod; | 1827 | enum fe_stv0900_demod_num demod = state->demod; |
2572 | 1828 | ||
2573 | s32 demod_timeout = 500, fec_timeout = 50, stream_merger_field; | 1829 | s32 demod_timeout = 500, fec_timeout = 50; |
1830 | s32 aq_power, agc1_power, i; | ||
2574 | 1831 | ||
2575 | int lock = FALSE, low_sr = FALSE; | 1832 | int lock = FALSE, low_sr = FALSE; |
2576 | 1833 | ||
@@ -2578,157 +1835,121 @@ enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe) | |||
2578 | enum fe_stv0900_search_algo algo; | 1835 | enum fe_stv0900_search_algo algo; |
2579 | int no_signal = FALSE; | 1836 | int no_signal = FALSE; |
2580 | 1837 | ||
2581 | dprintk(KERN_INFO "%s\n", __func__); | 1838 | dprintk("%s\n", __func__); |
2582 | |||
2583 | switch (demod) { | ||
2584 | case STV0900_DEMOD_1: | ||
2585 | default: | ||
2586 | algo = i_params->dmd1_srch_algo; | ||
2587 | |||
2588 | stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 1); | ||
2589 | stream_merger_field = F0900_P1_RST_HWARE; | ||
2590 | |||
2591 | stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5C); | ||
2592 | 1839 | ||
2593 | if (i_params->chip_id >= 0x20) | 1840 | algo = intp->srch_algo[demod]; |
2594 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x9e); | 1841 | stv0900_write_bits(intp, RST_HWARE, 1); |
1842 | stv0900_write_reg(intp, DMDISTATE, 0x5c); | ||
1843 | if (intp->chip_id >= 0x20) { | ||
1844 | if (intp->symbol_rate[demod] > 5000000) | ||
1845 | stv0900_write_reg(intp, CORRELABS, 0x9e); | ||
2595 | else | 1846 | else |
2596 | stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x88); | 1847 | stv0900_write_reg(intp, CORRELABS, 0x82); |
2597 | 1848 | } else | |
2598 | stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, i_params->dmd1_symbol_rate, i_params->dmd1_srch_algo); | 1849 | stv0900_write_reg(intp, CORRELABS, 0x88); |
2599 | |||
2600 | if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) { | ||
2601 | i_params->tuner1_bw = 2 * 36000000; | ||
2602 | |||
2603 | stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x00); | ||
2604 | stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x70); | ||
2605 | |||
2606 | stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod); | ||
2607 | } else { | ||
2608 | stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x20); | ||
2609 | stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0xd2); | ||
2610 | |||
2611 | if (i_params->dmd1_symbol_rate < 2000000) | ||
2612 | stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x63); | ||
2613 | else | ||
2614 | stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x70); | ||
2615 | |||
2616 | stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38); | ||
2617 | if (i_params->chip_id >= 0x20) { | ||
2618 | stv0900_write_reg(i_params, R0900_P1_KREFTMG, 0x5a); | ||
2619 | |||
2620 | if (i_params->dmd1_srch_algo == STV0900_COLD_START) | ||
2621 | i_params->tuner1_bw = (15 * (stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000)) / 10; | ||
2622 | else if (i_params->dmd1_srch_algo == STV0900_WARM_START) | ||
2623 | i_params->tuner1_bw = stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000; | ||
2624 | } else { | ||
2625 | stv0900_write_reg(i_params, R0900_P1_KREFTMG, 0xc1); | ||
2626 | i_params->tuner1_bw = (15 * (stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000)) / 10; | ||
2627 | } | ||
2628 | |||
2629 | stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01); | ||
2630 | |||
2631 | stv0900_set_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod); | ||
2632 | stv0900_set_max_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod); | ||
2633 | stv0900_set_min_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod); | ||
2634 | if (i_params->dmd1_symbol_rate >= 10000000) | ||
2635 | low_sr = FALSE; | ||
2636 | else | ||
2637 | low_sr = TRUE; | ||
2638 | |||
2639 | } | ||
2640 | |||
2641 | stv0900_set_tuner(fe, i_params->tuner1_freq, i_params->tuner1_bw); | ||
2642 | |||
2643 | stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, i_params->dmd1_srch_iq_inv); | ||
2644 | stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1); | ||
2645 | |||
2646 | stv0900_set_search_standard(i_params, demod); | ||
2647 | 1850 | ||
2648 | if (i_params->dmd1_srch_algo != STV0900_BLIND_SEARCH) | 1851 | stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, |
2649 | stv0900_start_search(i_params, demod); | 1852 | intp->symbol_rate[demod], |
2650 | break; | 1853 | intp->srch_algo[demod]); |
2651 | case STV0900_DEMOD_2: | ||
2652 | algo = i_params->dmd2_srch_algo; | ||
2653 | 1854 | ||
2654 | stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 1); | 1855 | if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) { |
1856 | intp->bw[demod] = 2 * 36000000; | ||
2655 | 1857 | ||
2656 | stream_merger_field = F0900_P2_RST_HWARE; | 1858 | stv0900_write_reg(intp, TMGCFG2, 0xc0); |
1859 | stv0900_write_reg(intp, CORRELMANT, 0x70); | ||
2657 | 1860 | ||
2658 | stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5C); | 1861 | stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod); |
1862 | } else { | ||
1863 | stv0900_write_reg(intp, DMDT0M, 0x20); | ||
1864 | stv0900_write_reg(intp, TMGCFG, 0xd2); | ||
2659 | 1865 | ||
2660 | if (i_params->chip_id >= 0x20) | 1866 | if (intp->symbol_rate[demod] < 2000000) |
2661 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x9e); | 1867 | stv0900_write_reg(intp, CORRELMANT, 0x63); |
2662 | else | 1868 | else |
2663 | stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x88); | 1869 | stv0900_write_reg(intp, CORRELMANT, 0x70); |
2664 | 1870 | ||
2665 | stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, i_params->dmd2_symbol_rate, i_params->dmd2_srch_algo); | 1871 | stv0900_write_reg(intp, AGC2REF, 0x38); |
2666 | 1872 | ||
2667 | if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) { | 1873 | intp->bw[demod] = |
2668 | i_params->tuner2_bw = 2 * 36000000; | 1874 | stv0900_carrier_width(intp->symbol_rate[demod], |
1875 | intp->rolloff); | ||
1876 | if (intp->chip_id >= 0x20) { | ||
1877 | stv0900_write_reg(intp, KREFTMG, 0x5a); | ||
2669 | 1878 | ||
2670 | stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x00); | 1879 | if (intp->srch_algo[demod] == STV0900_COLD_START) { |
2671 | stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x70); | 1880 | intp->bw[demod] += 10000000; |
1881 | intp->bw[demod] *= 15; | ||
1882 | intp->bw[demod] /= 10; | ||
1883 | } else if (intp->srch_algo[demod] == STV0900_WARM_START) | ||
1884 | intp->bw[demod] += 10000000; | ||
2672 | 1885 | ||
2673 | stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod); | ||
2674 | } else { | 1886 | } else { |
2675 | stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x20); | 1887 | stv0900_write_reg(intp, KREFTMG, 0xc1); |
2676 | stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0xd2); | 1888 | intp->bw[demod] += 10000000; |
1889 | intp->bw[demod] *= 15; | ||
1890 | intp->bw[demod] /= 10; | ||
1891 | } | ||
2677 | 1892 | ||
2678 | if (i_params->dmd2_symbol_rate < 2000000) | 1893 | stv0900_write_reg(intp, TMGCFG2, 0xc1); |
2679 | stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x63); | ||
2680 | else | ||
2681 | stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x70); | ||
2682 | 1894 | ||
2683 | if (i_params->dmd2_symbol_rate >= 10000000) | 1895 | stv0900_set_symbol_rate(intp, intp->mclk, |
2684 | stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38); | 1896 | intp->symbol_rate[demod], demod); |
2685 | else | 1897 | stv0900_set_max_symbol_rate(intp, intp->mclk, |
2686 | stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x60); | 1898 | intp->symbol_rate[demod], demod); |
1899 | stv0900_set_min_symbol_rate(intp, intp->mclk, | ||
1900 | intp->symbol_rate[demod], demod); | ||
1901 | if (intp->symbol_rate[demod] >= 10000000) | ||
1902 | low_sr = FALSE; | ||
1903 | else | ||
1904 | low_sr = TRUE; | ||
2687 | 1905 | ||
2688 | if (i_params->chip_id >= 0x20) { | 1906 | } |
2689 | stv0900_write_reg(i_params, R0900_P2_KREFTMG, 0x5a); | ||
2690 | 1907 | ||
2691 | if (i_params->dmd2_srch_algo == STV0900_COLD_START) | 1908 | if (intp->tuner_type[demod] == 3) |
2692 | i_params->tuner2_bw = (15 * (stv0900_carrier_width(i_params->dmd2_symbol_rate, | 1909 | stv0900_set_tuner_auto(intp, intp->freq[demod], |
2693 | i_params->rolloff) + 10000000)) / 10; | 1910 | intp->bw[demod], demod); |
2694 | else if (i_params->dmd2_srch_algo == STV0900_WARM_START) | 1911 | else |
2695 | i_params->tuner2_bw = stv0900_carrier_width(i_params->dmd2_symbol_rate, | 1912 | stv0900_set_tuner(fe, intp->freq[demod], intp->bw[demod]); |
2696 | i_params->rolloff) + 10000000; | ||
2697 | } else { | ||
2698 | stv0900_write_reg(i_params, R0900_P2_KREFTMG, 0xc1); | ||
2699 | i_params->tuner2_bw = (15 * (stv0900_carrier_width(i_params->dmd2_symbol_rate, | ||
2700 | i_params->rolloff) + 10000000)) / 10; | ||
2701 | } | ||
2702 | 1913 | ||
2703 | stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01); | 1914 | agc1_power = MAKEWORD(stv0900_get_bits(intp, AGCIQ_VALUE1), |
1915 | stv0900_get_bits(intp, AGCIQ_VALUE0)); | ||
2704 | 1916 | ||
2705 | stv0900_set_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod); | 1917 | aq_power = 0; |
2706 | stv0900_set_max_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod); | ||
2707 | stv0900_set_min_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod); | ||
2708 | if (i_params->dmd2_symbol_rate >= 10000000) | ||
2709 | low_sr = FALSE; | ||
2710 | else | ||
2711 | low_sr = TRUE; | ||
2712 | 1918 | ||
2713 | } | 1919 | if (agc1_power == 0) { |
1920 | for (i = 0; i < 5; i++) | ||
1921 | aq_power += (stv0900_get_bits(intp, POWER_I) + | ||
1922 | stv0900_get_bits(intp, POWER_Q)) / 2; | ||
2714 | 1923 | ||
2715 | stv0900_set_tuner(fe, i_params->tuner2_freq, i_params->tuner2_bw); | 1924 | aq_power /= 5; |
1925 | } | ||
2716 | 1926 | ||
2717 | stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, i_params->dmd2_srch_iq_inv); | 1927 | if ((agc1_power == 0) && (aq_power < IQPOWER_THRESHOLD)) { |
2718 | stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1); | 1928 | intp->result[demod].locked = FALSE; |
1929 | signal_type = STV0900_NOAGC1; | ||
1930 | dprintk("%s: NO AGC1, POWERI, POWERQ\n", __func__); | ||
1931 | } else { | ||
1932 | stv0900_write_bits(intp, SPECINV_CONTROL, | ||
1933 | intp->srch_iq_inv[demod]); | ||
1934 | if (intp->chip_id <= 0x20) /*cut 2.0*/ | ||
1935 | stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1); | ||
1936 | else /*cut 3.0*/ | ||
1937 | stv0900_write_bits(intp, MANUALS2_ROLLOFF, 1); | ||
2719 | 1938 | ||
2720 | stv0900_set_search_standard(i_params, demod); | 1939 | stv0900_set_search_standard(intp, demod); |
2721 | 1940 | ||
2722 | if (i_params->dmd2_srch_algo != STV0900_BLIND_SEARCH) | 1941 | if (intp->srch_algo[demod] != STV0900_BLIND_SEARCH) |
2723 | stv0900_start_search(i_params, demod); | 1942 | stv0900_start_search(intp, demod); |
2724 | break; | ||
2725 | } | 1943 | } |
2726 | 1944 | ||
2727 | if (i_params->chip_id == 0x12) { | 1945 | if (signal_type == STV0900_NOAGC1) |
2728 | stv0900_write_bits(i_params, stream_merger_field, 0); | 1946 | return signal_type; |
1947 | |||
1948 | if (intp->chip_id == 0x12) { | ||
1949 | stv0900_write_bits(intp, RST_HWARE, 0); | ||
2729 | msleep(3); | 1950 | msleep(3); |
2730 | stv0900_write_bits(i_params, stream_merger_field, 1); | 1951 | stv0900_write_bits(intp, RST_HWARE, 1); |
2731 | stv0900_write_bits(i_params, stream_merger_field, 0); | 1952 | stv0900_write_bits(intp, RST_HWARE, 0); |
2732 | } | 1953 | } |
2733 | 1954 | ||
2734 | if (algo == STV0900_BLIND_SEARCH) | 1955 | if (algo == STV0900_BLIND_SEARCH) |
@@ -2736,12 +1957,12 @@ enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe) | |||
2736 | else if (algo == STV0900_COLD_START) | 1957 | else if (algo == STV0900_COLD_START) |
2737 | lock = stv0900_get_demod_cold_lock(fe, demod_timeout); | 1958 | lock = stv0900_get_demod_cold_lock(fe, demod_timeout); |
2738 | else if (algo == STV0900_WARM_START) | 1959 | else if (algo == STV0900_WARM_START) |
2739 | lock = stv0900_get_demod_lock(i_params, demod, demod_timeout); | 1960 | lock = stv0900_get_demod_lock(intp, demod, demod_timeout); |
2740 | 1961 | ||
2741 | if ((lock == FALSE) && (algo == STV0900_COLD_START)) { | 1962 | if ((lock == FALSE) && (algo == STV0900_COLD_START)) { |
2742 | if (low_sr == FALSE) { | 1963 | if (low_sr == FALSE) { |
2743 | if (stv0900_check_timing_lock(i_params, demod) == TRUE) | 1964 | if (stv0900_check_timing_lock(intp, demod) == TRUE) |
2744 | lock = stv0900_sw_algo(i_params, demod); | 1965 | lock = stv0900_sw_algo(intp, demod); |
2745 | } | 1966 | } |
2746 | } | 1967 | } |
2747 | 1968 | ||
@@ -2750,98 +1971,64 @@ enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe) | |||
2750 | 1971 | ||
2751 | if ((lock == TRUE) && (signal_type == STV0900_RANGEOK)) { | 1972 | if ((lock == TRUE) && (signal_type == STV0900_RANGEOK)) { |
2752 | stv0900_track_optimization(fe); | 1973 | stv0900_track_optimization(fe); |
2753 | if (i_params->chip_id <= 0x11) { | 1974 | if (intp->chip_id <= 0x11) { |
2754 | if ((stv0900_get_standard(fe, STV0900_DEMOD_1) == STV0900_DVBS1_STANDARD) && (stv0900_get_standard(fe, STV0900_DEMOD_2) == STV0900_DVBS1_STANDARD)) { | 1975 | if ((stv0900_get_standard(fe, 0) == |
1976 | STV0900_DVBS1_STANDARD) && | ||
1977 | (stv0900_get_standard(fe, 1) == | ||
1978 | STV0900_DVBS1_STANDARD)) { | ||
2755 | msleep(20); | 1979 | msleep(20); |
2756 | stv0900_write_bits(i_params, stream_merger_field, 0); | 1980 | stv0900_write_bits(intp, RST_HWARE, 0); |
2757 | } else { | 1981 | } else { |
2758 | stv0900_write_bits(i_params, stream_merger_field, 0); | 1982 | stv0900_write_bits(intp, RST_HWARE, 0); |
2759 | msleep(3); | 1983 | msleep(3); |
2760 | stv0900_write_bits(i_params, stream_merger_field, 1); | 1984 | stv0900_write_bits(intp, RST_HWARE, 1); |
2761 | stv0900_write_bits(i_params, stream_merger_field, 0); | 1985 | stv0900_write_bits(intp, RST_HWARE, 0); |
2762 | } | 1986 | } |
2763 | } else if (i_params->chip_id == 0x20) { | 1987 | |
2764 | stv0900_write_bits(i_params, stream_merger_field, 0); | 1988 | } else if (intp->chip_id >= 0x20) { |
1989 | stv0900_write_bits(intp, RST_HWARE, 0); | ||
2765 | msleep(3); | 1990 | msleep(3); |
2766 | stv0900_write_bits(i_params, stream_merger_field, 1); | 1991 | stv0900_write_bits(intp, RST_HWARE, 1); |
2767 | stv0900_write_bits(i_params, stream_merger_field, 0); | 1992 | stv0900_write_bits(intp, RST_HWARE, 0); |
2768 | } | 1993 | } |
2769 | 1994 | ||
2770 | if (stv0900_wait_for_lock(i_params, demod, fec_timeout, fec_timeout) == TRUE) { | 1995 | if (stv0900_wait_for_lock(intp, demod, |
1996 | fec_timeout, fec_timeout) == TRUE) { | ||
2771 | lock = TRUE; | 1997 | lock = TRUE; |
2772 | switch (demod) { | 1998 | intp->result[demod].locked = TRUE; |
2773 | case STV0900_DEMOD_1: | 1999 | if (intp->result[demod].standard == |
2774 | default: | 2000 | STV0900_DVBS2_STANDARD) { |
2775 | i_params->dmd1_rslts.locked = TRUE; | 2001 | stv0900_set_dvbs2_rolloff(intp, demod); |
2776 | if (i_params->dmd1_rslts.standard == STV0900_DVBS2_STANDARD) { | 2002 | stv0900_write_bits(intp, RESET_UPKO_COUNT, 1); |
2777 | stv0900_set_dvbs2_rolloff(i_params, demod); | 2003 | stv0900_write_bits(intp, RESET_UPKO_COUNT, 0); |
2778 | stv0900_write_reg(i_params, R0900_P1_PDELCTRL2, 0x40); | 2004 | stv0900_write_reg(intp, ERRCTRL1, 0x67); |
2779 | stv0900_write_reg(i_params, R0900_P1_PDELCTRL2, 0); | 2005 | } else { |
2780 | stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x67); | 2006 | stv0900_write_reg(intp, ERRCTRL1, 0x75); |
2781 | } else { | ||
2782 | stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75); | ||
2783 | } | ||
2784 | |||
2785 | stv0900_write_reg(i_params, R0900_P1_FBERCPT4, 0); | ||
2786 | stv0900_write_reg(i_params, R0900_P1_ERRCTRL2, 0xc1); | ||
2787 | break; | ||
2788 | case STV0900_DEMOD_2: | ||
2789 | i_params->dmd2_rslts.locked = TRUE; | ||
2790 | |||
2791 | if (i_params->dmd2_rslts.standard == STV0900_DVBS2_STANDARD) { | ||
2792 | stv0900_set_dvbs2_rolloff(i_params, demod); | ||
2793 | stv0900_write_reg(i_params, R0900_P2_PDELCTRL2, 0x60); | ||
2794 | stv0900_write_reg(i_params, R0900_P2_PDELCTRL2, 0x20); | ||
2795 | stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x67); | ||
2796 | } else { | ||
2797 | stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75); | ||
2798 | } | ||
2799 | |||
2800 | stv0900_write_reg(i_params, R0900_P2_FBERCPT4, 0); | ||
2801 | |||
2802 | stv0900_write_reg(i_params, R0900_P2_ERRCTRL2, 0xc1); | ||
2803 | break; | ||
2804 | } | 2007 | } |
2008 | |||
2009 | stv0900_write_reg(intp, FBERCPT4, 0); | ||
2010 | stv0900_write_reg(intp, ERRCTRL2, 0xc1); | ||
2805 | } else { | 2011 | } else { |
2806 | lock = FALSE; | 2012 | lock = FALSE; |
2807 | signal_type = STV0900_NODATA; | 2013 | signal_type = STV0900_NODATA; |
2808 | no_signal = stv0900_check_signal_presence(i_params, demod); | 2014 | no_signal = stv0900_check_signal_presence(intp, demod); |
2809 | 2015 | ||
2810 | switch (demod) { | 2016 | intp->result[demod].locked = FALSE; |
2811 | case STV0900_DEMOD_1: | ||
2812 | default: | ||
2813 | i_params->dmd1_rslts.locked = FALSE; | ||
2814 | break; | ||
2815 | case STV0900_DEMOD_2: | ||
2816 | i_params->dmd2_rslts.locked = FALSE; | ||
2817 | break; | ||
2818 | } | ||
2819 | } | 2017 | } |
2820 | } | 2018 | } |
2821 | 2019 | ||
2822 | if ((signal_type == STV0900_NODATA) && (no_signal == FALSE)) { | 2020 | if ((signal_type != STV0900_NODATA) || (no_signal != FALSE)) |
2823 | switch (demod) { | 2021 | return signal_type; |
2824 | case STV0900_DEMOD_1: | ||
2825 | default: | ||
2826 | if (i_params->chip_id <= 0x11) { | ||
2827 | if ((stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS_FOUND) && | ||
2828 | (i_params->dmd1_srch_iq_inv <= STV0900_IQ_AUTO_NORMAL_FIRST)) | ||
2829 | signal_type = stv0900_dvbs1_acq_workaround(fe); | ||
2830 | } else | ||
2831 | i_params->dmd1_rslts.locked = FALSE; | ||
2832 | 2022 | ||
2833 | break; | 2023 | if (intp->chip_id > 0x11) { |
2834 | case STV0900_DEMOD_2: | 2024 | intp->result[demod].locked = FALSE; |
2835 | if (i_params->chip_id <= 0x11) { | 2025 | return signal_type; |
2836 | if ((stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS_FOUND) && | ||
2837 | (i_params->dmd2_srch_iq_inv <= STV0900_IQ_AUTO_NORMAL_FIRST)) | ||
2838 | signal_type = stv0900_dvbs1_acq_workaround(fe); | ||
2839 | } else | ||
2840 | i_params->dmd2_rslts.locked = FALSE; | ||
2841 | break; | ||
2842 | } | ||
2843 | } | 2026 | } |
2844 | 2027 | ||
2028 | if ((stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) && | ||
2029 | (intp->srch_iq_inv[demod] <= STV0900_IQ_AUTO_NORMAL_FIRST)) | ||
2030 | signal_type = stv0900_dvbs1_acq_workaround(fe); | ||
2031 | |||
2845 | return signal_type; | 2032 | return signal_type; |
2846 | } | 2033 | } |
2847 | 2034 | ||
diff --git a/drivers/media/dvb/frontends/stv090x.c b/drivers/media/dvb/frontends/stv090x.c index 488bdfb34fb3..96972804f4ad 100644 --- a/drivers/media/dvb/frontends/stv090x.c +++ b/drivers/media/dvb/frontends/stv090x.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/string.h> | 25 | #include <linux/string.h> |
26 | #include <linux/slab.h> | ||
26 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
27 | 28 | ||
28 | #include <linux/dvb/frontend.h> | 29 | #include <linux/dvb/frontend.h> |
@@ -37,7 +38,82 @@ | |||
37 | static unsigned int verbose; | 38 | static unsigned int verbose; |
38 | module_param(verbose, int, 0644); | 39 | module_param(verbose, int, 0644); |
39 | 40 | ||
40 | struct mutex demod_lock; | 41 | /* internal params node */ |
42 | struct stv090x_dev { | ||
43 | /* pointer for internal params, one for each pair of demods */ | ||
44 | struct stv090x_internal *internal; | ||
45 | struct stv090x_dev *next_dev; | ||
46 | }; | ||
47 | |||
48 | /* first internal params */ | ||
49 | static struct stv090x_dev *stv090x_first_dev; | ||
50 | |||
51 | /* find chip by i2c adapter and i2c address */ | ||
52 | static struct stv090x_dev *find_dev(struct i2c_adapter *i2c_adap, | ||
53 | u8 i2c_addr) | ||
54 | { | ||
55 | struct stv090x_dev *temp_dev = stv090x_first_dev; | ||
56 | |||
57 | /* | ||
58 | Search of the last stv0900 chip or | ||
59 | find it by i2c adapter and i2c address */ | ||
60 | while ((temp_dev != NULL) && | ||
61 | ((temp_dev->internal->i2c_adap != i2c_adap) || | ||
62 | (temp_dev->internal->i2c_addr != i2c_addr))) { | ||
63 | |||
64 | temp_dev = temp_dev->next_dev; | ||
65 | } | ||
66 | |||
67 | return temp_dev; | ||
68 | } | ||
69 | |||
70 | /* deallocating chip */ | ||
71 | static void remove_dev(struct stv090x_internal *internal) | ||
72 | { | ||
73 | struct stv090x_dev *prev_dev = stv090x_first_dev; | ||
74 | struct stv090x_dev *del_dev = find_dev(internal->i2c_adap, | ||
75 | internal->i2c_addr); | ||
76 | |||
77 | if (del_dev != NULL) { | ||
78 | if (del_dev == stv090x_first_dev) { | ||
79 | stv090x_first_dev = del_dev->next_dev; | ||
80 | } else { | ||
81 | while (prev_dev->next_dev != del_dev) | ||
82 | prev_dev = prev_dev->next_dev; | ||
83 | |||
84 | prev_dev->next_dev = del_dev->next_dev; | ||
85 | } | ||
86 | |||
87 | kfree(del_dev); | ||
88 | } | ||
89 | } | ||
90 | |||
91 | /* allocating new chip */ | ||
92 | static struct stv090x_dev *append_internal(struct stv090x_internal *internal) | ||
93 | { | ||
94 | struct stv090x_dev *new_dev; | ||
95 | struct stv090x_dev *temp_dev; | ||
96 | |||
97 | new_dev = kmalloc(sizeof(struct stv090x_dev), GFP_KERNEL); | ||
98 | if (new_dev != NULL) { | ||
99 | new_dev->internal = internal; | ||
100 | new_dev->next_dev = NULL; | ||
101 | |||
102 | /* append to list */ | ||
103 | if (stv090x_first_dev == NULL) { | ||
104 | stv090x_first_dev = new_dev; | ||
105 | } else { | ||
106 | temp_dev = stv090x_first_dev; | ||
107 | while (temp_dev->next_dev != NULL) | ||
108 | temp_dev = temp_dev->next_dev; | ||
109 | |||
110 | temp_dev->next_dev = new_dev; | ||
111 | } | ||
112 | } | ||
113 | |||
114 | return new_dev; | ||
115 | } | ||
116 | |||
41 | 117 | ||
42 | /* DVBS1 and DSS C/N Lookup table */ | 118 | /* DVBS1 and DSS C/N Lookup table */ |
43 | static const struct stv090x_tab stv090x_s1cn_tab[] = { | 119 | static const struct stv090x_tab stv090x_s1cn_tab[] = { |
@@ -683,6 +759,9 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | |||
683 | struct stv090x_state *state = fe->demodulator_priv; | 759 | struct stv090x_state *state = fe->demodulator_priv; |
684 | u32 reg; | 760 | u32 reg; |
685 | 761 | ||
762 | if (enable) | ||
763 | mutex_lock(&state->internal->tuner_lock); | ||
764 | |||
686 | reg = STV090x_READ_DEMOD(state, I2CRPT); | 765 | reg = STV090x_READ_DEMOD(state, I2CRPT); |
687 | if (enable) { | 766 | if (enable) { |
688 | dprintk(FE_DEBUG, 1, "Enable Gate"); | 767 | dprintk(FE_DEBUG, 1, "Enable Gate"); |
@@ -696,9 +775,14 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | |||
696 | if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0) | 775 | if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0) |
697 | goto err; | 776 | goto err; |
698 | } | 777 | } |
778 | |||
779 | if (!enable) | ||
780 | mutex_unlock(&state->internal->tuner_lock); | ||
781 | |||
699 | return 0; | 782 | return 0; |
700 | err: | 783 | err: |
701 | dprintk(FE_ERROR, 1, "I/O error"); | 784 | dprintk(FE_ERROR, 1, "I/O error"); |
785 | mutex_unlock(&state->internal->tuner_lock); | ||
702 | return -1; | 786 | return -1; |
703 | } | 787 | } |
704 | 788 | ||
@@ -755,13 +839,13 @@ static int stv090x_set_srate(struct stv090x_state *state, u32 srate) | |||
755 | 839 | ||
756 | if (srate > 60000000) { | 840 | if (srate > 60000000) { |
757 | sym = (srate << 4); /* SR * 2^16 / master_clk */ | 841 | sym = (srate << 4); /* SR * 2^16 / master_clk */ |
758 | sym /= (state->mclk >> 12); | 842 | sym /= (state->internal->mclk >> 12); |
759 | } else if (srate > 6000000) { | 843 | } else if (srate > 6000000) { |
760 | sym = (srate << 6); | 844 | sym = (srate << 6); |
761 | sym /= (state->mclk >> 10); | 845 | sym /= (state->internal->mclk >> 10); |
762 | } else { | 846 | } else { |
763 | sym = (srate << 9); | 847 | sym = (srate << 9); |
764 | sym /= (state->mclk >> 7); | 848 | sym /= (state->internal->mclk >> 7); |
765 | } | 849 | } |
766 | 850 | ||
767 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0x7f) < 0) /* MSB */ | 851 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0x7f) < 0) /* MSB */ |
@@ -782,13 +866,13 @@ static int stv090x_set_max_srate(struct stv090x_state *state, u32 clk, u32 srate | |||
782 | srate = 105 * (srate / 100); | 866 | srate = 105 * (srate / 100); |
783 | if (srate > 60000000) { | 867 | if (srate > 60000000) { |
784 | sym = (srate << 4); /* SR * 2^16 / master_clk */ | 868 | sym = (srate << 4); /* SR * 2^16 / master_clk */ |
785 | sym /= (state->mclk >> 12); | 869 | sym /= (state->internal->mclk >> 12); |
786 | } else if (srate > 6000000) { | 870 | } else if (srate > 6000000) { |
787 | sym = (srate << 6); | 871 | sym = (srate << 6); |
788 | sym /= (state->mclk >> 10); | 872 | sym /= (state->internal->mclk >> 10); |
789 | } else { | 873 | } else { |
790 | sym = (srate << 9); | 874 | sym = (srate << 9); |
791 | sym /= (state->mclk >> 7); | 875 | sym /= (state->internal->mclk >> 7); |
792 | } | 876 | } |
793 | 877 | ||
794 | if (sym < 0x7fff) { | 878 | if (sym < 0x7fff) { |
@@ -816,16 +900,16 @@ static int stv090x_set_min_srate(struct stv090x_state *state, u32 clk, u32 srate | |||
816 | srate = 95 * (srate / 100); | 900 | srate = 95 * (srate / 100); |
817 | if (srate > 60000000) { | 901 | if (srate > 60000000) { |
818 | sym = (srate << 4); /* SR * 2^16 / master_clk */ | 902 | sym = (srate << 4); /* SR * 2^16 / master_clk */ |
819 | sym /= (state->mclk >> 12); | 903 | sym /= (state->internal->mclk >> 12); |
820 | } else if (srate > 6000000) { | 904 | } else if (srate > 6000000) { |
821 | sym = (srate << 6); | 905 | sym = (srate << 6); |
822 | sym /= (state->mclk >> 10); | 906 | sym /= (state->internal->mclk >> 10); |
823 | } else { | 907 | } else { |
824 | sym = (srate << 9); | 908 | sym = (srate << 9); |
825 | sym /= (state->mclk >> 7); | 909 | sym /= (state->internal->mclk >> 7); |
826 | } | 910 | } |
827 | 911 | ||
828 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, ((sym >> 8) & 0xff)) < 0) /* MSB */ | 912 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, ((sym >> 8) & 0x7f)) < 0) /* MSB */ |
829 | goto err; | 913 | goto err; |
830 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, (sym & 0xff)) < 0) /* LSB */ | 914 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, (sym & 0xff)) < 0) /* LSB */ |
831 | goto err; | 915 | goto err; |
@@ -1103,21 +1187,21 @@ static int stv090x_vitclk_ctl(struct stv090x_state *state, int enable) | |||
1103 | 1187 | ||
1104 | switch (state->demod) { | 1188 | switch (state->demod) { |
1105 | case STV090x_DEMODULATOR_0: | 1189 | case STV090x_DEMODULATOR_0: |
1106 | mutex_lock(&demod_lock); | 1190 | mutex_lock(&state->internal->demod_lock); |
1107 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | 1191 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); |
1108 | STV090x_SETFIELD(reg, STOP_CLKVIT1_FIELD, enable); | 1192 | STV090x_SETFIELD(reg, STOP_CLKVIT1_FIELD, enable); |
1109 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | 1193 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) |
1110 | goto err; | 1194 | goto err; |
1111 | mutex_unlock(&demod_lock); | 1195 | mutex_unlock(&state->internal->demod_lock); |
1112 | break; | 1196 | break; |
1113 | 1197 | ||
1114 | case STV090x_DEMODULATOR_1: | 1198 | case STV090x_DEMODULATOR_1: |
1115 | mutex_lock(&demod_lock); | 1199 | mutex_lock(&state->internal->demod_lock); |
1116 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | 1200 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); |
1117 | STV090x_SETFIELD(reg, STOP_CLKVIT2_FIELD, enable); | 1201 | STV090x_SETFIELD(reg, STOP_CLKVIT2_FIELD, enable); |
1118 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | 1202 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) |
1119 | goto err; | 1203 | goto err; |
1120 | mutex_unlock(&demod_lock); | 1204 | mutex_unlock(&state->internal->demod_lock); |
1121 | break; | 1205 | break; |
1122 | 1206 | ||
1123 | default: | 1207 | default: |
@@ -1126,14 +1210,14 @@ static int stv090x_vitclk_ctl(struct stv090x_state *state, int enable) | |||
1126 | } | 1210 | } |
1127 | return 0; | 1211 | return 0; |
1128 | err: | 1212 | err: |
1129 | mutex_unlock(&demod_lock); | 1213 | mutex_unlock(&state->internal->demod_lock); |
1130 | dprintk(FE_ERROR, 1, "I/O error"); | 1214 | dprintk(FE_ERROR, 1, "I/O error"); |
1131 | return -1; | 1215 | return -1; |
1132 | } | 1216 | } |
1133 | 1217 | ||
1134 | static int stv090x_dvbs_track_crl(struct stv090x_state *state) | 1218 | static int stv090x_dvbs_track_crl(struct stv090x_state *state) |
1135 | { | 1219 | { |
1136 | if (state->dev_ver >= 0x30) { | 1220 | if (state->internal->dev_ver >= 0x30) { |
1137 | /* Set ACLC BCLC optimised value vs SR */ | 1221 | /* Set ACLC BCLC optimised value vs SR */ |
1138 | if (state->srate >= 15000000) { | 1222 | if (state->srate >= 15000000) { |
1139 | if (STV090x_WRITE_DEMOD(state, ACLC, 0x2b) < 0) | 1223 | if (STV090x_WRITE_DEMOD(state, ACLC, 0x2b) < 0) |
@@ -1215,7 +1299,7 @@ static int stv090x_delivery_search(struct stv090x_state *state) | |||
1215 | if (STV090x_WRITE_DEMOD(state, BCLC, 0x09) < 0) | 1299 | if (STV090x_WRITE_DEMOD(state, BCLC, 0x09) < 0) |
1216 | goto err; | 1300 | goto err; |
1217 | 1301 | ||
1218 | if (state->dev_ver <= 0x20) { | 1302 | if (state->internal->dev_ver <= 0x20) { |
1219 | /* enable S2 carrier loop */ | 1303 | /* enable S2 carrier loop */ |
1220 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) | 1304 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) |
1221 | goto err; | 1305 | goto err; |
@@ -1238,12 +1322,18 @@ static int stv090x_delivery_search(struct stv090x_state *state) | |||
1238 | goto err; | 1322 | goto err; |
1239 | } | 1323 | } |
1240 | 1324 | ||
1325 | if (stv090x_set_vit_thtracq(state) < 0) | ||
1326 | goto err; | ||
1241 | break; | 1327 | break; |
1242 | 1328 | ||
1243 | case STV090x_SEARCH_AUTO: | 1329 | case STV090x_SEARCH_AUTO: |
1244 | default: | 1330 | default: |
1245 | /* enable DVB-S2 and DVB-S2 in Auto MODE */ | 1331 | /* enable DVB-S2 and DVB-S2 in Auto MODE */ |
1246 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | 1332 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); |
1333 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 0); | ||
1334 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); | ||
1335 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1336 | goto err; | ||
1247 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | 1337 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); |
1248 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); | 1338 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); |
1249 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | 1339 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) |
@@ -1255,7 +1345,7 @@ static int stv090x_delivery_search(struct stv090x_state *state) | |||
1255 | if (stv090x_dvbs_track_crl(state) < 0) | 1345 | if (stv090x_dvbs_track_crl(state) < 0) |
1256 | goto err; | 1346 | goto err; |
1257 | 1347 | ||
1258 | if (state->dev_ver <= 0x20) { | 1348 | if (state->internal->dev_ver <= 0x20) { |
1259 | /* enable S2 carrier loop */ | 1349 | /* enable S2 carrier loop */ |
1260 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) | 1350 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) |
1261 | goto err; | 1351 | goto err; |
@@ -1278,17 +1368,8 @@ static int stv090x_delivery_search(struct stv090x_state *state) | |||
1278 | goto err; | 1368 | goto err; |
1279 | } | 1369 | } |
1280 | 1370 | ||
1281 | if (state->srate >= 2000000) { | 1371 | if (stv090x_set_vit_thacq(state) < 0) |
1282 | /* Srate >= 2MSPS, Viterbi threshold to acquire */ | 1372 | goto err; |
1283 | if (stv090x_set_vit_thacq(state) < 0) | ||
1284 | goto err; | ||
1285 | } else { | ||
1286 | /* Srate < 2MSPS, Reset Viterbi thresholdto track | ||
1287 | * and then re-acquire | ||
1288 | */ | ||
1289 | if (stv090x_set_vit_thtracq(state) < 0) | ||
1290 | goto err; | ||
1291 | } | ||
1292 | 1373 | ||
1293 | if (stv090x_set_viterbi(state) < 0) | 1374 | if (stv090x_set_viterbi(state) < 0) |
1294 | goto err; | 1375 | goto err; |
@@ -1311,13 +1392,13 @@ static int stv090x_start_search(struct stv090x_state *state) | |||
1311 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) | 1392 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) |
1312 | goto err; | 1393 | goto err; |
1313 | 1394 | ||
1314 | if (state->dev_ver <= 0x20) { | 1395 | if (state->internal->dev_ver <= 0x20) { |
1315 | if (state->srate <= 5000000) { | 1396 | if (state->srate <= 5000000) { |
1316 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0x44) < 0) | 1397 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0x44) < 0) |
1317 | goto err; | 1398 | goto err; |
1318 | if (STV090x_WRITE_DEMOD(state, CFRUP1, 0x0f) < 0) | 1399 | if (STV090x_WRITE_DEMOD(state, CFRUP1, 0x0f) < 0) |
1319 | goto err; | 1400 | goto err; |
1320 | if (STV090x_WRITE_DEMOD(state, CFRUP1, 0xff) < 0) | 1401 | if (STV090x_WRITE_DEMOD(state, CFRUP0, 0xff) < 0) |
1321 | goto err; | 1402 | goto err; |
1322 | if (STV090x_WRITE_DEMOD(state, CFRLOW1, 0xf0) < 0) | 1403 | if (STV090x_WRITE_DEMOD(state, CFRLOW1, 0xf0) < 0) |
1323 | goto err; | 1404 | goto err; |
@@ -1355,7 +1436,7 @@ static int stv090x_start_search(struct stv090x_state *state) | |||
1355 | * CFR max = +1MHz | 1436 | * CFR max = +1MHz |
1356 | */ | 1437 | */ |
1357 | freq_abs = 1000 << 16; | 1438 | freq_abs = 1000 << 16; |
1358 | freq_abs /= (state->mclk / 1000); | 1439 | freq_abs /= (state->internal->mclk / 1000); |
1359 | freq = (s16) freq_abs; | 1440 | freq = (s16) freq_abs; |
1360 | } else { | 1441 | } else { |
1361 | /* COLD Start | 1442 | /* COLD Start |
@@ -1365,13 +1446,13 @@ static int stv090x_start_search(struct stv090x_state *state) | |||
1365 | */ | 1446 | */ |
1366 | freq_abs = (state->search_range / 2000) + 600; | 1447 | freq_abs = (state->search_range / 2000) + 600; |
1367 | freq_abs = freq_abs << 16; | 1448 | freq_abs = freq_abs << 16; |
1368 | freq_abs /= (state->mclk / 1000); | 1449 | freq_abs /= (state->internal->mclk / 1000); |
1369 | freq = (s16) freq_abs; | 1450 | freq = (s16) freq_abs; |
1370 | } | 1451 | } |
1371 | 1452 | ||
1372 | if (STV090x_WRITE_DEMOD(state, CFRUP1, MSB(freq)) < 0) | 1453 | if (STV090x_WRITE_DEMOD(state, CFRUP1, MSB(freq)) < 0) |
1373 | goto err; | 1454 | goto err; |
1374 | if (STV090x_WRITE_DEMOD(state, CFRUP1, LSB(freq)) < 0) | 1455 | if (STV090x_WRITE_DEMOD(state, CFRUP0, LSB(freq)) < 0) |
1375 | goto err; | 1456 | goto err; |
1376 | 1457 | ||
1377 | freq *= -1; | 1458 | freq *= -1; |
@@ -1388,7 +1469,7 @@ static int stv090x_start_search(struct stv090x_state *state) | |||
1388 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0) < 0) | 1469 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0) < 0) |
1389 | goto err; | 1470 | goto err; |
1390 | 1471 | ||
1391 | if (state->dev_ver >= 0x20) { | 1472 | if (state->internal->dev_ver >= 0x20) { |
1392 | if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) | 1473 | if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) |
1393 | goto err; | 1474 | goto err; |
1394 | if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) | 1475 | if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) |
@@ -1422,28 +1503,33 @@ static int stv090x_start_search(struct stv090x_state *state) | |||
1422 | if (STV090x_WRITE_DEMOD(state, DMDCFG2, reg) < 0) | 1503 | if (STV090x_WRITE_DEMOD(state, DMDCFG2, reg) < 0) |
1423 | goto err; | 1504 | goto err; |
1424 | 1505 | ||
1425 | if (state->dev_ver >= 0x20) { | 1506 | if (STV090x_WRITE_DEMOD(state, RTC, 0x88) < 0) |
1507 | goto err; | ||
1508 | |||
1509 | if (state->internal->dev_ver >= 0x20) { | ||
1426 | /*Frequency offset detector setting*/ | 1510 | /*Frequency offset detector setting*/ |
1427 | if (state->srate < 2000000) { | 1511 | if (state->srate < 2000000) { |
1428 | if (state->dev_ver <= 0x20) { | 1512 | if (state->internal->dev_ver <= 0x20) { |
1429 | /* Cut 2 */ | 1513 | /* Cut 2 */ |
1430 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x39) < 0) | 1514 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x39) < 0) |
1431 | goto err; | 1515 | goto err; |
1432 | } else { | 1516 | } else { |
1433 | /* Cut 2 */ | 1517 | /* Cut 3 */ |
1434 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x89) < 0) | 1518 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x89) < 0) |
1435 | goto err; | 1519 | goto err; |
1436 | } | 1520 | } |
1437 | if (STV090x_WRITE_DEMOD(state, CARHDR, 0x40) < 0) | 1521 | if (STV090x_WRITE_DEMOD(state, CARHDR, 0x40) < 0) |
1438 | goto err; | 1522 | goto err; |
1439 | } | 1523 | } else if (state->srate < 10000000) { |
1440 | |||
1441 | if (state->srate < 10000000) { | ||
1442 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4c) < 0) | 1524 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4c) < 0) |
1443 | goto err; | 1525 | goto err; |
1526 | if (STV090x_WRITE_DEMOD(state, CARHDR, 0x20) < 0) | ||
1527 | goto err; | ||
1444 | } else { | 1528 | } else { |
1445 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4b) < 0) | 1529 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4b) < 0) |
1446 | goto err; | 1530 | goto err; |
1531 | if (STV090x_WRITE_DEMOD(state, CARHDR, 0x20) < 0) | ||
1532 | goto err; | ||
1447 | } | 1533 | } |
1448 | } else { | 1534 | } else { |
1449 | if (state->srate < 10000000) { | 1535 | if (state->srate < 10000000) { |
@@ -1485,14 +1571,14 @@ err: | |||
1485 | 1571 | ||
1486 | static int stv090x_get_agc2_min_level(struct stv090x_state *state) | 1572 | static int stv090x_get_agc2_min_level(struct stv090x_state *state) |
1487 | { | 1573 | { |
1488 | u32 agc2_min = 0, agc2 = 0, freq_init, freq_step, reg; | 1574 | u32 agc2_min = 0xffff, agc2 = 0, freq_init, freq_step, reg; |
1489 | s32 i, j, steps, dir; | 1575 | s32 i, j, steps, dir; |
1490 | 1576 | ||
1491 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) | 1577 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) |
1492 | goto err; | 1578 | goto err; |
1493 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | 1579 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); |
1494 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1); | 1580 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 0); |
1495 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 1); | 1581 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0); |
1496 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | 1582 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) |
1497 | goto err; | 1583 | goto err; |
1498 | 1584 | ||
@@ -1509,14 +1595,12 @@ static int stv090x_get_agc2_min_level(struct stv090x_state *state) | |||
1509 | if (stv090x_set_srate(state, 1000000) < 0) | 1595 | if (stv090x_set_srate(state, 1000000) < 0) |
1510 | goto err; | 1596 | goto err; |
1511 | 1597 | ||
1512 | steps = -1 + state->search_range / 1000000; | 1598 | steps = state->search_range / 1000000; |
1513 | steps /= 2; | 1599 | if (steps <= 0) |
1514 | steps = (2 * steps) + 1; | ||
1515 | if (steps < 0) | ||
1516 | steps = 1; | 1600 | steps = 1; |
1517 | 1601 | ||
1518 | dir = 1; | 1602 | dir = 1; |
1519 | freq_step = (1000000 * 256) / (state->mclk / 256); | 1603 | freq_step = (1000000 * 256) / (state->internal->mclk / 256); |
1520 | freq_init = 0; | 1604 | freq_init = 0; |
1521 | 1605 | ||
1522 | for (i = 0; i < steps; i++) { | 1606 | for (i = 0; i < steps; i++) { |
@@ -1525,7 +1609,7 @@ static int stv090x_get_agc2_min_level(struct stv090x_state *state) | |||
1525 | else | 1609 | else |
1526 | freq_init = freq_init - (freq_step * i); | 1610 | freq_init = freq_init - (freq_step * i); |
1527 | 1611 | ||
1528 | dir = -1; | 1612 | dir *= -1; |
1529 | 1613 | ||
1530 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod RESET */ | 1614 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod RESET */ |
1531 | goto err; | 1615 | goto err; |
@@ -1536,13 +1620,14 @@ static int stv090x_get_agc2_min_level(struct stv090x_state *state) | |||
1536 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x58) < 0) /* Demod RESET */ | 1620 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x58) < 0) /* Demod RESET */ |
1537 | goto err; | 1621 | goto err; |
1538 | msleep(10); | 1622 | msleep(10); |
1623 | |||
1624 | agc2 = 0; | ||
1539 | for (j = 0; j < 10; j++) { | 1625 | for (j = 0; j < 10; j++) { |
1540 | agc2 += STV090x_READ_DEMOD(state, AGC2I1) << 8; | 1626 | agc2 += (STV090x_READ_DEMOD(state, AGC2I1) << 8) | |
1541 | agc2 |= STV090x_READ_DEMOD(state, AGC2I0); | 1627 | STV090x_READ_DEMOD(state, AGC2I0); |
1542 | } | 1628 | } |
1543 | agc2 /= 10; | 1629 | agc2 /= 10; |
1544 | agc2_min = 0xffff; | 1630 | if (agc2 < agc2_min) |
1545 | if (agc2 < 0xffff) | ||
1546 | agc2_min = agc2; | 1631 | agc2_min = agc2; |
1547 | } | 1632 | } |
1548 | 1633 | ||
@@ -1584,6 +1669,12 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | |||
1584 | int tmg_lock = 0, i; | 1669 | int tmg_lock = 0, i; |
1585 | s32 tmg_cpt = 0, dir = 1, steps, cur_step = 0, freq; | 1670 | s32 tmg_cpt = 0, dir = 1, steps, cur_step = 0, freq; |
1586 | u32 srate_coarse = 0, agc2 = 0, car_step = 1200, reg; | 1671 | u32 srate_coarse = 0, agc2 = 0, car_step = 1200, reg; |
1672 | u32 agc2th; | ||
1673 | |||
1674 | if (state->internal->dev_ver >= 0x30) | ||
1675 | agc2th = 0x2e00; | ||
1676 | else | ||
1677 | agc2th = 0x1f00; | ||
1587 | 1678 | ||
1588 | reg = STV090x_READ_DEMOD(state, DMDISTATE); | 1679 | reg = STV090x_READ_DEMOD(state, DMDISTATE); |
1589 | STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x1f); /* Demod RESET */ | 1680 | STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x1f); /* Demod RESET */ |
@@ -1591,13 +1682,15 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | |||
1591 | goto err; | 1682 | goto err; |
1592 | if (STV090x_WRITE_DEMOD(state, TMGCFG, 0x12) < 0) | 1683 | if (STV090x_WRITE_DEMOD(state, TMGCFG, 0x12) < 0) |
1593 | goto err; | 1684 | goto err; |
1685 | if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0xc0) < 0) | ||
1686 | goto err; | ||
1594 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0xf0) < 0) | 1687 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0xf0) < 0) |
1595 | goto err; | 1688 | goto err; |
1596 | if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0xe0) < 0) | 1689 | if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0xe0) < 0) |
1597 | goto err; | 1690 | goto err; |
1598 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | 1691 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); |
1599 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1); | 1692 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1); |
1600 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 1); | 1693 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0); |
1601 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | 1694 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) |
1602 | goto err; | 1695 | goto err; |
1603 | 1696 | ||
@@ -1611,16 +1704,16 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | |||
1611 | goto err; | 1704 | goto err; |
1612 | if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x00) < 0) | 1705 | if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x00) < 0) |
1613 | goto err; | 1706 | goto err; |
1614 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x60) < 0) | 1707 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x50) < 0) |
1615 | goto err; | 1708 | goto err; |
1616 | 1709 | ||
1617 | if (state->dev_ver >= 0x30) { | 1710 | if (state->internal->dev_ver >= 0x30) { |
1618 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x99) < 0) | 1711 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x99) < 0) |
1619 | goto err; | 1712 | goto err; |
1620 | if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0) | 1713 | if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x98) < 0) |
1621 | goto err; | 1714 | goto err; |
1622 | 1715 | ||
1623 | } else if (state->dev_ver >= 0x20) { | 1716 | } else if (state->internal->dev_ver >= 0x20) { |
1624 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x6a) < 0) | 1717 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x6a) < 0) |
1625 | goto err; | 1718 | goto err; |
1626 | if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0) | 1719 | if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0) |
@@ -1652,23 +1745,31 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | |||
1652 | while ((!tmg_lock) && (cur_step < steps)) { | 1745 | while ((!tmg_lock) && (cur_step < steps)) { |
1653 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5f) < 0) /* Demod RESET */ | 1746 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5f) < 0) /* Demod RESET */ |
1654 | goto err; | 1747 | goto err; |
1655 | reg = STV090x_READ_DEMOD(state, DMDISTATE); | 1748 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0) |
1656 | STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x00); /* trigger acquisition */ | 1749 | goto err; |
1657 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) | 1750 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0) |
1751 | goto err; | ||
1752 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, 0x00) < 0) | ||
1753 | goto err; | ||
1754 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, 0x00) < 0) | ||
1755 | goto err; | ||
1756 | /* trigger acquisition */ | ||
1757 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x40) < 0) | ||
1658 | goto err; | 1758 | goto err; |
1659 | msleep(50); | 1759 | msleep(50); |
1660 | for (i = 0; i < 10; i++) { | 1760 | for (i = 0; i < 10; i++) { |
1661 | reg = STV090x_READ_DEMOD(state, DSTATUS); | 1761 | reg = STV090x_READ_DEMOD(state, DSTATUS); |
1662 | if (STV090x_GETFIELD_Px(reg, TMGLOCK_QUALITY_FIELD) >= 2) | 1762 | if (STV090x_GETFIELD_Px(reg, TMGLOCK_QUALITY_FIELD) >= 2) |
1663 | tmg_cpt++; | 1763 | tmg_cpt++; |
1664 | agc2 += STV090x_READ_DEMOD(state, AGC2I1) << 8; | 1764 | agc2 += (STV090x_READ_DEMOD(state, AGC2I1) << 8) | |
1665 | agc2 |= STV090x_READ_DEMOD(state, AGC2I0); | 1765 | STV090x_READ_DEMOD(state, AGC2I0); |
1666 | } | 1766 | } |
1667 | agc2 /= 10; | 1767 | agc2 /= 10; |
1668 | srate_coarse = stv090x_get_srate(state, state->mclk); | 1768 | srate_coarse = stv090x_get_srate(state, state->internal->mclk); |
1669 | cur_step++; | 1769 | cur_step++; |
1670 | dir *= -1; | 1770 | dir *= -1; |
1671 | if ((tmg_cpt >= 5) && (agc2 < 0x1f00) && (srate_coarse < 55000000) && (srate_coarse > 850000)) | 1771 | if ((tmg_cpt >= 5) && (agc2 < agc2th) && |
1772 | (srate_coarse < 50000000) && (srate_coarse > 850000)) | ||
1672 | tmg_lock = 1; | 1773 | tmg_lock = 1; |
1673 | else if (cur_step < steps) { | 1774 | else if (cur_step < steps) { |
1674 | if (dir > 0) | 1775 | if (dir > 0) |
@@ -1681,13 +1782,13 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | |||
1681 | goto err; | 1782 | goto err; |
1682 | 1783 | ||
1683 | if (state->config->tuner_set_frequency) { | 1784 | if (state->config->tuner_set_frequency) { |
1684 | if (state->config->tuner_set_frequency(fe, state->frequency) < 0) | 1785 | if (state->config->tuner_set_frequency(fe, freq) < 0) |
1685 | goto err; | 1786 | goto err_gateoff; |
1686 | } | 1787 | } |
1687 | 1788 | ||
1688 | if (state->config->tuner_set_bandwidth) { | 1789 | if (state->config->tuner_set_bandwidth) { |
1689 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | 1790 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) |
1690 | goto err; | 1791 | goto err_gateoff; |
1691 | } | 1792 | } |
1692 | 1793 | ||
1693 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 1794 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) |
@@ -1700,7 +1801,7 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | |||
1700 | 1801 | ||
1701 | if (state->config->tuner_get_status) { | 1802 | if (state->config->tuner_get_status) { |
1702 | if (state->config->tuner_get_status(fe, ®) < 0) | 1803 | if (state->config->tuner_get_status(fe, ®) < 0) |
1703 | goto err; | 1804 | goto err_gateoff; |
1704 | } | 1805 | } |
1705 | 1806 | ||
1706 | if (reg) | 1807 | if (reg) |
@@ -1716,9 +1817,12 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | |||
1716 | if (!tmg_lock) | 1817 | if (!tmg_lock) |
1717 | srate_coarse = 0; | 1818 | srate_coarse = 0; |
1718 | else | 1819 | else |
1719 | srate_coarse = stv090x_get_srate(state, state->mclk); | 1820 | srate_coarse = stv090x_get_srate(state, state->internal->mclk); |
1720 | 1821 | ||
1721 | return srate_coarse; | 1822 | return srate_coarse; |
1823 | |||
1824 | err_gateoff: | ||
1825 | stv090x_i2c_gate_ctrl(fe, 0); | ||
1722 | err: | 1826 | err: |
1723 | dprintk(FE_ERROR, 1, "I/O error"); | 1827 | dprintk(FE_ERROR, 1, "I/O error"); |
1724 | return -1; | 1828 | return -1; |
@@ -1728,7 +1832,7 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state) | |||
1728 | { | 1832 | { |
1729 | u32 srate_coarse, freq_coarse, sym, reg; | 1833 | u32 srate_coarse, freq_coarse, sym, reg; |
1730 | 1834 | ||
1731 | srate_coarse = stv090x_get_srate(state, state->mclk); | 1835 | srate_coarse = stv090x_get_srate(state, state->internal->mclk); |
1732 | freq_coarse = STV090x_READ_DEMOD(state, CFR2) << 8; | 1836 | freq_coarse = STV090x_READ_DEMOD(state, CFR2) << 8; |
1733 | freq_coarse |= STV090x_READ_DEMOD(state, CFR1); | 1837 | freq_coarse |= STV090x_READ_DEMOD(state, CFR1); |
1734 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ | 1838 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ |
@@ -1738,7 +1842,7 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state) | |||
1738 | else { | 1842 | else { |
1739 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) /* Demod RESET */ | 1843 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) /* Demod RESET */ |
1740 | goto err; | 1844 | goto err; |
1741 | if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0x01) < 0) | 1845 | if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0xc1) < 0) |
1742 | goto err; | 1846 | goto err; |
1743 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0x20) < 0) | 1847 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0x20) < 0) |
1744 | goto err; | 1848 | goto err; |
@@ -1751,10 +1855,13 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state) | |||
1751 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | 1855 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) |
1752 | goto err; | 1856 | goto err; |
1753 | 1857 | ||
1754 | if (state->dev_ver >= 0x30) { | 1858 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) |
1859 | goto err; | ||
1860 | |||
1861 | if (state->internal->dev_ver >= 0x30) { | ||
1755 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x79) < 0) | 1862 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x79) < 0) |
1756 | goto err; | 1863 | goto err; |
1757 | } else if (state->dev_ver >= 0x20) { | 1864 | } else if (state->internal->dev_ver >= 0x20) { |
1758 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) | 1865 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) |
1759 | goto err; | 1866 | goto err; |
1760 | } | 1867 | } |
@@ -1762,20 +1869,20 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state) | |||
1762 | if (srate_coarse > 3000000) { | 1869 | if (srate_coarse > 3000000) { |
1763 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ | 1870 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ |
1764 | sym = (sym / 1000) * 65536; | 1871 | sym = (sym / 1000) * 65536; |
1765 | sym /= (state->mclk / 1000); | 1872 | sym /= (state->internal->mclk / 1000); |
1766 | if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) | 1873 | if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) |
1767 | goto err; | 1874 | goto err; |
1768 | if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) | 1875 | if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) |
1769 | goto err; | 1876 | goto err; |
1770 | sym = 10 * (srate_coarse / 13); /* SFRLOW = SFR - 30% */ | 1877 | sym = 10 * (srate_coarse / 13); /* SFRLOW = SFR - 30% */ |
1771 | sym = (sym / 1000) * 65536; | 1878 | sym = (sym / 1000) * 65536; |
1772 | sym /= (state->mclk / 1000); | 1879 | sym /= (state->internal->mclk / 1000); |
1773 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) | 1880 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) |
1774 | goto err; | 1881 | goto err; |
1775 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) | 1882 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) |
1776 | goto err; | 1883 | goto err; |
1777 | sym = (srate_coarse / 1000) * 65536; | 1884 | sym = (srate_coarse / 1000) * 65536; |
1778 | sym /= (state->mclk / 1000); | 1885 | sym /= (state->internal->mclk / 1000); |
1779 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) | 1886 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) |
1780 | goto err; | 1887 | goto err; |
1781 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) | 1888 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) |
@@ -1783,20 +1890,20 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state) | |||
1783 | } else { | 1890 | } else { |
1784 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ | 1891 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ |
1785 | sym = (sym / 100) * 65536; | 1892 | sym = (sym / 100) * 65536; |
1786 | sym /= (state->mclk / 100); | 1893 | sym /= (state->internal->mclk / 100); |
1787 | if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) | 1894 | if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) |
1788 | goto err; | 1895 | goto err; |
1789 | if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) | 1896 | if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) |
1790 | goto err; | 1897 | goto err; |
1791 | sym = 10 * (srate_coarse / 14); /* SFRLOW = SFR - 30% */ | 1898 | sym = 10 * (srate_coarse / 14); /* SFRLOW = SFR - 30% */ |
1792 | sym = (sym / 100) * 65536; | 1899 | sym = (sym / 100) * 65536; |
1793 | sym /= (state->mclk / 100); | 1900 | sym /= (state->internal->mclk / 100); |
1794 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) | 1901 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) |
1795 | goto err; | 1902 | goto err; |
1796 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) | 1903 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) |
1797 | goto err; | 1904 | goto err; |
1798 | sym = (srate_coarse / 100) * 65536; | 1905 | sym = (srate_coarse / 100) * 65536; |
1799 | sym /= (state->mclk / 100); | 1906 | sym /= (state->internal->mclk / 100); |
1800 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) | 1907 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) |
1801 | goto err; | 1908 | goto err; |
1802 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) | 1909 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) |
@@ -1856,20 +1963,21 @@ static int stv090x_get_dmdlock(struct stv090x_state *state, s32 timeout) | |||
1856 | static int stv090x_blind_search(struct stv090x_state *state) | 1963 | static int stv090x_blind_search(struct stv090x_state *state) |
1857 | { | 1964 | { |
1858 | u32 agc2, reg, srate_coarse; | 1965 | u32 agc2, reg, srate_coarse; |
1859 | s32 timeout_dmd = 500, cpt_fail, agc2_ovflw, i; | 1966 | s32 cpt_fail, agc2_ovflw, i; |
1860 | u8 k_ref, k_max, k_min; | 1967 | u8 k_ref, k_max, k_min; |
1861 | int coarse_fail, lock; | 1968 | int coarse_fail = 0; |
1969 | int lock; | ||
1862 | 1970 | ||
1863 | k_max = 120; | 1971 | k_max = 110; |
1864 | k_min = 30; | 1972 | k_min = 10; |
1865 | 1973 | ||
1866 | agc2 = stv090x_get_agc2_min_level(state); | 1974 | agc2 = stv090x_get_agc2_min_level(state); |
1867 | 1975 | ||
1868 | if (agc2 > STV090x_SEARCH_AGC2_TH(state->dev_ver)) { | 1976 | if (agc2 > STV090x_SEARCH_AGC2_TH(state->internal->dev_ver)) { |
1869 | lock = 0; | 1977 | lock = 0; |
1870 | } else { | 1978 | } else { |
1871 | 1979 | ||
1872 | if (state->dev_ver <= 0x20) { | 1980 | if (state->internal->dev_ver <= 0x20) { |
1873 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0xc4) < 0) | 1981 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0xc4) < 0) |
1874 | goto err; | 1982 | goto err; |
1875 | } else { | 1983 | } else { |
@@ -1881,7 +1989,7 @@ static int stv090x_blind_search(struct stv090x_state *state) | |||
1881 | if (STV090x_WRITE_DEMOD(state, RTCS2, 0x44) < 0) | 1989 | if (STV090x_WRITE_DEMOD(state, RTCS2, 0x44) < 0) |
1882 | goto err; | 1990 | goto err; |
1883 | 1991 | ||
1884 | if (state->dev_ver >= 0x20) { | 1992 | if (state->internal->dev_ver >= 0x20) { |
1885 | if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) | 1993 | if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) |
1886 | goto err; | 1994 | goto err; |
1887 | if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) | 1995 | if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) |
@@ -1900,7 +2008,8 @@ static int stv090x_blind_search(struct stv090x_state *state) | |||
1900 | srate_coarse = stv090x_srate_srch_fine(state); | 2008 | srate_coarse = stv090x_srate_srch_fine(state); |
1901 | if (srate_coarse != 0) { | 2009 | if (srate_coarse != 0) { |
1902 | stv090x_get_lock_tmg(state); | 2010 | stv090x_get_lock_tmg(state); |
1903 | lock = stv090x_get_dmdlock(state, timeout_dmd); | 2011 | lock = stv090x_get_dmdlock(state, |
2012 | state->DemodTimeout); | ||
1904 | } else { | 2013 | } else { |
1905 | lock = 0; | 2014 | lock = 0; |
1906 | } | 2015 | } |
@@ -1908,8 +2017,8 @@ static int stv090x_blind_search(struct stv090x_state *state) | |||
1908 | cpt_fail = 0; | 2017 | cpt_fail = 0; |
1909 | agc2_ovflw = 0; | 2018 | agc2_ovflw = 0; |
1910 | for (i = 0; i < 10; i++) { | 2019 | for (i = 0; i < 10; i++) { |
1911 | agc2 = STV090x_READ_DEMOD(state, AGC2I1) << 8; | 2020 | agc2 += (STV090x_READ_DEMOD(state, AGC2I1) << 8) | |
1912 | agc2 |= STV090x_READ_DEMOD(state, AGC2I0); | 2021 | STV090x_READ_DEMOD(state, AGC2I0); |
1913 | if (agc2 >= 0xff00) | 2022 | if (agc2 >= 0xff00) |
1914 | agc2_ovflw++; | 2023 | agc2_ovflw++; |
1915 | reg = STV090x_READ_DEMOD(state, DSTATUS2); | 2024 | reg = STV090x_READ_DEMOD(state, DSTATUS2); |
@@ -1923,7 +2032,7 @@ static int stv090x_blind_search(struct stv090x_state *state) | |||
1923 | 2032 | ||
1924 | lock = 0; | 2033 | lock = 0; |
1925 | } | 2034 | } |
1926 | k_ref -= 30; | 2035 | k_ref -= 20; |
1927 | } while ((k_ref >= k_min) && (!lock) && (!coarse_fail)); | 2036 | } while ((k_ref >= k_min) && (!lock) && (!coarse_fail)); |
1928 | } | 2037 | } |
1929 | 2038 | ||
@@ -1939,7 +2048,7 @@ static int stv090x_chk_tmg(struct stv090x_state *state) | |||
1939 | u32 reg; | 2048 | u32 reg; |
1940 | s32 tmg_cpt = 0, i; | 2049 | s32 tmg_cpt = 0, i; |
1941 | u8 freq, tmg_thh, tmg_thl; | 2050 | u8 freq, tmg_thh, tmg_thl; |
1942 | int tmg_lock; | 2051 | int tmg_lock = 0; |
1943 | 2052 | ||
1944 | freq = STV090x_READ_DEMOD(state, CARFREQ); | 2053 | freq = STV090x_READ_DEMOD(state, CARFREQ); |
1945 | tmg_thh = STV090x_READ_DEMOD(state, TMGTHRISE); | 2054 | tmg_thh = STV090x_READ_DEMOD(state, TMGTHRISE); |
@@ -2062,13 +2171,13 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd) | |||
2062 | goto err; | 2171 | goto err; |
2063 | 2172 | ||
2064 | if (state->config->tuner_set_frequency) { | 2173 | if (state->config->tuner_set_frequency) { |
2065 | if (state->config->tuner_set_frequency(fe, state->frequency) < 0) | 2174 | if (state->config->tuner_set_frequency(fe, freq) < 0) |
2066 | goto err; | 2175 | goto err_gateoff; |
2067 | } | 2176 | } |
2068 | 2177 | ||
2069 | if (state->config->tuner_set_bandwidth) { | 2178 | if (state->config->tuner_set_bandwidth) { |
2070 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | 2179 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) |
2071 | goto err; | 2180 | goto err_gateoff; |
2072 | } | 2181 | } |
2073 | 2182 | ||
2074 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 2183 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) |
@@ -2081,7 +2190,7 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd) | |||
2081 | 2190 | ||
2082 | if (state->config->tuner_get_status) { | 2191 | if (state->config->tuner_get_status) { |
2083 | if (state->config->tuner_get_status(fe, ®) < 0) | 2192 | if (state->config->tuner_get_status(fe, ®) < 0) |
2084 | goto err; | 2193 | goto err_gateoff; |
2085 | } | 2194 | } |
2086 | 2195 | ||
2087 | if (reg) | 2196 | if (reg) |
@@ -2093,17 +2202,6 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd) | |||
2093 | goto err; | 2202 | goto err; |
2094 | 2203 | ||
2095 | STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1c); | 2204 | STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1c); |
2096 | if (state->delsys == STV090x_DVBS2) { | ||
2097 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
2098 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 0); | ||
2099 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); | ||
2100 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
2101 | goto err; | ||
2102 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | ||
2103 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); | ||
2104 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
2105 | goto err; | ||
2106 | } | ||
2107 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0) | 2205 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0) |
2108 | goto err; | 2206 | goto err; |
2109 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0) | 2207 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0) |
@@ -2123,6 +2221,8 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd) | |||
2123 | 2221 | ||
2124 | return lock; | 2222 | return lock; |
2125 | 2223 | ||
2224 | err_gateoff: | ||
2225 | stv090x_i2c_gate_ctrl(fe, 0); | ||
2126 | err: | 2226 | err: |
2127 | dprintk(FE_ERROR, 1, "I/O error"); | 2227 | dprintk(FE_ERROR, 1, "I/O error"); |
2128 | return -1; | 2228 | return -1; |
@@ -2136,13 +2236,13 @@ static int stv090x_get_loop_params(struct stv090x_state *state, s32 *freq_inc, s | |||
2136 | car_max = state->search_range / 1000; | 2236 | car_max = state->search_range / 1000; |
2137 | car_max += car_max / 10; | 2237 | car_max += car_max / 10; |
2138 | car_max = 65536 * (car_max / 2); | 2238 | car_max = 65536 * (car_max / 2); |
2139 | car_max /= (state->mclk / 1000); | 2239 | car_max /= (state->internal->mclk / 1000); |
2140 | 2240 | ||
2141 | if (car_max > 0x4000) | 2241 | if (car_max > 0x4000) |
2142 | car_max = 0x4000 ; /* maxcarrier should be<= +-1/4 Mclk */ | 2242 | car_max = 0x4000 ; /* maxcarrier should be<= +-1/4 Mclk */ |
2143 | 2243 | ||
2144 | inc = srate; | 2244 | inc = srate; |
2145 | inc /= state->mclk / 1000; | 2245 | inc /= state->internal->mclk / 1000; |
2146 | inc *= 256; | 2246 | inc *= 256; |
2147 | inc *= 256; | 2247 | inc *= 256; |
2148 | inc /= 1000; | 2248 | inc /= 1000; |
@@ -2203,7 +2303,7 @@ static int stv090x_chk_signal(struct stv090x_state *state) | |||
2203 | 2303 | ||
2204 | car_max += (car_max / 10); /* 10% margin */ | 2304 | car_max += (car_max / 10); /* 10% margin */ |
2205 | car_max = (65536 * car_max / 2); | 2305 | car_max = (65536 * car_max / 2); |
2206 | car_max /= state->mclk / 1000; | 2306 | car_max /= state->internal->mclk / 1000; |
2207 | 2307 | ||
2208 | if (car_max > 0x4000) | 2308 | if (car_max > 0x4000) |
2209 | car_max = 0x4000; | 2309 | car_max = 0x4000; |
@@ -2228,7 +2328,7 @@ static int stv090x_search_car_loop(struct stv090x_state *state, s32 inc, s32 tim | |||
2228 | car_max = state->search_range / 1000; | 2328 | car_max = state->search_range / 1000; |
2229 | car_max += (car_max / 10); | 2329 | car_max += (car_max / 10); |
2230 | car_max = (65536 * car_max / 2); | 2330 | car_max = (65536 * car_max / 2); |
2231 | car_max /= (state->mclk / 1000); | 2331 | car_max /= (state->internal->mclk / 1000); |
2232 | if (car_max > 0x4000) | 2332 | if (car_max > 0x4000) |
2233 | car_max = 0x4000; | 2333 | car_max = 0x4000; |
2234 | 2334 | ||
@@ -2298,7 +2398,7 @@ static int stv090x_sw_algo(struct stv090x_state *state) | |||
2298 | case STV090x_SEARCH_DVBS1: | 2398 | case STV090x_SEARCH_DVBS1: |
2299 | case STV090x_SEARCH_DSS: | 2399 | case STV090x_SEARCH_DSS: |
2300 | /* accelerate the frequency detector */ | 2400 | /* accelerate the frequency detector */ |
2301 | if (state->dev_ver >= 0x20) { | 2401 | if (state->internal->dev_ver >= 0x20) { |
2302 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3B) < 0) | 2402 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3B) < 0) |
2303 | goto err; | 2403 | goto err; |
2304 | } | 2404 | } |
@@ -2309,7 +2409,7 @@ static int stv090x_sw_algo(struct stv090x_state *state) | |||
2309 | break; | 2409 | break; |
2310 | 2410 | ||
2311 | case STV090x_SEARCH_DVBS2: | 2411 | case STV090x_SEARCH_DVBS2: |
2312 | if (state->dev_ver >= 0x20) { | 2412 | if (state->internal->dev_ver >= 0x20) { |
2313 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) | 2413 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) |
2314 | goto err; | 2414 | goto err; |
2315 | } | 2415 | } |
@@ -2322,7 +2422,7 @@ static int stv090x_sw_algo(struct stv090x_state *state) | |||
2322 | case STV090x_SEARCH_AUTO: | 2422 | case STV090x_SEARCH_AUTO: |
2323 | default: | 2423 | default: |
2324 | /* accelerate the frequency detector */ | 2424 | /* accelerate the frequency detector */ |
2325 | if (state->dev_ver >= 0x20) { | 2425 | if (state->internal->dev_ver >= 0x20) { |
2326 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3b) < 0) | 2426 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3b) < 0) |
2327 | goto err; | 2427 | goto err; |
2328 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) | 2428 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) |
@@ -2344,7 +2444,7 @@ static int stv090x_sw_algo(struct stv090x_state *state) | |||
2344 | /*run the SW search 2 times maximum*/ | 2444 | /*run the SW search 2 times maximum*/ |
2345 | if (lock || no_signal || (trials == 2)) { | 2445 | if (lock || no_signal || (trials == 2)) { |
2346 | /*Check if the demod is not losing lock in DVBS2*/ | 2446 | /*Check if the demod is not losing lock in DVBS2*/ |
2347 | if (state->dev_ver >= 0x20) { | 2447 | if (state->internal->dev_ver >= 0x20) { |
2348 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) | 2448 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) |
2349 | goto err; | 2449 | goto err; |
2350 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) | 2450 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) |
@@ -2366,7 +2466,7 @@ static int stv090x_sw_algo(struct stv090x_state *state) | |||
2366 | /*FALSE lock, The demod is loosing lock */ | 2466 | /*FALSE lock, The demod is loosing lock */ |
2367 | lock = 0; | 2467 | lock = 0; |
2368 | if (trials < 2) { | 2468 | if (trials < 2) { |
2369 | if (state->dev_ver >= 0x20) { | 2469 | if (state->internal->dev_ver >= 0x20) { |
2370 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) | 2470 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) |
2371 | goto err; | 2471 | goto err; |
2372 | } | 2472 | } |
@@ -2416,16 +2516,16 @@ static s32 stv090x_get_car_freq(struct stv090x_state *state, u32 mclk) | |||
2416 | derot |= STV090x_READ_DEMOD(state, CFR0); | 2516 | derot |= STV090x_READ_DEMOD(state, CFR0); |
2417 | 2517 | ||
2418 | derot = comp2(derot, 24); | 2518 | derot = comp2(derot, 24); |
2419 | int_1 = state->mclk >> 12; | 2519 | int_1 = mclk >> 12; |
2420 | int_2 = derot >> 12; | 2520 | int_2 = derot >> 12; |
2421 | 2521 | ||
2422 | /* carrier_frequency = MasterClock * Reg / 2^24 */ | 2522 | /* carrier_frequency = MasterClock * Reg / 2^24 */ |
2423 | tmp_1 = state->mclk % 0x1000; | 2523 | tmp_1 = mclk % 0x1000; |
2424 | tmp_2 = derot % 0x1000; | 2524 | tmp_2 = derot % 0x1000; |
2425 | 2525 | ||
2426 | derot = (int_1 * int_2) + | 2526 | derot = (int_1 * int_2) + |
2427 | ((int_1 * tmp_2) >> 12) + | 2527 | ((int_1 * tmp_2) >> 12) + |
2428 | ((int_1 * tmp_1) >> 12); | 2528 | ((int_2 * tmp_1) >> 12); |
2429 | 2529 | ||
2430 | return derot; | 2530 | return derot; |
2431 | } | 2531 | } |
@@ -2496,13 +2596,13 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st | |||
2496 | 2596 | ||
2497 | if (state->config->tuner_get_frequency) { | 2597 | if (state->config->tuner_get_frequency) { |
2498 | if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) | 2598 | if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) |
2499 | goto err; | 2599 | goto err_gateoff; |
2500 | } | 2600 | } |
2501 | 2601 | ||
2502 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 2602 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) |
2503 | goto err; | 2603 | goto err; |
2504 | 2604 | ||
2505 | offst_freq = stv090x_get_car_freq(state, state->mclk) / 1000; | 2605 | offst_freq = stv090x_get_car_freq(state, state->internal->mclk) / 1000; |
2506 | state->frequency += offst_freq; | 2606 | state->frequency += offst_freq; |
2507 | 2607 | ||
2508 | if (stv090x_get_viterbi(state) < 0) | 2608 | if (stv090x_get_viterbi(state) < 0) |
@@ -2524,7 +2624,7 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st | |||
2524 | 2624 | ||
2525 | if (state->config->tuner_get_frequency) { | 2625 | if (state->config->tuner_get_frequency) { |
2526 | if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) | 2626 | if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) |
2527 | goto err; | 2627 | goto err_gateoff; |
2528 | } | 2628 | } |
2529 | 2629 | ||
2530 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 2630 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) |
@@ -2544,6 +2644,9 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st | |||
2544 | } | 2644 | } |
2545 | 2645 | ||
2546 | return STV090x_OUTOFRANGE; | 2646 | return STV090x_OUTOFRANGE; |
2647 | |||
2648 | err_gateoff: | ||
2649 | stv090x_i2c_gate_ctrl(fe, 0); | ||
2547 | err: | 2650 | err: |
2548 | dprintk(FE_ERROR, 1, "I/O error"); | 2651 | dprintk(FE_ERROR, 1, "I/O error"); |
2549 | return -1; | 2652 | return -1; |
@@ -2573,7 +2676,7 @@ static u8 stv090x_optimize_carloop(struct stv090x_state *state, enum stv090x_mod | |||
2573 | s32 i; | 2676 | s32 i; |
2574 | struct stv090x_long_frame_crloop *car_loop, *car_loop_qpsk_low, *car_loop_apsk_low; | 2677 | struct stv090x_long_frame_crloop *car_loop, *car_loop_qpsk_low, *car_loop_apsk_low; |
2575 | 2678 | ||
2576 | if (state->dev_ver == 0x20) { | 2679 | if (state->internal->dev_ver == 0x20) { |
2577 | car_loop = stv090x_s2_crl_cut20; | 2680 | car_loop = stv090x_s2_crl_cut20; |
2578 | car_loop_qpsk_low = stv090x_s2_lowqpsk_crl_cut20; | 2681 | car_loop_qpsk_low = stv090x_s2_lowqpsk_crl_cut20; |
2579 | car_loop_apsk_low = stv090x_s2_apsk_crl_cut20; | 2682 | car_loop_apsk_low = stv090x_s2_apsk_crl_cut20; |
@@ -2694,7 +2797,7 @@ static u8 stv090x_optimize_carloop_short(struct stv090x_state *state) | |||
2694 | break; | 2797 | break; |
2695 | } | 2798 | } |
2696 | 2799 | ||
2697 | if (state->dev_ver >= 0x30) { | 2800 | if (state->internal->dev_ver >= 0x30) { |
2698 | /* Cut 3.0 and up */ | 2801 | /* Cut 3.0 and up */ |
2699 | short_crl = stv090x_s2_short_crl_cut30; | 2802 | short_crl = stv090x_s2_short_crl_cut30; |
2700 | } else { | 2803 | } else { |
@@ -2726,13 +2829,13 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2726 | s32 srate, pilots, aclc, f_1, f_0, i = 0, blind_tune = 0; | 2829 | s32 srate, pilots, aclc, f_1, f_0, i = 0, blind_tune = 0; |
2727 | u32 reg; | 2830 | u32 reg; |
2728 | 2831 | ||
2729 | srate = stv090x_get_srate(state, state->mclk); | 2832 | srate = stv090x_get_srate(state, state->internal->mclk); |
2730 | srate += stv090x_get_tmgoffst(state, srate); | 2833 | srate += stv090x_get_tmgoffst(state, srate); |
2731 | 2834 | ||
2732 | switch (state->delsys) { | 2835 | switch (state->delsys) { |
2733 | case STV090x_DVBS1: | 2836 | case STV090x_DVBS1: |
2734 | case STV090x_DSS: | 2837 | case STV090x_DSS: |
2735 | if (state->algo == STV090x_SEARCH_AUTO) { | 2838 | if (state->search_mode == STV090x_SEARCH_AUTO) { |
2736 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | 2839 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); |
2737 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | 2840 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); |
2738 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); | 2841 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); |
@@ -2745,7 +2848,7 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2745 | if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) | 2848 | if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) |
2746 | goto err; | 2849 | goto err; |
2747 | 2850 | ||
2748 | if (state->dev_ver >= 0x30) { | 2851 | if (state->internal->dev_ver >= 0x30) { |
2749 | if (stv090x_get_viterbi(state) < 0) | 2852 | if (stv090x_get_viterbi(state) < 0) |
2750 | goto err; | 2853 | goto err; |
2751 | 2854 | ||
@@ -2857,9 +2960,12 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2857 | if (stv090x_set_srate(state, srate) < 0) | 2960 | if (stv090x_set_srate(state, srate) < 0) |
2858 | goto err; | 2961 | goto err; |
2859 | blind_tune = 1; | 2962 | blind_tune = 1; |
2963 | |||
2964 | if (stv090x_dvbs_track_crl(state) < 0) | ||
2965 | goto err; | ||
2860 | } | 2966 | } |
2861 | 2967 | ||
2862 | if (state->dev_ver >= 0x20) { | 2968 | if (state->internal->dev_ver >= 0x20) { |
2863 | if ((state->search_mode == STV090x_SEARCH_DVBS1) || | 2969 | if ((state->search_mode == STV090x_SEARCH_DVBS1) || |
2864 | (state->search_mode == STV090x_SEARCH_DSS) || | 2970 | (state->search_mode == STV090x_SEARCH_DSS) || |
2865 | (state->search_mode == STV090x_SEARCH_AUTO)) { | 2971 | (state->search_mode == STV090x_SEARCH_AUTO)) { |
@@ -2881,7 +2987,8 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2881 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, 0x80) < 0) | 2987 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, 0x80) < 0) |
2882 | goto err; | 2988 | goto err; |
2883 | 2989 | ||
2884 | if ((state->dev_ver >= 0x20) || (blind_tune == 1) || (state->srate < 10000000)) { | 2990 | if ((state->internal->dev_ver >= 0x20) || (blind_tune == 1) || |
2991 | (state->srate < 10000000)) { | ||
2885 | /* update initial carrier freq with the found freq offset */ | 2992 | /* update initial carrier freq with the found freq offset */ |
2886 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, f_1) < 0) | 2993 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, f_1) < 0) |
2887 | goto err; | 2994 | goto err; |
@@ -2889,7 +2996,7 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2889 | goto err; | 2996 | goto err; |
2890 | state->tuner_bw = stv090x_car_width(srate, state->rolloff) + 10000000; | 2997 | state->tuner_bw = stv090x_car_width(srate, state->rolloff) + 10000000; |
2891 | 2998 | ||
2892 | if ((state->dev_ver >= 0x20) || (blind_tune == 1)) { | 2999 | if ((state->internal->dev_ver >= 0x20) || (blind_tune == 1)) { |
2893 | 3000 | ||
2894 | if (state->algo != STV090x_WARM_SEARCH) { | 3001 | if (state->algo != STV090x_WARM_SEARCH) { |
2895 | 3002 | ||
@@ -2898,7 +3005,7 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2898 | 3005 | ||
2899 | if (state->config->tuner_set_bandwidth) { | 3006 | if (state->config->tuner_set_bandwidth) { |
2900 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | 3007 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) |
2901 | goto err; | 3008 | goto err_gateoff; |
2902 | } | 3009 | } |
2903 | 3010 | ||
2904 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 3011 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) |
@@ -2941,7 +3048,7 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2941 | 3048 | ||
2942 | } | 3049 | } |
2943 | 3050 | ||
2944 | if (state->dev_ver >= 0x20) { | 3051 | if (state->internal->dev_ver >= 0x20) { |
2945 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) | 3052 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) |
2946 | goto err; | 3053 | goto err; |
2947 | } | 3054 | } |
@@ -2950,6 +3057,9 @@ static int stv090x_optimize_track(struct stv090x_state *state) | |||
2950 | stv090x_set_vit_thtracq(state); | 3057 | stv090x_set_vit_thtracq(state); |
2951 | 3058 | ||
2952 | return 0; | 3059 | return 0; |
3060 | |||
3061 | err_gateoff: | ||
3062 | stv090x_i2c_gate_ctrl(fe, 0); | ||
2953 | err: | 3063 | err: |
2954 | dprintk(FE_ERROR, 1, "I/O error"); | 3064 | dprintk(FE_ERROR, 1, "I/O error"); |
2955 | return -1; | 3065 | return -1; |
@@ -3017,7 +3127,7 @@ static int stv090x_set_s2rolloff(struct stv090x_state *state) | |||
3017 | { | 3127 | { |
3018 | u32 reg; | 3128 | u32 reg; |
3019 | 3129 | ||
3020 | if (state->dev_ver <= 0x20) { | 3130 | if (state->internal->dev_ver <= 0x20) { |
3021 | /* rolloff to auto mode if DVBS2 */ | 3131 | /* rolloff to auto mode if DVBS2 */ |
3022 | reg = STV090x_READ_DEMOD(state, DEMOD); | 3132 | reg = STV090x_READ_DEMOD(state, DEMOD); |
3023 | STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 0x00); | 3133 | STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 0x00); |
@@ -3042,7 +3152,7 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3042 | struct dvb_frontend *fe = &state->frontend; | 3152 | struct dvb_frontend *fe = &state->frontend; |
3043 | enum stv090x_signal_state signal_state = STV090x_NOCARRIER; | 3153 | enum stv090x_signal_state signal_state = STV090x_NOCARRIER; |
3044 | u32 reg; | 3154 | u32 reg; |
3045 | s32 timeout_dmd = 500, timeout_fec = 50, agc1_power, power_iq = 0, i; | 3155 | s32 agc1_power, power_iq = 0, i; |
3046 | int lock = 0, low_sr = 0, no_signal = 0; | 3156 | int lock = 0, low_sr = 0, no_signal = 0; |
3047 | 3157 | ||
3048 | reg = STV090x_READ_DEMOD(state, TSCFGH); | 3158 | reg = STV090x_READ_DEMOD(state, TSCFGH); |
@@ -3053,9 +3163,14 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3053 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod stop */ | 3163 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod stop */ |
3054 | goto err; | 3164 | goto err; |
3055 | 3165 | ||
3056 | if (state->dev_ver >= 0x20) { | 3166 | if (state->internal->dev_ver >= 0x20) { |
3057 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) /* cut 2.0 */ | 3167 | if (state->srate > 5000000) { |
3058 | goto err; | 3168 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) |
3169 | goto err; | ||
3170 | } else { | ||
3171 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x82) < 0) | ||
3172 | goto err; | ||
3173 | } | ||
3059 | } | 3174 | } |
3060 | 3175 | ||
3061 | stv090x_get_lock_tmg(state); | 3176 | stv090x_get_lock_tmg(state); |
@@ -3088,7 +3203,7 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3088 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) | 3203 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) |
3089 | goto err; | 3204 | goto err; |
3090 | 3205 | ||
3091 | if (state->dev_ver >= 0x20) { | 3206 | if (state->internal->dev_ver >= 0x20) { |
3092 | if (STV090x_WRITE_DEMOD(state, KREFTMG, 0x5a) < 0) | 3207 | if (STV090x_WRITE_DEMOD(state, KREFTMG, 0x5a) < 0) |
3093 | goto err; | 3208 | goto err; |
3094 | if (state->algo == STV090x_COLD_SEARCH) | 3209 | if (state->algo == STV090x_COLD_SEARCH) |
@@ -3106,9 +3221,11 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3106 | if (stv090x_set_srate(state, state->srate) < 0) | 3221 | if (stv090x_set_srate(state, state->srate) < 0) |
3107 | goto err; | 3222 | goto err; |
3108 | 3223 | ||
3109 | if (stv090x_set_max_srate(state, state->mclk, state->srate) < 0) | 3224 | if (stv090x_set_max_srate(state, state->internal->mclk, |
3225 | state->srate) < 0) | ||
3110 | goto err; | 3226 | goto err; |
3111 | if (stv090x_set_min_srate(state, state->mclk, state->srate) < 0) | 3227 | if (stv090x_set_min_srate(state, state->internal->mclk, |
3228 | state->srate) < 0) | ||
3112 | goto err; | 3229 | goto err; |
3113 | 3230 | ||
3114 | if (state->srate >= 10000000) | 3231 | if (state->srate >= 10000000) |
@@ -3122,18 +3239,21 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3122 | goto err; | 3239 | goto err; |
3123 | 3240 | ||
3124 | if (state->config->tuner_set_bbgain) { | 3241 | if (state->config->tuner_set_bbgain) { |
3125 | if (state->config->tuner_set_bbgain(fe, 10) < 0) /* 10dB */ | 3242 | reg = state->config->tuner_bbgain; |
3126 | goto err; | 3243 | if (reg == 0) |
3244 | reg = 10; /* default: 10dB */ | ||
3245 | if (state->config->tuner_set_bbgain(fe, reg) < 0) | ||
3246 | goto err_gateoff; | ||
3127 | } | 3247 | } |
3128 | 3248 | ||
3129 | if (state->config->tuner_set_frequency) { | 3249 | if (state->config->tuner_set_frequency) { |
3130 | if (state->config->tuner_set_frequency(fe, state->frequency) < 0) | 3250 | if (state->config->tuner_set_frequency(fe, state->frequency) < 0) |
3131 | goto err; | 3251 | goto err_gateoff; |
3132 | } | 3252 | } |
3133 | 3253 | ||
3134 | if (state->config->tuner_set_bandwidth) { | 3254 | if (state->config->tuner_set_bandwidth) { |
3135 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | 3255 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) |
3136 | goto err; | 3256 | goto err_gateoff; |
3137 | } | 3257 | } |
3138 | 3258 | ||
3139 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 3259 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) |
@@ -3141,21 +3261,21 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3141 | 3261 | ||
3142 | msleep(50); | 3262 | msleep(50); |
3143 | 3263 | ||
3144 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
3145 | goto err; | ||
3146 | |||
3147 | if (state->config->tuner_get_status) { | 3264 | if (state->config->tuner_get_status) { |
3265 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
3266 | goto err; | ||
3148 | if (state->config->tuner_get_status(fe, ®) < 0) | 3267 | if (state->config->tuner_get_status(fe, ®) < 0) |
3268 | goto err_gateoff; | ||
3269 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
3149 | goto err; | 3270 | goto err; |
3150 | } | ||
3151 | 3271 | ||
3152 | if (reg) | 3272 | if (reg) |
3153 | dprintk(FE_DEBUG, 1, "Tuner phase locked"); | 3273 | dprintk(FE_DEBUG, 1, "Tuner phase locked"); |
3154 | else | 3274 | else { |
3155 | dprintk(FE_DEBUG, 1, "Tuner unlocked"); | 3275 | dprintk(FE_DEBUG, 1, "Tuner unlocked"); |
3156 | 3276 | return STV090x_NOCARRIER; | |
3157 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 3277 | } |
3158 | goto err; | 3278 | } |
3159 | 3279 | ||
3160 | msleep(10); | 3280 | msleep(10); |
3161 | agc1_power = MAKEWORD16(STV090x_READ_DEMOD(state, AGCIQIN1), | 3281 | agc1_power = MAKEWORD16(STV090x_READ_DEMOD(state, AGCIQIN1), |
@@ -3175,12 +3295,12 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3175 | if ((agc1_power == 0) && (power_iq < STV090x_IQPOWER_THRESHOLD)) { | 3295 | if ((agc1_power == 0) && (power_iq < STV090x_IQPOWER_THRESHOLD)) { |
3176 | dprintk(FE_ERROR, 1, "No Signal: POWER_IQ=0x%02x", power_iq); | 3296 | dprintk(FE_ERROR, 1, "No Signal: POWER_IQ=0x%02x", power_iq); |
3177 | lock = 0; | 3297 | lock = 0; |
3178 | 3298 | signal_state = STV090x_NOAGC1; | |
3179 | } else { | 3299 | } else { |
3180 | reg = STV090x_READ_DEMOD(state, DEMOD); | 3300 | reg = STV090x_READ_DEMOD(state, DEMOD); |
3181 | STV090x_SETFIELD_Px(reg, SPECINV_CONTROL_FIELD, state->inversion); | 3301 | STV090x_SETFIELD_Px(reg, SPECINV_CONTROL_FIELD, state->inversion); |
3182 | 3302 | ||
3183 | if (state->dev_ver <= 0x20) { | 3303 | if (state->internal->dev_ver <= 0x20) { |
3184 | /* rolloff to auto mode if DVBS2 */ | 3304 | /* rolloff to auto mode if DVBS2 */ |
3185 | STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 1); | 3305 | STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 1); |
3186 | } else { | 3306 | } else { |
@@ -3199,18 +3319,17 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3199 | } | 3319 | } |
3200 | } | 3320 | } |
3201 | 3321 | ||
3202 | /* need to check for AGC1 state */ | 3322 | if (signal_state == STV090x_NOAGC1) |
3203 | 3323 | return signal_state; | |
3204 | |||
3205 | 3324 | ||
3206 | if (state->algo == STV090x_BLIND_SEARCH) | 3325 | if (state->algo == STV090x_BLIND_SEARCH) |
3207 | lock = stv090x_blind_search(state); | 3326 | lock = stv090x_blind_search(state); |
3208 | 3327 | ||
3209 | else if (state->algo == STV090x_COLD_SEARCH) | 3328 | else if (state->algo == STV090x_COLD_SEARCH) |
3210 | lock = stv090x_get_coldlock(state, timeout_dmd); | 3329 | lock = stv090x_get_coldlock(state, state->DemodTimeout); |
3211 | 3330 | ||
3212 | else if (state->algo == STV090x_WARM_SEARCH) | 3331 | else if (state->algo == STV090x_WARM_SEARCH) |
3213 | lock = stv090x_get_dmdlock(state, timeout_dmd); | 3332 | lock = stv090x_get_dmdlock(state, state->DemodTimeout); |
3214 | 3333 | ||
3215 | if ((!lock) && (state->algo == STV090x_COLD_SEARCH)) { | 3334 | if ((!lock) && (state->algo == STV090x_COLD_SEARCH)) { |
3216 | if (!low_sr) { | 3335 | if (!low_sr) { |
@@ -3225,7 +3344,7 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3225 | if ((lock) && (signal_state == STV090x_RANGEOK)) { /* signal within Range */ | 3344 | if ((lock) && (signal_state == STV090x_RANGEOK)) { /* signal within Range */ |
3226 | stv090x_optimize_track(state); | 3345 | stv090x_optimize_track(state); |
3227 | 3346 | ||
3228 | if (state->dev_ver >= 0x20) { | 3347 | if (state->internal->dev_ver >= 0x20) { |
3229 | /* >= Cut 2.0 :release TS reset after | 3348 | /* >= Cut 2.0 :release TS reset after |
3230 | * demod lock and optimized Tracking | 3349 | * demod lock and optimized Tracking |
3231 | */ | 3350 | */ |
@@ -3245,8 +3364,9 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3245 | goto err; | 3364 | goto err; |
3246 | } | 3365 | } |
3247 | 3366 | ||
3248 | if (stv090x_get_lock(state, timeout_fec, timeout_fec)) { | 3367 | lock = stv090x_get_lock(state, state->FecTimeout, |
3249 | lock = 1; | 3368 | state->FecTimeout); |
3369 | if (lock) { | ||
3250 | if (state->delsys == STV090x_DVBS2) { | 3370 | if (state->delsys == STV090x_DVBS2) { |
3251 | stv090x_set_s2rolloff(state); | 3371 | stv090x_set_s2rolloff(state); |
3252 | 3372 | ||
@@ -3273,13 +3393,14 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | |||
3273 | if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0) | 3393 | if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0) |
3274 | goto err; | 3394 | goto err; |
3275 | } else { | 3395 | } else { |
3276 | lock = 0; | ||
3277 | signal_state = STV090x_NODATA; | 3396 | signal_state = STV090x_NODATA; |
3278 | no_signal = stv090x_chk_signal(state); | 3397 | no_signal = stv090x_chk_signal(state); |
3279 | } | 3398 | } |
3280 | } | 3399 | } |
3281 | return signal_state; | 3400 | return signal_state; |
3282 | 3401 | ||
3402 | err_gateoff: | ||
3403 | stv090x_i2c_gate_ctrl(fe, 0); | ||
3283 | err: | 3404 | err: |
3284 | dprintk(FE_ERROR, 1, "I/O error"); | 3405 | dprintk(FE_ERROR, 1, "I/O error"); |
3285 | return -1; | 3406 | return -1; |
@@ -3290,13 +3411,22 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe, struct dvb_fron | |||
3290 | struct stv090x_state *state = fe->demodulator_priv; | 3411 | struct stv090x_state *state = fe->demodulator_priv; |
3291 | struct dtv_frontend_properties *props = &fe->dtv_property_cache; | 3412 | struct dtv_frontend_properties *props = &fe->dtv_property_cache; |
3292 | 3413 | ||
3414 | if (p->frequency == 0) | ||
3415 | return DVBFE_ALGO_SEARCH_INVALID; | ||
3416 | |||
3293 | state->delsys = props->delivery_system; | 3417 | state->delsys = props->delivery_system; |
3294 | state->frequency = p->frequency; | 3418 | state->frequency = p->frequency; |
3295 | state->srate = p->u.qpsk.symbol_rate; | 3419 | state->srate = p->u.qpsk.symbol_rate; |
3296 | state->search_mode = STV090x_SEARCH_AUTO; | 3420 | state->search_mode = STV090x_SEARCH_AUTO; |
3297 | state->algo = STV090x_COLD_SEARCH; | 3421 | state->algo = STV090x_COLD_SEARCH; |
3298 | state->fec = STV090x_PRERR; | 3422 | state->fec = STV090x_PRERR; |
3299 | state->search_range = 2000000; | 3423 | if (state->srate > 10000000) { |
3424 | dprintk(FE_DEBUG, 1, "Search range: 10 MHz"); | ||
3425 | state->search_range = 10000000; | ||
3426 | } else { | ||
3427 | dprintk(FE_DEBUG, 1, "Search range: 5 MHz"); | ||
3428 | state->search_range = 5000000; | ||
3429 | } | ||
3300 | 3430 | ||
3301 | if (stv090x_algo(state) == STV090x_RANGEOK) { | 3431 | if (stv090x_algo(state) == STV090x_RANGEOK) { |
3302 | dprintk(FE_DEBUG, 1, "Search success!"); | 3432 | dprintk(FE_DEBUG, 1, "Search success!"); |
@@ -3309,7 +3439,6 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe, struct dvb_fron | |||
3309 | return DVBFE_ALGO_SEARCH_ERROR; | 3439 | return DVBFE_ALGO_SEARCH_ERROR; |
3310 | } | 3440 | } |
3311 | 3441 | ||
3312 | /* FIXME! */ | ||
3313 | static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status) | 3442 | static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status) |
3314 | { | 3443 | { |
3315 | struct stv090x_state *state = fe->demodulator_priv; | 3444 | struct stv090x_state *state = fe->demodulator_priv; |
@@ -3331,9 +3460,16 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status) | |||
3331 | dprintk(FE_DEBUG, 1, "Delivery system: DVB-S2"); | 3460 | dprintk(FE_DEBUG, 1, "Delivery system: DVB-S2"); |
3332 | reg = STV090x_READ_DEMOD(state, DSTATUS); | 3461 | reg = STV090x_READ_DEMOD(state, DSTATUS); |
3333 | if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) { | 3462 | if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) { |
3334 | reg = STV090x_READ_DEMOD(state, TSSTATUS); | 3463 | reg = STV090x_READ_DEMOD(state, PDELSTATUS1); |
3335 | if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { | 3464 | if (STV090x_GETFIELD_Px(reg, PKTDELIN_LOCK_FIELD)) { |
3336 | *status = FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; | 3465 | reg = STV090x_READ_DEMOD(state, TSSTATUS); |
3466 | if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { | ||
3467 | *status = FE_HAS_SIGNAL | | ||
3468 | FE_HAS_CARRIER | | ||
3469 | FE_HAS_VITERBI | | ||
3470 | FE_HAS_SYNC | | ||
3471 | FE_HAS_LOCK; | ||
3472 | } | ||
3337 | } | 3473 | } |
3338 | } | 3474 | } |
3339 | break; | 3475 | break; |
@@ -3346,7 +3482,11 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status) | |||
3346 | if (STV090x_GETFIELD_Px(reg, LOCKEDVIT_FIELD)) { | 3482 | if (STV090x_GETFIELD_Px(reg, LOCKEDVIT_FIELD)) { |
3347 | reg = STV090x_READ_DEMOD(state, TSSTATUS); | 3483 | reg = STV090x_READ_DEMOD(state, TSSTATUS); |
3348 | if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { | 3484 | if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { |
3349 | *status = FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; | 3485 | *status = FE_HAS_SIGNAL | |
3486 | FE_HAS_CARRIER | | ||
3487 | FE_HAS_VITERBI | | ||
3488 | FE_HAS_SYNC | | ||
3489 | FE_HAS_LOCK; | ||
3350 | } | 3490 | } |
3351 | } | 3491 | } |
3352 | } | 3492 | } |
@@ -3412,14 +3552,12 @@ static int stv090x_table_lookup(const struct stv090x_tab *tab, int max, int val) | |||
3412 | int res = 0; | 3552 | int res = 0; |
3413 | int min = 0, med; | 3553 | int min = 0, med; |
3414 | 3554 | ||
3415 | if (val < tab[min].read) | 3555 | if ((val >= tab[min].read && val < tab[max].read) || |
3416 | res = tab[min].real; | 3556 | (val >= tab[max].read && val < tab[min].read)) { |
3417 | else if (val >= tab[max].read) | ||
3418 | res = tab[max].real; | ||
3419 | else { | ||
3420 | while ((max - min) > 1) { | 3557 | while ((max - min) > 1) { |
3421 | med = (max + min) / 2; | 3558 | med = (max + min) / 2; |
3422 | if (val >= tab[min].read && val < tab[med].read) | 3559 | if ((val >= tab[min].read && val < tab[med].read) || |
3560 | (val >= tab[med].read && val < tab[min].read)) | ||
3423 | max = med; | 3561 | max = med; |
3424 | else | 3562 | else |
3425 | min = med; | 3563 | min = med; |
@@ -3428,6 +3566,18 @@ static int stv090x_table_lookup(const struct stv090x_tab *tab, int max, int val) | |||
3428 | (tab[max].real - tab[min].real) / | 3566 | (tab[max].real - tab[min].real) / |
3429 | (tab[max].read - tab[min].read)) + | 3567 | (tab[max].read - tab[min].read)) + |
3430 | tab[min].real; | 3568 | tab[min].real; |
3569 | } else { | ||
3570 | if (tab[min].read < tab[max].read) { | ||
3571 | if (val < tab[min].read) | ||
3572 | res = tab[min].real; | ||
3573 | else if (val >= tab[max].read) | ||
3574 | res = tab[max].real; | ||
3575 | } else { | ||
3576 | if (val >= tab[min].read) | ||
3577 | res = tab[min].real; | ||
3578 | else if (val < tab[max].read) | ||
3579 | res = tab[max].real; | ||
3580 | } | ||
3431 | } | 3581 | } |
3432 | 3582 | ||
3433 | return res; | 3583 | return res; |
@@ -3437,16 +3587,22 @@ static int stv090x_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
3437 | { | 3587 | { |
3438 | struct stv090x_state *state = fe->demodulator_priv; | 3588 | struct stv090x_state *state = fe->demodulator_priv; |
3439 | u32 reg; | 3589 | u32 reg; |
3440 | s32 agc; | 3590 | s32 agc_0, agc_1, agc; |
3591 | s32 str; | ||
3441 | 3592 | ||
3442 | reg = STV090x_READ_DEMOD(state, AGCIQIN1); | 3593 | reg = STV090x_READ_DEMOD(state, AGCIQIN1); |
3443 | agc = STV090x_GETFIELD_Px(reg, AGCIQ_VALUE_FIELD); | 3594 | agc_1 = STV090x_GETFIELD_Px(reg, AGCIQ_VALUE_FIELD); |
3595 | reg = STV090x_READ_DEMOD(state, AGCIQIN0); | ||
3596 | agc_0 = STV090x_GETFIELD_Px(reg, AGCIQ_VALUE_FIELD); | ||
3597 | agc = MAKEWORD16(agc_1, agc_0); | ||
3444 | 3598 | ||
3445 | *strength = stv090x_table_lookup(stv090x_rf_tab, ARRAY_SIZE(stv090x_rf_tab) - 1, agc); | 3599 | str = stv090x_table_lookup(stv090x_rf_tab, |
3600 | ARRAY_SIZE(stv090x_rf_tab) - 1, agc); | ||
3446 | if (agc > stv090x_rf_tab[0].read) | 3601 | if (agc > stv090x_rf_tab[0].read) |
3447 | *strength = 5; | 3602 | str = 0; |
3448 | else if (agc < stv090x_rf_tab[ARRAY_SIZE(stv090x_rf_tab) - 1].read) | 3603 | else if (agc < stv090x_rf_tab[ARRAY_SIZE(stv090x_rf_tab) - 1].read) |
3449 | *strength = -100; | 3604 | str = -100; |
3605 | *strength = (str + 100) * 0xFFFF / 100; | ||
3450 | 3606 | ||
3451 | return 0; | 3607 | return 0; |
3452 | } | 3608 | } |
@@ -3457,6 +3613,8 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr) | |||
3457 | u32 reg_0, reg_1, reg, i; | 3613 | u32 reg_0, reg_1, reg, i; |
3458 | s32 val_0, val_1, val = 0; | 3614 | s32 val_0, val_1, val = 0; |
3459 | u8 lock_f; | 3615 | u8 lock_f; |
3616 | s32 div; | ||
3617 | u32 last; | ||
3460 | 3618 | ||
3461 | switch (state->delsys) { | 3619 | switch (state->delsys) { |
3462 | case STV090x_DVBS2: | 3620 | case STV090x_DVBS2: |
@@ -3468,14 +3626,15 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr) | |||
3468 | reg_1 = STV090x_READ_DEMOD(state, NNOSPLHT1); | 3626 | reg_1 = STV090x_READ_DEMOD(state, NNOSPLHT1); |
3469 | val_1 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD); | 3627 | val_1 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD); |
3470 | reg_0 = STV090x_READ_DEMOD(state, NNOSPLHT0); | 3628 | reg_0 = STV090x_READ_DEMOD(state, NNOSPLHT0); |
3471 | val_0 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD); | 3629 | val_0 = STV090x_GETFIELD_Px(reg_0, NOSPLHT_NORMED_FIELD); |
3472 | val += MAKEWORD16(val_1, val_0); | 3630 | val += MAKEWORD16(val_1, val_0); |
3473 | msleep(1); | 3631 | msleep(1); |
3474 | } | 3632 | } |
3475 | val /= 16; | 3633 | val /= 16; |
3476 | *cnr = stv090x_table_lookup(stv090x_s2cn_tab, ARRAY_SIZE(stv090x_s2cn_tab) - 1, val); | 3634 | last = ARRAY_SIZE(stv090x_s2cn_tab) - 1; |
3477 | if (val < stv090x_s2cn_tab[ARRAY_SIZE(stv090x_s2cn_tab) - 1].read) | 3635 | div = stv090x_s2cn_tab[0].read - |
3478 | *cnr = 1000; | 3636 | stv090x_s2cn_tab[last].read; |
3637 | *cnr = 0xFFFF - ((val * 0xFFFF) / div); | ||
3479 | } | 3638 | } |
3480 | break; | 3639 | break; |
3481 | 3640 | ||
@@ -3489,14 +3648,15 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr) | |||
3489 | reg_1 = STV090x_READ_DEMOD(state, NOSDATAT1); | 3648 | reg_1 = STV090x_READ_DEMOD(state, NOSDATAT1); |
3490 | val_1 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD); | 3649 | val_1 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD); |
3491 | reg_0 = STV090x_READ_DEMOD(state, NOSDATAT0); | 3650 | reg_0 = STV090x_READ_DEMOD(state, NOSDATAT0); |
3492 | val_0 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD); | 3651 | val_0 = STV090x_GETFIELD_Px(reg_0, NOSDATAT_UNNORMED_FIELD); |
3493 | val += MAKEWORD16(val_1, val_0); | 3652 | val += MAKEWORD16(val_1, val_0); |
3494 | msleep(1); | 3653 | msleep(1); |
3495 | } | 3654 | } |
3496 | val /= 16; | 3655 | val /= 16; |
3497 | *cnr = stv090x_table_lookup(stv090x_s1cn_tab, ARRAY_SIZE(stv090x_s1cn_tab) - 1, val); | 3656 | last = ARRAY_SIZE(stv090x_s1cn_tab) - 1; |
3498 | if (val < stv090x_s2cn_tab[ARRAY_SIZE(stv090x_s1cn_tab) - 1].read) | 3657 | div = stv090x_s1cn_tab[0].read - |
3499 | *cnr = 1000; | 3658 | stv090x_s1cn_tab[last].read; |
3659 | *cnr = 0xFFFF - ((val * 0xFFFF) / div); | ||
3500 | } | 3660 | } |
3501 | break; | 3661 | break; |
3502 | default: | 3662 | default: |
@@ -3553,7 +3713,8 @@ static int stv090x_send_diseqc_msg(struct dvb_frontend *fe, struct dvb_diseqc_ma | |||
3553 | 3713 | ||
3554 | reg = STV090x_READ_DEMOD(state, DISTXCTL); | 3714 | reg = STV090x_READ_DEMOD(state, DISTXCTL); |
3555 | 3715 | ||
3556 | STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD, 2); | 3716 | STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD, |
3717 | (state->config->diseqc_envelope_mode) ? 4 : 2); | ||
3557 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1); | 3718 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1); |
3558 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | 3719 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) |
3559 | goto err; | 3720 | goto err; |
@@ -3605,10 +3766,10 @@ static int stv090x_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t | |||
3605 | reg = STV090x_READ_DEMOD(state, DISTXCTL); | 3766 | reg = STV090x_READ_DEMOD(state, DISTXCTL); |
3606 | 3767 | ||
3607 | if (burst == SEC_MINI_A) { | 3768 | if (burst == SEC_MINI_A) { |
3608 | mode = 3; | 3769 | mode = (state->config->diseqc_envelope_mode) ? 5 : 3; |
3609 | value = 0x00; | 3770 | value = 0x00; |
3610 | } else { | 3771 | } else { |
3611 | mode = 2; | 3772 | mode = (state->config->diseqc_envelope_mode) ? 4 : 2; |
3612 | value = 0xFF; | 3773 | value = 0xFF; |
3613 | } | 3774 | } |
3614 | 3775 | ||
@@ -3725,6 +3886,15 @@ static void stv090x_release(struct dvb_frontend *fe) | |||
3725 | { | 3886 | { |
3726 | struct stv090x_state *state = fe->demodulator_priv; | 3887 | struct stv090x_state *state = fe->demodulator_priv; |
3727 | 3888 | ||
3889 | state->internal->num_used--; | ||
3890 | if (state->internal->num_used <= 0) { | ||
3891 | |||
3892 | dprintk(FE_ERROR, 1, "Actually removing"); | ||
3893 | |||
3894 | remove_dev(state->internal); | ||
3895 | kfree(state->internal); | ||
3896 | } | ||
3897 | |||
3728 | kfree(state); | 3898 | kfree(state); |
3729 | } | 3899 | } |
3730 | 3900 | ||
@@ -3732,6 +3902,8 @@ static int stv090x_ldpc_mode(struct stv090x_state *state, enum stv090x_mode ldpc | |||
3732 | { | 3902 | { |
3733 | u32 reg = 0; | 3903 | u32 reg = 0; |
3734 | 3904 | ||
3905 | reg = stv090x_read_reg(state, STV090x_GENCFG); | ||
3906 | |||
3735 | switch (ldpc_mode) { | 3907 | switch (ldpc_mode) { |
3736 | case STV090x_DUAL: | 3908 | case STV090x_DUAL: |
3737 | default: | 3909 | default: |
@@ -3854,10 +4026,10 @@ static int stv090x_set_mclk(struct stv090x_state *state, u32 mclk, u32 clk) | |||
3854 | if (stv090x_write_reg(state, STV090x_NCOARSE, reg) < 0) | 4026 | if (stv090x_write_reg(state, STV090x_NCOARSE, reg) < 0) |
3855 | goto err; | 4027 | goto err; |
3856 | 4028 | ||
3857 | state->mclk = stv090x_get_mclk(state); | 4029 | state->internal->mclk = stv090x_get_mclk(state); |
3858 | 4030 | ||
3859 | /*Set the DiseqC frequency to 22KHz */ | 4031 | /*Set the DiseqC frequency to 22KHz */ |
3860 | div = state->mclk / 704000; | 4032 | div = state->internal->mclk / 704000; |
3861 | if (STV090x_WRITE_DEMOD(state, F22TX, div) < 0) | 4033 | if (STV090x_WRITE_DEMOD(state, F22TX, div) < 0) |
3862 | goto err; | 4034 | goto err; |
3863 | if (STV090x_WRITE_DEMOD(state, F22RX, div) < 0) | 4035 | if (STV090x_WRITE_DEMOD(state, F22RX, div) < 0) |
@@ -3873,7 +4045,7 @@ static int stv090x_set_tspath(struct stv090x_state *state) | |||
3873 | { | 4045 | { |
3874 | u32 reg; | 4046 | u32 reg; |
3875 | 4047 | ||
3876 | if (state->dev_ver >= 0x20) { | 4048 | if (state->internal->dev_ver >= 0x20) { |
3877 | switch (state->config->ts1_mode) { | 4049 | switch (state->config->ts1_mode) { |
3878 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | 4050 | case STV090x_TSMODE_PARALLEL_PUNCTURED: |
3879 | case STV090x_TSMODE_DVBCI: | 4051 | case STV090x_TSMODE_DVBCI: |
@@ -4045,6 +4217,71 @@ static int stv090x_set_tspath(struct stv090x_state *state) | |||
4045 | default: | 4217 | default: |
4046 | break; | 4218 | break; |
4047 | } | 4219 | } |
4220 | |||
4221 | if (state->config->ts1_clk > 0) { | ||
4222 | u32 speed; | ||
4223 | |||
4224 | switch (state->config->ts1_mode) { | ||
4225 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
4226 | case STV090x_TSMODE_DVBCI: | ||
4227 | default: | ||
4228 | speed = state->internal->mclk / | ||
4229 | (state->config->ts1_clk / 4); | ||
4230 | if (speed < 0x08) | ||
4231 | speed = 0x08; | ||
4232 | if (speed > 0xFF) | ||
4233 | speed = 0xFF; | ||
4234 | break; | ||
4235 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
4236 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
4237 | speed = state->internal->mclk / | ||
4238 | (state->config->ts1_clk / 32); | ||
4239 | if (speed < 0x20) | ||
4240 | speed = 0x20; | ||
4241 | if (speed > 0xFF) | ||
4242 | speed = 0xFF; | ||
4243 | break; | ||
4244 | } | ||
4245 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGM); | ||
4246 | STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3); | ||
4247 | if (stv090x_write_reg(state, STV090x_P1_TSCFGM, reg) < 0) | ||
4248 | goto err; | ||
4249 | if (stv090x_write_reg(state, STV090x_P1_TSSPEED, speed) < 0) | ||
4250 | goto err; | ||
4251 | } | ||
4252 | |||
4253 | if (state->config->ts2_clk > 0) { | ||
4254 | u32 speed; | ||
4255 | |||
4256 | switch (state->config->ts2_mode) { | ||
4257 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
4258 | case STV090x_TSMODE_DVBCI: | ||
4259 | default: | ||
4260 | speed = state->internal->mclk / | ||
4261 | (state->config->ts2_clk / 4); | ||
4262 | if (speed < 0x08) | ||
4263 | speed = 0x08; | ||
4264 | if (speed > 0xFF) | ||
4265 | speed = 0xFF; | ||
4266 | break; | ||
4267 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
4268 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
4269 | speed = state->internal->mclk / | ||
4270 | (state->config->ts2_clk / 32); | ||
4271 | if (speed < 0x20) | ||
4272 | speed = 0x20; | ||
4273 | if (speed > 0xFF) | ||
4274 | speed = 0xFF; | ||
4275 | break; | ||
4276 | } | ||
4277 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGM); | ||
4278 | STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3); | ||
4279 | if (stv090x_write_reg(state, STV090x_P2_TSCFGM, reg) < 0) | ||
4280 | goto err; | ||
4281 | if (stv090x_write_reg(state, STV090x_P2_TSSPEED, speed) < 0) | ||
4282 | goto err; | ||
4283 | } | ||
4284 | |||
4048 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); | 4285 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); |
4049 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x01); | 4286 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x01); |
4050 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) | 4287 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) |
@@ -4073,6 +4310,15 @@ static int stv090x_init(struct dvb_frontend *fe) | |||
4073 | const struct stv090x_config *config = state->config; | 4310 | const struct stv090x_config *config = state->config; |
4074 | u32 reg; | 4311 | u32 reg; |
4075 | 4312 | ||
4313 | if (state->internal->mclk == 0) { | ||
4314 | stv090x_set_mclk(state, 135000000, config->xtal); /* 135 Mhz */ | ||
4315 | msleep(5); | ||
4316 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, | ||
4317 | 0x20 | config->clk_mode) < 0) | ||
4318 | goto err; | ||
4319 | stv090x_get_mclk(state); | ||
4320 | } | ||
4321 | |||
4076 | if (stv090x_wakeup(fe) < 0) { | 4322 | if (stv090x_wakeup(fe) < 0) { |
4077 | dprintk(FE_ERROR, 1, "Error waking device"); | 4323 | dprintk(FE_ERROR, 1, "Error waking device"); |
4078 | goto err; | 4324 | goto err; |
@@ -4095,12 +4341,12 @@ static int stv090x_init(struct dvb_frontend *fe) | |||
4095 | 4341 | ||
4096 | if (config->tuner_set_mode) { | 4342 | if (config->tuner_set_mode) { |
4097 | if (config->tuner_set_mode(fe, TUNER_WAKE) < 0) | 4343 | if (config->tuner_set_mode(fe, TUNER_WAKE) < 0) |
4098 | goto err; | 4344 | goto err_gateoff; |
4099 | } | 4345 | } |
4100 | 4346 | ||
4101 | if (config->tuner_init) { | 4347 | if (config->tuner_init) { |
4102 | if (config->tuner_init(fe) < 0) | 4348 | if (config->tuner_init(fe) < 0) |
4103 | goto err; | 4349 | goto err_gateoff; |
4104 | } | 4350 | } |
4105 | 4351 | ||
4106 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | 4352 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) |
@@ -4110,6 +4356,9 @@ static int stv090x_init(struct dvb_frontend *fe) | |||
4110 | goto err; | 4356 | goto err; |
4111 | 4357 | ||
4112 | return 0; | 4358 | return 0; |
4359 | |||
4360 | err_gateoff: | ||
4361 | stv090x_i2c_gate_ctrl(fe, 0); | ||
4113 | err: | 4362 | err: |
4114 | dprintk(FE_ERROR, 1, "I/O error"); | 4363 | dprintk(FE_ERROR, 1, "I/O error"); |
4115 | return -1; | 4364 | return -1; |
@@ -4141,16 +4390,26 @@ static int stv090x_setup(struct dvb_frontend *fe) | |||
4141 | } | 4390 | } |
4142 | 4391 | ||
4143 | /* STV090x init */ | 4392 | /* STV090x init */ |
4144 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Stop Demod */ | 4393 | |
4394 | /* Stop Demod */ | ||
4395 | if (stv090x_write_reg(state, STV090x_P1_DMDISTATE, 0x5c) < 0) | ||
4396 | goto err; | ||
4397 | if (stv090x_write_reg(state, STV090x_P2_DMDISTATE, 0x5c) < 0) | ||
4145 | goto err; | 4398 | goto err; |
4146 | 4399 | ||
4147 | msleep(5); | 4400 | msleep(5); |
4148 | 4401 | ||
4149 | if (STV090x_WRITE_DEMOD(state, TNRCFG, 0x6c) < 0) /* check register ! (No Tuner Mode) */ | 4402 | /* Set No Tuner Mode */ |
4403 | if (stv090x_write_reg(state, STV090x_P1_TNRCFG, 0x6c) < 0) | ||
4404 | goto err; | ||
4405 | if (stv090x_write_reg(state, STV090x_P2_TNRCFG, 0x6c) < 0) | ||
4150 | goto err; | 4406 | goto err; |
4151 | 4407 | ||
4408 | /* I2C repeater OFF */ | ||
4152 | STV090x_SETFIELD_Px(reg, ENARPT_LEVEL_FIELD, config->repeater_level); | 4409 | STV090x_SETFIELD_Px(reg, ENARPT_LEVEL_FIELD, config->repeater_level); |
4153 | if (STV090x_WRITE_DEMOD(state, I2CRPT, reg) < 0) /* repeater OFF */ | 4410 | if (stv090x_write_reg(state, STV090x_P1_I2CRPT, reg) < 0) |
4411 | goto err; | ||
4412 | if (stv090x_write_reg(state, STV090x_P2_I2CRPT, reg) < 0) | ||
4154 | goto err; | 4413 | goto err; |
4155 | 4414 | ||
4156 | if (stv090x_write_reg(state, STV090x_NCOARSE, 0x13) < 0) /* set PLL divider */ | 4415 | if (stv090x_write_reg(state, STV090x_NCOARSE, 0x13) < 0) /* set PLL divider */ |
@@ -4169,8 +4428,8 @@ static int stv090x_setup(struct dvb_frontend *fe) | |||
4169 | goto err; | 4428 | goto err; |
4170 | } | 4429 | } |
4171 | 4430 | ||
4172 | state->dev_ver = stv090x_read_reg(state, STV090x_MID); | 4431 | state->internal->dev_ver = stv090x_read_reg(state, STV090x_MID); |
4173 | if (state->dev_ver >= 0x20) { | 4432 | if (state->internal->dev_ver >= 0x20) { |
4174 | if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x0c) < 0) | 4433 | if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x0c) < 0) |
4175 | goto err; | 4434 | goto err; |
4176 | 4435 | ||
@@ -4181,27 +4440,39 @@ static int stv090x_setup(struct dvb_frontend *fe) | |||
4181 | goto err; | 4440 | goto err; |
4182 | } | 4441 | } |
4183 | 4442 | ||
4184 | } else if (state->dev_ver < 0x20) { | 4443 | } else if (state->internal->dev_ver < 0x20) { |
4185 | dprintk(FE_ERROR, 1, "ERROR: Unsupported Cut: 0x%02x!", | 4444 | dprintk(FE_ERROR, 1, "ERROR: Unsupported Cut: 0x%02x!", |
4186 | state->dev_ver); | 4445 | state->internal->dev_ver); |
4187 | 4446 | ||
4188 | goto err; | 4447 | goto err; |
4189 | } else if (state->dev_ver > 0x30) { | 4448 | } else if (state->internal->dev_ver > 0x30) { |
4190 | /* we shouldn't bail out from here */ | 4449 | /* we shouldn't bail out from here */ |
4191 | dprintk(FE_ERROR, 1, "INFO: Cut: 0x%02x probably incomplete support!", | 4450 | dprintk(FE_ERROR, 1, "INFO: Cut: 0x%02x probably incomplete support!", |
4192 | state->dev_ver); | 4451 | state->internal->dev_ver); |
4193 | } | 4452 | } |
4194 | 4453 | ||
4454 | /* ADC1 range */ | ||
4455 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); | ||
4456 | STV090x_SETFIELD(reg, ADC1_INMODE_FIELD, | ||
4457 | (config->adc1_range == STV090x_ADC_1Vpp) ? 0 : 1); | ||
4458 | if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0) | ||
4459 | goto err; | ||
4460 | |||
4461 | /* ADC2 range */ | ||
4462 | reg = stv090x_read_reg(state, STV090x_TSTTNR3); | ||
4463 | STV090x_SETFIELD(reg, ADC2_INMODE_FIELD, | ||
4464 | (config->adc2_range == STV090x_ADC_1Vpp) ? 0 : 1); | ||
4465 | if (stv090x_write_reg(state, STV090x_TSTTNR3, reg) < 0) | ||
4466 | goto err; | ||
4467 | |||
4195 | if (stv090x_write_reg(state, STV090x_TSTRES0, 0x80) < 0) | 4468 | if (stv090x_write_reg(state, STV090x_TSTRES0, 0x80) < 0) |
4196 | goto err; | 4469 | goto err; |
4197 | if (stv090x_write_reg(state, STV090x_TSTRES0, 0x00) < 0) | 4470 | if (stv090x_write_reg(state, STV090x_TSTRES0, 0x00) < 0) |
4198 | goto err; | 4471 | goto err; |
4199 | 4472 | ||
4200 | stv090x_set_mclk(state, 135000000, config->xtal); /* 135 Mhz */ | 4473 | /* workaround for stuck DiSEqC output */ |
4201 | msleep(5); | 4474 | if (config->diseqc_envelope_mode) |
4202 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, 0x20 | config->clk_mode) < 0) | 4475 | stv090x_send_diseqc_burst(fe, SEC_MINI_A); |
4203 | goto err; | ||
4204 | stv090x_get_mclk(state); | ||
4205 | 4476 | ||
4206 | return 0; | 4477 | return 0; |
4207 | err: | 4478 | err: |
@@ -4252,6 +4523,7 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config, | |||
4252 | enum stv090x_demodulator demod) | 4523 | enum stv090x_demodulator demod) |
4253 | { | 4524 | { |
4254 | struct stv090x_state *state = NULL; | 4525 | struct stv090x_state *state = NULL; |
4526 | struct stv090x_dev *temp_int; | ||
4255 | 4527 | ||
4256 | state = kzalloc(sizeof (struct stv090x_state), GFP_KERNEL); | 4528 | state = kzalloc(sizeof (struct stv090x_state), GFP_KERNEL); |
4257 | if (state == NULL) | 4529 | if (state == NULL) |
@@ -4267,8 +4539,32 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config, | |||
4267 | state->device = config->device; | 4539 | state->device = config->device; |
4268 | state->rolloff = STV090x_RO_35; /* default */ | 4540 | state->rolloff = STV090x_RO_35; /* default */ |
4269 | 4541 | ||
4270 | if (state->demod == STV090x_DEMODULATOR_0) | 4542 | temp_int = find_dev(state->i2c, |
4271 | mutex_init(&demod_lock); | 4543 | state->config->address); |
4544 | |||
4545 | if ((temp_int != NULL) && (state->demod_mode == STV090x_DUAL)) { | ||
4546 | state->internal = temp_int->internal; | ||
4547 | state->internal->num_used++; | ||
4548 | dprintk(FE_INFO, 1, "Found Internal Structure!"); | ||
4549 | dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x", | ||
4550 | state->device == STV0900 ? "STV0900" : "STV0903", | ||
4551 | demod, | ||
4552 | state->internal->dev_ver); | ||
4553 | return &state->frontend; | ||
4554 | } else { | ||
4555 | state->internal = kmalloc(sizeof(struct stv090x_internal), | ||
4556 | GFP_KERNEL); | ||
4557 | temp_int = append_internal(state->internal); | ||
4558 | state->internal->num_used = 1; | ||
4559 | state->internal->mclk = 0; | ||
4560 | state->internal->dev_ver = 0; | ||
4561 | state->internal->i2c_adap = state->i2c; | ||
4562 | state->internal->i2c_addr = state->config->address; | ||
4563 | dprintk(FE_INFO, 1, "Create New Internal Structure!"); | ||
4564 | } | ||
4565 | |||
4566 | mutex_init(&state->internal->demod_lock); | ||
4567 | mutex_init(&state->internal->tuner_lock); | ||
4272 | 4568 | ||
4273 | if (stv090x_sleep(&state->frontend) < 0) { | 4569 | if (stv090x_sleep(&state->frontend) < 0) { |
4274 | dprintk(FE_ERROR, 1, "Error putting device to sleep"); | 4570 | dprintk(FE_ERROR, 1, "Error putting device to sleep"); |
@@ -4284,10 +4580,10 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config, | |||
4284 | goto error; | 4580 | goto error; |
4285 | } | 4581 | } |
4286 | 4582 | ||
4287 | dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x\n", | 4583 | dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x", |
4288 | state->device == STV0900 ? "STV0900" : "STV0903", | 4584 | state->device == STV0900 ? "STV0900" : "STV0903", |
4289 | demod, | 4585 | demod, |
4290 | state->dev_ver); | 4586 | state->internal->dev_ver); |
4291 | 4587 | ||
4292 | return &state->frontend; | 4588 | return &state->frontend; |
4293 | 4589 | ||
diff --git a/drivers/media/dvb/frontends/stv090x.h b/drivers/media/dvb/frontends/stv090x.h index e968c98bb70f..30f01a6902ac 100644 --- a/drivers/media/dvb/frontends/stv090x.h +++ b/drivers/media/dvb/frontends/stv090x.h | |||
@@ -60,6 +60,11 @@ enum stv090x_i2crpt { | |||
60 | STV090x_RPTLEVEL_2 = 7, | 60 | STV090x_RPTLEVEL_2 = 7, |
61 | }; | 61 | }; |
62 | 62 | ||
63 | enum stv090x_adc_range { | ||
64 | STV090x_ADC_2Vpp = 0, | ||
65 | STV090x_ADC_1Vpp = 1 | ||
66 | }; | ||
67 | |||
63 | struct stv090x_config { | 68 | struct stv090x_config { |
64 | enum stv090x_device device; | 69 | enum stv090x_device device; |
65 | enum stv090x_mode demod_mode; | 70 | enum stv090x_mode demod_mode; |
@@ -68,13 +73,19 @@ struct stv090x_config { | |||
68 | u32 xtal; /* default: 8000000 */ | 73 | u32 xtal; /* default: 8000000 */ |
69 | u8 address; /* default: 0x68 */ | 74 | u8 address; /* default: 0x68 */ |
70 | 75 | ||
71 | u32 ref_clk; /* default: 16000000 FIXME to tuner config */ | ||
72 | |||
73 | u8 ts1_mode; | 76 | u8 ts1_mode; |
74 | u8 ts2_mode; | 77 | u8 ts2_mode; |
78 | u32 ts1_clk; | ||
79 | u32 ts2_clk; | ||
75 | 80 | ||
76 | enum stv090x_i2crpt repeater_level; | 81 | enum stv090x_i2crpt repeater_level; |
77 | 82 | ||
83 | u8 tuner_bbgain; /* default: 10db */ | ||
84 | enum stv090x_adc_range adc1_range; /* default: 2Vpp */ | ||
85 | enum stv090x_adc_range adc2_range; /* default: 2Vpp */ | ||
86 | |||
87 | bool diseqc_envelope_mode; | ||
88 | |||
78 | int (*tuner_init) (struct dvb_frontend *fe); | 89 | int (*tuner_init) (struct dvb_frontend *fe); |
79 | int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); | 90 | int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); |
80 | int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); | 91 | int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); |
diff --git a/drivers/media/dvb/frontends/stv090x_priv.h b/drivers/media/dvb/frontends/stv090x_priv.h index 5a4a01740d88..5b780c80d496 100644 --- a/drivers/media/dvb/frontends/stv090x_priv.h +++ b/drivers/media/dvb/frontends/stv090x_priv.h | |||
@@ -83,7 +83,7 @@ | |||
83 | 83 | ||
84 | #define STV090x_IQPOWER_THRESHOLD 30 | 84 | #define STV090x_IQPOWER_THRESHOLD 30 |
85 | #define STV090x_SEARCH_AGC2_TH_CUT20 700 | 85 | #define STV090x_SEARCH_AGC2_TH_CUT20 700 |
86 | #define STV090x_SEARCH_AGC2_TH_CUT30 1200 | 86 | #define STV090x_SEARCH_AGC2_TH_CUT30 1400 |
87 | 87 | ||
88 | #define STV090x_SEARCH_AGC2_TH(__ver) \ | 88 | #define STV090x_SEARCH_AGC2_TH(__ver) \ |
89 | ((__ver <= 0x20) ? \ | 89 | ((__ver <= 0x20) ? \ |
@@ -91,6 +91,7 @@ | |||
91 | STV090x_SEARCH_AGC2_TH_CUT30) | 91 | STV090x_SEARCH_AGC2_TH_CUT30) |
92 | 92 | ||
93 | enum stv090x_signal_state { | 93 | enum stv090x_signal_state { |
94 | STV090x_NOAGC1, | ||
94 | STV090x_NOCARRIER, | 95 | STV090x_NOCARRIER, |
95 | STV090x_NODATA, | 96 | STV090x_NODATA, |
96 | STV090x_DATAOK, | 97 | STV090x_DATAOK, |
@@ -229,11 +230,23 @@ struct stv090x_tab { | |||
229 | s32 read; | 230 | s32 read; |
230 | }; | 231 | }; |
231 | 232 | ||
233 | struct stv090x_internal { | ||
234 | struct i2c_adapter *i2c_adap; | ||
235 | u8 i2c_addr; | ||
236 | |||
237 | struct mutex demod_lock; /* Lock access to shared register */ | ||
238 | struct mutex tuner_lock; /* Lock access to tuners */ | ||
239 | s32 mclk; /* Masterclock Divider factor */ | ||
240 | u32 dev_ver; | ||
241 | |||
242 | int num_used; | ||
243 | }; | ||
244 | |||
232 | struct stv090x_state { | 245 | struct stv090x_state { |
233 | enum stv090x_device device; | 246 | enum stv090x_device device; |
234 | enum stv090x_demodulator demod; | 247 | enum stv090x_demodulator demod; |
235 | enum stv090x_mode demod_mode; | 248 | enum stv090x_mode demod_mode; |
236 | u32 dev_ver; | 249 | struct stv090x_internal *internal; |
237 | 250 | ||
238 | struct i2c_adapter *i2c; | 251 | struct i2c_adapter *i2c; |
239 | const struct stv090x_config *config; | 252 | const struct stv090x_config *config; |
@@ -255,11 +268,8 @@ struct stv090x_state { | |||
255 | u32 frequency; | 268 | u32 frequency; |
256 | u32 srate; | 269 | u32 srate; |
257 | 270 | ||
258 | s32 mclk; /* Masterclock Divider factor */ | ||
259 | s32 tuner_bw; | 271 | s32 tuner_bw; |
260 | 272 | ||
261 | u32 tuner_refclk; | ||
262 | |||
263 | s32 search_range; | 273 | s32 search_range; |
264 | 274 | ||
265 | s32 DemodTimeout; | 275 | s32 DemodTimeout; |
diff --git a/drivers/media/dvb/frontends/stv090x_reg.h b/drivers/media/dvb/frontends/stv090x_reg.h index 57b6abbbd32d..2502855dd784 100644 --- a/drivers/media/dvb/frontends/stv090x_reg.h +++ b/drivers/media/dvb/frontends/stv090x_reg.h | |||
@@ -44,7 +44,7 @@ | |||
44 | #define STV090x_OFFST_OUTSERRS2_HZ_FIELD 5 | 44 | #define STV090x_OFFST_OUTSERRS2_HZ_FIELD 5 |
45 | #define STV090x_WIDTH_OUTSERRS2_HZ_FIELD 1 | 45 | #define STV090x_WIDTH_OUTSERRS2_HZ_FIELD 1 |
46 | #define STV090x_OFFST_OUTSERRS3_HZ_FIELD 4 | 46 | #define STV090x_OFFST_OUTSERRS3_HZ_FIELD 4 |
47 | #define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1 | 47 | #define STV090x_WIDTH_OUTSERRS3_HZ_FIELD 1 |
48 | #define STV090x_OFFST_OUTPARRS3_HZ_FIELD 3 | 48 | #define STV090x_OFFST_OUTPARRS3_HZ_FIELD 3 |
49 | #define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1 | 49 | #define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1 |
50 | 50 | ||
@@ -113,24 +113,24 @@ | |||
113 | #define STV090x_IRQMASK3 0xf124 | 113 | #define STV090x_IRQMASK3 0xf124 |
114 | #define STV090x_OFFST_MPLL_LOCK_FIELD 5 | 114 | #define STV090x_OFFST_MPLL_LOCK_FIELD 5 |
115 | #define STV090x_WIDTH_MPLL_LOCK_FIELD 1 | 115 | #define STV090x_WIDTH_MPLL_LOCK_FIELD 1 |
116 | #define STV090x_OFFST_MSTREAM_LCK_3_FIELD 2 | 116 | #define STV090x_OFFST_MSTREAM_LCK_3_FIELD 4 |
117 | #define STV090x_WIDTH_MSTREAM_LCK_3_FIELD 3 | 117 | #define STV090x_WIDTH_MSTREAM_LCK_3_FIELD 1 |
118 | #define STV090x_OFFST_MSTREAM_LCK_2_FIELD 2 | 118 | #define STV090x_OFFST_MSTREAM_LCK_2_FIELD 3 |
119 | #define STV090x_WIDTH_MSTREAM_LCK_2_FIELD 3 | 119 | #define STV090x_WIDTH_MSTREAM_LCK_2_FIELD 1 |
120 | #define STV090x_OFFST_MSTREAM_LCK_1_FIELD 2 | 120 | #define STV090x_OFFST_MSTREAM_LCK_1_FIELD 2 |
121 | #define STV090x_WIDTH_MSTREAM_LCK_1_FIELD 3 | 121 | #define STV090x_WIDTH_MSTREAM_LCK_1_FIELD 1 |
122 | #define STV090x_OFFST_MDVBS1_PRF_2_FIELD 1 | 122 | #define STV090x_OFFST_MDVBS1_PRF_2_FIELD 1 |
123 | #define STV090x_WIDTH_MDVBS1_PRF_2_FIELD 1 | 123 | #define STV090x_WIDTH_MDVBS1_PRF_2_FIELD 1 |
124 | #define STV090x_OFFST_MDVBS1_PRF_1_FIELD 0 | 124 | #define STV090x_OFFST_MDVBS1_PRF_1_FIELD 0 |
125 | #define STV090x_WIDTH_MDVBS1_PRF_1_FIELD 1 | 125 | #define STV090x_WIDTH_MDVBS1_PRF_1_FIELD 1 |
126 | 126 | ||
127 | #define STV090x_IRQMASK2 0xf125 | 127 | #define STV090x_IRQMASK2 0xf125 |
128 | #define STV090x_OFFST_MSPY_ENDSIM_3_FIELD 5 | 128 | #define STV090x_OFFST_MSPY_ENDSIM_3_FIELD 7 |
129 | #define STV090x_WIDTH_MSPY_ENDSIM_3_FIELD 3 | 129 | #define STV090x_WIDTH_MSPY_ENDSIM_3_FIELD 1 |
130 | #define STV090x_OFFST_MSPY_ENDSIM_2_FIELD 5 | 130 | #define STV090x_OFFST_MSPY_ENDSIM_2_FIELD 6 |
131 | #define STV090x_WIDTH_MSPY_ENDSIM_2_FIELD 3 | 131 | #define STV090x_WIDTH_MSPY_ENDSIM_2_FIELD 1 |
132 | #define STV090x_OFFST_MSPY_ENDSIM_1_FIELD 5 | 132 | #define STV090x_OFFST_MSPY_ENDSIM_1_FIELD 5 |
133 | #define STV090x_WIDTH_MSPY_ENDSIM_1_FIELD 3 | 133 | #define STV090x_WIDTH_MSPY_ENDSIM_1_FIELD 1 |
134 | #define STV090x_OFFST_MPKTDEL_ERROR_2_FIELD 4 | 134 | #define STV090x_OFFST_MPKTDEL_ERROR_2_FIELD 4 |
135 | #define STV090x_WIDTH_MPKTDEL_ERROR_2_FIELD 1 | 135 | #define STV090x_WIDTH_MPKTDEL_ERROR_2_FIELD 1 |
136 | #define STV090x_OFFST_MPKTDEL_LOCKB_2_FIELD 3 | 136 | #define STV090x_OFFST_MPKTDEL_LOCKB_2_FIELD 3 |
@@ -370,7 +370,7 @@ | |||
370 | #define STV090x_OFFST_SELX1RATIO_FIELD 5 | 370 | #define STV090x_OFFST_SELX1RATIO_FIELD 5 |
371 | #define STV090x_WIDTH_SELX1RATIO_FIELD 1 | 371 | #define STV090x_WIDTH_SELX1RATIO_FIELD 1 |
372 | #define STV090x_OFFST_STOP_PLL_FIELD 3 | 372 | #define STV090x_OFFST_STOP_PLL_FIELD 3 |
373 | #define STV090x_WIDTH_SELX1RATIO_FIELD 1 | 373 | #define STV090x_WIDTH_STOP_PLL_FIELD 1 |
374 | #define STV090x_OFFST_BYPASSPLLFSK_FIELD 2 | 374 | #define STV090x_OFFST_BYPASSPLLFSK_FIELD 2 |
375 | #define STV090x_WIDTH_BYPASSPLLFSK_FIELD 1 | 375 | #define STV090x_WIDTH_BYPASSPLLFSK_FIELD 1 |
376 | #define STV090x_OFFST_SELOSCI_FIELD 1 | 376 | #define STV090x_OFFST_SELOSCI_FIELD 1 |
@@ -616,7 +616,7 @@ | |||
616 | #define STV090x_OFFST_Px_CONT_TONE_FIELD 4 | 616 | #define STV090x_OFFST_Px_CONT_TONE_FIELD 4 |
617 | #define STV090x_WIDTH_Px_CONT_TONE_FIELD 1 | 617 | #define STV090x_WIDTH_Px_CONT_TONE_FIELD 1 |
618 | #define STV090x_OFFST_Px_FIFO_4BREADY_FIELD 3 | 618 | #define STV090x_OFFST_Px_FIFO_4BREADY_FIELD 3 |
619 | #define STV090x_WIDTH_Px_FIFO_4BREADY_FIELD 2 | 619 | #define STV090x_WIDTH_Px_FIFO_4BREADY_FIELD 1 |
620 | #define STV090x_OFFST_Px_FIFO_EMPTY_FIELD 2 | 620 | #define STV090x_OFFST_Px_FIFO_EMPTY_FIELD 2 |
621 | #define STV090x_WIDTH_Px_FIFO_EMPTY_FIELD 1 | 621 | #define STV090x_WIDTH_Px_FIFO_EMPTY_FIELD 1 |
622 | #define STV090x_OFFST_Px_ABORT_DISRX_FIELD 0 | 622 | #define STV090x_OFFST_Px_ABORT_DISRX_FIELD 0 |
@@ -847,12 +847,10 @@ | |||
847 | #define STV090x_WIDTH_Px_DVBS2_ENABLE_FIELD 1 | 847 | #define STV090x_WIDTH_Px_DVBS2_ENABLE_FIELD 1 |
848 | #define STV090x_OFFST_Px_DVBS1_ENABLE_FIELD 6 | 848 | #define STV090x_OFFST_Px_DVBS1_ENABLE_FIELD 6 |
849 | #define STV090x_WIDTH_Px_DVBS1_ENABLE_FIELD 1 | 849 | #define STV090x_WIDTH_Px_DVBS1_ENABLE_FIELD 1 |
850 | #define STV090x_OFFST_Px_CFR_AUTOSCAN_FIELD 5 /* check */ | 850 | #define STV090x_OFFST_Px_SCAN_ENABLE_FIELD 4 |
851 | #define STV090x_WIDTH_Px_CFR_AUTOSCAN_FIELD 1 | ||
852 | #define STV090x_OFFST_Px_SCAN_ENABLE_FIELD 4 /* check */ | ||
853 | #define STV090x_WIDTH_Px_SCAN_ENABLE_FIELD 1 | 851 | #define STV090x_WIDTH_Px_SCAN_ENABLE_FIELD 1 |
854 | #define STV090x_OFFST_Px_TUN_AUTOSCAN_FIELD 3 | 852 | #define STV090x_OFFST_Px_CFR_AUTOSCAN_FIELD 3 |
855 | #define STV090x_WIDTH_Px_TUN_AUTOSCAN_FIELD 1 | 853 | #define STV090x_WIDTH_Px_CFR_AUTOSCAN_FIELD 1 |
856 | #define STV090x_OFFST_Px_NOFORCE_RELOCK_FIELD 2 | 854 | #define STV090x_OFFST_Px_NOFORCE_RELOCK_FIELD 2 |
857 | #define STV090x_WIDTH_Px_NOFORCE_RELOCK_FIELD 1 | 855 | #define STV090x_WIDTH_Px_NOFORCE_RELOCK_FIELD 1 |
858 | #define STV090x_OFFST_Px_TUN_RNG_FIELD 0 | 856 | #define STV090x_OFFST_Px_TUN_RNG_FIELD 0 |
@@ -885,7 +883,7 @@ | |||
885 | #define STV090x_P2_DMDFLYW STV090x_Px_DMDFLYW(2) | 883 | #define STV090x_P2_DMDFLYW STV090x_Px_DMDFLYW(2) |
886 | #define STV090x_OFFST_Px_I2C_IRQVAL_FIELD 4 | 884 | #define STV090x_OFFST_Px_I2C_IRQVAL_FIELD 4 |
887 | #define STV090x_WIDTH_Px_I2C_IRQVAL_FIELD 4 | 885 | #define STV090x_WIDTH_Px_I2C_IRQVAL_FIELD 4 |
888 | #define STV090x_OFFST_Px_FLYWHEEL_CPT_FIELD 0 /* check */ | 886 | #define STV090x_OFFST_Px_FLYWHEEL_CPT_FIELD 0 |
889 | #define STV090x_WIDTH_Px_FLYWHEEL_CPT_FIELD 4 | 887 | #define STV090x_WIDTH_Px_FLYWHEEL_CPT_FIELD 4 |
890 | 888 | ||
891 | #define STV090x_Px_DSTATUS3(__x) (0xF41D - (__x - 1) * 0x200) | 889 | #define STV090x_Px_DSTATUS3(__x) (0xF41D - (__x - 1) * 0x200) |
@@ -1048,12 +1046,12 @@ | |||
1048 | #define STV090x_P1_CFRINC1 STV090x_Px_CFRINC1(1) | 1046 | #define STV090x_P1_CFRINC1 STV090x_Px_CFRINC1(1) |
1049 | #define STV090x_P2_CFRINC1 STV090x_Px_CFRINC1(2) | 1047 | #define STV090x_P2_CFRINC1 STV090x_Px_CFRINC1(2) |
1050 | #define STV090x_OFFST_Px_CFR_INC1_FIELD 0 | 1048 | #define STV090x_OFFST_Px_CFR_INC1_FIELD 0 |
1051 | #define STV090x_WIDTH_Px_CFR_INC1_FIELD 7 | 1049 | #define STV090x_WIDTH_Px_CFR_INC1_FIELD 7 /* check */ |
1052 | 1050 | ||
1053 | #define STV090x_Px_CFRINC0(__x) (0xF44B - (__x - 1) * 0x200) | 1051 | #define STV090x_Px_CFRINC0(__x) (0xF44B - (__x - 1) * 0x200) |
1054 | #define STV090x_P1_CFRINC0 STV090x_Px_CFRINC0(1) | 1052 | #define STV090x_P1_CFRINC0 STV090x_Px_CFRINC0(1) |
1055 | #define STV090x_P2_CFRINC0 STV090x_Px_CFRINC0(2) | 1053 | #define STV090x_P2_CFRINC0 STV090x_Px_CFRINC0(2) |
1056 | #define STV090x_OFFST_Px_CFR_INC0_FIELD 4 | 1054 | #define STV090x_OFFST_Px_CFR_INC0_FIELD 4 /* check */ |
1057 | #define STV090x_WIDTH_Px_CFR_INC0_FIELD 4 | 1055 | #define STV090x_WIDTH_Px_CFR_INC0_FIELD 4 |
1058 | 1056 | ||
1059 | #define STV090x_Pn_CFRy(__x, __y) (0xF44E - (__x - 1) * 0x200 - __y * 0x1) | 1057 | #define STV090x_Pn_CFRy(__x, __y) (0xF44E - (__x - 1) * 0x200 - __y * 0x1) |
@@ -1145,14 +1143,14 @@ | |||
1145 | #define STV090x_Px_SFRINIT1(__x) (0xF45E - (__x - 1) * 0x200) | 1143 | #define STV090x_Px_SFRINIT1(__x) (0xF45E - (__x - 1) * 0x200) |
1146 | #define STV090x_P1_SFRINIT1 STV090x_Px_SFRINIT1(1) | 1144 | #define STV090x_P1_SFRINIT1 STV090x_Px_SFRINIT1(1) |
1147 | #define STV090x_P2_SFRINIT1 STV090x_Px_SFRINIT1(2) | 1145 | #define STV090x_P2_SFRINIT1 STV090x_Px_SFRINIT1(2) |
1148 | #define STV090x_OFFST_Px_SFR_INIT_FIELD 0 | 1146 | #define STV090x_OFFST_Px_SFR_INIT1_FIELD 0 |
1149 | #define STV090x_WIDTH_Px_SFR_INIT_FIELD 8 | 1147 | #define STV090x_WIDTH_Px_SFR_INIT1_FIELD 7 |
1150 | 1148 | ||
1151 | #define STV090x_Px_SFRINIT0(__x) (0xF45F - (__x - 1) * 0x200) | 1149 | #define STV090x_Px_SFRINIT0(__x) (0xF45F - (__x - 1) * 0x200) |
1152 | #define STV090x_P1_SFRINIT0 STV090x_Px_SFRINIT0(1) | 1150 | #define STV090x_P1_SFRINIT0 STV090x_Px_SFRINIT0(1) |
1153 | #define STV090x_P2_SFRINIT0 STV090x_Px_SFRINIT0(2) | 1151 | #define STV090x_P2_SFRINIT0 STV090x_Px_SFRINIT0(2) |
1154 | #define STV090x_OFFST_Px_SFR_INIT_FIELD 0 | 1152 | #define STV090x_OFFST_Px_SFR_INIT0_FIELD 0 |
1155 | #define STV090x_WIDTH_Px_SFR_INIT_FIELD 8 | 1153 | #define STV090x_WIDTH_Px_SFR_INIT0_FIELD 8 |
1156 | 1154 | ||
1157 | #define STV090x_Px_SFRUP1(__x) (0xF460 - (__x - 1) * 0x200) | 1155 | #define STV090x_Px_SFRUP1(__x) (0xF460 - (__x - 1) * 0x200) |
1158 | #define STV090x_P1_SFRUP1 STV090x_Px_SFRUP1(1) | 1156 | #define STV090x_P1_SFRUP1 STV090x_Px_SFRUP1(1) |
@@ -1178,7 +1176,7 @@ | |||
1178 | #define STV090x_OFFST_Px_SYMB_FREQ_LOW0_FIELD 0 | 1176 | #define STV090x_OFFST_Px_SYMB_FREQ_LOW0_FIELD 0 |
1179 | #define STV090x_WIDTH_Px_SYMB_FREQ_LOW0_FIELD 8 | 1177 | #define STV090x_WIDTH_Px_SYMB_FREQ_LOW0_FIELD 8 |
1180 | 1178 | ||
1181 | #define STV090x_Px_SFRy(__x, __y) (0xF464 - (__x-1) * 0x200 + (3 - __y)) | 1179 | #define STV090x_Px_SFRy(__x, __y) (0xF467 - (__x-1) * 0x200 - __y) |
1182 | #define STV090x_P1_SFR0 STV090x_Px_SFRy(1, 0) | 1180 | #define STV090x_P1_SFR0 STV090x_Px_SFRy(1, 0) |
1183 | #define STV090x_P1_SFR1 STV090x_Px_SFRy(1, 1) | 1181 | #define STV090x_P1_SFR1 STV090x_Px_SFRy(1, 1) |
1184 | #define STV090x_P1_SFR2 STV090x_Px_SFRy(1, 2) | 1182 | #define STV090x_P1_SFR2 STV090x_Px_SFRy(1, 2) |
@@ -1188,7 +1186,7 @@ | |||
1188 | #define STV090x_P2_SFR2 STV090x_Px_SFRy(2, 2) | 1186 | #define STV090x_P2_SFR2 STV090x_Px_SFRy(2, 2) |
1189 | #define STV090x_P2_SFR3 STV090x_Px_SFRy(2, 3) | 1187 | #define STV090x_P2_SFR3 STV090x_Px_SFRy(2, 3) |
1190 | #define STV090x_OFFST_Px_SYMB_FREQ_FIELD 0 | 1188 | #define STV090x_OFFST_Px_SYMB_FREQ_FIELD 0 |
1191 | #define STV090x_WIDTH_Px_SYMB_FREQ_FIELD 32 | 1189 | #define STV090x_WIDTH_Px_SYMB_FREQ_FIELD 8 |
1192 | 1190 | ||
1193 | #define STV090x_Px_TMGREG2(__x) (0xF468 - (__x - 1) * 0x200) | 1191 | #define STV090x_Px_TMGREG2(__x) (0xF468 - (__x - 1) * 0x200) |
1194 | #define STV090x_P1_TMGREG2 STV090x_Px_TMGREG2(1) | 1192 | #define STV090x_P1_TMGREG2 STV090x_Px_TMGREG2(1) |
@@ -1198,7 +1196,7 @@ | |||
1198 | 1196 | ||
1199 | #define STV090x_Px_TMGREG1(__x) (0xF469 - (__x - 1) * 0x200) | 1197 | #define STV090x_Px_TMGREG1(__x) (0xF469 - (__x - 1) * 0x200) |
1200 | #define STV090x_P1_TMGREG1 STV090x_Px_TMGREG1(1) | 1198 | #define STV090x_P1_TMGREG1 STV090x_Px_TMGREG1(1) |
1201 | #define STV090x_P2_TMGREG1 STV090x_Px_TMGREG1(2) | 1199 | #define STV090x_P2_TMGREG1 STV090x_Px_TMGREG1(2) |
1202 | #define STV090x_OFFST_Px_TMGREG_FIELD 0 | 1200 | #define STV090x_OFFST_Px_TMGREG_FIELD 0 |
1203 | #define STV090x_WIDTH_Px_TMGREG_FIELD 8 | 1201 | #define STV090x_WIDTH_Px_TMGREG_FIELD 8 |
1204 | 1202 | ||
@@ -1230,7 +1228,7 @@ | |||
1230 | #define STV090x_OFFST_Px_MU_EQUALDFE_FIELD 0 | 1228 | #define STV090x_OFFST_Px_MU_EQUALDFE_FIELD 0 |
1231 | #define STV090x_WIDTH_Px_MU_EQUALDFE_FIELD 3 | 1229 | #define STV090x_WIDTH_Px_MU_EQUALDFE_FIELD 3 |
1232 | 1230 | ||
1233 | #define STV090x_Px_EQUAIy(__x, __y) (0xf470 - (__x - 1) * 0x200 + (__y - 1)) | 1231 | #define STV090x_Px_EQUAIy(__x, __y) (0xf470 - (__x-1) * 0x200 + 2 * (__y-1)) |
1234 | #define STV090x_P1_EQUAI1 STV090x_Px_EQUAIy(1, 1) | 1232 | #define STV090x_P1_EQUAI1 STV090x_Px_EQUAIy(1, 1) |
1235 | #define STV090x_P1_EQUAI2 STV090x_Px_EQUAIy(1, 2) | 1233 | #define STV090x_P1_EQUAI2 STV090x_Px_EQUAIy(1, 2) |
1236 | #define STV090x_P1_EQUAI3 STV090x_Px_EQUAIy(1, 3) | 1234 | #define STV090x_P1_EQUAI3 STV090x_Px_EQUAIy(1, 3) |
@@ -1251,7 +1249,7 @@ | |||
1251 | #define STV090x_OFFST_Px_EQUA_ACCIy_FIELD 0 | 1249 | #define STV090x_OFFST_Px_EQUA_ACCIy_FIELD 0 |
1252 | #define STV090x_WIDTH_Px_EQUA_ACCIy_FIELD 8 | 1250 | #define STV090x_WIDTH_Px_EQUA_ACCIy_FIELD 8 |
1253 | 1251 | ||
1254 | #define STV090x_Px_EQUAQy(__x, __y) (0xf471 - (__x - 1) * 0x200 + (__y - 1)) | 1252 | #define STV090x_Px_EQUAQy(__x, __y) (0xf471 - (__x-1) * 0x200 + 2 * (__y-1)) |
1255 | #define STV090x_P1_EQUAQ1 STV090x_Px_EQUAQy(1, 1) | 1253 | #define STV090x_P1_EQUAQ1 STV090x_Px_EQUAQy(1, 1) |
1256 | #define STV090x_P1_EQUAQ2 STV090x_Px_EQUAQy(1, 2) | 1254 | #define STV090x_P1_EQUAQ2 STV090x_Px_EQUAQy(1, 2) |
1257 | #define STV090x_P1_EQUAQ3 STV090x_Px_EQUAQy(1, 3) | 1255 | #define STV090x_P1_EQUAQ3 STV090x_Px_EQUAQy(1, 3) |
@@ -1390,7 +1388,7 @@ | |||
1390 | #define STV090x_OFFST_Px_CAR2S2_16A_ALPH_E_FIELD 0 | 1388 | #define STV090x_OFFST_Px_CAR2S2_16A_ALPH_E_FIELD 0 |
1391 | #define STV090x_WIDTH_Px_CAR2S2_16A_ALPH_E_FIELD 4 | 1389 | #define STV090x_WIDTH_Px_CAR2S2_16A_ALPH_E_FIELD 4 |
1392 | 1390 | ||
1393 | #define STV090x_Px_ACLC2S232A(__x) (0xf499 - (__x - 1) * 0x200) | 1391 | #define STV090x_Px_ACLC2S232A(__x) (0xf49A - (__x - 1) * 0x200) |
1394 | #define STV090x_P1_ACLC2S232A STV090x_Px_ACLC2S232A(1) | 1392 | #define STV090x_P1_ACLC2S232A STV090x_Px_ACLC2S232A(1) |
1395 | #define STV090x_P2_ACLC2S232A STV090x_Px_ACLC2S232A(2) | 1393 | #define STV090x_P2_ACLC2S232A STV090x_Px_ACLC2S232A(2) |
1396 | #define STV090x_OFFST_Px_CAR2S2_32A_ALPH_M_FIELD 4 | 1394 | #define STV090x_OFFST_Px_CAR2S2_32A_ALPH_M_FIELD 4 |
@@ -1414,7 +1412,7 @@ | |||
1414 | #define STV090x_OFFST_Px_CAR2S2_8_BETA_E_FIELD 0 | 1412 | #define STV090x_OFFST_Px_CAR2S2_8_BETA_E_FIELD 0 |
1415 | #define STV090x_WIDTH_Px_CAR2S2_8_BETA_E_FIELD 4 | 1413 | #define STV090x_WIDTH_Px_CAR2S2_8_BETA_E_FIELD 4 |
1416 | 1414 | ||
1417 | #define STV090x_Px_BCLC2S216A(__x) (0xf49d - (__x - 1) * 0x200) | 1415 | #define STV090x_Px_BCLC2S216A(__x) (0xf49e - (__x - 1) * 0x200) |
1418 | #define STV090x_P1_BCLC2S216A STV090x_Px_BCLC2S216A(1) | 1416 | #define STV090x_P1_BCLC2S216A STV090x_Px_BCLC2S216A(1) |
1419 | #define STV090x_P2_BCLC2S216A STV090x_Px_BCLC2S216A(1) | 1417 | #define STV090x_P2_BCLC2S216A STV090x_Px_BCLC2S216A(1) |
1420 | #define STV090x_OFFST_Px_CAR2S2_16A_BETA_M_FIELD 4 | 1418 | #define STV090x_OFFST_Px_CAR2S2_16A_BETA_M_FIELD 4 |
@@ -1422,7 +1420,7 @@ | |||
1422 | #define STV090x_OFFST_Px_CAR2S2_16A_BETA_E_FIELD 0 | 1420 | #define STV090x_OFFST_Px_CAR2S2_16A_BETA_E_FIELD 0 |
1423 | #define STV090x_WIDTH_Px_CAR2S2_16A_BETA_E_FIELD 4 | 1421 | #define STV090x_WIDTH_Px_CAR2S2_16A_BETA_E_FIELD 4 |
1424 | 1422 | ||
1425 | #define STV090x_Px_BCLC2S232A(__x) (0xf49d - (__x - 1) * 0x200) | 1423 | #define STV090x_Px_BCLC2S232A(__x) (0xf49f - (__x - 1) * 0x200) |
1426 | #define STV090x_P1_BCLC2S232A STV090x_Px_BCLC2S232A(1) | 1424 | #define STV090x_P1_BCLC2S232A STV090x_Px_BCLC2S232A(1) |
1427 | #define STV090x_P2_BCLC2S232A STV090x_Px_BCLC2S232A(1) | 1425 | #define STV090x_P2_BCLC2S232A STV090x_Px_BCLC2S232A(1) |
1428 | #define STV090x_OFFST_Px_CAR2S2_32A_BETA_M_FIELD 4 | 1426 | #define STV090x_OFFST_Px_CAR2S2_32A_BETA_M_FIELD 4 |
@@ -1458,7 +1456,7 @@ | |||
1458 | #define STV090x_P1_MODCODLST1 STV090x_Px_MODCODLST1(1) | 1456 | #define STV090x_P1_MODCODLST1 STV090x_Px_MODCODLST1(1) |
1459 | #define STV090x_P2_MODCODLST1 STV090x_Px_MODCODLST1(2) | 1457 | #define STV090x_P2_MODCODLST1 STV090x_Px_MODCODLST1(2) |
1460 | #define STV090x_OFFST_Px_DIS_MODCOD29_FIELD 4 | 1458 | #define STV090x_OFFST_Px_DIS_MODCOD29_FIELD 4 |
1461 | #define STV090x_WIDTH_Px_DIS_MODCOD29T_FIELD 4 | 1459 | #define STV090x_WIDTH_Px_DIS_MODCOD29_FIELD 4 |
1462 | #define STV090x_OFFST_Px_DIS_32PSK_9_10_FIELD 0 | 1460 | #define STV090x_OFFST_Px_DIS_32PSK_9_10_FIELD 0 |
1463 | #define STV090x_WIDTH_Px_DIS_32PSK_9_10_FIELD 4 | 1461 | #define STV090x_WIDTH_Px_DIS_32PSK_9_10_FIELD 4 |
1464 | 1462 | ||
@@ -2180,7 +2178,7 @@ | |||
2180 | #define STV090x_WIDTH_Px_TSFIFOSPEED_STORE_FIELD 1 | 2178 | #define STV090x_WIDTH_Px_TSFIFOSPEED_STORE_FIELD 1 |
2181 | #define STV090x_OFFST_Px_DILXX_RESET_FIELD 5 | 2179 | #define STV090x_OFFST_Px_DILXX_RESET_FIELD 5 |
2182 | #define STV090x_WIDTH_Px_DILXX_RESET_FIELD 1 | 2180 | #define STV090x_WIDTH_Px_DILXX_RESET_FIELD 1 |
2183 | #define STV090x_OFFST_Px_TSSERIAL_IMPOS_FIELD 5 | 2181 | #define STV090x_OFFST_Px_TSSERIAL_IMPOS_FIELD 4 |
2184 | #define STV090x_WIDTH_Px_TSSERIAL_IMPOS_FIELD 1 | 2182 | #define STV090x_WIDTH_Px_TSSERIAL_IMPOS_FIELD 1 |
2185 | #define STV090x_OFFST_Px_SCRAMBDETECT_FIELD 1 | 2183 | #define STV090x_OFFST_Px_SCRAMBDETECT_FIELD 1 |
2186 | #define STV090x_WIDTH_Px_SCRAMBDETECT_FIELD 1 | 2184 | #define STV090x_WIDTH_Px_SCRAMBDETECT_FIELD 1 |
@@ -2190,7 +2188,7 @@ | |||
2190 | #define STV090x_P1_TSBITRATE1 STV090x_Px_TSBITRATEy(1, 1) | 2188 | #define STV090x_P1_TSBITRATE1 STV090x_Px_TSBITRATEy(1, 1) |
2191 | #define STV090x_P2_TSBITRATE0 STV090x_Px_TSBITRATEy(2, 0) | 2189 | #define STV090x_P2_TSBITRATE0 STV090x_Px_TSBITRATEy(2, 0) |
2192 | #define STV090x_P2_TSBITRATE1 STV090x_Px_TSBITRATEy(2, 1) | 2190 | #define STV090x_P2_TSBITRATE1 STV090x_Px_TSBITRATEy(2, 1) |
2193 | #define STV090x_OFFST_Px_TSFIFO_BITRATE_FIELD 7 | 2191 | #define STV090x_OFFST_Px_TSFIFO_BITRATE_FIELD 0 |
2194 | #define STV090x_WIDTH_Px_TSFIFO_BITRATE_FIELD 8 | 2192 | #define STV090x_WIDTH_Px_TSFIFO_BITRATE_FIELD 8 |
2195 | 2193 | ||
2196 | #define STV090x_Px_ERRCTRL1(__x) (0xF598 - (__x - 1) * 0x200) | 2194 | #define STV090x_Px_ERRCTRL1(__x) (0xF598 - (__x - 1) * 0x200) |
diff --git a/drivers/media/dvb/frontends/stv6110.c b/drivers/media/dvb/frontends/stv6110.c index dcf1b21ea974..2dca7c8e5148 100644 --- a/drivers/media/dvb/frontends/stv6110.c +++ b/drivers/media/dvb/frontends/stv6110.c | |||
@@ -22,6 +22,7 @@ | |||
22 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 22 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <linux/slab.h> | ||
25 | #include <linux/module.h> | 26 | #include <linux/module.h> |
26 | #include <linux/dvb/frontend.h> | 27 | #include <linux/dvb/frontend.h> |
27 | 28 | ||
@@ -37,6 +38,7 @@ struct stv6110_priv { | |||
37 | 38 | ||
38 | u32 mclk; | 39 | u32 mclk; |
39 | u8 clk_div; | 40 | u8 clk_div; |
41 | u8 gain; | ||
40 | u8 regs[8]; | 42 | u8 regs[8]; |
41 | }; | 43 | }; |
42 | 44 | ||
@@ -255,7 +257,7 @@ static int stv6110_set_frequency(struct dvb_frontend *fe, u32 frequency) | |||
255 | u8 ret = 0x04; | 257 | u8 ret = 0x04; |
256 | u32 divider, ref, p, presc, i, result_freq, vco_freq; | 258 | u32 divider, ref, p, presc, i, result_freq, vco_freq; |
257 | s32 p_calc, p_calc_opt = 1000, r_div, r_div_opt = 0, p_val; | 259 | s32 p_calc, p_calc_opt = 1000, r_div, r_div_opt = 0, p_val; |
258 | s32 srate; u8 gain; | 260 | s32 srate; |
259 | 261 | ||
260 | dprintk("%s, freq=%d kHz, mclk=%d Hz\n", __func__, | 262 | dprintk("%s, freq=%d kHz, mclk=%d Hz\n", __func__, |
261 | frequency, priv->mclk); | 263 | frequency, priv->mclk); |
@@ -273,15 +275,8 @@ static int stv6110_set_frequency(struct dvb_frontend *fe, u32 frequency) | |||
273 | } else | 275 | } else |
274 | srate = 15000000; | 276 | srate = 15000000; |
275 | 277 | ||
276 | if (srate >= 15000000) | ||
277 | gain = 3; /* +6 dB */ | ||
278 | else if (srate >= 5000000) | ||
279 | gain = 3; /* +6 dB */ | ||
280 | else | ||
281 | gain = 3; /* +6 dB */ | ||
282 | |||
283 | priv->regs[RSTV6110_CTRL2] &= ~0x0f; | 278 | priv->regs[RSTV6110_CTRL2] &= ~0x0f; |
284 | priv->regs[RSTV6110_CTRL2] |= (gain & 0x0f); | 279 | priv->regs[RSTV6110_CTRL2] |= (priv->gain & 0x0f); |
285 | 280 | ||
286 | if (frequency <= 1023000) { | 281 | if (frequency <= 1023000) { |
287 | p = 1; | 282 | p = 1; |
@@ -436,6 +431,7 @@ struct dvb_frontend *stv6110_attach(struct dvb_frontend *fe, | |||
436 | priv->i2c = i2c; | 431 | priv->i2c = i2c; |
437 | priv->mclk = config->mclk; | 432 | priv->mclk = config->mclk; |
438 | priv->clk_div = config->clk_div; | 433 | priv->clk_div = config->clk_div; |
434 | priv->gain = config->gain; | ||
439 | 435 | ||
440 | memcpy(&priv->regs, ®0[1], 8); | 436 | memcpy(&priv->regs, ®0[1], 8); |
441 | 437 | ||
diff --git a/drivers/media/dvb/frontends/stv6110.h b/drivers/media/dvb/frontends/stv6110.h index 9db2402410f6..fe71bba6a26e 100644 --- a/drivers/media/dvb/frontends/stv6110.h +++ b/drivers/media/dvb/frontends/stv6110.h | |||
@@ -41,6 +41,7 @@ | |||
41 | struct stv6110_config { | 41 | struct stv6110_config { |
42 | u8 i2c_address; | 42 | u8 i2c_address; |
43 | u32 mclk; | 43 | u32 mclk; |
44 | u8 gain; | ||
44 | u8 clk_div; /* divisor value for the output clock */ | 45 | u8 clk_div; /* divisor value for the output clock */ |
45 | }; | 46 | }; |
46 | 47 | ||
diff --git a/drivers/media/dvb/frontends/stv6110x.c b/drivers/media/dvb/frontends/stv6110x.c index 3d8a2e01c9c4..dea4245f077c 100644 --- a/drivers/media/dvb/frontends/stv6110x.c +++ b/drivers/media/dvb/frontends/stv6110x.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/slab.h> | ||
26 | #include <linux/string.h> | 27 | #include <linux/string.h> |
27 | 28 | ||
28 | #include "dvb_frontend.h" | 29 | #include "dvb_frontend.h" |
@@ -35,8 +36,6 @@ static unsigned int verbose; | |||
35 | module_param(verbose, int, 0644); | 36 | module_param(verbose, int, 0644); |
36 | MODULE_PARM_DESC(verbose, "Set Verbosity level"); | 37 | MODULE_PARM_DESC(verbose, "Set Verbosity level"); |
37 | 38 | ||
38 | static u8 stv6110x_regs[] = {0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e}; | ||
39 | |||
40 | static int stv6110x_read_reg(struct stv6110x_state *stv6110x, u8 reg, u8 *data) | 39 | static int stv6110x_read_reg(struct stv6110x_state *stv6110x, u8 reg, u8 *data) |
41 | { | 40 | { |
42 | int ret; | 41 | int ret; |
@@ -58,12 +57,23 @@ static int stv6110x_read_reg(struct stv6110x_state *stv6110x, u8 reg, u8 *data) | |||
58 | return 0; | 57 | return 0; |
59 | } | 58 | } |
60 | 59 | ||
61 | static int stv6110x_write_reg(struct stv6110x_state *stv6110x, u8 reg, u8 data) | 60 | static int stv6110x_write_regs(struct stv6110x_state *stv6110x, int start, u8 data[], int len) |
62 | { | 61 | { |
63 | int ret; | 62 | int ret; |
64 | const struct stv6110x_config *config = stv6110x->config; | 63 | const struct stv6110x_config *config = stv6110x->config; |
65 | u8 buf[] = { reg, data }; | 64 | u8 buf[len + 1]; |
66 | struct i2c_msg msg = { .addr = config->addr, .flags = 0, . buf = buf, .len = 2 }; | 65 | struct i2c_msg msg = { |
66 | .addr = config->addr, | ||
67 | .flags = 0, | ||
68 | .buf = buf, | ||
69 | .len = len + 1 | ||
70 | }; | ||
71 | |||
72 | if (start + len > 8) | ||
73 | return -EINVAL; | ||
74 | |||
75 | buf[0] = start; | ||
76 | memcpy(&buf[1], data, len); | ||
67 | 77 | ||
68 | ret = i2c_transfer(stv6110x->i2c, &msg, 1); | 78 | ret = i2c_transfer(stv6110x->i2c, &msg, 1); |
69 | if (ret != 1) { | 79 | if (ret != 1) { |
@@ -74,18 +84,21 @@ static int stv6110x_write_reg(struct stv6110x_state *stv6110x, u8 reg, u8 data) | |||
74 | return 0; | 84 | return 0; |
75 | } | 85 | } |
76 | 86 | ||
87 | static int stv6110x_write_reg(struct stv6110x_state *stv6110x, u8 reg, u8 data) | ||
88 | { | ||
89 | return stv6110x_write_regs(stv6110x, reg, &data, 1); | ||
90 | } | ||
91 | |||
77 | static int stv6110x_init(struct dvb_frontend *fe) | 92 | static int stv6110x_init(struct dvb_frontend *fe) |
78 | { | 93 | { |
79 | struct stv6110x_state *stv6110x = fe->tuner_priv; | 94 | struct stv6110x_state *stv6110x = fe->tuner_priv; |
80 | int ret; | 95 | int ret; |
81 | u8 i; | ||
82 | 96 | ||
83 | for (i = 0; i < ARRAY_SIZE(stv6110x_regs); i++) { | 97 | ret = stv6110x_write_regs(stv6110x, 0, stv6110x->regs, |
84 | ret = stv6110x_write_reg(stv6110x, i, stv6110x_regs[i]); | 98 | ARRAY_SIZE(stv6110x->regs)); |
85 | if (ret < 0) { | 99 | if (ret < 0) { |
86 | dprintk(FE_ERROR, 1, "Initialization failed"); | 100 | dprintk(FE_ERROR, 1, "Initialization failed"); |
87 | return -1; | 101 | return -1; |
88 | } | ||
89 | } | 102 | } |
90 | 103 | ||
91 | return 0; | 104 | return 0; |
@@ -95,54 +108,56 @@ static int stv6110x_set_frequency(struct dvb_frontend *fe, u32 frequency) | |||
95 | { | 108 | { |
96 | struct stv6110x_state *stv6110x = fe->tuner_priv; | 109 | struct stv6110x_state *stv6110x = fe->tuner_priv; |
97 | u32 rDiv, divider; | 110 | u32 rDiv, divider; |
98 | s32 pVal, pCalc, rDivOpt = 0; | 111 | s32 pVal, pCalc, rDivOpt = 0, pCalcOpt = 1000; |
99 | u8 i; | 112 | u8 i; |
100 | 113 | ||
101 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_K, (REFCLOCK_MHz - 16)); | 114 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_K, (REFCLOCK_MHz - 16)); |
102 | 115 | ||
103 | if (frequency <= 1023000) { | 116 | if (frequency <= 1023000) { |
104 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); | 117 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); |
105 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); | 118 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); |
106 | pVal = 40; | 119 | pVal = 40; |
107 | } else if (frequency <= 1300000) { | 120 | } else if (frequency <= 1300000) { |
108 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); | 121 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); |
109 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); | 122 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); |
110 | pVal = 40; | 123 | pVal = 40; |
111 | } else if (frequency <= 2046000) { | 124 | } else if (frequency <= 2046000) { |
112 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); | 125 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); |
113 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); | 126 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); |
114 | pVal = 20; | 127 | pVal = 20; |
115 | } else { | 128 | } else { |
116 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); | 129 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); |
117 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); | 130 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); |
118 | pVal = 20; | 131 | pVal = 20; |
119 | } | 132 | } |
120 | 133 | ||
121 | for (rDiv = 0; rDiv <= 3; rDiv++) { | 134 | for (rDiv = 0; rDiv <= 3; rDiv++) { |
122 | pCalc = (REFCLOCK_kHz / 100) / R_DIV(rDiv); | 135 | pCalc = (REFCLOCK_kHz / 100) / R_DIV(rDiv); |
123 | 136 | ||
124 | if ((abs((s32)(pCalc - pVal))) < (abs((s32)(1000 - pVal)))) | 137 | if ((abs((s32)(pCalc - pVal))) < (abs((s32)(pCalcOpt - pVal)))) |
125 | rDivOpt = rDiv; | 138 | rDivOpt = rDiv; |
139 | |||
140 | pCalcOpt = (REFCLOCK_kHz / 100) / R_DIV(rDivOpt); | ||
126 | } | 141 | } |
127 | 142 | ||
128 | divider = (frequency * R_DIV(rDivOpt) * pVal) / REFCLOCK_kHz; | 143 | divider = (frequency * R_DIV(rDivOpt) * pVal) / REFCLOCK_kHz; |
129 | divider = (divider + 5) / 10; | 144 | divider = (divider + 5) / 10; |
130 | 145 | ||
131 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_R_DIV, rDivOpt); | 146 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_R_DIV, rDivOpt); |
132 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_N_DIV_11_8, MSB(divider)); | 147 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_N_DIV_11_8, MSB(divider)); |
133 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG0], TNG0_N_DIV_7_0, LSB(divider)); | 148 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG0], TNG0_N_DIV_7_0, LSB(divider)); |
134 | 149 | ||
135 | /* VCO Auto calibration */ | 150 | /* VCO Auto calibration */ |
136 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_STAT1], STAT1_CALVCO_STRT, 1); | 151 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_STAT1], STAT1_CALVCO_STRT, 1); |
137 | 152 | ||
138 | stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x_regs[STV6110x_CTRL1]); | 153 | stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x->regs[STV6110x_CTRL1]); |
139 | stv6110x_write_reg(stv6110x, STV6110x_TNG1, stv6110x_regs[STV6110x_TNG1]); | 154 | stv6110x_write_reg(stv6110x, STV6110x_TNG1, stv6110x->regs[STV6110x_TNG1]); |
140 | stv6110x_write_reg(stv6110x, STV6110x_TNG0, stv6110x_regs[STV6110x_TNG0]); | 155 | stv6110x_write_reg(stv6110x, STV6110x_TNG0, stv6110x->regs[STV6110x_TNG0]); |
141 | stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x_regs[STV6110x_STAT1]); | 156 | stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x->regs[STV6110x_STAT1]); |
142 | 157 | ||
143 | for (i = 0; i < TRIALS; i++) { | 158 | for (i = 0; i < TRIALS; i++) { |
144 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); | 159 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x->regs[STV6110x_STAT1]); |
145 | if (!STV6110x_GETFIELD(STAT1_CALVCO_STRT, stv6110x_regs[STV6110x_STAT1])) | 160 | if (!STV6110x_GETFIELD(STAT1_CALVCO_STRT, stv6110x->regs[STV6110x_STAT1])) |
146 | break; | 161 | break; |
147 | msleep(1); | 162 | msleep(1); |
148 | } | 163 | } |
@@ -154,14 +169,14 @@ static int stv6110x_get_frequency(struct dvb_frontend *fe, u32 *frequency) | |||
154 | { | 169 | { |
155 | struct stv6110x_state *stv6110x = fe->tuner_priv; | 170 | struct stv6110x_state *stv6110x = fe->tuner_priv; |
156 | 171 | ||
157 | stv6110x_read_reg(stv6110x, STV6110x_TNG1, &stv6110x_regs[STV6110x_TNG1]); | 172 | stv6110x_read_reg(stv6110x, STV6110x_TNG1, &stv6110x->regs[STV6110x_TNG1]); |
158 | stv6110x_read_reg(stv6110x, STV6110x_TNG0, &stv6110x_regs[STV6110x_TNG0]); | 173 | stv6110x_read_reg(stv6110x, STV6110x_TNG0, &stv6110x->regs[STV6110x_TNG0]); |
159 | 174 | ||
160 | *frequency = (MAKEWORD16(STV6110x_GETFIELD(TNG1_N_DIV_11_8, stv6110x_regs[STV6110x_TNG1]), | 175 | *frequency = (MAKEWORD16(STV6110x_GETFIELD(TNG1_N_DIV_11_8, stv6110x->regs[STV6110x_TNG1]), |
161 | STV6110x_GETFIELD(TNG0_N_DIV_7_0, stv6110x_regs[STV6110x_TNG0]))) * REFCLOCK_kHz; | 176 | STV6110x_GETFIELD(TNG0_N_DIV_7_0, stv6110x->regs[STV6110x_TNG0]))) * REFCLOCK_kHz; |
162 | 177 | ||
163 | *frequency /= (1 << (STV6110x_GETFIELD(TNG1_R_DIV, stv6110x_regs[STV6110x_TNG1]) + | 178 | *frequency /= (1 << (STV6110x_GETFIELD(TNG1_R_DIV, stv6110x->regs[STV6110x_TNG1]) + |
164 | STV6110x_GETFIELD(TNG1_DIV4SEL, stv6110x_regs[STV6110x_TNG1]))); | 179 | STV6110x_GETFIELD(TNG1_DIV4SEL, stv6110x->regs[STV6110x_TNG1]))); |
165 | 180 | ||
166 | *frequency >>= 2; | 181 | *frequency >>= 2; |
167 | 182 | ||
@@ -177,27 +192,27 @@ static int stv6110x_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth) | |||
177 | halfbw = bandwidth >> 1; | 192 | halfbw = bandwidth >> 1; |
178 | 193 | ||
179 | if (halfbw > 36000000) | 194 | if (halfbw > 36000000) |
180 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, 31); /* LPF */ | 195 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_CF, 31); /* LPF */ |
181 | else if (halfbw < 5000000) | 196 | else if (halfbw < 5000000) |
182 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, 0); /* LPF */ | 197 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_CF, 0); /* LPF */ |
183 | else | 198 | else |
184 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, ((halfbw / 1000000) - 5)); /* LPF */ | 199 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_CF, ((halfbw / 1000000) - 5)); /* LPF */ |
185 | 200 | ||
186 | 201 | ||
187 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x0); /* cal. clk activated */ | 202 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x0); /* cal. clk activated */ |
188 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_STAT1], STAT1_CALRC_STRT, 0x1); /* LPF auto cal */ | 203 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_STAT1], STAT1_CALRC_STRT, 0x1); /* LPF auto cal */ |
189 | 204 | ||
190 | stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x_regs[STV6110x_CTRL3]); | 205 | stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x->regs[STV6110x_CTRL3]); |
191 | stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x_regs[STV6110x_STAT1]); | 206 | stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x->regs[STV6110x_STAT1]); |
192 | 207 | ||
193 | for (i = 0; i < TRIALS; i++) { | 208 | for (i = 0; i < TRIALS; i++) { |
194 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); | 209 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x->regs[STV6110x_STAT1]); |
195 | if (!STV6110x_GETFIELD(STAT1_CALRC_STRT, stv6110x_regs[STV6110x_STAT1])) | 210 | if (!STV6110x_GETFIELD(STAT1_CALRC_STRT, stv6110x->regs[STV6110x_STAT1])) |
196 | break; | 211 | break; |
197 | msleep(1); | 212 | msleep(1); |
198 | } | 213 | } |
199 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x1); /* cal. done */ | 214 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x1); /* cal. done */ |
200 | stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x_regs[STV6110x_CTRL3]); | 215 | stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x->regs[STV6110x_CTRL3]); |
201 | 216 | ||
202 | return 0; | 217 | return 0; |
203 | } | 218 | } |
@@ -206,8 +221,8 @@ static int stv6110x_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) | |||
206 | { | 221 | { |
207 | struct stv6110x_state *stv6110x = fe->tuner_priv; | 222 | struct stv6110x_state *stv6110x = fe->tuner_priv; |
208 | 223 | ||
209 | stv6110x_read_reg(stv6110x, STV6110x_CTRL3, &stv6110x_regs[STV6110x_CTRL3]); | 224 | stv6110x_read_reg(stv6110x, STV6110x_CTRL3, &stv6110x->regs[STV6110x_CTRL3]); |
210 | *bandwidth = (STV6110x_GETFIELD(CTRL3_CF, stv6110x_regs[STV6110x_CTRL3]) + 5) * 2000000; | 225 | *bandwidth = (STV6110x_GETFIELD(CTRL3_CF, stv6110x->regs[STV6110x_CTRL3]) + 5) * 2000000; |
211 | 226 | ||
212 | return 0; | 227 | return 0; |
213 | } | 228 | } |
@@ -220,20 +235,20 @@ static int stv6110x_set_refclock(struct dvb_frontend *fe, u32 refclock) | |||
220 | switch (refclock) { | 235 | switch (refclock) { |
221 | default: | 236 | default: |
222 | case 1: | 237 | case 1: |
223 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0); | 238 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0); |
224 | break; | 239 | break; |
225 | case 2: | 240 | case 2: |
226 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1); | 241 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1); |
227 | break; | 242 | break; |
228 | case 4: | 243 | case 4: |
229 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2); | 244 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2); |
230 | break; | 245 | break; |
231 | case 8: | 246 | case 8: |
232 | case 0: | 247 | case 0: |
233 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3); | 248 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3); |
234 | break; | 249 | break; |
235 | } | 250 | } |
236 | stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x_regs[STV6110x_CTRL2]); | 251 | stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x->regs[STV6110x_CTRL2]); |
237 | 252 | ||
238 | return 0; | 253 | return 0; |
239 | } | 254 | } |
@@ -242,8 +257,8 @@ static int stv6110x_get_bbgain(struct dvb_frontend *fe, u32 *gain) | |||
242 | { | 257 | { |
243 | struct stv6110x_state *stv6110x = fe->tuner_priv; | 258 | struct stv6110x_state *stv6110x = fe->tuner_priv; |
244 | 259 | ||
245 | stv6110x_read_reg(stv6110x, STV6110x_CTRL2, &stv6110x_regs[STV6110x_CTRL2]); | 260 | stv6110x_read_reg(stv6110x, STV6110x_CTRL2, &stv6110x->regs[STV6110x_CTRL2]); |
246 | *gain = 2 * STV6110x_GETFIELD(CTRL2_BBGAIN, stv6110x_regs[STV6110x_CTRL2]); | 261 | *gain = 2 * STV6110x_GETFIELD(CTRL2_BBGAIN, stv6110x->regs[STV6110x_CTRL2]); |
247 | 262 | ||
248 | return 0; | 263 | return 0; |
249 | } | 264 | } |
@@ -252,8 +267,8 @@ static int stv6110x_set_bbgain(struct dvb_frontend *fe, u32 gain) | |||
252 | { | 267 | { |
253 | struct stv6110x_state *stv6110x = fe->tuner_priv; | 268 | struct stv6110x_state *stv6110x = fe->tuner_priv; |
254 | 269 | ||
255 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_BBGAIN, gain / 2); | 270 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_BBGAIN, gain / 2); |
256 | stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x_regs[STV6110x_CTRL2]); | 271 | stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x->regs[STV6110x_CTRL2]); |
257 | 272 | ||
258 | return 0; | 273 | return 0; |
259 | } | 274 | } |
@@ -265,19 +280,19 @@ static int stv6110x_set_mode(struct dvb_frontend *fe, enum tuner_mode mode) | |||
265 | 280 | ||
266 | switch (mode) { | 281 | switch (mode) { |
267 | case TUNER_SLEEP: | 282 | case TUNER_SLEEP: |
268 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_SYN, 0); | 283 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_SYN, 0); |
269 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_RX, 0); | 284 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_RX, 0); |
270 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_LPT, 0); | 285 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_LPT, 0); |
271 | break; | 286 | break; |
272 | 287 | ||
273 | case TUNER_WAKE: | 288 | case TUNER_WAKE: |
274 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_SYN, 1); | 289 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_SYN, 1); |
275 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_RX, 1); | 290 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_RX, 1); |
276 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_LPT, 1); | 291 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_LPT, 1); |
277 | break; | 292 | break; |
278 | } | 293 | } |
279 | 294 | ||
280 | ret = stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x_regs[STV6110x_CTRL1]); | 295 | ret = stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x->regs[STV6110x_CTRL1]); |
281 | if (ret < 0) { | 296 | if (ret < 0) { |
282 | dprintk(FE_ERROR, 1, "I/O Error"); | 297 | dprintk(FE_ERROR, 1, "I/O Error"); |
283 | return -EIO; | 298 | return -EIO; |
@@ -295,9 +310,9 @@ static int stv6110x_get_status(struct dvb_frontend *fe, u32 *status) | |||
295 | { | 310 | { |
296 | struct stv6110x_state *stv6110x = fe->tuner_priv; | 311 | struct stv6110x_state *stv6110x = fe->tuner_priv; |
297 | 312 | ||
298 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); | 313 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x->regs[STV6110x_STAT1]); |
299 | 314 | ||
300 | if (STV6110x_GETFIELD(STAT1_LOCK, stv6110x_regs[STV6110x_STAT1])) | 315 | if (STV6110x_GETFIELD(STAT1_LOCK, stv6110x->regs[STV6110x_STAT1])) |
301 | *status = TUNER_PHASELOCKED; | 316 | *status = TUNER_PHASELOCKED; |
302 | else | 317 | else |
303 | *status = 0; | 318 | *status = 0; |
@@ -347,6 +362,8 @@ struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe, | |||
347 | struct i2c_adapter *i2c) | 362 | struct i2c_adapter *i2c) |
348 | { | 363 | { |
349 | struct stv6110x_state *stv6110x; | 364 | struct stv6110x_state *stv6110x; |
365 | u8 default_regs[] = {0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e}; | ||
366 | int ret; | ||
350 | 367 | ||
351 | stv6110x = kzalloc(sizeof (struct stv6110x_state), GFP_KERNEL); | 368 | stv6110x = kzalloc(sizeof (struct stv6110x_state), GFP_KERNEL); |
352 | if (stv6110x == NULL) | 369 | if (stv6110x == NULL) |
@@ -355,6 +372,44 @@ struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe, | |||
355 | stv6110x->i2c = i2c; | 372 | stv6110x->i2c = i2c; |
356 | stv6110x->config = config; | 373 | stv6110x->config = config; |
357 | stv6110x->devctl = &stv6110x_ctl; | 374 | stv6110x->devctl = &stv6110x_ctl; |
375 | memcpy(stv6110x->regs, default_regs, 8); | ||
376 | |||
377 | /* setup divider */ | ||
378 | switch (stv6110x->config->clk_div) { | ||
379 | default: | ||
380 | case 1: | ||
381 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0); | ||
382 | break; | ||
383 | case 2: | ||
384 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1); | ||
385 | break; | ||
386 | case 4: | ||
387 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2); | ||
388 | break; | ||
389 | case 8: | ||
390 | case 0: | ||
391 | STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3); | ||
392 | break; | ||
393 | } | ||
394 | |||
395 | if (fe->ops.i2c_gate_ctrl) { | ||
396 | ret = fe->ops.i2c_gate_ctrl(fe, 1); | ||
397 | if (ret < 0) | ||
398 | goto error; | ||
399 | } | ||
400 | |||
401 | ret = stv6110x_write_regs(stv6110x, 0, stv6110x->regs, | ||
402 | ARRAY_SIZE(stv6110x->regs)); | ||
403 | if (ret < 0) { | ||
404 | dprintk(FE_ERROR, 1, "Initialization failed"); | ||
405 | goto error; | ||
406 | } | ||
407 | |||
408 | if (fe->ops.i2c_gate_ctrl) { | ||
409 | ret = fe->ops.i2c_gate_ctrl(fe, 0); | ||
410 | if (ret < 0) | ||
411 | goto error; | ||
412 | } | ||
358 | 413 | ||
359 | fe->tuner_priv = stv6110x; | 414 | fe->tuner_priv = stv6110x; |
360 | fe->ops.tuner_ops = stv6110x_ops; | 415 | fe->ops.tuner_ops = stv6110x_ops; |
diff --git a/drivers/media/dvb/frontends/stv6110x.h b/drivers/media/dvb/frontends/stv6110x.h index a38257080e01..2429ae6d7847 100644 --- a/drivers/media/dvb/frontends/stv6110x.h +++ b/drivers/media/dvb/frontends/stv6110x.h | |||
@@ -26,6 +26,7 @@ | |||
26 | struct stv6110x_config { | 26 | struct stv6110x_config { |
27 | u8 addr; | 27 | u8 addr; |
28 | u32 refclk; | 28 | u32 refclk; |
29 | u8 clk_div; /* divisor value for the output clock */ | ||
29 | }; | 30 | }; |
30 | 31 | ||
31 | enum tuner_mode { | 32 | enum tuner_mode { |
diff --git a/drivers/media/dvb/frontends/stv6110x_priv.h b/drivers/media/dvb/frontends/stv6110x_priv.h index 7260da633d49..0ec936a660a7 100644 --- a/drivers/media/dvb/frontends/stv6110x_priv.h +++ b/drivers/media/dvb/frontends/stv6110x_priv.h | |||
@@ -68,6 +68,7 @@ | |||
68 | struct stv6110x_state { | 68 | struct stv6110x_state { |
69 | struct i2c_adapter *i2c; | 69 | struct i2c_adapter *i2c; |
70 | const struct stv6110x_config *config; | 70 | const struct stv6110x_config *config; |
71 | u8 regs[8]; | ||
71 | 72 | ||
72 | struct stv6110x_devctl *devctl; | 73 | struct stv6110x_devctl *devctl; |
73 | }; | 74 | }; |
diff --git a/drivers/media/dvb/frontends/tda10021.c b/drivers/media/dvb/frontends/tda10021.c index 6c1dbf9288d8..6ca533ea0f0e 100644 --- a/drivers/media/dvb/frontends/tda10021.c +++ b/drivers/media/dvb/frontends/tda10021.c | |||
@@ -426,6 +426,10 @@ struct dvb_frontend* tda10021_attach(const struct tda1002x_config* config, | |||
426 | id = tda10021_readreg(state, 0x1a); | 426 | id = tda10021_readreg(state, 0x1a); |
427 | if ((id & 0xf0) != 0x70) goto error; | 427 | if ((id & 0xf0) != 0x70) goto error; |
428 | 428 | ||
429 | /* Don't claim TDA10023 */ | ||
430 | if (id == 0x7d) | ||
431 | goto error; | ||
432 | |||
429 | printk("TDA10021: i2c-addr = 0x%02x, id = 0x%02x\n", | 433 | printk("TDA10021: i2c-addr = 0x%02x, id = 0x%02x\n", |
430 | state->config->demod_address, id); | 434 | state->config->demod_address, id); |
431 | 435 | ||
diff --git a/drivers/media/dvb/frontends/tda665x.c b/drivers/media/dvb/frontends/tda665x.c new file mode 100644 index 000000000000..2c1c759a4f42 --- /dev/null +++ b/drivers/media/dvb/frontends/tda665x.c | |||
@@ -0,0 +1,258 @@ | |||
1 | /* | ||
2 | TDA665x tuner driver | ||
3 | Copyright (C) Manu Abraham (abraham.manu@gmail.com) | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 2 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | ||
19 | |||
20 | #include <linux/init.h> | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/slab.h> | ||
24 | |||
25 | #include "dvb_frontend.h" | ||
26 | #include "tda665x.h" | ||
27 | |||
28 | struct tda665x_state { | ||
29 | struct dvb_frontend *fe; | ||
30 | struct i2c_adapter *i2c; | ||
31 | const struct tda665x_config *config; | ||
32 | |||
33 | u32 frequency; | ||
34 | u32 bandwidth; | ||
35 | }; | ||
36 | |||
37 | static int tda665x_read(struct tda665x_state *state, u8 *buf) | ||
38 | { | ||
39 | const struct tda665x_config *config = state->config; | ||
40 | int err = 0; | ||
41 | struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD, .buf = buf, .len = 2 }; | ||
42 | |||
43 | err = i2c_transfer(state->i2c, &msg, 1); | ||
44 | if (err != 1) | ||
45 | goto exit; | ||
46 | |||
47 | return err; | ||
48 | exit: | ||
49 | printk(KERN_ERR "%s: I/O Error err=<%d>\n", __func__, err); | ||
50 | return err; | ||
51 | } | ||
52 | |||
53 | static int tda665x_write(struct tda665x_state *state, u8 *buf, u8 length) | ||
54 | { | ||
55 | const struct tda665x_config *config = state->config; | ||
56 | int err = 0; | ||
57 | struct i2c_msg msg = { .addr = config->addr, .flags = 0, .buf = buf, .len = length }; | ||
58 | |||
59 | err = i2c_transfer(state->i2c, &msg, 1); | ||
60 | if (err != 1) | ||
61 | goto exit; | ||
62 | |||
63 | return err; | ||
64 | exit: | ||
65 | printk(KERN_ERR "%s: I/O Error err=<%d>\n", __func__, err); | ||
66 | return err; | ||
67 | } | ||
68 | |||
69 | static int tda665x_get_state(struct dvb_frontend *fe, | ||
70 | enum tuner_param param, | ||
71 | struct tuner_state *tstate) | ||
72 | { | ||
73 | struct tda665x_state *state = fe->tuner_priv; | ||
74 | int err = 0; | ||
75 | |||
76 | switch (param) { | ||
77 | case DVBFE_TUNER_FREQUENCY: | ||
78 | tstate->frequency = state->frequency; | ||
79 | break; | ||
80 | case DVBFE_TUNER_BANDWIDTH: | ||
81 | break; | ||
82 | default: | ||
83 | printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param); | ||
84 | err = -EINVAL; | ||
85 | break; | ||
86 | } | ||
87 | |||
88 | return err; | ||
89 | } | ||
90 | |||
91 | static int tda665x_get_status(struct dvb_frontend *fe, u32 *status) | ||
92 | { | ||
93 | struct tda665x_state *state = fe->tuner_priv; | ||
94 | u8 result = 0; | ||
95 | int err = 0; | ||
96 | |||
97 | *status = 0; | ||
98 | |||
99 | err = tda665x_read(state, &result); | ||
100 | if (err < 0) | ||
101 | goto exit; | ||
102 | |||
103 | if ((result >> 6) & 0x01) { | ||
104 | printk(KERN_DEBUG "%s: Tuner Phase Locked\n", __func__); | ||
105 | *status = 1; | ||
106 | } | ||
107 | |||
108 | return err; | ||
109 | exit: | ||
110 | printk(KERN_ERR "%s: I/O Error\n", __func__); | ||
111 | return err; | ||
112 | } | ||
113 | |||
114 | static int tda665x_set_state(struct dvb_frontend *fe, | ||
115 | enum tuner_param param, | ||
116 | struct tuner_state *tstate) | ||
117 | { | ||
118 | struct tda665x_state *state = fe->tuner_priv; | ||
119 | const struct tda665x_config *config = state->config; | ||
120 | u32 frequency, status = 0; | ||
121 | u8 buf[4]; | ||
122 | int err = 0; | ||
123 | |||
124 | if (param & DVBFE_TUNER_FREQUENCY) { | ||
125 | |||
126 | frequency = tstate->frequency; | ||
127 | if ((frequency < config->frequency_max) || (frequency > config->frequency_min)) { | ||
128 | printk(KERN_ERR "%s: Frequency beyond limits, frequency=%d\n", __func__, frequency); | ||
129 | return -EINVAL; | ||
130 | } | ||
131 | |||
132 | frequency += config->frequency_offst; | ||
133 | frequency *= config->ref_multiplier; | ||
134 | frequency += config->ref_divider >> 1; | ||
135 | frequency /= config->ref_divider; | ||
136 | |||
137 | buf[0] = (u8) ((frequency & 0x7f00) >> 8); | ||
138 | buf[1] = (u8) (frequency & 0x00ff) >> 0; | ||
139 | buf[2] = 0x80 | 0x40 | 0x02; | ||
140 | buf[3] = 0x00; | ||
141 | |||
142 | /* restore frequency */ | ||
143 | frequency = tstate->frequency; | ||
144 | |||
145 | if (frequency < 153000000) { | ||
146 | /* VHF-L */ | ||
147 | buf[3] |= 0x01; /* fc, Low Band, 47 - 153 MHz */ | ||
148 | if (frequency < 68000000) | ||
149 | buf[3] |= 0x40; /* 83uA */ | ||
150 | if (frequency < 1040000000) | ||
151 | buf[3] |= 0x60; /* 122uA */ | ||
152 | if (frequency < 1250000000) | ||
153 | buf[3] |= 0x80; /* 163uA */ | ||
154 | else | ||
155 | buf[3] |= 0xa0; /* 254uA */ | ||
156 | } else if (frequency < 438000000) { | ||
157 | /* VHF-H */ | ||
158 | buf[3] |= 0x02; /* fc, Mid Band, 153 - 438 MHz */ | ||
159 | if (frequency < 230000000) | ||
160 | buf[3] |= 0x40; | ||
161 | if (frequency < 300000000) | ||
162 | buf[3] |= 0x60; | ||
163 | else | ||
164 | buf[3] |= 0x80; | ||
165 | } else { | ||
166 | /* UHF */ | ||
167 | buf[3] |= 0x04; /* fc, High Band, 438 - 862 MHz */ | ||
168 | if (frequency < 470000000) | ||
169 | buf[3] |= 0x60; | ||
170 | if (frequency < 526000000) | ||
171 | buf[3] |= 0x80; | ||
172 | else | ||
173 | buf[3] |= 0xa0; | ||
174 | } | ||
175 | |||
176 | /* Set params */ | ||
177 | err = tda665x_write(state, buf, 5); | ||
178 | if (err < 0) | ||
179 | goto exit; | ||
180 | |||
181 | /* sleep for some time */ | ||
182 | printk(KERN_DEBUG "%s: Waiting to Phase LOCK\n", __func__); | ||
183 | msleep(20); | ||
184 | /* check status */ | ||
185 | err = tda665x_get_status(fe, &status); | ||
186 | if (err < 0) | ||
187 | goto exit; | ||
188 | |||
189 | if (status == 1) { | ||
190 | printk(KERN_DEBUG "%s: Tuner Phase locked: status=%d\n", __func__, status); | ||
191 | state->frequency = frequency; /* cache successful state */ | ||
192 | } else { | ||
193 | printk(KERN_ERR "%s: No Phase lock: status=%d\n", __func__, status); | ||
194 | } | ||
195 | } else { | ||
196 | printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param); | ||
197 | return -EINVAL; | ||
198 | } | ||
199 | |||
200 | return 0; | ||
201 | exit: | ||
202 | printk(KERN_ERR "%s: I/O Error\n", __func__); | ||
203 | return err; | ||
204 | } | ||
205 | |||
206 | static int tda665x_release(struct dvb_frontend *fe) | ||
207 | { | ||
208 | struct tda665x_state *state = fe->tuner_priv; | ||
209 | |||
210 | fe->tuner_priv = NULL; | ||
211 | kfree(state); | ||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | static struct dvb_tuner_ops tda665x_ops = { | ||
216 | |||
217 | .set_state = tda665x_set_state, | ||
218 | .get_state = tda665x_get_state, | ||
219 | .get_status = tda665x_get_status, | ||
220 | .release = tda665x_release | ||
221 | }; | ||
222 | |||
223 | struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe, | ||
224 | const struct tda665x_config *config, | ||
225 | struct i2c_adapter *i2c) | ||
226 | { | ||
227 | struct tda665x_state *state = NULL; | ||
228 | struct dvb_tuner_info *info; | ||
229 | |||
230 | state = kzalloc(sizeof(struct tda665x_state), GFP_KERNEL); | ||
231 | if (state == NULL) | ||
232 | goto exit; | ||
233 | |||
234 | state->config = config; | ||
235 | state->i2c = i2c; | ||
236 | state->fe = fe; | ||
237 | fe->tuner_priv = state; | ||
238 | fe->ops.tuner_ops = tda665x_ops; | ||
239 | info = &fe->ops.tuner_ops.info; | ||
240 | |||
241 | memcpy(info->name, config->name, sizeof(config->name)); | ||
242 | info->frequency_min = config->frequency_min; | ||
243 | info->frequency_max = config->frequency_max; | ||
244 | info->frequency_step = config->frequency_offst; | ||
245 | |||
246 | printk(KERN_DEBUG "%s: Attaching TDA665x (%s) tuner\n", __func__, info->name); | ||
247 | |||
248 | return fe; | ||
249 | |||
250 | exit: | ||
251 | kfree(state); | ||
252 | return NULL; | ||
253 | } | ||
254 | EXPORT_SYMBOL(tda665x_attach); | ||
255 | |||
256 | MODULE_DESCRIPTION("TDA665x driver"); | ||
257 | MODULE_AUTHOR("Manu Abraham"); | ||
258 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/tda665x.h b/drivers/media/dvb/frontends/tda665x.h new file mode 100644 index 000000000000..ec7927aa75ae --- /dev/null +++ b/drivers/media/dvb/frontends/tda665x.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | TDA665x tuner driver | ||
3 | Copyright (C) Manu Abraham (abraham.manu@gmail.com) | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 2 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | ||
19 | |||
20 | #ifndef __TDA665x_H | ||
21 | #define __TDA665x_H | ||
22 | |||
23 | struct tda665x_config { | ||
24 | char name[128]; | ||
25 | |||
26 | u8 addr; | ||
27 | u32 frequency_min; | ||
28 | u32 frequency_max; | ||
29 | u32 frequency_offst; | ||
30 | u32 ref_multiplier; | ||
31 | u32 ref_divider; | ||
32 | }; | ||
33 | |||
34 | #if defined(CONFIG_DVB_TDA665x) || (defined(CONFIG_DVB_TDA665x_MODULE) && defined(MODULE)) | ||
35 | |||
36 | extern struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe, | ||
37 | const struct tda665x_config *config, | ||
38 | struct i2c_adapter *i2c); | ||
39 | |||
40 | #else | ||
41 | |||
42 | static inline struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe, | ||
43 | const struct tda665x_config *config, | ||
44 | struct i2c_adapter *i2c) | ||
45 | { | ||
46 | printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__); | ||
47 | return NULL; | ||
48 | } | ||
49 | |||
50 | #endif /* CONFIG_DVB_TDA665x */ | ||
51 | |||
52 | #endif /* __TDA665x_H */ | ||
diff --git a/drivers/media/dvb/frontends/tda8261.c b/drivers/media/dvb/frontends/tda8261.c index 320c3c36d8b2..1742056a34e8 100644 --- a/drivers/media/dvb/frontends/tda8261.c +++ b/drivers/media/dvb/frontends/tda8261.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/slab.h> | ||
24 | 25 | ||
25 | #include "dvb_frontend.h" | 26 | #include "dvb_frontend.h" |
26 | #include "tda8261.h" | 27 | #include "tda8261.h" |
@@ -39,7 +40,7 @@ static int tda8261_read(struct tda8261_state *state, u8 *buf) | |||
39 | { | 40 | { |
40 | const struct tda8261_config *config = state->config; | 41 | const struct tda8261_config *config = state->config; |
41 | int err = 0; | 42 | int err = 0; |
42 | struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD,.buf = buf, .len = 2 }; | 43 | struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD,.buf = buf, .len = 1 }; |
43 | 44 | ||
44 | if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) | 45 | if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) |
45 | printk("%s: read error, err=%d\n", __func__, err); | 46 | printk("%s: read error, err=%d\n", __func__, err); |
diff --git a/drivers/media/dvb/frontends/tda826x.c b/drivers/media/dvb/frontends/tda826x.c index a051554b5e25..06c94800b940 100644 --- a/drivers/media/dvb/frontends/tda826x.c +++ b/drivers/media/dvb/frontends/tda826x.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/slab.h> | ||
23 | #include <linux/module.h> | 24 | #include <linux/module.h> |
24 | #include <linux/dvb/frontend.h> | 25 | #include <linux/dvb/frontend.h> |
25 | #include <asm/types.h> | 26 | #include <asm/types.h> |
diff --git a/drivers/media/dvb/frontends/tua6100.c b/drivers/media/dvb/frontends/tua6100.c index 1790baee014c..bcb95c2ef296 100644 --- a/drivers/media/dvb/frontends/tua6100.c +++ b/drivers/media/dvb/frontends/tua6100.c | |||
@@ -28,6 +28,7 @@ | |||
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include <linux/slab.h> | ||
31 | #include <linux/module.h> | 32 | #include <linux/module.h> |
32 | #include <linux/dvb/frontend.h> | 33 | #include <linux/dvb/frontend.h> |
33 | #include <asm/types.h> | 34 | #include <asm/types.h> |
diff --git a/drivers/media/dvb/frontends/zl10036.c b/drivers/media/dvb/frontends/zl10036.c index 4e814ff22b23..4627f491656b 100644 --- a/drivers/media/dvb/frontends/zl10036.c +++ b/drivers/media/dvb/frontends/zl10036.c | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
31 | #include <linux/dvb/frontend.h> | 31 | #include <linux/dvb/frontend.h> |
32 | #include <linux/slab.h> | ||
32 | #include <linux/types.h> | 33 | #include <linux/types.h> |
33 | 34 | ||
34 | #include "zl10036.h" | 35 | #include "zl10036.h" |
@@ -411,7 +412,7 @@ static int zl10036_init_regs(struct zl10036_state *state) | |||
411 | state->bf = 0xff; | 412 | state->bf = 0xff; |
412 | 413 | ||
413 | if (!state->config->rf_loop_enable) | 414 | if (!state->config->rf_loop_enable) |
414 | zl10036_init_tab[1][2] |= 0x01; | 415 | zl10036_init_tab[1][0] |= 0x01; |
415 | 416 | ||
416 | deb_info("%s\n", __func__); | 417 | deb_info("%s\n", __func__); |
417 | 418 | ||
diff --git a/drivers/media/dvb/frontends/zl10039.c b/drivers/media/dvb/frontends/zl10039.c index 11b29cb883e6..c085e58a94bf 100644 --- a/drivers/media/dvb/frontends/zl10039.c +++ b/drivers/media/dvb/frontends/zl10039.c | |||
@@ -287,7 +287,6 @@ struct dvb_frontend *zl10039_attach(struct dvb_frontend *fe, | |||
287 | break; | 287 | break; |
288 | default: | 288 | default: |
289 | dprintk("Chip ID=%x does not match a known type\n", state->id); | 289 | dprintk("Chip ID=%x does not match a known type\n", state->id); |
290 | break; | ||
291 | goto error; | 290 | goto error; |
292 | } | 291 | } |
293 | 292 | ||