diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-17 00:15:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-17 00:15:42 -0400 |
commit | 0dd5198672dd2bbeb933862e1fc82162e0b636be (patch) | |
tree | c9efed20d90603c4d1626c21bd7aab1e7fc74a58 /drivers/media/dvb | |
parent | c868d550115b9ccc0027c67265b9520790f05601 (diff) | |
parent | 11c635a25b9f3a5d87409ce46cf2e05c500251ec (diff) |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (425 commits)
V4L/DVB (11870): gspca - main: VIDIOC_ENUM_FRAMESIZES ioctl added.
V4L/DVB (12004): poll method lose race condition
V4L/DVB (11894): flexcop-pci: dmesg visible names broken
V4L/DVB (11892): Siano: smsendian - declare function as extern
V4L/DVB (11891): Siano: smscore - bind the GPIO SMS protocol
V4L/DVB (11890): Siano: smscore - remove redundant code
V4L/DVB (11889): Siano: smsdvb - add DVB v3 events
V4L/DVB (11888): Siano: smsusb - remove redundant ifdef
V4L/DVB (11887): Siano: smscards - add board (target) events
V4L/DVB (11886): Siano: smscore - fix some new GPIO definitions names
V4L/DVB (11885): Siano: Add new GPIO management interface
V4L/DVB (11884): Siano: smssdio - revert to stand alone module
V4L/DVB (11883): Siano: cards - add two additional (USB) devices
V4L/DVB (11824): Siano: smsusb - change exit func debug msg
V4L/DVB (11823): Siano: smsusb - fix typo in module description
V4L/DVB (11822): Siano: smscore - bug fix at get_device_mode
V4L/DVB (11821): Siano: smscore - fix isdb-t firmware name
V4L/DVB (11820): Siano: smscore - fix byte ordering bug
V4L/DVB (11819): Siano: smscore - fix get_common_buffer bug
V4L/DVB (11818): Siano: smscards - assign gpio to HPG targets
...
Diffstat (limited to 'drivers/media/dvb')
62 files changed, 11835 insertions, 939 deletions
diff --git a/drivers/media/dvb/b2c2/flexcop-common.h b/drivers/media/dvb/b2c2/flexcop-common.h index 3e1c472092ab..9e2148a19967 100644 --- a/drivers/media/dvb/b2c2/flexcop-common.h +++ b/drivers/media/dvb/b2c2/flexcop-common.h | |||
@@ -1,9 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III | 2 | * Linux driver for digital TV devices equipped with B2C2 FlexcopII(b)/III |
3 | * | 3 | * flexcop-common.h - common header file for device-specific source files |
4 | * flexcop-common.h - common header file for device-specific source files also. | 4 | * see flexcop.c for copyright information |
5 | * | ||
6 | * see flexcop.c for copyright information. | ||
7 | */ | 5 | */ |
8 | #ifndef __FLEXCOP_COMMON_H__ | 6 | #ifndef __FLEXCOP_COMMON_H__ |
9 | #define __FLEXCOP_COMMON_H__ | 7 | #define __FLEXCOP_COMMON_H__ |
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c index f7afab5944cf..efb4a6c2b57a 100644 --- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c +++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c | |||
@@ -1,34 +1,27 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III | 2 | * Linux driver for digital TV devices equipped with B2C2 FlexcopII(b)/III |
3 | * | 3 | * flexcop-fe-tuner.c - methods for frontend attachment and DiSEqC controlling |
4 | * flexcop-fe-tuner.c - methods for attaching a frontend and controlling DiSEqC. | 4 | * see flexcop.c for copyright information |
5 | * | ||
6 | * see flexcop.c for copyright information. | ||
7 | */ | 5 | */ |
8 | #include <media/tuner.h> | 6 | #include <media/tuner.h> |
9 | |||
10 | #include "flexcop.h" | 7 | #include "flexcop.h" |
11 | |||
12 | #include "stv0299.h" | ||
13 | #include "mt352.h" | ||
14 | #include "nxt200x.h" | ||
15 | #include "bcm3510.h" | ||
16 | #include "stv0297.h" | ||
17 | #include "mt312.h" | 8 | #include "mt312.h" |
18 | #include "lgdt330x.h" | 9 | #include "stv0299.h" |
19 | #include "dvb-pll.h" | ||
20 | #include "tuner-simple.h" | ||
21 | |||
22 | #include "s5h1420.h" | 10 | #include "s5h1420.h" |
23 | #include "itd1000.h" | 11 | #include "itd1000.h" |
24 | |||
25 | #include "cx24123.h" | ||
26 | #include "cx24113.h" | 12 | #include "cx24113.h" |
27 | 13 | #include "cx24123.h" | |
28 | #include "isl6421.h" | 14 | #include "isl6421.h" |
15 | #include "mt352.h" | ||
16 | #include "bcm3510.h" | ||
17 | #include "nxt200x.h" | ||
18 | #include "dvb-pll.h" | ||
19 | #include "lgdt330x.h" | ||
20 | #include "tuner-simple.h" | ||
21 | #include "stv0297.h" | ||
29 | 22 | ||
30 | /* lnb control */ | 23 | /* lnb control */ |
31 | 24 | #if defined(CONFIG_DVB_MT312_MODULE) || defined(CONFIG_DVB_STV0299_MODULE) | |
32 | static int flexcop_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | 25 | static int flexcop_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) |
33 | { | 26 | { |
34 | struct flexcop_device *fc = fe->dvb->priv; | 27 | struct flexcop_device *fc = fe->dvb->priv; |
@@ -37,65 +30,62 @@ static int flexcop_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage | |||
37 | 30 | ||
38 | v = fc->read_ibi_reg(fc, misc_204); | 31 | v = fc->read_ibi_reg(fc, misc_204); |
39 | switch (voltage) { | 32 | switch (voltage) { |
40 | case SEC_VOLTAGE_OFF: | 33 | case SEC_VOLTAGE_OFF: |
41 | v.misc_204.ACPI1_sig = 1; | 34 | v.misc_204.ACPI1_sig = 1; |
42 | break; | 35 | break; |
43 | case SEC_VOLTAGE_13: | 36 | case SEC_VOLTAGE_13: |
44 | v.misc_204.ACPI1_sig = 0; | 37 | v.misc_204.ACPI1_sig = 0; |
45 | v.misc_204.LNB_L_H_sig = 0; | 38 | v.misc_204.LNB_L_H_sig = 0; |
46 | break; | 39 | break; |
47 | case SEC_VOLTAGE_18: | 40 | case SEC_VOLTAGE_18: |
48 | v.misc_204.ACPI1_sig = 0; | 41 | v.misc_204.ACPI1_sig = 0; |
49 | v.misc_204.LNB_L_H_sig = 1; | 42 | v.misc_204.LNB_L_H_sig = 1; |
50 | break; | 43 | break; |
51 | default: | 44 | default: |
52 | err("unknown SEC_VOLTAGE value"); | 45 | err("unknown SEC_VOLTAGE value"); |
53 | return -EINVAL; | 46 | return -EINVAL; |
54 | } | 47 | } |
55 | return fc->write_ibi_reg(fc, misc_204, v); | 48 | return fc->write_ibi_reg(fc, misc_204, v); |
56 | } | 49 | } |
50 | #endif | ||
57 | 51 | ||
52 | #if defined(CONFIG_DVB_S5H1420_MODULE) || defined(CONFIG_DVB_STV0299_MODULE) \ | ||
53 | || defined(CONFIG_DVB_MT312_MODULE) | ||
58 | static int flexcop_sleep(struct dvb_frontend* fe) | 54 | static int flexcop_sleep(struct dvb_frontend* fe) |
59 | { | 55 | { |
60 | struct flexcop_device *fc = fe->dvb->priv; | 56 | struct flexcop_device *fc = fe->dvb->priv; |
61 | /* flexcop_ibi_value v = fc->read_ibi_reg(fc,misc_204); */ | ||
62 | |||
63 | if (fc->fe_sleep) | 57 | if (fc->fe_sleep) |
64 | return fc->fe_sleep(fe); | 58 | return fc->fe_sleep(fe); |
65 | |||
66 | /* v.misc_204.ACPI3_sig = 1; | ||
67 | fc->write_ibi_reg(fc,misc_204,v);*/ | ||
68 | |||
69 | return 0; | 59 | return 0; |
70 | } | 60 | } |
61 | #endif | ||
71 | 62 | ||
63 | /* SkyStar2 DVB-S rev 2.3 */ | ||
64 | #if defined(CONFIG_DVB_MT312_MODULE) | ||
72 | static int flexcop_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | 65 | static int flexcop_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) |
73 | { | 66 | { |
74 | /* u16 wz_half_period_for_45_mhz[] = { 0x01ff, 0x0154, 0x00ff, 0x00cc }; */ | 67 | /* u16 wz_half_period_for_45_mhz[] = { 0x01ff, 0x0154, 0x00ff, 0x00cc }; */ |
75 | struct flexcop_device *fc = fe->dvb->priv; | 68 | struct flexcop_device *fc = fe->dvb->priv; |
76 | flexcop_ibi_value v; | 69 | flexcop_ibi_value v; |
77 | u16 ax; | 70 | u16 ax; |
78 | v.raw = 0; | 71 | v.raw = 0; |
79 | |||
80 | deb_tuner("tone = %u\n",tone); | 72 | deb_tuner("tone = %u\n",tone); |
81 | 73 | ||
82 | switch (tone) { | 74 | switch (tone) { |
83 | case SEC_TONE_ON: | 75 | case SEC_TONE_ON: |
84 | ax = 0x01ff; | 76 | ax = 0x01ff; |
85 | break; | 77 | break; |
86 | case SEC_TONE_OFF: | 78 | case SEC_TONE_OFF: |
87 | ax = 0; | 79 | ax = 0; |
88 | break; | 80 | break; |
89 | default: | 81 | default: |
90 | err("unknown SEC_TONE value"); | 82 | err("unknown SEC_TONE value"); |
91 | return -EINVAL; | 83 | return -EINVAL; |
92 | } | 84 | } |
93 | 85 | ||
94 | v.lnb_switch_freq_200.LNB_CTLPrescaler_sig = 1; /* divide by 2 */ | 86 | v.lnb_switch_freq_200.LNB_CTLPrescaler_sig = 1; /* divide by 2 */ |
95 | |||
96 | v.lnb_switch_freq_200.LNB_CTLHighCount_sig = ax; | 87 | v.lnb_switch_freq_200.LNB_CTLHighCount_sig = ax; |
97 | v.lnb_switch_freq_200.LNB_CTLLowCount_sig = ax == 0 ? 0x1ff : ax; | 88 | v.lnb_switch_freq_200.LNB_CTLLowCount_sig = ax == 0 ? 0x1ff : ax; |
98 | |||
99 | return fc->write_ibi_reg(fc,lnb_switch_freq_200,v); | 89 | return fc->write_ibi_reg(fc,lnb_switch_freq_200,v); |
100 | } | 90 | } |
101 | 91 | ||
@@ -110,17 +100,16 @@ static void flexcop_diseqc_send_bit(struct dvb_frontend* fe, int data) | |||
110 | static void flexcop_diseqc_send_byte(struct dvb_frontend* fe, int data) | 100 | static void flexcop_diseqc_send_byte(struct dvb_frontend* fe, int data) |
111 | { | 101 | { |
112 | int i, par = 1, d; | 102 | int i, par = 1, d; |
113 | |||
114 | for (i = 7; i >= 0; i--) { | 103 | for (i = 7; i >= 0; i--) { |
115 | d = (data >> i) & 1; | 104 | d = (data >> i) & 1; |
116 | par ^= d; | 105 | par ^= d; |
117 | flexcop_diseqc_send_bit(fe, d); | 106 | flexcop_diseqc_send_bit(fe, d); |
118 | } | 107 | } |
119 | |||
120 | flexcop_diseqc_send_bit(fe, par); | 108 | flexcop_diseqc_send_bit(fe, par); |
121 | } | 109 | } |
122 | 110 | ||
123 | static int flexcop_send_diseqc_msg(struct dvb_frontend* fe, int len, u8 *msg, unsigned long burst) | 111 | static int flexcop_send_diseqc_msg(struct dvb_frontend *fe, |
112 | int len, u8 *msg, unsigned long burst) | ||
124 | { | 113 | { |
125 | int i; | 114 | int i; |
126 | 115 | ||
@@ -129,7 +118,6 @@ static int flexcop_send_diseqc_msg(struct dvb_frontend* fe, int len, u8 *msg, un | |||
129 | 118 | ||
130 | for (i = 0; i < len; i++) | 119 | for (i = 0; i < len; i++) |
131 | flexcop_diseqc_send_byte(fe,msg[i]); | 120 | flexcop_diseqc_send_byte(fe,msg[i]); |
132 | |||
133 | mdelay(16); | 121 | mdelay(16); |
134 | 122 | ||
135 | if (burst != -1) { | 123 | if (burst != -1) { |
@@ -146,50 +134,110 @@ static int flexcop_send_diseqc_msg(struct dvb_frontend* fe, int len, u8 *msg, un | |||
146 | return 0; | 134 | return 0; |
147 | } | 135 | } |
148 | 136 | ||
149 | static int flexcop_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd) | 137 | static int flexcop_diseqc_send_master_cmd(struct dvb_frontend *fe, |
138 | struct dvb_diseqc_master_cmd *cmd) | ||
150 | { | 139 | { |
151 | return flexcop_send_diseqc_msg(fe, cmd->msg_len, cmd->msg, 0); | 140 | return flexcop_send_diseqc_msg(fe, cmd->msg_len, cmd->msg, 0); |
152 | } | 141 | } |
153 | 142 | ||
154 | static int flexcop_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd) | 143 | static int flexcop_diseqc_send_burst(struct dvb_frontend *fe, |
144 | fe_sec_mini_cmd_t minicmd) | ||
155 | { | 145 | { |
156 | return flexcop_send_diseqc_msg(fe, 0, NULL, minicmd); | 146 | return flexcop_send_diseqc_msg(fe, 0, NULL, minicmd); |
157 | } | 147 | } |
158 | 148 | ||
159 | /* dvb-s stv0299 */ | 149 | static struct mt312_config skystar23_samsung_tbdu18132_config = { |
160 | static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio) | 150 | .demod_address = 0x0e, |
151 | }; | ||
152 | |||
153 | static int skystar23_samsung_tbdu18132_tuner_set_params(struct dvb_frontend *fe, | ||
154 | struct dvb_frontend_parameters *params) | ||
155 | { | ||
156 | u8 buf[4]; | ||
157 | u32 div; | ||
158 | struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, | ||
159 | .len = sizeof(buf) }; | ||
160 | struct flexcop_device *fc = fe->dvb->priv; | ||
161 | div = (params->frequency + (125/2)) / 125; | ||
162 | |||
163 | buf[0] = (div >> 8) & 0x7f; | ||
164 | buf[1] = (div >> 0) & 0xff; | ||
165 | buf[2] = 0x84 | ((div >> 10) & 0x60); | ||
166 | buf[3] = 0x80; | ||
167 | |||
168 | if (params->frequency < 1550000) | ||
169 | buf[3] |= 0x02; | ||
170 | |||
171 | if (fe->ops.i2c_gate_ctrl) | ||
172 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
173 | if (i2c_transfer(&fc->fc_i2c_adap[0].i2c_adap, &msg, 1) != 1) | ||
174 | return -EIO; | ||
175 | return 0; | ||
176 | } | ||
177 | |||
178 | static int skystar2_rev23_attach(struct flexcop_device *fc, | ||
179 | struct i2c_adapter *i2c) | ||
180 | { | ||
181 | fc->fe = dvb_attach(mt312_attach, &skystar23_samsung_tbdu18132_config, i2c); | ||
182 | if (fc->fe != NULL) { | ||
183 | struct dvb_frontend_ops *ops = &fc->fe->ops; | ||
184 | ops->tuner_ops.set_params = | ||
185 | skystar23_samsung_tbdu18132_tuner_set_params; | ||
186 | ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd; | ||
187 | ops->diseqc_send_burst = flexcop_diseqc_send_burst; | ||
188 | ops->set_tone = flexcop_set_tone; | ||
189 | ops->set_voltage = flexcop_set_voltage; | ||
190 | fc->fe_sleep = ops->sleep; | ||
191 | ops->sleep = flexcop_sleep; | ||
192 | return 1; | ||
193 | } | ||
194 | return 0; | ||
195 | } | ||
196 | #endif | ||
197 | |||
198 | /* SkyStar2 DVB-S rev 2.6 */ | ||
199 | #if defined(CONFIG_DVB_STV0299_MODULE) | ||
200 | static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend *fe, | ||
201 | u32 srate, u32 ratio) | ||
161 | { | 202 | { |
162 | u8 aclk = 0; | 203 | u8 aclk = 0; |
163 | u8 bclk = 0; | 204 | u8 bclk = 0; |
164 | 205 | ||
165 | if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; } | 206 | if (srate < 1500000) { |
166 | else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; } | 207 | aclk = 0xb7; bclk = 0x47; |
167 | else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; } | 208 | } else if (srate < 3000000) { |
168 | else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; } | 209 | aclk = 0xb7; bclk = 0x4b; |
169 | else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; } | 210 | } else if (srate < 7000000) { |
170 | else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; } | 211 | aclk = 0xb7; bclk = 0x4f; |
171 | 212 | } else if (srate < 14000000) { | |
172 | stv0299_writereg (fe, 0x13, aclk); | 213 | aclk = 0xb7; bclk = 0x53; |
173 | stv0299_writereg (fe, 0x14, bclk); | 214 | } else if (srate < 30000000) { |
174 | stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff); | 215 | aclk = 0xb6; bclk = 0x53; |
175 | stv0299_writereg (fe, 0x20, (ratio >> 8) & 0xff); | 216 | } else if (srate < 45000000) { |
176 | stv0299_writereg (fe, 0x21, (ratio ) & 0xf0); | 217 | aclk = 0xb4; bclk = 0x51; |
218 | } | ||
177 | 219 | ||
220 | stv0299_writereg(fe, 0x13, aclk); | ||
221 | stv0299_writereg(fe, 0x14, bclk); | ||
222 | stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff); | ||
223 | stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff); | ||
224 | stv0299_writereg(fe, 0x21, ratio & 0xf0); | ||
178 | return 0; | 225 | return 0; |
179 | } | 226 | } |
180 | 227 | ||
181 | static int samsung_tbmu24112_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) | 228 | static int samsung_tbmu24112_tuner_set_params(struct dvb_frontend *fe, |
229 | struct dvb_frontend_parameters *params) | ||
182 | { | 230 | { |
183 | u8 buf[4]; | 231 | u8 buf[4]; |
184 | u32 div; | 232 | u32 div; |
185 | struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; | 233 | struct i2c_msg msg = { |
234 | .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; | ||
186 | struct flexcop_device *fc = fe->dvb->priv; | 235 | struct flexcop_device *fc = fe->dvb->priv; |
187 | |||
188 | div = params->frequency / 125; | 236 | div = params->frequency / 125; |
189 | 237 | ||
190 | buf[0] = (div >> 8) & 0x7f; | 238 | buf[0] = (div >> 8) & 0x7f; |
191 | buf[1] = div & 0xff; | 239 | buf[1] = div & 0xff; |
192 | buf[2] = 0x84; /* 0xC4 */ | 240 | buf[2] = 0x84; /* 0xC4 */ |
193 | buf[3] = 0x08; | 241 | buf[3] = 0x08; |
194 | 242 | ||
195 | if (params->frequency < 1500000) | 243 | if (params->frequency < 1500000) |
@@ -203,48 +251,48 @@ static int samsung_tbmu24112_tuner_set_params(struct dvb_frontend* fe, struct dv | |||
203 | } | 251 | } |
204 | 252 | ||
205 | static u8 samsung_tbmu24112_inittab[] = { | 253 | static u8 samsung_tbmu24112_inittab[] = { |
206 | 0x01, 0x15, | 254 | 0x01, 0x15, |
207 | 0x02, 0x30, | 255 | 0x02, 0x30, |
208 | 0x03, 0x00, | 256 | 0x03, 0x00, |
209 | 0x04, 0x7D, | 257 | 0x04, 0x7D, |
210 | 0x05, 0x35, | 258 | 0x05, 0x35, |
211 | 0x06, 0x02, | 259 | 0x06, 0x02, |
212 | 0x07, 0x00, | 260 | 0x07, 0x00, |
213 | 0x08, 0xC3, | 261 | 0x08, 0xC3, |
214 | 0x0C, 0x00, | 262 | 0x0C, 0x00, |
215 | 0x0D, 0x81, | 263 | 0x0D, 0x81, |
216 | 0x0E, 0x23, | 264 | 0x0E, 0x23, |
217 | 0x0F, 0x12, | 265 | 0x0F, 0x12, |
218 | 0x10, 0x7E, | 266 | 0x10, 0x7E, |
219 | 0x11, 0x84, | 267 | 0x11, 0x84, |
220 | 0x12, 0xB9, | 268 | 0x12, 0xB9, |
221 | 0x13, 0x88, | 269 | 0x13, 0x88, |
222 | 0x14, 0x89, | 270 | 0x14, 0x89, |
223 | 0x15, 0xC9, | 271 | 0x15, 0xC9, |
224 | 0x16, 0x00, | 272 | 0x16, 0x00, |
225 | 0x17, 0x5C, | 273 | 0x17, 0x5C, |
226 | 0x18, 0x00, | 274 | 0x18, 0x00, |
227 | 0x19, 0x00, | 275 | 0x19, 0x00, |
228 | 0x1A, 0x00, | 276 | 0x1A, 0x00, |
229 | 0x1C, 0x00, | 277 | 0x1C, 0x00, |
230 | 0x1D, 0x00, | 278 | 0x1D, 0x00, |
231 | 0x1E, 0x00, | 279 | 0x1E, 0x00, |
232 | 0x1F, 0x3A, | 280 | 0x1F, 0x3A, |
233 | 0x20, 0x2E, | 281 | 0x20, 0x2E, |
234 | 0x21, 0x80, | 282 | 0x21, 0x80, |
235 | 0x22, 0xFF, | 283 | 0x22, 0xFF, |
236 | 0x23, 0xC1, | 284 | 0x23, 0xC1, |
237 | 0x28, 0x00, | 285 | 0x28, 0x00, |
238 | 0x29, 0x1E, | 286 | 0x29, 0x1E, |
239 | 0x2A, 0x14, | 287 | 0x2A, 0x14, |
240 | 0x2B, 0x0F, | 288 | 0x2B, 0x0F, |
241 | 0x2C, 0x09, | 289 | 0x2C, 0x09, |
242 | 0x2D, 0x05, | 290 | 0x2D, 0x05, |
243 | 0x31, 0x1F, | 291 | 0x31, 0x1F, |
244 | 0x32, 0x19, | 292 | 0x32, 0x19, |
245 | 0x33, 0xFE, | 293 | 0x33, 0xFE, |
246 | 0x34, 0x93, | 294 | 0x34, 0x93, |
247 | 0xff, 0xff, | 295 | 0xff, 0xff, |
248 | }; | 296 | }; |
249 | 297 | ||
250 | static struct stv0299_config samsung_tbmu24112_config = { | 298 | static struct stv0299_config samsung_tbmu24112_config = { |
@@ -259,27 +307,155 @@ static struct stv0299_config samsung_tbmu24112_config = { | |||
259 | .set_symbol_rate = samsung_tbmu24112_set_symbol_rate, | 307 | .set_symbol_rate = samsung_tbmu24112_set_symbol_rate, |
260 | }; | 308 | }; |
261 | 309 | ||
262 | /* dvb-t mt352 */ | 310 | static int skystar2_rev26_attach(struct flexcop_device *fc, |
263 | static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe) | 311 | struct i2c_adapter *i2c) |
312 | { | ||
313 | fc->fe = dvb_attach(stv0299_attach, &samsung_tbmu24112_config, i2c); | ||
314 | if (fc->fe != NULL) { | ||
315 | struct dvb_frontend_ops *ops = &fc->fe->ops; | ||
316 | ops->tuner_ops.set_params = samsung_tbmu24112_tuner_set_params; | ||
317 | ops->set_voltage = flexcop_set_voltage; | ||
318 | fc->fe_sleep = ops->sleep; | ||
319 | ops->sleep = flexcop_sleep; | ||
320 | return 1; | ||
321 | } | ||
322 | return 0; | ||
323 | } | ||
324 | #endif | ||
325 | |||
326 | /* SkyStar2 DVB-S rev 2.7 */ | ||
327 | #if defined(CONFIG_DVB_S5H1420_MODULE) | ||
328 | static struct s5h1420_config skystar2_rev2_7_s5h1420_config = { | ||
329 | .demod_address = 0x53, | ||
330 | .invert = 1, | ||
331 | .repeated_start_workaround = 1, | ||
332 | .serial_mpeg = 1, | ||
333 | }; | ||
334 | |||
335 | static struct itd1000_config skystar2_rev2_7_itd1000_config = { | ||
336 | .i2c_address = 0x61, | ||
337 | }; | ||
338 | |||
339 | static int skystar2_rev27_attach(struct flexcop_device *fc, | ||
340 | struct i2c_adapter *i2c) | ||
341 | { | ||
342 | flexcop_ibi_value r108; | ||
343 | struct i2c_adapter *i2c_tuner; | ||
344 | |||
345 | /* enable no_base_addr - no repeated start when reading */ | ||
346 | fc->fc_i2c_adap[0].no_base_addr = 1; | ||
347 | fc->fe = dvb_attach(s5h1420_attach, &skystar2_rev2_7_s5h1420_config, | ||
348 | i2c); | ||
349 | if (!fc->fe) | ||
350 | goto fail; | ||
351 | |||
352 | i2c_tuner = s5h1420_get_tuner_i2c_adapter(fc->fe); | ||
353 | if (!i2c_tuner) | ||
354 | goto fail; | ||
355 | |||
356 | fc->fe_sleep = fc->fe->ops.sleep; | ||
357 | fc->fe->ops.sleep = flexcop_sleep; | ||
358 | |||
359 | /* enable no_base_addr - no repeated start when reading */ | ||
360 | fc->fc_i2c_adap[2].no_base_addr = 1; | ||
361 | if (!dvb_attach(isl6421_attach, fc->fe, &fc->fc_i2c_adap[2].i2c_adap, | ||
362 | 0x08, 1, 1)) { | ||
363 | err("ISL6421 could NOT be attached"); | ||
364 | goto fail_isl; | ||
365 | } | ||
366 | info("ISL6421 successfully attached"); | ||
367 | |||
368 | /* the ITD1000 requires a lower i2c clock - is it a problem ? */ | ||
369 | r108.raw = 0x00000506; | ||
370 | fc->write_ibi_reg(fc, tw_sm_c_108, r108); | ||
371 | if (!dvb_attach(itd1000_attach, fc->fe, i2c_tuner, | ||
372 | &skystar2_rev2_7_itd1000_config)) { | ||
373 | err("ITD1000 could NOT be attached"); | ||
374 | /* Should i2c clock be restored? */ | ||
375 | goto fail_isl; | ||
376 | } | ||
377 | info("ITD1000 successfully attached"); | ||
378 | |||
379 | return 1; | ||
380 | |||
381 | fail_isl: | ||
382 | fc->fc_i2c_adap[2].no_base_addr = 0; | ||
383 | fail: | ||
384 | /* for the next devices we need it again */ | ||
385 | fc->fc_i2c_adap[0].no_base_addr = 0; | ||
386 | return 0; | ||
387 | } | ||
388 | #endif | ||
389 | |||
390 | /* SkyStar2 rev 2.8 */ | ||
391 | #if defined(CONFIG_DVB_CX24123_MODULE) | ||
392 | static struct cx24123_config skystar2_rev2_8_cx24123_config = { | ||
393 | .demod_address = 0x55, | ||
394 | .dont_use_pll = 1, | ||
395 | .agc_callback = cx24113_agc_callback, | ||
396 | }; | ||
397 | |||
398 | static const struct cx24113_config skystar2_rev2_8_cx24113_config = { | ||
399 | .i2c_addr = 0x54, | ||
400 | .xtal_khz = 10111, | ||
401 | }; | ||
402 | |||
403 | static int skystar2_rev28_attach(struct flexcop_device *fc, | ||
404 | struct i2c_adapter *i2c) | ||
405 | { | ||
406 | struct i2c_adapter *i2c_tuner; | ||
407 | |||
408 | fc->fe = dvb_attach(cx24123_attach, &skystar2_rev2_8_cx24123_config, | ||
409 | i2c); | ||
410 | if (!fc->fe) | ||
411 | return 0; | ||
412 | |||
413 | i2c_tuner = cx24123_get_tuner_i2c_adapter(fc->fe);; | ||
414 | if (!i2c_tuner) | ||
415 | return 0; | ||
416 | |||
417 | if (!dvb_attach(cx24113_attach, fc->fe, &skystar2_rev2_8_cx24113_config, | ||
418 | i2c_tuner)) { | ||
419 | err("CX24113 could NOT be attached"); | ||
420 | return 0; | ||
421 | } | ||
422 | info("CX24113 successfully attached"); | ||
423 | |||
424 | fc->fc_i2c_adap[2].no_base_addr = 1; | ||
425 | if (!dvb_attach(isl6421_attach, fc->fe, &fc->fc_i2c_adap[2].i2c_adap, | ||
426 | 0x08, 0, 0)) { | ||
427 | err("ISL6421 could NOT be attached"); | ||
428 | fc->fc_i2c_adap[2].no_base_addr = 0; | ||
429 | return 0; | ||
430 | } | ||
431 | info("ISL6421 successfully attached"); | ||
432 | /* TODO on i2c_adap[1] addr 0x11 (EEPROM) there seems to be an | ||
433 | * IR-receiver (PIC16F818) - but the card has no input for that ??? */ | ||
434 | return 1; | ||
435 | } | ||
436 | #endif | ||
437 | |||
438 | /* AirStar DVB-T */ | ||
439 | #if defined(CONFIG_DVB_MT352_MODULE) | ||
440 | static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend *fe) | ||
264 | { | 441 | { |
265 | static u8 mt352_clock_config [] = { 0x89, 0x18, 0x2d }; | 442 | static u8 mt352_clock_config[] = { 0x89, 0x18, 0x2d }; |
266 | static u8 mt352_reset [] = { 0x50, 0x80 }; | 443 | static u8 mt352_reset[] = { 0x50, 0x80 }; |
267 | static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 }; | 444 | static u8 mt352_adc_ctl_1_cfg[] = { 0x8E, 0x40 }; |
268 | static u8 mt352_agc_cfg [] = { 0x67, 0x28, 0xa1 }; | 445 | static u8 mt352_agc_cfg[] = { 0x67, 0x28, 0xa1 }; |
269 | static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 }; | 446 | static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 }; |
270 | 447 | ||
271 | mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config)); | 448 | mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config)); |
272 | udelay(2000); | 449 | udelay(2000); |
273 | mt352_write(fe, mt352_reset, sizeof(mt352_reset)); | 450 | mt352_write(fe, mt352_reset, sizeof(mt352_reset)); |
274 | mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg)); | 451 | mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg)); |
275 | |||
276 | mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg)); | 452 | mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg)); |
277 | mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg)); | 453 | mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg)); |
278 | |||
279 | return 0; | 454 | return 0; |
280 | } | 455 | } |
281 | 456 | ||
282 | static int samsung_tdtc9251dh0_calc_regs(struct dvb_frontend* fe, struct dvb_frontend_parameters *params, u8* pllbuf, int buf_len) | 457 | static int samsung_tdtc9251dh0_calc_regs(struct dvb_frontend *fe, |
458 | struct dvb_frontend_parameters *params, u8* pllbuf, int buf_len) | ||
283 | { | 459 | { |
284 | u32 div; | 460 | u32 div; |
285 | unsigned char bs = 0; | 461 | unsigned char bs = 0; |
@@ -287,19 +463,20 @@ static int samsung_tdtc9251dh0_calc_regs(struct dvb_frontend* fe, struct dvb_fro | |||
287 | if (buf_len < 5) | 463 | if (buf_len < 5) |
288 | return -EINVAL; | 464 | return -EINVAL; |
289 | 465 | ||
290 | #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ | 466 | #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ |
291 | div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; | 467 | div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; |
292 | 468 | if (params->frequency >= 48000000 && params->frequency <= 154000000) \ | |
293 | if (params->frequency >= 48000000 && params->frequency <= 154000000) bs = 0x09; | 469 | bs = 0x09; |
294 | if (params->frequency >= 161000000 && params->frequency <= 439000000) bs = 0x0a; | 470 | if (params->frequency >= 161000000 && params->frequency <= 439000000) \ |
295 | if (params->frequency >= 447000000 && params->frequency <= 863000000) bs = 0x08; | 471 | bs = 0x0a; |
472 | if (params->frequency >= 447000000 && params->frequency <= 863000000) \ | ||
473 | bs = 0x08; | ||
296 | 474 | ||
297 | pllbuf[0] = 0x61; | 475 | pllbuf[0] = 0x61; |
298 | pllbuf[1] = div >> 8; | 476 | pllbuf[1] = div >> 8; |
299 | pllbuf[2] = div & 0xff; | 477 | pllbuf[2] = div & 0xff; |
300 | pllbuf[3] = 0xcc; | 478 | pllbuf[3] = 0xcc; |
301 | pllbuf[4] = bs; | 479 | pllbuf[4] = bs; |
302 | |||
303 | return 5; | 480 | return 5; |
304 | } | 481 | } |
305 | 482 | ||
@@ -308,70 +485,95 @@ static struct mt352_config samsung_tdtc9251dh0_config = { | |||
308 | .demod_init = samsung_tdtc9251dh0_demod_init, | 485 | .demod_init = samsung_tdtc9251dh0_demod_init, |
309 | }; | 486 | }; |
310 | 487 | ||
311 | static int flexcop_fe_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name) | 488 | static int airstar_dvbt_attach(struct flexcop_device *fc, |
489 | struct i2c_adapter *i2c) | ||
490 | { | ||
491 | fc->fe = dvb_attach(mt352_attach, &samsung_tdtc9251dh0_config, i2c); | ||
492 | if (fc->fe != NULL) { | ||
493 | fc->fe->ops.tuner_ops.calc_regs = samsung_tdtc9251dh0_calc_regs; | ||
494 | return 1; | ||
495 | } | ||
496 | return 0; | ||
497 | } | ||
498 | #endif | ||
499 | |||
500 | /* AirStar ATSC 1st generation */ | ||
501 | #if defined(CONFIG_DVB_BCM3510_MODULE) | ||
502 | static int flexcop_fe_request_firmware(struct dvb_frontend *fe, | ||
503 | const struct firmware **fw, char* name) | ||
312 | { | 504 | { |
313 | struct flexcop_device *fc = fe->dvb->priv; | 505 | struct flexcop_device *fc = fe->dvb->priv; |
314 | return request_firmware(fw, name, fc->dev); | 506 | return request_firmware(fw, name, fc->dev); |
315 | } | 507 | } |
316 | 508 | ||
317 | static struct lgdt330x_config air2pc_atsc_hd5000_config = { | ||
318 | .demod_address = 0x59, | ||
319 | .demod_chip = LGDT3303, | ||
320 | .serial_mpeg = 0x04, | ||
321 | .clock_polarity_flip = 1, | ||
322 | }; | ||
323 | |||
324 | static struct nxt200x_config samsung_tbmv_config = { | ||
325 | .demod_address = 0x0a, | ||
326 | }; | ||
327 | |||
328 | static struct bcm3510_config air2pc_atsc_first_gen_config = { | 509 | static struct bcm3510_config air2pc_atsc_first_gen_config = { |
329 | .demod_address = 0x0f, | 510 | .demod_address = 0x0f, |
330 | .request_firmware = flexcop_fe_request_firmware, | 511 | .request_firmware = flexcop_fe_request_firmware, |
331 | }; | 512 | }; |
332 | 513 | ||
333 | static int skystar23_samsung_tbdu18132_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) | 514 | static int airstar_atsc1_attach(struct flexcop_device *fc, |
515 | struct i2c_adapter *i2c) | ||
334 | { | 516 | { |
335 | u8 buf[4]; | 517 | fc->fe = dvb_attach(bcm3510_attach, &air2pc_atsc_first_gen_config, i2c); |
336 | u32 div; | 518 | return fc->fe != NULL; |
337 | struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; | 519 | } |
338 | struct flexcop_device *fc = fe->dvb->priv; | 520 | #endif |
339 | |||
340 | div = (params->frequency + (125/2)) / 125; | ||
341 | 521 | ||
342 | buf[0] = (div >> 8) & 0x7f; | 522 | /* AirStar ATSC 2nd generation */ |
343 | buf[1] = (div >> 0) & 0xff; | 523 | #if defined(CONFIG_DVB_NXT200X_MODULE) |
344 | buf[2] = 0x84 | ((div >> 10) & 0x60); | 524 | static struct nxt200x_config samsung_tbmv_config = { |
345 | buf[3] = 0x80; | 525 | .demod_address = 0x0a, |
526 | }; | ||
346 | 527 | ||
347 | if (params->frequency < 1550000) | 528 | static int airstar_atsc2_attach(struct flexcop_device *fc, |
348 | buf[3] |= 0x02; | 529 | struct i2c_adapter *i2c) |
530 | { | ||
531 | fc->fe = dvb_attach(nxt200x_attach, &samsung_tbmv_config, i2c); | ||
532 | if (!fc->fe) | ||
533 | return 0; | ||
349 | 534 | ||
350 | if (fe->ops.i2c_gate_ctrl) | 535 | return !!dvb_attach(dvb_pll_attach, fc->fe, 0x61, NULL, |
351 | fe->ops.i2c_gate_ctrl(fe, 1); | 536 | DVB_PLL_SAMSUNG_TBMV); |
352 | if (i2c_transfer(&fc->fc_i2c_adap[0].i2c_adap, &msg, 1) != 1) | ||
353 | return -EIO; | ||
354 | return 0; | ||
355 | } | 537 | } |
538 | #endif | ||
356 | 539 | ||
357 | static struct mt312_config skystar23_samsung_tbdu18132_config = { | 540 | /* AirStar ATSC 3rd generation */ |
358 | 541 | #if defined(CONFIG_DVB_LGDT330X_MODULE) | |
359 | .demod_address = 0x0e, | 542 | static struct lgdt330x_config air2pc_atsc_hd5000_config = { |
543 | .demod_address = 0x59, | ||
544 | .demod_chip = LGDT3303, | ||
545 | .serial_mpeg = 0x04, | ||
546 | .clock_polarity_flip = 1, | ||
360 | }; | 547 | }; |
361 | 548 | ||
549 | static int airstar_atsc3_attach(struct flexcop_device *fc, | ||
550 | struct i2c_adapter *i2c) | ||
551 | { | ||
552 | fc->fe = dvb_attach(lgdt330x_attach, &air2pc_atsc_hd5000_config, i2c); | ||
553 | if (!fc->fe) | ||
554 | return 0; | ||
555 | |||
556 | return !!dvb_attach(simple_tuner_attach, fc->fe, i2c, 0x61, | ||
557 | TUNER_LG_TDVS_H06XF); | ||
558 | } | ||
559 | #endif | ||
560 | |||
561 | /* CableStar2 DVB-C */ | ||
562 | #if defined(CONFIG_DVB_STV0297_MODULE) | ||
362 | static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe, | 563 | static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe, |
363 | struct dvb_frontend_parameters *fep) | 564 | struct dvb_frontend_parameters *fep) |
364 | { | 565 | { |
365 | struct flexcop_device *fc = fe->dvb->priv; | 566 | struct flexcop_device *fc = fe->dvb->priv; |
366 | u8 buf[4]; | 567 | u8 buf[4]; |
367 | u16 div; | 568 | u16 div; |
368 | int ret; | 569 | int ret; |
369 | 570 | ||
370 | /* 62.5 kHz * 10 */ | 571 | /* 62.5 kHz * 10 */ |
371 | #define REF_FREQ 625 | 572 | #define REF_FREQ 625 |
372 | #define FREQ_OFFSET 36125 | 573 | #define FREQ_OFFSET 36125 |
373 | 574 | ||
374 | div = ((fep->frequency/1000 + FREQ_OFFSET ) * 10) / REF_FREQ; // 4 MHz = 4000 KHz | 575 | div = ((fep->frequency/1000 + FREQ_OFFSET) * 10) / REF_FREQ; |
576 | /* 4 MHz = 4000 KHz */ | ||
375 | 577 | ||
376 | buf[0] = (u8)( div >> 8) & 0x7f; | 578 | buf[0] = (u8)( div >> 8) & 0x7f; |
377 | buf[1] = (u8) div & 0xff; | 579 | buf[1] = (u8) div & 0xff; |
@@ -384,11 +586,11 @@ static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe, | |||
384 | * AGD = 1, R3 R2 R1 R0 = 0 1 0 1 => byte 4 = 1**10101 = 0x95 */ | 586 | * AGD = 1, R3 R2 R1 R0 = 0 1 0 1 => byte 4 = 1**10101 = 0x95 */ |
385 | buf[2] = 0x95; | 587 | buf[2] = 0x95; |
386 | 588 | ||
387 | // Range(MHz) C1 * RE RTS BS4 BS3 BS2 BS1 Byte 5 | 589 | /* Range(MHz) C1 * RE RTS BS4 BS3 BS2 BS1 Byte 5 |
388 | // 47 - 153 0 * 0 0 0 0 0 1 0x01 | 590 | * 47 - 153 0 * 0 0 0 0 0 1 0x01 |
389 | // 153 - 430 0 * 0 0 0 0 1 0 0x02 | 591 | * 153 - 430 0 * 0 0 0 0 1 0 0x02 |
390 | // 430 - 822 0 * 0 0 1 0 0 0 0x08 | 592 | * 430 - 822 0 * 0 0 1 0 0 0 0x08 |
391 | // 822 - 862 1 * 0 0 1 0 0 0 0x88 | 593 | * 822 - 862 1 * 0 0 1 0 0 0 0x88 */ |
392 | 594 | ||
393 | if (fep->frequency <= 153000000) buf[3] = 0x01; | 595 | if (fep->frequency <= 153000000) buf[3] = 0x01; |
394 | else if (fep->frequency <= 430000000) buf[3] = 0x02; | 596 | else if (fep->frequency <= 430000000) buf[3] = 0x02; |
@@ -397,11 +599,11 @@ static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe, | |||
397 | 599 | ||
398 | if (fe->ops.i2c_gate_ctrl) | 600 | if (fe->ops.i2c_gate_ctrl) |
399 | fe->ops.i2c_gate_ctrl(fe, 0); | 601 | fe->ops.i2c_gate_ctrl(fe, 0); |
400 | deb_tuner("tuner buffer for %d Hz: %x %x %x %x\n",fep->frequency, buf[0],buf[1],buf[2],buf[3]); | 602 | deb_tuner("tuner buffer for %d Hz: %x %x %x %x\n", fep->frequency, |
603 | buf[0], buf[1], buf[2], buf[3]); | ||
401 | ret = fc->i2c_request(&fc->fc_i2c_adap[2], | 604 | ret = fc->i2c_request(&fc->fc_i2c_adap[2], |
402 | FC_WRITE, 0x61, buf[0], &buf[1], 3); | 605 | FC_WRITE, 0x61, buf[0], &buf[1], 3); |
403 | deb_tuner("tuner write returned: %d\n",ret); | 606 | deb_tuner("tuner write returned: %d\n",ret); |
404 | |||
405 | return ret; | 607 | return ret; |
406 | } | 608 | } |
407 | 609 | ||
@@ -481,182 +683,73 @@ static u8 alps_tdee4_stv0297_inittab[] = { | |||
481 | static struct stv0297_config alps_tdee4_stv0297_config = { | 683 | static struct stv0297_config alps_tdee4_stv0297_config = { |
482 | .demod_address = 0x1c, | 684 | .demod_address = 0x1c, |
483 | .inittab = alps_tdee4_stv0297_inittab, | 685 | .inittab = alps_tdee4_stv0297_inittab, |
484 | // .invert = 1, | ||
485 | // .pll_set = alps_tdee4_stv0297_pll_set, | ||
486 | }; | ||
487 | |||
488 | |||
489 | /* SkyStar2 rev2.7 (a/u) */ | ||
490 | static struct s5h1420_config skystar2_rev2_7_s5h1420_config = { | ||
491 | .demod_address = 0x53, | ||
492 | .invert = 1, | ||
493 | .repeated_start_workaround = 1, | ||
494 | .serial_mpeg = 1, | ||
495 | }; | ||
496 | |||
497 | static struct itd1000_config skystar2_rev2_7_itd1000_config = { | ||
498 | .i2c_address = 0x61, | ||
499 | }; | 686 | }; |
500 | 687 | ||
501 | /* SkyStar2 rev2.8 */ | 688 | static int cablestar2_attach(struct flexcop_device *fc, |
502 | static struct cx24123_config skystar2_rev2_8_cx24123_config = { | 689 | struct i2c_adapter *i2c) |
503 | .demod_address = 0x55, | ||
504 | .dont_use_pll = 1, | ||
505 | .agc_callback = cx24113_agc_callback, | ||
506 | }; | ||
507 | |||
508 | static const struct cx24113_config skystar2_rev2_8_cx24113_config = { | ||
509 | .i2c_addr = 0x54, | ||
510 | .xtal_khz = 10111, | ||
511 | }; | ||
512 | |||
513 | /* try to figure out the frontend, each card/box can have on of the following list */ | ||
514 | int flexcop_frontend_init(struct flexcop_device *fc) | ||
515 | { | 690 | { |
516 | struct dvb_frontend_ops *ops; | ||
517 | struct i2c_adapter *i2c = &fc->fc_i2c_adap[0].i2c_adap; | ||
518 | struct i2c_adapter *i2c_tuner; | ||
519 | |||
520 | /* enable no_base_addr - no repeated start when reading */ | ||
521 | fc->fc_i2c_adap[0].no_base_addr = 1; | ||
522 | fc->fe = dvb_attach(s5h1420_attach, &skystar2_rev2_7_s5h1420_config, i2c); | ||
523 | if (fc->fe != NULL) { | ||
524 | flexcop_ibi_value r108; | ||
525 | i2c_tuner = s5h1420_get_tuner_i2c_adapter(fc->fe); | ||
526 | ops = &fc->fe->ops; | ||
527 | |||
528 | fc->fe_sleep = ops->sleep; | ||
529 | ops->sleep = flexcop_sleep; | ||
530 | |||
531 | fc->dev_type = FC_SKY_REV27; | ||
532 | |||
533 | /* enable no_base_addr - no repeated start when reading */ | ||
534 | fc->fc_i2c_adap[2].no_base_addr = 1; | ||
535 | if (dvb_attach(isl6421_attach, fc->fe, &fc->fc_i2c_adap[2].i2c_adap, 0x08, 1, 1) == NULL) | ||
536 | err("ISL6421 could NOT be attached"); | ||
537 | else | ||
538 | info("ISL6421 successfully attached"); | ||
539 | |||
540 | /* the ITD1000 requires a lower i2c clock - it slows down the stuff for everyone - but is it a problem ? */ | ||
541 | r108.raw = 0x00000506; | ||
542 | fc->write_ibi_reg(fc, tw_sm_c_108, r108); | ||
543 | if (i2c_tuner) { | ||
544 | if (dvb_attach(itd1000_attach, fc->fe, i2c_tuner, &skystar2_rev2_7_itd1000_config) == NULL) | ||
545 | err("ITD1000 could NOT be attached"); | ||
546 | else | ||
547 | info("ITD1000 successfully attached"); | ||
548 | } | ||
549 | goto fe_found; | ||
550 | } | ||
551 | fc->fc_i2c_adap[0].no_base_addr = 0; /* for the next devices we need it again */ | ||
552 | |||
553 | /* try the sky v2.8 (cx24123, isl6421) */ | ||
554 | fc->fe = dvb_attach(cx24123_attach, | ||
555 | &skystar2_rev2_8_cx24123_config, i2c); | ||
556 | if (fc->fe != NULL) { | ||
557 | i2c_tuner = cx24123_get_tuner_i2c_adapter(fc->fe); | ||
558 | if (i2c_tuner != NULL) { | ||
559 | if (dvb_attach(cx24113_attach, fc->fe, | ||
560 | &skystar2_rev2_8_cx24113_config, | ||
561 | i2c_tuner) == NULL) | ||
562 | err("CX24113 could NOT be attached"); | ||
563 | else | ||
564 | info("CX24113 successfully attached"); | ||
565 | } | ||
566 | |||
567 | fc->dev_type = FC_SKY_REV28; | ||
568 | |||
569 | fc->fc_i2c_adap[2].no_base_addr = 1; | ||
570 | if (dvb_attach(isl6421_attach, fc->fe, | ||
571 | &fc->fc_i2c_adap[2].i2c_adap, 0x08, 0, 0) == NULL) | ||
572 | err("ISL6421 could NOT be attached"); | ||
573 | else | ||
574 | info("ISL6421 successfully attached"); | ||
575 | |||
576 | /* TODO on i2c_adap[1] addr 0x11 (EEPROM) there seems to be an | ||
577 | * IR-receiver (PIC16F818) - but the card has no input for | ||
578 | * that ??? */ | ||
579 | |||
580 | goto fe_found; | ||
581 | } | ||
582 | |||
583 | /* try the sky v2.6 (stv0299/Samsung tbmu24112(sl1935)) */ | ||
584 | fc->fe = dvb_attach(stv0299_attach, &samsung_tbmu24112_config, i2c); | ||
585 | if (fc->fe != NULL) { | ||
586 | ops = &fc->fe->ops; | ||
587 | |||
588 | ops->tuner_ops.set_params = samsung_tbmu24112_tuner_set_params; | ||
589 | |||
590 | ops->set_voltage = flexcop_set_voltage; | ||
591 | |||
592 | fc->fe_sleep = ops->sleep; | ||
593 | ops->sleep = flexcop_sleep; | ||
594 | |||
595 | fc->dev_type = FC_SKY_REV26; | ||
596 | goto fe_found; | ||
597 | } | ||
598 | |||
599 | /* try the air dvb-t (mt352/Samsung tdtc9251dh0(??)) */ | ||
600 | fc->fe = dvb_attach(mt352_attach, &samsung_tdtc9251dh0_config, i2c); | ||
601 | if (fc->fe != NULL) { | ||
602 | fc->dev_type = FC_AIR_DVBT; | ||
603 | fc->fe->ops.tuner_ops.calc_regs = samsung_tdtc9251dh0_calc_regs; | ||
604 | goto fe_found; | ||
605 | } | ||
606 | |||
607 | /* try the air atsc 2nd generation (nxt2002) */ | ||
608 | fc->fe = dvb_attach(nxt200x_attach, &samsung_tbmv_config, i2c); | ||
609 | if (fc->fe != NULL) { | ||
610 | fc->dev_type = FC_AIR_ATSC2; | ||
611 | dvb_attach(dvb_pll_attach, fc->fe, 0x61, NULL, DVB_PLL_SAMSUNG_TBMV); | ||
612 | goto fe_found; | ||
613 | } | ||
614 | |||
615 | fc->fe = dvb_attach(lgdt330x_attach, &air2pc_atsc_hd5000_config, i2c); | ||
616 | if (fc->fe != NULL) { | ||
617 | fc->dev_type = FC_AIR_ATSC3; | ||
618 | dvb_attach(simple_tuner_attach, fc->fe, i2c, 0x61, | ||
619 | TUNER_LG_TDVS_H06XF); | ||
620 | goto fe_found; | ||
621 | } | ||
622 | |||
623 | /* try the air atsc 1nd generation (bcm3510)/panasonic ct10s */ | ||
624 | fc->fe = dvb_attach(bcm3510_attach, &air2pc_atsc_first_gen_config, i2c); | ||
625 | if (fc->fe != NULL) { | ||
626 | fc->dev_type = FC_AIR_ATSC1; | ||
627 | goto fe_found; | ||
628 | } | ||
629 | |||
630 | /* try the cable dvb (stv0297) */ | ||
631 | fc->fc_i2c_adap[0].no_base_addr = 1; | 691 | fc->fc_i2c_adap[0].no_base_addr = 1; |
632 | fc->fe = dvb_attach(stv0297_attach, &alps_tdee4_stv0297_config, i2c); | 692 | fc->fe = dvb_attach(stv0297_attach, &alps_tdee4_stv0297_config, i2c); |
633 | if (fc->fe != NULL) { | 693 | if (!fc->fe) { |
634 | fc->dev_type = FC_CABLE; | 694 | /* Reset for next frontend to try */ |
635 | fc->fe->ops.tuner_ops.set_params = alps_tdee4_stv0297_tuner_set_params; | 695 | fc->fc_i2c_adap[0].no_base_addr = 0; |
636 | goto fe_found; | 696 | return 0; |
637 | } | 697 | } |
638 | fc->fc_i2c_adap[0].no_base_addr = 0; | 698 | fc->fe->ops.tuner_ops.set_params = alps_tdee4_stv0297_tuner_set_params; |
639 | 699 | return 1; | |
640 | /* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */ | 700 | } |
641 | fc->fe = dvb_attach(mt312_attach, | 701 | #endif |
642 | &skystar23_samsung_tbdu18132_config, i2c); | 702 | |
643 | if (fc->fe != NULL) { | 703 | static struct { |
644 | ops = &fc->fe->ops; | 704 | flexcop_device_type_t type; |
645 | 705 | int (*attach)(struct flexcop_device *, struct i2c_adapter *); | |
646 | ops->tuner_ops.set_params = skystar23_samsung_tbdu18132_tuner_set_params; | 706 | } flexcop_frontends[] = { |
647 | 707 | #if defined(CONFIG_DVB_S5H1420_MODULE) | |
648 | ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd; | 708 | { FC_SKY_REV27, skystar2_rev27_attach }, |
649 | ops->diseqc_send_burst = flexcop_diseqc_send_burst; | 709 | #endif |
650 | ops->set_tone = flexcop_set_tone; | 710 | #if defined(CONFIG_DVB_CX24123_MODULE) |
651 | ops->set_voltage = flexcop_set_voltage; | 711 | { FC_SKY_REV28, skystar2_rev28_attach }, |
652 | 712 | #endif | |
653 | fc->fe_sleep = ops->sleep; | 713 | #if defined(CONFIG_DVB_STV0299_MODULE) |
654 | ops->sleep = flexcop_sleep; | 714 | { FC_SKY_REV26, skystar2_rev26_attach }, |
715 | #endif | ||
716 | #if defined(CONFIG_DVB_MT352_MODULE) | ||
717 | { FC_AIR_DVBT, airstar_dvbt_attach }, | ||
718 | #endif | ||
719 | #if defined(CONFIG_DVB_NXT200X_MODULE) | ||
720 | { FC_AIR_ATSC2, airstar_atsc2_attach }, | ||
721 | #endif | ||
722 | #if defined(CONFIG_DVB_LGDT330X_MODULE) | ||
723 | { FC_AIR_ATSC3, airstar_atsc3_attach }, | ||
724 | #endif | ||
725 | #if defined(CONFIG_DVB_BCM3510_MODULE) | ||
726 | { FC_AIR_ATSC1, airstar_atsc1_attach }, | ||
727 | #endif | ||
728 | #if defined(CONFIG_DVB_STV0297_MODULE) | ||
729 | { FC_CABLE, cablestar2_attach }, | ||
730 | #endif | ||
731 | #if defined(CONFIG_DVB_MT312_MODULE) | ||
732 | { FC_SKY_REV23, skystar2_rev23_attach }, | ||
733 | #endif | ||
734 | }; | ||
655 | 735 | ||
656 | fc->dev_type = FC_SKY_REV23; | 736 | /* try to figure out the frontend */ |
657 | goto fe_found; | 737 | int flexcop_frontend_init(struct flexcop_device *fc) |
738 | { | ||
739 | int i; | ||
740 | for (i = 0; i < ARRAY_SIZE(flexcop_frontends); i++) { | ||
741 | /* type needs to be set before, because of some workarounds | ||
742 | * done based on the probed card type */ | ||
743 | fc->dev_type = flexcop_frontends[i].type; | ||
744 | if (flexcop_frontends[i].attach(fc, &fc->fc_i2c_adap[0].i2c_adap)) | ||
745 | goto fe_found; | ||
746 | /* Clean up partially attached frontend */ | ||
747 | if (fc->fe) { | ||
748 | dvb_frontend_detach(fc->fe); | ||
749 | fc->fe = NULL; | ||
750 | } | ||
658 | } | 751 | } |
659 | 752 | fc->dev_type = FC_UNK; | |
660 | err("no frontend driver found for this B2C2/FlexCop adapter"); | 753 | err("no frontend driver found for this B2C2/FlexCop adapter"); |
661 | return -ENODEV; | 754 | return -ENODEV; |
662 | 755 | ||
@@ -664,9 +757,7 @@ fe_found: | |||
664 | info("found '%s' .", fc->fe->ops.info.name); | 757 | info("found '%s' .", fc->fe->ops.info.name); |
665 | if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) { | 758 | if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) { |
666 | err("frontend registration failed!"); | 759 | err("frontend registration failed!"); |
667 | ops = &fc->fe->ops; | 760 | dvb_frontend_detach(fc->fe); |
668 | if (ops->release != NULL) | ||
669 | ops->release(fc->fe); | ||
670 | fc->fe = NULL; | 761 | fc->fe = NULL; |
671 | return -EINVAL; | 762 | return -EINVAL; |
672 | } | 763 | } |
@@ -680,6 +771,5 @@ void flexcop_frontend_exit(struct flexcop_device *fc) | |||
680 | dvb_unregister_frontend(fc->fe); | 771 | dvb_unregister_frontend(fc->fe); |
681 | dvb_frontend_detach(fc->fe); | 772 | dvb_frontend_detach(fc->fe); |
682 | } | 773 | } |
683 | |||
684 | fc->init_state &= ~FC_STATE_FE_INIT; | 774 | fc->init_state &= ~FC_STATE_FE_INIT; |
685 | } | 775 | } |
diff --git a/drivers/media/dvb/b2c2/flexcop-i2c.c b/drivers/media/dvb/b2c2/flexcop-i2c.c index e2bed5076485..fd1df2352764 100644 --- a/drivers/media/dvb/b2c2/flexcop-i2c.c +++ b/drivers/media/dvb/b2c2/flexcop-i2c.c | |||
@@ -200,7 +200,7 @@ static int flexcop_master_xfer(struct i2c_adapter *i2c_adap, | |||
200 | msgs[i].buf[0], &msgs[i].buf[1], | 200 | msgs[i].buf[0], &msgs[i].buf[1], |
201 | msgs[i].len - 1); | 201 | msgs[i].len - 1); |
202 | if (ret < 0) { | 202 | if (ret < 0) { |
203 | err("i2c master_xfer failed"); | 203 | deb_i2c("i2c master_xfer failed"); |
204 | break; | 204 | break; |
205 | } | 205 | } |
206 | } | 206 | } |
diff --git a/drivers/media/dvb/b2c2/flexcop-misc.c b/drivers/media/dvb/b2c2/flexcop-misc.c index e56627d2f0f4..f06f3a9070f5 100644 --- a/drivers/media/dvb/b2c2/flexcop-misc.c +++ b/drivers/media/dvb/b2c2/flexcop-misc.c | |||
@@ -46,16 +46,16 @@ static const char *flexcop_revision_names[] = { | |||
46 | }; | 46 | }; |
47 | 47 | ||
48 | static const char *flexcop_device_names[] = { | 48 | static const char *flexcop_device_names[] = { |
49 | "Unknown device", | 49 | [FC_UNK] = "Unknown device", |
50 | "Air2PC/AirStar 2 DVB-T", | 50 | [FC_CABLE] = "Cable2PC/CableStar 2 DVB-C", |
51 | "Air2PC/AirStar 2 ATSC 1st generation", | 51 | [FC_AIR_DVBT] = "Air2PC/AirStar 2 DVB-T", |
52 | "Air2PC/AirStar 2 ATSC 2nd generation", | 52 | [FC_AIR_ATSC1] = "Air2PC/AirStar 2 ATSC 1st generation", |
53 | "Sky2PC/SkyStar 2 DVB-S", | 53 | [FC_AIR_ATSC2] = "Air2PC/AirStar 2 ATSC 2nd generation", |
54 | "Sky2PC/SkyStar 2 DVB-S (old version)", | 54 | [FC_AIR_ATSC3] = "Air2PC/AirStar 2 ATSC 3rd generation (HD5000)", |
55 | "Cable2PC/CableStar 2 DVB-C", | 55 | [FC_SKY_REV23] = "Sky2PC/SkyStar 2 DVB-S rev 2.3 (old version)", |
56 | "Air2PC/AirStar 2 ATSC 3rd generation (HD5000)", | 56 | [FC_SKY_REV26] = "Sky2PC/SkyStar 2 DVB-S rev 2.6", |
57 | "Sky2PC/SkyStar 2 DVB-S rev 2.7a/u", | 57 | [FC_SKY_REV27] = "Sky2PC/SkyStar 2 DVB-S rev 2.7a/u", |
58 | "Sky2PC/SkyStar 2 DVB-S rev 2.8", | 58 | [FC_SKY_REV28] = "Sky2PC/SkyStar 2 DVB-S rev 2.8", |
59 | }; | 59 | }; |
60 | 60 | ||
61 | static const char *flexcop_bus_names[] = { | 61 | static const char *flexcop_bus_names[] = { |
diff --git a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c index 56d8fab688bb..a24c125331f0 100644 --- a/drivers/media/dvb/bt8xx/bt878.c +++ b/drivers/media/dvb/bt8xx/bt878.c | |||
@@ -508,12 +508,6 @@ static int __devinit bt878_probe(struct pci_dev *dev, | |||
508 | pci_set_master(dev); | 508 | pci_set_master(dev); |
509 | pci_set_drvdata(dev, bt); | 509 | pci_set_drvdata(dev, bt); |
510 | 510 | ||
511 | /* if(init_bt878(btv) < 0) { | ||
512 | bt878_remove(dev); | ||
513 | return -EIO; | ||
514 | } | ||
515 | */ | ||
516 | |||
517 | if ((result = bt878_mem_alloc(bt))) { | 511 | if ((result = bt878_mem_alloc(bt))) { |
518 | printk(KERN_ERR "bt878: failed to allocate memory!\n"); | 512 | printk(KERN_ERR "bt878: failed to allocate memory!\n"); |
519 | goto fail2; | 513 | goto fail2; |
@@ -579,7 +573,7 @@ static struct pci_driver bt878_pci_driver = { | |||
579 | .name = "bt878", | 573 | .name = "bt878", |
580 | .id_table = bt878_pci_tbl, | 574 | .id_table = bt878_pci_tbl, |
581 | .probe = bt878_probe, | 575 | .probe = bt878_probe, |
582 | .remove = bt878_remove, | 576 | .remove = __devexit_p(bt878_remove), |
583 | }; | 577 | }; |
584 | 578 | ||
585 | static int bt878_pci_driver_registered; | 579 | static int bt878_pci_driver_registered; |
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c index 971a8b18f6dd..4dbd7d4185af 100644 --- a/drivers/media/dvb/dm1105/dm1105.c +++ b/drivers/media/dvb/dm1105/dm1105.c | |||
@@ -51,6 +51,9 @@ | |||
51 | #ifndef PCI_VENDOR_ID_TRIGEM | 51 | #ifndef PCI_VENDOR_ID_TRIGEM |
52 | #define PCI_VENDOR_ID_TRIGEM 0x109f | 52 | #define PCI_VENDOR_ID_TRIGEM 0x109f |
53 | #endif | 53 | #endif |
54 | #ifndef PCI_VENDOR_ID_AXESS | ||
55 | #define PCI_VENDOR_ID_AXESS 0x195d | ||
56 | #endif | ||
54 | #ifndef PCI_DEVICE_ID_DM1105 | 57 | #ifndef PCI_DEVICE_ID_DM1105 |
55 | #define PCI_DEVICE_ID_DM1105 0x036f | 58 | #define PCI_DEVICE_ID_DM1105 0x036f |
56 | #endif | 59 | #endif |
@@ -60,6 +63,9 @@ | |||
60 | #ifndef PCI_DEVICE_ID_DW2004 | 63 | #ifndef PCI_DEVICE_ID_DW2004 |
61 | #define PCI_DEVICE_ID_DW2004 0x2004 | 64 | #define PCI_DEVICE_ID_DW2004 0x2004 |
62 | #endif | 65 | #endif |
66 | #ifndef PCI_DEVICE_ID_DM05 | ||
67 | #define PCI_DEVICE_ID_DM05 0x1105 | ||
68 | #endif | ||
63 | /* ----------------------------------------------- */ | 69 | /* ----------------------------------------------- */ |
64 | /* sdmc dm1105 registers */ | 70 | /* sdmc dm1105 registers */ |
65 | 71 | ||
@@ -150,6 +156,11 @@ | |||
150 | #define DM1105_LNB_13V 0x00010100 | 156 | #define DM1105_LNB_13V 0x00010100 |
151 | #define DM1105_LNB_18V 0x00000100 | 157 | #define DM1105_LNB_18V 0x00000100 |
152 | 158 | ||
159 | /* GPIO's for LNB power control for Axess DM05 */ | ||
160 | #define DM05_LNB_MASK 0x00000000 | ||
161 | #define DM05_LNB_13V 0x00020000 | ||
162 | #define DM05_LNB_18V 0x00030000 | ||
163 | |||
153 | static int ir_debug; | 164 | static int ir_debug; |
154 | module_param(ir_debug, int, 0644); | 165 | module_param(ir_debug, int, 0644); |
155 | MODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding"); | 166 | MODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding"); |
@@ -188,6 +199,8 @@ struct dm1105dvb { | |||
188 | 199 | ||
189 | /* irq */ | 200 | /* irq */ |
190 | struct work_struct work; | 201 | struct work_struct work; |
202 | struct workqueue_struct *wq; | ||
203 | char wqn[16]; | ||
191 | 204 | ||
192 | /* dma */ | 205 | /* dma */ |
193 | dma_addr_t dma_addr; | 206 | dma_addr_t dma_addr; |
@@ -313,15 +326,25 @@ static inline struct dm1105dvb *frontend_to_dm1105dvb(struct dvb_frontend *fe) | |||
313 | static int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | 326 | static int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) |
314 | { | 327 | { |
315 | struct dm1105dvb *dm1105dvb = frontend_to_dm1105dvb(fe); | 328 | struct dm1105dvb *dm1105dvb = frontend_to_dm1105dvb(fe); |
329 | u32 lnb_mask, lnb_13v, lnb_18v; | ||
316 | 330 | ||
317 | if (voltage == SEC_VOLTAGE_18) { | 331 | switch (dm1105dvb->pdev->subsystem_device) { |
318 | outl(DM1105_LNB_MASK, dm_io_mem(DM1105_GPIOCTR)); | 332 | case PCI_DEVICE_ID_DM05: |
319 | outl(DM1105_LNB_18V, dm_io_mem(DM1105_GPIOVAL)); | 333 | lnb_mask = DM05_LNB_MASK; |
320 | } else { | 334 | lnb_13v = DM05_LNB_13V; |
321 | /*LNB ON-13V by default!*/ | 335 | lnb_18v = DM05_LNB_18V; |
322 | outl(DM1105_LNB_MASK, dm_io_mem(DM1105_GPIOCTR)); | 336 | break; |
323 | outl(DM1105_LNB_13V, dm_io_mem(DM1105_GPIOVAL)); | 337 | default: |
324 | } | 338 | lnb_mask = DM1105_LNB_MASK; |
339 | lnb_13v = DM1105_LNB_13V; | ||
340 | lnb_18v = DM1105_LNB_18V; | ||
341 | } | ||
342 | |||
343 | outl(lnb_mask, dm_io_mem(DM1105_GPIOCTR)); | ||
344 | if (voltage == SEC_VOLTAGE_18) | ||
345 | outl(lnb_18v , dm_io_mem(DM1105_GPIOVAL)); | ||
346 | else | ||
347 | outl(lnb_13v, dm_io_mem(DM1105_GPIOVAL)); | ||
325 | 348 | ||
326 | return 0; | 349 | return 0; |
327 | } | 350 | } |
@@ -440,7 +463,7 @@ static irqreturn_t dm1105dvb_irq(int irq, void *dev_id) | |||
440 | case (INTSTS_TSIRQ | INTSTS_IR): | 463 | case (INTSTS_TSIRQ | INTSTS_IR): |
441 | dm1105dvb->nextwrp = inl(dm_io_mem(DM1105_WRP)) - | 464 | dm1105dvb->nextwrp = inl(dm_io_mem(DM1105_WRP)) - |
442 | inl(dm_io_mem(DM1105_STADR)); | 465 | inl(dm_io_mem(DM1105_STADR)); |
443 | schedule_work(&dm1105dvb->work); | 466 | queue_work(dm1105dvb->wq, &dm1105dvb->work); |
444 | break; | 467 | break; |
445 | case INTSTS_IR: | 468 | case INTSTS_IR: |
446 | dm1105dvb->ir.ir_command = inl(dm_io_mem(DM1105_IRCODE)); | 469 | dm1105dvb->ir.ir_command = inl(dm_io_mem(DM1105_IRCODE)); |
@@ -567,46 +590,44 @@ static int __devinit frontend_init(struct dm1105dvb *dm1105dvb) | |||
567 | int ret; | 590 | int ret; |
568 | 591 | ||
569 | switch (dm1105dvb->pdev->subsystem_device) { | 592 | switch (dm1105dvb->pdev->subsystem_device) { |
570 | case PCI_DEVICE_ID_DW2002: | 593 | case PCI_DEVICE_ID_DW2004: |
571 | dm1105dvb->fe = dvb_attach( | 594 | dm1105dvb->fe = dvb_attach( |
572 | stv0299_attach, &sharp_z0194a_config, | 595 | cx24116_attach, &serit_sp2633_config, |
573 | &dm1105dvb->i2c_adap); | 596 | &dm1105dvb->i2c_adap); |
597 | if (dm1105dvb->fe) | ||
598 | dm1105dvb->fe->ops.set_voltage = dm1105dvb_set_voltage; | ||
574 | 599 | ||
600 | break; | ||
601 | default: | ||
602 | dm1105dvb->fe = dvb_attach( | ||
603 | stv0299_attach, &sharp_z0194a_config, | ||
604 | &dm1105dvb->i2c_adap); | ||
575 | if (dm1105dvb->fe) { | 605 | if (dm1105dvb->fe) { |
576 | dm1105dvb->fe->ops.set_voltage = | 606 | dm1105dvb->fe->ops.set_voltage = |
577 | dm1105dvb_set_voltage; | 607 | dm1105dvb_set_voltage; |
578 | dvb_attach(dvb_pll_attach, dm1105dvb->fe, 0x60, | 608 | dvb_attach(dvb_pll_attach, dm1105dvb->fe, 0x60, |
579 | &dm1105dvb->i2c_adap, DVB_PLL_OPERA1); | 609 | &dm1105dvb->i2c_adap, DVB_PLL_OPERA1); |
610 | break; | ||
580 | } | 611 | } |
581 | 612 | ||
582 | if (!dm1105dvb->fe) { | 613 | dm1105dvb->fe = dvb_attach( |
583 | dm1105dvb->fe = dvb_attach( | 614 | stv0288_attach, &earda_config, |
584 | stv0288_attach, &earda_config, | 615 | &dm1105dvb->i2c_adap); |
585 | &dm1105dvb->i2c_adap); | 616 | if (dm1105dvb->fe) { |
586 | if (dm1105dvb->fe) { | 617 | dm1105dvb->fe->ops.set_voltage = |
587 | dm1105dvb->fe->ops.set_voltage = | 618 | dm1105dvb_set_voltage; |
588 | dm1105dvb_set_voltage; | 619 | dvb_attach(stb6000_attach, dm1105dvb->fe, 0x61, |
589 | dvb_attach(stb6000_attach, dm1105dvb->fe, 0x61, | 620 | &dm1105dvb->i2c_adap); |
590 | &dm1105dvb->i2c_adap); | 621 | break; |
591 | } | ||
592 | } | 622 | } |
593 | 623 | ||
594 | if (!dm1105dvb->fe) { | ||
595 | dm1105dvb->fe = dvb_attach( | ||
596 | si21xx_attach, &serit_config, | ||
597 | &dm1105dvb->i2c_adap); | ||
598 | if (dm1105dvb->fe) | ||
599 | dm1105dvb->fe->ops.set_voltage = | ||
600 | dm1105dvb_set_voltage; | ||
601 | } | ||
602 | break; | ||
603 | case PCI_DEVICE_ID_DW2004: | ||
604 | dm1105dvb->fe = dvb_attach( | 624 | dm1105dvb->fe = dvb_attach( |
605 | cx24116_attach, &serit_sp2633_config, | 625 | si21xx_attach, &serit_config, |
606 | &dm1105dvb->i2c_adap); | 626 | &dm1105dvb->i2c_adap); |
607 | if (dm1105dvb->fe) | 627 | if (dm1105dvb->fe) |
608 | dm1105dvb->fe->ops.set_voltage = dm1105dvb_set_voltage; | 628 | dm1105dvb->fe->ops.set_voltage = |
609 | break; | 629 | dm1105dvb_set_voltage; |
630 | |||
610 | } | 631 | } |
611 | 632 | ||
612 | if (!dm1105dvb->fe) { | 633 | if (!dm1105dvb->fe) { |
@@ -630,10 +651,17 @@ static void __devinit dm1105dvb_read_mac(struct dm1105dvb *dm1105dvb, u8 *mac) | |||
630 | static u8 command[1] = { 0x28 }; | 651 | static u8 command[1] = { 0x28 }; |
631 | 652 | ||
632 | struct i2c_msg msg[] = { | 653 | struct i2c_msg msg[] = { |
633 | { .addr = IIC_24C01_addr >> 1, .flags = 0, | 654 | { |
634 | .buf = command, .len = 1 }, | 655 | .addr = IIC_24C01_addr >> 1, |
635 | { .addr = IIC_24C01_addr >> 1, .flags = I2C_M_RD, | 656 | .flags = 0, |
636 | .buf = mac, .len = 6 }, | 657 | .buf = command, |
658 | .len = 1 | ||
659 | }, { | ||
660 | .addr = IIC_24C01_addr >> 1, | ||
661 | .flags = I2C_M_RD, | ||
662 | .buf = mac, | ||
663 | .len = 6 | ||
664 | }, | ||
637 | }; | 665 | }; |
638 | 666 | ||
639 | dm1105_i2c_xfer(&dm1105dvb->i2c_adap, msg , 2); | 667 | dm1105_i2c_xfer(&dm1105dvb->i2c_adap, msg , 2); |
@@ -752,14 +780,22 @@ static int __devinit dm1105_probe(struct pci_dev *pdev, | |||
752 | dm1105_ir_init(dm1105dvb); | 780 | dm1105_ir_init(dm1105dvb); |
753 | 781 | ||
754 | INIT_WORK(&dm1105dvb->work, dm1105_dmx_buffer); | 782 | INIT_WORK(&dm1105dvb->work, dm1105_dmx_buffer); |
783 | sprintf(dm1105dvb->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num); | ||
784 | dm1105dvb->wq = create_singlethread_workqueue(dm1105dvb->wqn); | ||
785 | if (!dm1105dvb->wq) | ||
786 | goto err_dvb_net; | ||
755 | 787 | ||
756 | ret = request_irq(pdev->irq, dm1105dvb_irq, IRQF_SHARED, | 788 | ret = request_irq(pdev->irq, dm1105dvb_irq, IRQF_SHARED, |
757 | DRIVER_NAME, dm1105dvb); | 789 | DRIVER_NAME, dm1105dvb); |
758 | if (ret < 0) | 790 | if (ret < 0) |
759 | goto err_free_irq; | 791 | goto err_workqueue; |
760 | 792 | ||
761 | return 0; | 793 | return 0; |
762 | 794 | ||
795 | err_workqueue: | ||
796 | destroy_workqueue(dm1105dvb->wq); | ||
797 | err_dvb_net: | ||
798 | dvb_net_release(&dm1105dvb->dvbnet); | ||
763 | err_disconnect_frontend: | 799 | err_disconnect_frontend: |
764 | dmx->disconnect_frontend(dmx); | 800 | dmx->disconnect_frontend(dmx); |
765 | err_remove_mem_frontend: | 801 | err_remove_mem_frontend: |
@@ -776,8 +812,6 @@ err_i2c_del_adapter: | |||
776 | i2c_del_adapter(&dm1105dvb->i2c_adap); | 812 | i2c_del_adapter(&dm1105dvb->i2c_adap); |
777 | err_dm1105dvb_hw_exit: | 813 | err_dm1105dvb_hw_exit: |
778 | dm1105dvb_hw_exit(dm1105dvb); | 814 | dm1105dvb_hw_exit(dm1105dvb); |
779 | err_free_irq: | ||
780 | free_irq(pdev->irq, dm1105dvb); | ||
781 | err_pci_iounmap: | 815 | err_pci_iounmap: |
782 | pci_iounmap(pdev, dm1105dvb->io_mem); | 816 | pci_iounmap(pdev, dm1105dvb->io_mem); |
783 | err_pci_release_regions: | 817 | err_pci_release_regions: |
@@ -834,6 +868,11 @@ static struct pci_device_id dm1105_id_table[] __devinitdata = { | |||
834 | .subvendor = PCI_ANY_ID, | 868 | .subvendor = PCI_ANY_ID, |
835 | .subdevice = PCI_DEVICE_ID_DW2004, | 869 | .subdevice = PCI_DEVICE_ID_DW2004, |
836 | }, { | 870 | }, { |
871 | .vendor = PCI_VENDOR_ID_AXESS, | ||
872 | .device = PCI_DEVICE_ID_DM05, | ||
873 | .subvendor = PCI_VENDOR_ID_AXESS, | ||
874 | .subdevice = PCI_DEVICE_ID_DM05, | ||
875 | }, { | ||
837 | /* empty */ | 876 | /* empty */ |
838 | }, | 877 | }, |
839 | }; | 878 | }; |
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index c35fbb8d8f4a..6d6121eb5d59 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c | |||
@@ -244,19 +244,13 @@ static ssize_t dvb_dvr_read(struct file *file, char __user *buf, size_t count, | |||
244 | { | 244 | { |
245 | struct dvb_device *dvbdev = file->private_data; | 245 | struct dvb_device *dvbdev = file->private_data; |
246 | struct dmxdev *dmxdev = dvbdev->priv; | 246 | struct dmxdev *dmxdev = dvbdev->priv; |
247 | int ret; | ||
248 | 247 | ||
249 | if (dmxdev->exit) { | 248 | if (dmxdev->exit) |
250 | mutex_unlock(&dmxdev->mutex); | ||
251 | return -ENODEV; | 249 | return -ENODEV; |
252 | } | ||
253 | 250 | ||
254 | //mutex_lock(&dmxdev->mutex); | 251 | return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, |
255 | ret = dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, | 252 | file->f_flags & O_NONBLOCK, |
256 | file->f_flags & O_NONBLOCK, | 253 | buf, count, ppos); |
257 | buf, count, ppos); | ||
258 | //mutex_unlock(&dmxdev->mutex); | ||
259 | return ret; | ||
260 | } | 254 | } |
261 | 255 | ||
262 | static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev, | 256 | static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev, |
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c index e2eca0b1fe7c..cfe2768d24af 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.c +++ b/drivers/media/dvb/dvb-core/dvb_demux.c | |||
@@ -38,6 +38,16 @@ | |||
38 | */ | 38 | */ |
39 | // #define DVB_DEMUX_SECTION_LOSS_LOG | 39 | // #define DVB_DEMUX_SECTION_LOSS_LOG |
40 | 40 | ||
41 | static int dvb_demux_tscheck; | ||
42 | module_param(dvb_demux_tscheck, int, 0644); | ||
43 | MODULE_PARM_DESC(dvb_demux_tscheck, | ||
44 | "enable transport stream continuity and TEI check"); | ||
45 | |||
46 | #define dprintk_tscheck(x...) do { \ | ||
47 | if (dvb_demux_tscheck && printk_ratelimit()) \ | ||
48 | printk(x); \ | ||
49 | } while (0) | ||
50 | |||
41 | /****************************************************************************** | 51 | /****************************************************************************** |
42 | * static inlined helper functions | 52 | * static inlined helper functions |
43 | ******************************************************************************/ | 53 | ******************************************************************************/ |
@@ -376,6 +386,36 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
376 | u16 pid = ts_pid(buf); | 386 | u16 pid = ts_pid(buf); |
377 | int dvr_done = 0; | 387 | int dvr_done = 0; |
378 | 388 | ||
389 | if (dvb_demux_tscheck) { | ||
390 | if (!demux->cnt_storage) | ||
391 | demux->cnt_storage = vmalloc(MAX_PID + 1); | ||
392 | |||
393 | if (!demux->cnt_storage) { | ||
394 | printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n"); | ||
395 | dvb_demux_tscheck = 0; | ||
396 | goto no_dvb_demux_tscheck; | ||
397 | } | ||
398 | |||
399 | /* check pkt counter */ | ||
400 | if (pid < MAX_PID) { | ||
401 | if (buf[1] & 0x80) | ||
402 | dprintk_tscheck("TEI detected. " | ||
403 | "PID=0x%x data1=0x%x\n", | ||
404 | pid, buf[1]); | ||
405 | |||
406 | if ((buf[3] & 0xf) != demux->cnt_storage[pid]) | ||
407 | dprintk_tscheck("TS packet counter mismatch. " | ||
408 | "PID=0x%x expected 0x%x " | ||
409 | "got 0x%x\n", | ||
410 | pid, demux->cnt_storage[pid], | ||
411 | buf[3] & 0xf); | ||
412 | |||
413 | demux->cnt_storage[pid] = ((buf[3] & 0xf) + 1)&0xf; | ||
414 | }; | ||
415 | /* end check */ | ||
416 | }; | ||
417 | no_dvb_demux_tscheck: | ||
418 | |||
379 | list_for_each_entry(feed, &demux->feed_list, list_head) { | 419 | list_for_each_entry(feed, &demux->feed_list, list_head) { |
380 | if ((feed->pid != pid) && (feed->pid != 0x2000)) | 420 | if ((feed->pid != pid) && (feed->pid != 0x2000)) |
381 | continue; | 421 | continue; |
@@ -1160,6 +1200,7 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux) | |||
1160 | int i; | 1200 | int i; |
1161 | struct dmx_demux *dmx = &dvbdemux->dmx; | 1201 | struct dmx_demux *dmx = &dvbdemux->dmx; |
1162 | 1202 | ||
1203 | dvbdemux->cnt_storage = NULL; | ||
1163 | dvbdemux->users = 0; | 1204 | dvbdemux->users = 0; |
1164 | dvbdemux->filter = vmalloc(dvbdemux->filternum * sizeof(struct dvb_demux_filter)); | 1205 | dvbdemux->filter = vmalloc(dvbdemux->filternum * sizeof(struct dvb_demux_filter)); |
1165 | 1206 | ||
@@ -1226,6 +1267,7 @@ EXPORT_SYMBOL(dvb_dmx_init); | |||
1226 | 1267 | ||
1227 | void dvb_dmx_release(struct dvb_demux *dvbdemux) | 1268 | void dvb_dmx_release(struct dvb_demux *dvbdemux) |
1228 | { | 1269 | { |
1270 | vfree(dvbdemux->cnt_storage); | ||
1229 | vfree(dvbdemux->filter); | 1271 | vfree(dvbdemux->filter); |
1230 | vfree(dvbdemux->feed); | 1272 | vfree(dvbdemux->feed); |
1231 | } | 1273 | } |
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h index 2c5f915329ca..2fe05d03240d 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.h +++ b/drivers/media/dvb/dvb-core/dvb_demux.h | |||
@@ -42,6 +42,8 @@ | |||
42 | 42 | ||
43 | #define DVB_DEMUX_MASK_MAX 18 | 43 | #define DVB_DEMUX_MASK_MAX 18 |
44 | 44 | ||
45 | #define MAX_PID 0x1fff | ||
46 | |||
45 | struct dvb_demux_filter { | 47 | struct dvb_demux_filter { |
46 | struct dmx_section_filter filter; | 48 | struct dmx_section_filter filter; |
47 | u8 maskandmode[DMX_MAX_FILTER_SIZE]; | 49 | u8 maskandmode[DMX_MAX_FILTER_SIZE]; |
@@ -127,6 +129,8 @@ struct dvb_demux { | |||
127 | 129 | ||
128 | struct mutex mutex; | 130 | struct mutex mutex; |
129 | spinlock_t lock; | 131 | spinlock_t lock; |
132 | |||
133 | uint8_t *cnt_storage; /* for TS continuity check */ | ||
130 | }; | 134 | }; |
131 | 135 | ||
132 | int dvb_dmx_init(struct dvb_demux *dvbdemux); | 136 | int dvb_dmx_init(struct dvb_demux *dvbdemux); |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index ebc78157b9b8..f50ca7292a7d 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
@@ -543,6 +543,7 @@ restart: | |||
543 | 543 | ||
544 | if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) { | 544 | if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) { |
545 | /* got signal or quitting */ | 545 | /* got signal or quitting */ |
546 | fepriv->exit = 1; | ||
546 | break; | 547 | break; |
547 | } | 548 | } |
548 | 549 | ||
@@ -656,6 +657,7 @@ restart: | |||
656 | } | 657 | } |
657 | 658 | ||
658 | fepriv->thread = NULL; | 659 | fepriv->thread = NULL; |
660 | fepriv->exit = 0; | ||
659 | mb(); | 661 | mb(); |
660 | 662 | ||
661 | dvb_frontend_wakeup(fe); | 663 | dvb_frontend_wakeup(fe); |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 1bb66e1ed5a7..496c1a37034c 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
@@ -261,6 +261,7 @@ config DVB_USB_DW2102 | |||
261 | select DVB_STB6000 if !DVB_FE_CUSTOMISE | 261 | select DVB_STB6000 if !DVB_FE_CUSTOMISE |
262 | select DVB_CX24116 if !DVB_FE_CUSTOMISE | 262 | select DVB_CX24116 if !DVB_FE_CUSTOMISE |
263 | select DVB_SI21XX if !DVB_FE_CUSTOMISE | 263 | select DVB_SI21XX if !DVB_FE_CUSTOMISE |
264 | select DVB_TDA10021 if !DVB_FE_CUSTOMISE | ||
264 | help | 265 | help |
265 | Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers | 266 | Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers |
266 | and the TeVii S650. | 267 | and the TeVii S650. |
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 53bfc8e42fb9..4cb31e7c13c2 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
@@ -40,7 +40,7 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | |||
40 | static DEFINE_MUTEX(af9015_usb_mutex); | 40 | static DEFINE_MUTEX(af9015_usb_mutex); |
41 | 41 | ||
42 | static struct af9015_config af9015_config; | 42 | static struct af9015_config af9015_config; |
43 | static struct dvb_usb_device_properties af9015_properties[2]; | 43 | static struct dvb_usb_device_properties af9015_properties[3]; |
44 | static int af9015_properties_count = ARRAY_SIZE(af9015_properties); | 44 | static int af9015_properties_count = ARRAY_SIZE(af9015_properties); |
45 | 45 | ||
46 | static struct af9013_config af9015_af9013_config[] = { | 46 | static struct af9013_config af9015_af9013_config[] = { |
@@ -538,7 +538,7 @@ exit: | |||
538 | /* dump eeprom */ | 538 | /* dump eeprom */ |
539 | static int af9015_eeprom_dump(struct dvb_usb_device *d) | 539 | static int af9015_eeprom_dump(struct dvb_usb_device *d) |
540 | { | 540 | { |
541 | char buf[52], buf2[4]; | 541 | char buf[4+3*16+1], buf2[4]; |
542 | u8 reg, val; | 542 | u8 reg, val; |
543 | 543 | ||
544 | for (reg = 0; ; reg++) { | 544 | for (reg = 0; ; reg++) { |
@@ -1261,7 +1261,11 @@ static struct usb_device_id af9015_usb_table[] = { | |||
1261 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)}, | 1261 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)}, |
1262 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)}, | 1262 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)}, |
1263 | {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)}, | 1263 | {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)}, |
1264 | {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)}, | 1264 | /* 20 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)}, |
1265 | {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)}, | ||
1266 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)}, | ||
1267 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)}, | ||
1268 | {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)}, | ||
1265 | {0}, | 1269 | {0}, |
1266 | }; | 1270 | }; |
1267 | MODULE_DEVICE_TABLE(usb, af9015_usb_table); | 1271 | MODULE_DEVICE_TABLE(usb, af9015_usb_table); |
@@ -1321,7 +1325,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1321 | 1325 | ||
1322 | .i2c_algo = &af9015_i2c_algo, | 1326 | .i2c_algo = &af9015_i2c_algo, |
1323 | 1327 | ||
1324 | .num_device_descs = 9, | 1328 | .num_device_descs = 9, /* max 9 */ |
1325 | .devices = { | 1329 | .devices = { |
1326 | { | 1330 | { |
1327 | .name = "Afatech AF9015 DVB-T USB2.0 stick", | 1331 | .name = "Afatech AF9015 DVB-T USB2.0 stick", |
@@ -1426,7 +1430,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1426 | 1430 | ||
1427 | .i2c_algo = &af9015_i2c_algo, | 1431 | .i2c_algo = &af9015_i2c_algo, |
1428 | 1432 | ||
1429 | .num_device_descs = 9, | 1433 | .num_device_descs = 9, /* max 9 */ |
1430 | .devices = { | 1434 | .devices = { |
1431 | { | 1435 | { |
1432 | .name = "Xtensions XD-380", | 1436 | .name = "Xtensions XD-380", |
@@ -1478,7 +1482,85 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1478 | .warm_ids = {NULL}, | 1482 | .warm_ids = {NULL}, |
1479 | }, | 1483 | }, |
1480 | } | 1484 | } |
1481 | } | 1485 | }, { |
1486 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | ||
1487 | |||
1488 | .usb_ctrl = DEVICE_SPECIFIC, | ||
1489 | .download_firmware = af9015_download_firmware, | ||
1490 | .firmware = "dvb-usb-af9015.fw", | ||
1491 | .no_reconnect = 1, | ||
1492 | |||
1493 | .size_of_priv = sizeof(struct af9015_state), \ | ||
1494 | |||
1495 | .num_adapters = 2, | ||
1496 | .adapter = { | ||
1497 | { | ||
1498 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | | ||
1499 | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, | ||
1500 | |||
1501 | .pid_filter_count = 32, | ||
1502 | .pid_filter = af9015_pid_filter, | ||
1503 | .pid_filter_ctrl = af9015_pid_filter_ctrl, | ||
1504 | |||
1505 | .frontend_attach = | ||
1506 | af9015_af9013_frontend_attach, | ||
1507 | .tuner_attach = af9015_tuner_attach, | ||
1508 | .stream = { | ||
1509 | .type = USB_BULK, | ||
1510 | .count = 6, | ||
1511 | .endpoint = 0x84, | ||
1512 | }, | ||
1513 | }, | ||
1514 | { | ||
1515 | .frontend_attach = | ||
1516 | af9015_af9013_frontend_attach, | ||
1517 | .tuner_attach = af9015_tuner_attach, | ||
1518 | .stream = { | ||
1519 | .type = USB_BULK, | ||
1520 | .count = 6, | ||
1521 | .endpoint = 0x85, | ||
1522 | .u = { | ||
1523 | .bulk = { | ||
1524 | .buffersize = | ||
1525 | TS_USB20_MAX_PACKET_SIZE, | ||
1526 | } | ||
1527 | } | ||
1528 | }, | ||
1529 | } | ||
1530 | }, | ||
1531 | |||
1532 | .identify_state = af9015_identify_state, | ||
1533 | |||
1534 | .rc_query = af9015_rc_query, | ||
1535 | .rc_interval = 150, | ||
1536 | |||
1537 | .i2c_algo = &af9015_i2c_algo, | ||
1538 | |||
1539 | .num_device_descs = 4, /* max 9 */ | ||
1540 | .devices = { | ||
1541 | { | ||
1542 | .name = "AverMedia AVerTV Volar GPS 805 (A805)", | ||
1543 | .cold_ids = {&af9015_usb_table[21], NULL}, | ||
1544 | .warm_ids = {NULL}, | ||
1545 | }, | ||
1546 | { | ||
1547 | .name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \ | ||
1548 | "V3.0", | ||
1549 | .cold_ids = {&af9015_usb_table[22], NULL}, | ||
1550 | .warm_ids = {NULL}, | ||
1551 | }, | ||
1552 | { | ||
1553 | .name = "KWorld Digial MC-810", | ||
1554 | .cold_ids = {&af9015_usb_table[23], NULL}, | ||
1555 | .warm_ids = {NULL}, | ||
1556 | }, | ||
1557 | { | ||
1558 | .name = "Genius TVGo DVB-T03", | ||
1559 | .cold_ids = {&af9015_usb_table[24], NULL}, | ||
1560 | .warm_ids = {NULL}, | ||
1561 | }, | ||
1562 | } | ||
1563 | }, | ||
1482 | }; | 1564 | }; |
1483 | 1565 | ||
1484 | static int af9015_usb_probe(struct usb_interface *intf, | 1566 | static int af9015_usb_probe(struct usb_interface *intf, |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index 8ddbadf62194..818b2ab584bf 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | |||
@@ -1346,9 +1346,9 @@ static int dib0700_xc5000_tuner_callback(void *priv, int component, | |||
1346 | if (command == XC5000_TUNER_RESET) { | 1346 | if (command == XC5000_TUNER_RESET) { |
1347 | /* Reset the tuner */ | 1347 | /* Reset the tuner */ |
1348 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0); | 1348 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0); |
1349 | msleep(330); /* from Windows USB trace */ | 1349 | msleep(10); |
1350 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1); | 1350 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1); |
1351 | msleep(330); /* from Windows USB trace */ | 1351 | msleep(10); |
1352 | } else { | 1352 | } else { |
1353 | err("xc5000: unknown tuner callback command: %d\n", command); | 1353 | err("xc5000: unknown tuner callback command: %d\n", command); |
1354 | return -EINVAL; | 1354 | return -EINVAL; |
@@ -1493,6 +1493,10 @@ struct usb_device_id dib0700_usb_id_table[] = { | |||
1493 | { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) }, | 1493 | { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) }, |
1494 | { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) }, | 1494 | { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) }, |
1495 | { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) }, | 1495 | { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) }, |
1496 | /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) }, | ||
1497 | { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) }, | ||
1498 | { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) }, | ||
1499 | { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) }, | ||
1496 | { 0 } /* Terminating entry */ | 1500 | { 0 } /* Terminating entry */ |
1497 | }; | 1501 | }; |
1498 | MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); | 1502 | MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); |
@@ -1692,7 +1696,7 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1692 | }, | 1696 | }, |
1693 | }, | 1697 | }, |
1694 | 1698 | ||
1695 | .num_device_descs = 11, | 1699 | .num_device_descs = 12, |
1696 | .devices = { | 1700 | .devices = { |
1697 | { "DiBcom STK7070P reference design", | 1701 | { "DiBcom STK7070P reference design", |
1698 | { &dib0700_usb_id_table[15], NULL }, | 1702 | { &dib0700_usb_id_table[15], NULL }, |
@@ -1726,8 +1730,9 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1726 | { &dib0700_usb_id_table[30], NULL }, | 1730 | { &dib0700_usb_id_table[30], NULL }, |
1727 | { NULL }, | 1731 | { NULL }, |
1728 | }, | 1732 | }, |
1729 | { "Terratec Cinergy T USB XXS", | 1733 | { "Terratec Cinergy T USB XXS/ T3", |
1730 | { &dib0700_usb_id_table[33], NULL }, | 1734 | { &dib0700_usb_id_table[33], |
1735 | &dib0700_usb_id_table[52], NULL }, | ||
1731 | { NULL }, | 1736 | { NULL }, |
1732 | }, | 1737 | }, |
1733 | { "Elgato EyeTV DTT", | 1738 | { "Elgato EyeTV DTT", |
@@ -1738,6 +1743,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1738 | { &dib0700_usb_id_table[45], NULL }, | 1743 | { &dib0700_usb_id_table[45], NULL }, |
1739 | { NULL }, | 1744 | { NULL }, |
1740 | }, | 1745 | }, |
1746 | { "Elgato EyeTV Dtt Dlx PD378S", | ||
1747 | { &dib0700_usb_id_table[50], NULL }, | ||
1748 | { NULL }, | ||
1749 | }, | ||
1741 | }, | 1750 | }, |
1742 | 1751 | ||
1743 | .rc_interval = DEFAULT_RC_INTERVAL, | 1752 | .rc_interval = DEFAULT_RC_INTERVAL, |
@@ -1784,8 +1793,9 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1784 | { &dib0700_usb_id_table[36], NULL }, | 1793 | { &dib0700_usb_id_table[36], NULL }, |
1785 | { NULL }, | 1794 | { NULL }, |
1786 | }, | 1795 | }, |
1787 | { "Terratec Cinergy DT USB XS Diversity", | 1796 | { "Terratec Cinergy DT USB XS Diversity/ T5", |
1788 | { &dib0700_usb_id_table[43], NULL }, | 1797 | { &dib0700_usb_id_table[43], |
1798 | &dib0700_usb_id_table[53], NULL}, | ||
1789 | { NULL }, | 1799 | { NULL }, |
1790 | }, | 1800 | }, |
1791 | { "Sony PlayTV", | 1801 | { "Sony PlayTV", |
@@ -1812,7 +1822,7 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1812 | }, | 1822 | }, |
1813 | }, | 1823 | }, |
1814 | 1824 | ||
1815 | .num_device_descs = 7, | 1825 | .num_device_descs = 8, |
1816 | .devices = { | 1826 | .devices = { |
1817 | { "Terratec Cinergy HT USB XE", | 1827 | { "Terratec Cinergy HT USB XE", |
1818 | { &dib0700_usb_id_table[27], NULL }, | 1828 | { &dib0700_usb_id_table[27], NULL }, |
@@ -1842,6 +1852,11 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1842 | { &dib0700_usb_id_table[48], NULL }, | 1852 | { &dib0700_usb_id_table[48], NULL }, |
1843 | { NULL }, | 1853 | { NULL }, |
1844 | }, | 1854 | }, |
1855 | { "Leadtek WinFast DTV Dongle H", | ||
1856 | { &dib0700_usb_id_table[51], NULL }, | ||
1857 | { NULL }, | ||
1858 | }, | ||
1859 | |||
1845 | }, | 1860 | }, |
1846 | .rc_interval = DEFAULT_RC_INTERVAL, | 1861 | .rc_interval = DEFAULT_RC_INTERVAL, |
1847 | .rc_key_map = dib0700_rc_keys, | 1862 | .rc_key_map = dib0700_rc_keys, |
diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c index 8ee6cd4da9e7..8dbad1ec53c4 100644 --- a/drivers/media/dvb/dvb-usb/dibusb-common.c +++ b/drivers/media/dvb/dvb-usb/dibusb-common.c | |||
@@ -133,14 +133,17 @@ static int dibusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num | |||
133 | 133 | ||
134 | for (i = 0; i < num; i++) { | 134 | for (i = 0; i < num; i++) { |
135 | /* write/read request */ | 135 | /* write/read request */ |
136 | if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) { | 136 | if (i+1 < num && (msg[i].flags & I2C_M_RD) == 0 |
137 | && (msg[i+1].flags & I2C_M_RD)) { | ||
137 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len, | 138 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len, |
138 | msg[i+1].buf,msg[i+1].len) < 0) | 139 | msg[i+1].buf,msg[i+1].len) < 0) |
139 | break; | 140 | break; |
140 | i++; | 141 | i++; |
141 | } else | 142 | } else if ((msg[i].flags & I2C_M_RD) == 0) { |
142 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0) | 143 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0) |
143 | break; | 144 | break; |
145 | } else | ||
146 | break; | ||
144 | } | 147 | } |
145 | 148 | ||
146 | mutex_unlock(&d->i2c_mutex); | 149 | mutex_unlock(&d->i2c_mutex); |
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h index f506c74119f3..9593b7289994 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h | |||
@@ -80,6 +80,7 @@ | |||
80 | #define USB_PID_COMPRO_DVBU2000_UNK_WARM 0x010d | 80 | #define USB_PID_COMPRO_DVBU2000_UNK_WARM 0x010d |
81 | #define USB_PID_COMPRO_VIDEOMATE_U500 0x1e78 | 81 | #define USB_PID_COMPRO_VIDEOMATE_U500 0x1e78 |
82 | #define USB_PID_COMPRO_VIDEOMATE_U500_PC 0x1e80 | 82 | #define USB_PID_COMPRO_VIDEOMATE_U500_PC 0x1e80 |
83 | #define USB_PID_CONCEPTRONIC_CTVDIGRCU 0xe397 | ||
83 | #define USB_PID_CONEXANT_D680_DMB 0x86d6 | 84 | #define USB_PID_CONEXANT_D680_DMB 0x86d6 |
84 | #define USB_PID_DIBCOM_HOOK_DEFAULT 0x0064 | 85 | #define USB_PID_DIBCOM_HOOK_DEFAULT 0x0064 |
85 | #define USB_PID_DIBCOM_HOOK_DEFAULT_REENUM 0x0065 | 86 | #define USB_PID_DIBCOM_HOOK_DEFAULT_REENUM 0x0065 |
@@ -97,6 +98,7 @@ | |||
97 | #define USB_PID_DPOSH_M9206_COLD 0x9206 | 98 | #define USB_PID_DPOSH_M9206_COLD 0x9206 |
98 | #define USB_PID_DPOSH_M9206_WARM 0xa090 | 99 | #define USB_PID_DPOSH_M9206_WARM 0xa090 |
99 | #define USB_PID_UNIWILL_STK7700P 0x6003 | 100 | #define USB_PID_UNIWILL_STK7700P 0x6003 |
101 | #define USB_PID_GENIUS_TVGO_DVB_T03 0x4012 | ||
100 | #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0 | 102 | #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0 |
101 | #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1 | 103 | #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1 |
102 | #define USB_PID_INTEL_CE9500 0x9500 | 104 | #define USB_PID_INTEL_CE9500 0x9500 |
@@ -104,6 +106,7 @@ | |||
104 | #define USB_PID_KWORLD_395U 0xe396 | 106 | #define USB_PID_KWORLD_395U 0xe396 |
105 | #define USB_PID_KWORLD_395U_2 0xe39b | 107 | #define USB_PID_KWORLD_395U_2 0xe39b |
106 | #define USB_PID_KWORLD_395U_3 0xe395 | 108 | #define USB_PID_KWORLD_395U_3 0xe395 |
109 | #define USB_PID_KWORLD_MC810 0xc810 | ||
107 | #define USB_PID_KWORLD_PC160_2T 0xc160 | 110 | #define USB_PID_KWORLD_PC160_2T 0xc160 |
108 | #define USB_PID_KWORLD_VSTREAM_COLD 0x17de | 111 | #define USB_PID_KWORLD_VSTREAM_COLD 0x17de |
109 | #define USB_PID_KWORLD_VSTREAM_WARM 0x17df | 112 | #define USB_PID_KWORLD_VSTREAM_WARM 0x17df |
@@ -171,6 +174,7 @@ | |||
171 | #define USB_PID_AVERMEDIA_A309 0xa309 | 174 | #define USB_PID_AVERMEDIA_A309 0xa309 |
172 | #define USB_PID_AVERMEDIA_A310 0xa310 | 175 | #define USB_PID_AVERMEDIA_A310 0xa310 |
173 | #define USB_PID_AVERMEDIA_A850 0x850a | 176 | #define USB_PID_AVERMEDIA_A850 0x850a |
177 | #define USB_PID_AVERMEDIA_A805 0xa805 | ||
174 | #define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006 | 178 | #define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006 |
175 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a | 179 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a |
176 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081 | 180 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081 |
@@ -178,6 +182,8 @@ | |||
178 | #define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060 | 182 | #define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060 |
179 | #define USB_PID_TERRATEC_CINERGY_T_EXPRESS 0x0062 | 183 | #define USB_PID_TERRATEC_CINERGY_T_EXPRESS 0x0062 |
180 | #define USB_PID_TERRATEC_CINERGY_T_XXS 0x0078 | 184 | #define USB_PID_TERRATEC_CINERGY_T_XXS 0x0078 |
185 | #define USB_PID_TERRATEC_T3 0x10a0 | ||
186 | #define USB_PID_TERRATEC_T5 0x10a1 | ||
181 | #define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e | 187 | #define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e |
182 | #define USB_PID_PINNACLE_PCTV2000E 0x022c | 188 | #define USB_PID_PINNACLE_PCTV2000E 0x022c |
183 | #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228 | 189 | #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228 |
@@ -222,6 +228,7 @@ | |||
222 | #define USB_PID_WINFAST_DTV_DONGLE_COLD 0x6025 | 228 | #define USB_PID_WINFAST_DTV_DONGLE_COLD 0x6025 |
223 | #define USB_PID_WINFAST_DTV_DONGLE_WARM 0x6026 | 229 | #define USB_PID_WINFAST_DTV_DONGLE_WARM 0x6026 |
224 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P 0x6f00 | 230 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P 0x6f00 |
231 | #define USB_PID_WINFAST_DTV_DONGLE_H 0x60f6 | ||
225 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P_2 0x6f01 | 232 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P_2 0x6f01 |
226 | #define USB_PID_WINFAST_DTV_DONGLE_GOLD 0x6029 | 233 | #define USB_PID_WINFAST_DTV_DONGLE_GOLD 0x6029 |
227 | #define USB_PID_GENPIX_8PSK_REV_1_COLD 0x0200 | 234 | #define USB_PID_GENPIX_8PSK_REV_1_COLD 0x0200 |
@@ -251,5 +258,6 @@ | |||
251 | #define USB_PID_MSI_DIGI_VOX_MINI_III 0x8807 | 258 | #define USB_PID_MSI_DIGI_VOX_MINI_III 0x8807 |
252 | #define USB_PID_SONY_PLAYTV 0x0003 | 259 | #define USB_PID_SONY_PLAYTV 0x0003 |
253 | #define USB_PID_ELGATO_EYETV_DTT 0x0021 | 260 | #define USB_PID_ELGATO_EYETV_DTT 0x0021 |
261 | #define USB_PID_ELGATO_EYETV_DTT_Dlx 0x0020 | ||
254 | 262 | ||
255 | #endif | 263 | #endif |
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h index b5157518a300..e441d274e6c1 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb.h | |||
@@ -223,7 +223,7 @@ struct dvb_usb_device_properties { | |||
223 | int generic_bulk_ctrl_endpoint; | 223 | int generic_bulk_ctrl_endpoint; |
224 | 224 | ||
225 | int num_device_descs; | 225 | int num_device_descs; |
226 | struct dvb_usb_device_description devices[11]; | 226 | struct dvb_usb_device_description devices[12]; |
227 | }; | 227 | }; |
228 | 228 | ||
229 | /** | 229 | /** |
diff --git a/drivers/media/dvb/dvb-usb/dw2102.c b/drivers/media/dvb/dvb-usb/dw2102.c index c65f273ff313..75de49c0d943 100644 --- a/drivers/media/dvb/dvb-usb/dw2102.c +++ b/drivers/media/dvb/dvb-usb/dw2102.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* DVB USB framework compliant Linux driver for the | 1 | /* DVB USB framework compliant Linux driver for the |
2 | * DVBWorld DVB-S 2101, 2102, DVB-S2 2104 Card | 2 | * DVBWorld DVB-S 2101, 2102, DVB-S2 2104, DVB-C 3101, |
3 | * | 3 | * TeVii S600, S650 Cards |
4 | * Copyright (C) 2008 Igor M. Liplianin (liplianin@me.by) | 4 | * Copyright (C) 2008,2009 Igor M. Liplianin (liplianin@me.by) |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License as published by the | 7 | * under the terms of the GNU General Public License as published by the |
@@ -17,6 +17,7 @@ | |||
17 | #include "stb6000.h" | 17 | #include "stb6000.h" |
18 | #include "eds1547.h" | 18 | #include "eds1547.h" |
19 | #include "cx24116.h" | 19 | #include "cx24116.h" |
20 | #include "tda1002x.h" | ||
20 | 21 | ||
21 | #ifndef USB_PID_DW2102 | 22 | #ifndef USB_PID_DW2102 |
22 | #define USB_PID_DW2102 0x2102 | 23 | #define USB_PID_DW2102 0x2102 |
@@ -26,10 +27,18 @@ | |||
26 | #define USB_PID_DW2104 0x2104 | 27 | #define USB_PID_DW2104 0x2104 |
27 | #endif | 28 | #endif |
28 | 29 | ||
30 | #ifndef USB_PID_DW3101 | ||
31 | #define USB_PID_DW3101 0x3101 | ||
32 | #endif | ||
33 | |||
29 | #ifndef USB_PID_CINERGY_S | 34 | #ifndef USB_PID_CINERGY_S |
30 | #define USB_PID_CINERGY_S 0x0064 | 35 | #define USB_PID_CINERGY_S 0x0064 |
31 | #endif | 36 | #endif |
32 | 37 | ||
38 | #ifndef USB_PID_TEVII_S650 | ||
39 | #define USB_PID_TEVII_S650 0xd650 | ||
40 | #endif | ||
41 | |||
33 | #define DW210X_READ_MSG 0 | 42 | #define DW210X_READ_MSG 0 |
34 | #define DW210X_WRITE_MSG 1 | 43 | #define DW210X_WRITE_MSG 1 |
35 | 44 | ||
@@ -40,18 +49,21 @@ | |||
40 | #define DW2102_VOLTAGE_CTRL (0x1800) | 49 | #define DW2102_VOLTAGE_CTRL (0x1800) |
41 | #define DW2102_RC_QUERY (0x1a00) | 50 | #define DW2102_RC_QUERY (0x1a00) |
42 | 51 | ||
43 | struct dw210x_state { | 52 | struct dvb_usb_rc_keys_table { |
44 | u32 last_key_pressed; | 53 | struct dvb_usb_rc_key *rc_keys; |
45 | }; | 54 | int rc_keys_size; |
46 | struct dw210x_rc_keys { | ||
47 | u32 keycode; | ||
48 | u32 event; | ||
49 | }; | 55 | }; |
50 | 56 | ||
51 | /* debug */ | 57 | /* debug */ |
52 | static int dvb_usb_dw2102_debug; | 58 | static int dvb_usb_dw2102_debug; |
53 | module_param_named(debug, dvb_usb_dw2102_debug, int, 0644); | 59 | module_param_named(debug, dvb_usb_dw2102_debug, int, 0644); |
54 | MODULE_PARM_DESC(debug, "set debugging level (1=info 2=xfer (or-able))." DVB_USB_DEBUG_STATUS); | 60 | MODULE_PARM_DESC(debug, "set debugging level (1=info 2=xfer 4=rc(or-able))." |
61 | DVB_USB_DEBUG_STATUS); | ||
62 | |||
63 | /* keymaps */ | ||
64 | static int ir_keymap; | ||
65 | module_param_named(keymap, ir_keymap, int, 0644); | ||
66 | MODULE_PARM_DESC(keymap, "set keymap 0=default 1=dvbworld 2=tevii 3=tbs ..."); | ||
55 | 67 | ||
56 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 68 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
57 | 69 | ||
@@ -79,7 +91,7 @@ static int dw210x_op_rw(struct usb_device *dev, u8 request, u16 value, | |||
79 | static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | 91 | static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
80 | int num) | 92 | int num) |
81 | { | 93 | { |
82 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | 94 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
83 | int i = 0, ret = 0; | 95 | int i = 0, ret = 0; |
84 | u8 buf6[] = {0x2c, 0x05, 0xc0, 0, 0, 0, 0}; | 96 | u8 buf6[] = {0x2c, 0x05, 0xc0, 0, 0, 0, 0}; |
85 | u16 value; | 97 | u16 value; |
@@ -205,6 +217,7 @@ static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap, | |||
205 | mutex_unlock(&d->i2c_mutex); | 217 | mutex_unlock(&d->i2c_mutex); |
206 | return num; | 218 | return num; |
207 | } | 219 | } |
220 | |||
208 | static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) | 221 | static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) |
209 | { | 222 | { |
210 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | 223 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
@@ -219,7 +232,7 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms | |||
219 | case 2: { | 232 | case 2: { |
220 | /* read */ | 233 | /* read */ |
221 | /* first write first register number */ | 234 | /* first write first register number */ |
222 | u8 ibuf [msg[1].len + 2], obuf[3]; | 235 | u8 ibuf[msg[1].len + 2], obuf[3]; |
223 | obuf[0] = 0xd0; | 236 | obuf[0] = 0xd0; |
224 | obuf[1] = msg[0].len; | 237 | obuf[1] = msg[0].len; |
225 | obuf[2] = msg[0].buf[0]; | 238 | obuf[2] = msg[0].buf[0]; |
@@ -293,7 +306,7 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i | |||
293 | case 2: { | 306 | case 2: { |
294 | /* read */ | 307 | /* read */ |
295 | /* first write first register number */ | 308 | /* first write first register number */ |
296 | u8 ibuf [msg[1].len + 2], obuf[3]; | 309 | u8 ibuf[msg[1].len + 2], obuf[3]; |
297 | obuf[0] = 0xaa; | 310 | obuf[0] = 0xaa; |
298 | obuf[1] = msg[0].len; | 311 | obuf[1] = msg[0].len; |
299 | obuf[2] = msg[0].buf[0]; | 312 | obuf[2] = msg[0].buf[0]; |
@@ -360,6 +373,69 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i | |||
360 | return num; | 373 | return num; |
361 | } | 374 | } |
362 | 375 | ||
376 | static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
377 | int num) | ||
378 | { | ||
379 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
380 | int ret = 0, i; | ||
381 | |||
382 | if (!d) | ||
383 | return -ENODEV; | ||
384 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) | ||
385 | return -EAGAIN; | ||
386 | |||
387 | switch (num) { | ||
388 | case 2: { | ||
389 | /* read */ | ||
390 | /* first write first register number */ | ||
391 | u8 ibuf[msg[1].len + 2], obuf[3]; | ||
392 | obuf[0] = msg[0].addr << 1; | ||
393 | obuf[1] = msg[0].len; | ||
394 | obuf[2] = msg[0].buf[0]; | ||
395 | ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, | ||
396 | obuf, msg[0].len + 2, DW210X_WRITE_MSG); | ||
397 | /* second read registers */ | ||
398 | ret = dw210x_op_rw(d->udev, 0xc3, 0x19 , 0, | ||
399 | ibuf, msg[1].len + 2, DW210X_READ_MSG); | ||
400 | memcpy(msg[1].buf, ibuf + 2, msg[1].len); | ||
401 | |||
402 | break; | ||
403 | } | ||
404 | case 1: | ||
405 | switch (msg[0].addr) { | ||
406 | case 0x60: | ||
407 | case 0x0c: { | ||
408 | /* write to register */ | ||
409 | u8 obuf[msg[0].len + 2]; | ||
410 | obuf[0] = msg[0].addr << 1; | ||
411 | obuf[1] = msg[0].len; | ||
412 | memcpy(obuf + 2, msg[0].buf, msg[0].len); | ||
413 | ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, | ||
414 | obuf, msg[0].len + 2, DW210X_WRITE_MSG); | ||
415 | break; | ||
416 | } | ||
417 | case(DW2102_RC_QUERY): { | ||
418 | u8 ibuf[2]; | ||
419 | ret = dw210x_op_rw(d->udev, 0xb8, 0, 0, | ||
420 | ibuf, 2, DW210X_READ_MSG); | ||
421 | memcpy(msg[0].buf, ibuf , 2); | ||
422 | break; | ||
423 | } | ||
424 | } | ||
425 | |||
426 | break; | ||
427 | } | ||
428 | |||
429 | for (i = 0; i < num; i++) { | ||
430 | deb_xfer("%02x:%02x: %s ", i, msg[i].addr, | ||
431 | msg[i].flags == 0 ? ">>>" : "<<<"); | ||
432 | debug_dump(msg[i].buf, msg[i].len, deb_xfer); | ||
433 | } | ||
434 | |||
435 | mutex_unlock(&d->i2c_mutex); | ||
436 | return num; | ||
437 | } | ||
438 | |||
363 | static u32 dw210x_i2c_func(struct i2c_adapter *adapter) | 439 | static u32 dw210x_i2c_func(struct i2c_adapter *adapter) |
364 | { | 440 | { |
365 | return I2C_FUNC_I2C; | 441 | return I2C_FUNC_I2C; |
@@ -385,6 +461,11 @@ static struct i2c_algorithm dw2104_i2c_algo = { | |||
385 | .functionality = dw210x_i2c_func, | 461 | .functionality = dw210x_i2c_func, |
386 | }; | 462 | }; |
387 | 463 | ||
464 | static struct i2c_algorithm dw3101_i2c_algo = { | ||
465 | .master_xfer = dw3101_i2c_transfer, | ||
466 | .functionality = dw210x_i2c_func, | ||
467 | }; | ||
468 | |||
388 | static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) | 469 | static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) |
389 | { | 470 | { |
390 | int i; | 471 | int i; |
@@ -404,6 +485,7 @@ static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) | |||
404 | debug_dump(eepromline, 16, deb_xfer); | 485 | debug_dump(eepromline, 16, deb_xfer); |
405 | } | 486 | } |
406 | } | 487 | } |
488 | |||
407 | memcpy(mac, eeprom + 8, 6); | 489 | memcpy(mac, eeprom + 8, 6); |
408 | return 0; | 490 | return 0; |
409 | }; | 491 | }; |
@@ -448,6 +530,11 @@ static struct si21xx_config serit_sp1511lhb_config = { | |||
448 | 530 | ||
449 | }; | 531 | }; |
450 | 532 | ||
533 | static struct tda10023_config dw3101_tda10023_config = { | ||
534 | .demod_address = 0x0c, | ||
535 | .invert = 1, | ||
536 | }; | ||
537 | |||
451 | static int dw2104_frontend_attach(struct dvb_usb_adapter *d) | 538 | static int dw2104_frontend_attach(struct dvb_usb_adapter *d) |
452 | { | 539 | { |
453 | if ((d->fe = dvb_attach(cx24116_attach, &dw2104_config, | 540 | if ((d->fe = dvb_attach(cx24116_attach, &dw2104_config, |
@@ -460,6 +547,7 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d) | |||
460 | } | 547 | } |
461 | 548 | ||
462 | static struct dvb_usb_device_properties dw2102_properties; | 549 | static struct dvb_usb_device_properties dw2102_properties; |
550 | static struct dvb_usb_device_properties dw2104_properties; | ||
463 | 551 | ||
464 | static int dw2102_frontend_attach(struct dvb_usb_adapter *d) | 552 | static int dw2102_frontend_attach(struct dvb_usb_adapter *d) |
465 | { | 553 | { |
@@ -497,6 +585,17 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d) | |||
497 | return -EIO; | 585 | return -EIO; |
498 | } | 586 | } |
499 | 587 | ||
588 | static int dw3101_frontend_attach(struct dvb_usb_adapter *d) | ||
589 | { | ||
590 | d->fe = dvb_attach(tda10023_attach, &dw3101_tda10023_config, | ||
591 | &d->dev->i2c_adap, 0x48); | ||
592 | if (d->fe != NULL) { | ||
593 | info("Attached tda10023!\n"); | ||
594 | return 0; | ||
595 | } | ||
596 | return -EIO; | ||
597 | } | ||
598 | |||
500 | static int dw2102_tuner_attach(struct dvb_usb_adapter *adap) | 599 | static int dw2102_tuner_attach(struct dvb_usb_adapter *adap) |
501 | { | 600 | { |
502 | dvb_attach(dvb_pll_attach, adap->fe, 0x60, | 601 | dvb_attach(dvb_pll_attach, adap->fe, 0x60, |
@@ -512,6 +611,14 @@ static int dw2102_earda_tuner_attach(struct dvb_usb_adapter *adap) | |||
512 | return 0; | 611 | return 0; |
513 | } | 612 | } |
514 | 613 | ||
614 | static int dw3101_tuner_attach(struct dvb_usb_adapter *adap) | ||
615 | { | ||
616 | dvb_attach(dvb_pll_attach, adap->fe, 0x60, | ||
617 | &adap->dev->i2c_adap, DVB_PLL_TUA6034); | ||
618 | |||
619 | return 0; | ||
620 | } | ||
621 | |||
515 | static struct dvb_usb_rc_key dw210x_rc_keys[] = { | 622 | static struct dvb_usb_rc_key dw210x_rc_keys[] = { |
516 | { 0xf8, 0x0a, KEY_Q }, /*power*/ | 623 | { 0xf8, 0x0a, KEY_Q }, /*power*/ |
517 | { 0xf8, 0x0c, KEY_M }, /*mute*/ | 624 | { 0xf8, 0x0c, KEY_M }, /*mute*/ |
@@ -544,44 +651,147 @@ static struct dvb_usb_rc_key dw210x_rc_keys[] = { | |||
544 | { 0xf8, 0x40, KEY_F }, /*full*/ | 651 | { 0xf8, 0x40, KEY_F }, /*full*/ |
545 | { 0xf8, 0x1e, KEY_W }, /*tvmode*/ | 652 | { 0xf8, 0x1e, KEY_W }, /*tvmode*/ |
546 | { 0xf8, 0x1b, KEY_B }, /*recall*/ | 653 | { 0xf8, 0x1b, KEY_B }, /*recall*/ |
654 | }; | ||
547 | 655 | ||
656 | static struct dvb_usb_rc_key tevii_rc_keys[] = { | ||
657 | { 0xf8, 0x0a, KEY_POWER }, | ||
658 | { 0xf8, 0x0c, KEY_MUTE }, | ||
659 | { 0xf8, 0x11, KEY_1 }, | ||
660 | { 0xf8, 0x12, KEY_2 }, | ||
661 | { 0xf8, 0x13, KEY_3 }, | ||
662 | { 0xf8, 0x14, KEY_4 }, | ||
663 | { 0xf8, 0x15, KEY_5 }, | ||
664 | { 0xf8, 0x16, KEY_6 }, | ||
665 | { 0xf8, 0x17, KEY_7 }, | ||
666 | { 0xf8, 0x18, KEY_8 }, | ||
667 | { 0xf8, 0x19, KEY_9 }, | ||
668 | { 0xf8, 0x10, KEY_0 }, | ||
669 | { 0xf8, 0x1c, KEY_MENU }, | ||
670 | { 0xf8, 0x0f, KEY_VOLUMEDOWN }, | ||
671 | { 0xf8, 0x1a, KEY_LAST }, | ||
672 | { 0xf8, 0x0e, KEY_OPEN }, | ||
673 | { 0xf8, 0x04, KEY_RECORD }, | ||
674 | { 0xf8, 0x09, KEY_VOLUMEUP }, | ||
675 | { 0xf8, 0x08, KEY_CHANNELUP }, | ||
676 | { 0xf8, 0x07, KEY_PVR }, | ||
677 | { 0xf8, 0x0b, KEY_TIME }, | ||
678 | { 0xf8, 0x02, KEY_RIGHT }, | ||
679 | { 0xf8, 0x03, KEY_LEFT }, | ||
680 | { 0xf8, 0x00, KEY_UP }, | ||
681 | { 0xf8, 0x1f, KEY_OK }, | ||
682 | { 0xf8, 0x01, KEY_DOWN }, | ||
683 | { 0xf8, 0x05, KEY_TUNER }, | ||
684 | { 0xf8, 0x06, KEY_CHANNELDOWN }, | ||
685 | { 0xf8, 0x40, KEY_PLAYPAUSE }, | ||
686 | { 0xf8, 0x1e, KEY_REWIND }, | ||
687 | { 0xf8, 0x1b, KEY_FAVORITES }, | ||
688 | { 0xf8, 0x1d, KEY_BACK }, | ||
689 | { 0xf8, 0x4d, KEY_FASTFORWARD }, | ||
690 | { 0xf8, 0x44, KEY_EPG }, | ||
691 | { 0xf8, 0x4c, KEY_INFO }, | ||
692 | { 0xf8, 0x41, KEY_AB }, | ||
693 | { 0xf8, 0x43, KEY_AUDIO }, | ||
694 | { 0xf8, 0x45, KEY_SUBTITLE }, | ||
695 | { 0xf8, 0x4a, KEY_LIST }, | ||
696 | { 0xf8, 0x46, KEY_F1 }, | ||
697 | { 0xf8, 0x47, KEY_F2 }, | ||
698 | { 0xf8, 0x5e, KEY_F3 }, | ||
699 | { 0xf8, 0x5c, KEY_F4 }, | ||
700 | { 0xf8, 0x52, KEY_F5 }, | ||
701 | { 0xf8, 0x5a, KEY_F6 }, | ||
702 | { 0xf8, 0x56, KEY_MODE }, | ||
703 | { 0xf8, 0x58, KEY_SWITCHVIDEOMODE }, | ||
548 | }; | 704 | }; |
549 | 705 | ||
706 | static struct dvb_usb_rc_key tbs_rc_keys[] = { | ||
707 | { 0xf8, 0x84, KEY_POWER }, | ||
708 | { 0xf8, 0x94, KEY_MUTE }, | ||
709 | { 0xf8, 0x87, KEY_1 }, | ||
710 | { 0xf8, 0x86, KEY_2 }, | ||
711 | { 0xf8, 0x85, KEY_3 }, | ||
712 | { 0xf8, 0x8b, KEY_4 }, | ||
713 | { 0xf8, 0x8a, KEY_5 }, | ||
714 | { 0xf8, 0x89, KEY_6 }, | ||
715 | { 0xf8, 0x8f, KEY_7 }, | ||
716 | { 0xf8, 0x8e, KEY_8 }, | ||
717 | { 0xf8, 0x8d, KEY_9 }, | ||
718 | { 0xf8, 0x92, KEY_0 }, | ||
719 | { 0xf8, 0x96, KEY_CHANNELUP }, | ||
720 | { 0xf8, 0x91, KEY_CHANNELDOWN }, | ||
721 | { 0xf8, 0x93, KEY_VOLUMEUP }, | ||
722 | { 0xf8, 0x8c, KEY_VOLUMEDOWN }, | ||
723 | { 0xf8, 0x83, KEY_RECORD }, | ||
724 | { 0xf8, 0x98, KEY_PAUSE }, | ||
725 | { 0xf8, 0x99, KEY_OK }, | ||
726 | { 0xf8, 0x9a, KEY_SHUFFLE }, | ||
727 | { 0xf8, 0x81, KEY_UP }, | ||
728 | { 0xf8, 0x90, KEY_LEFT }, | ||
729 | { 0xf8, 0x82, KEY_RIGHT }, | ||
730 | { 0xf8, 0x88, KEY_DOWN }, | ||
731 | { 0xf8, 0x95, KEY_FAVORITES }, | ||
732 | { 0xf8, 0x97, KEY_SUBTITLE }, | ||
733 | { 0xf8, 0x9d, KEY_ZOOM }, | ||
734 | { 0xf8, 0x9f, KEY_EXIT }, | ||
735 | { 0xf8, 0x9e, KEY_MENU }, | ||
736 | { 0xf8, 0x9c, KEY_EPG }, | ||
737 | { 0xf8, 0x80, KEY_PREVIOUS }, | ||
738 | { 0xf8, 0x9b, KEY_MODE } | ||
739 | }; | ||
550 | 740 | ||
741 | static struct dvb_usb_rc_keys_table keys_tables[] = { | ||
742 | { dw210x_rc_keys, ARRAY_SIZE(dw210x_rc_keys) }, | ||
743 | { tevii_rc_keys, ARRAY_SIZE(tevii_rc_keys) }, | ||
744 | { tbs_rc_keys, ARRAY_SIZE(tbs_rc_keys) }, | ||
745 | }; | ||
551 | 746 | ||
552 | static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | 747 | static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state) |
553 | { | 748 | { |
554 | struct dw210x_state *st = d->priv; | 749 | struct dvb_usb_rc_key *keymap = d->props.rc_key_map; |
750 | int keymap_size = d->props.rc_key_map_size; | ||
555 | u8 key[2]; | 751 | u8 key[2]; |
556 | struct i2c_msg msg[] = { | 752 | struct i2c_msg msg = { |
557 | {.addr = DW2102_RC_QUERY, .flags = I2C_M_RD, .buf = key, | 753 | .addr = DW2102_RC_QUERY, |
558 | .len = 2}, | 754 | .flags = I2C_M_RD, |
755 | .buf = key, | ||
756 | .len = 2 | ||
559 | }; | 757 | }; |
560 | int i; | 758 | int i; |
759 | /* override keymap */ | ||
760 | if ((ir_keymap > 0) && (ir_keymap <= ARRAY_SIZE(keys_tables))) { | ||
761 | keymap = keys_tables[ir_keymap - 1].rc_keys ; | ||
762 | keymap_size = keys_tables[ir_keymap - 1].rc_keys_size; | ||
763 | } | ||
561 | 764 | ||
562 | *state = REMOTE_NO_KEY_PRESSED; | 765 | *state = REMOTE_NO_KEY_PRESSED; |
563 | if (dw2102_i2c_transfer(&d->i2c_adap, msg, 1) == 1) { | 766 | if (dw2102_i2c_transfer(&d->i2c_adap, &msg, 1) == 1) { |
564 | for (i = 0; i < ARRAY_SIZE(dw210x_rc_keys); i++) { | 767 | for (i = 0; i < keymap_size ; i++) { |
565 | if (dw210x_rc_keys[i].data == msg[0].buf[0]) { | 768 | if (keymap[i].data == msg.buf[0]) { |
566 | *state = REMOTE_KEY_PRESSED; | 769 | *state = REMOTE_KEY_PRESSED; |
567 | *event = dw210x_rc_keys[i].event; | 770 | *event = keymap[i].event; |
568 | st->last_key_pressed = | ||
569 | dw210x_rc_keys[i].event; | ||
570 | break; | 771 | break; |
571 | } | 772 | } |
572 | st->last_key_pressed = 0; | 773 | |
573 | } | 774 | } |
775 | |||
776 | if ((*state) == REMOTE_KEY_PRESSED) | ||
777 | deb_rc("%s: found rc key: %x, %x, event: %x\n", | ||
778 | __func__, key[0], key[1], (*event)); | ||
779 | else if (key[0] != 0xff) | ||
780 | deb_rc("%s: unknown rc key: %x, %x\n", | ||
781 | __func__, key[0], key[1]); | ||
782 | |||
574 | } | 783 | } |
575 | /* info("key: %x %x\n",key[0],key[1]); */ | 784 | |
576 | return 0; | 785 | return 0; |
577 | } | 786 | } |
578 | 787 | ||
579 | static struct usb_device_id dw2102_table[] = { | 788 | static struct usb_device_id dw2102_table[] = { |
580 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2102)}, | 789 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2102)}, |
581 | {USB_DEVICE(USB_VID_CYPRESS, 0x2101)}, | 790 | {USB_DEVICE(USB_VID_CYPRESS, 0x2101)}, |
582 | {USB_DEVICE(USB_VID_CYPRESS, 0x2104)}, | 791 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2104)}, |
583 | {USB_DEVICE(0x9022, 0xd650)}, | 792 | {USB_DEVICE(0x9022, USB_PID_TEVII_S650)}, |
584 | {USB_DEVICE(USB_VID_TERRATEC, USB_PID_CINERGY_S)}, | 793 | {USB_DEVICE(USB_VID_TERRATEC, USB_PID_CINERGY_S)}, |
794 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW3101)}, | ||
585 | { } | 795 | { } |
586 | }; | 796 | }; |
587 | 797 | ||
@@ -642,11 +852,16 @@ static int dw2102_load_firmware(struct usb_device *dev, | |||
642 | } | 852 | } |
643 | /* init registers */ | 853 | /* init registers */ |
644 | switch (dev->descriptor.idProduct) { | 854 | switch (dev->descriptor.idProduct) { |
855 | case USB_PID_TEVII_S650: | ||
856 | dw2104_properties.rc_key_map = tevii_rc_keys; | ||
857 | dw2104_properties.rc_key_map_size = | ||
858 | ARRAY_SIZE(tevii_rc_keys); | ||
645 | case USB_PID_DW2104: | 859 | case USB_PID_DW2104: |
646 | case 0xd650: | ||
647 | reset = 1; | 860 | reset = 1; |
648 | dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1, | 861 | dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1, |
649 | DW210X_WRITE_MSG); | 862 | DW210X_WRITE_MSG); |
863 | /* break omitted intentionally */ | ||
864 | case USB_PID_DW3101: | ||
650 | reset = 0; | 865 | reset = 0; |
651 | dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0, | 866 | dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0, |
652 | DW210X_WRITE_MSG); | 867 | DW210X_WRITE_MSG); |
@@ -690,6 +905,7 @@ static int dw2102_load_firmware(struct usb_device *dev, | |||
690 | DW210X_READ_MSG); | 905 | DW210X_READ_MSG); |
691 | break; | 906 | break; |
692 | } | 907 | } |
908 | |||
693 | msleep(100); | 909 | msleep(100); |
694 | kfree(p); | 910 | kfree(p); |
695 | } | 911 | } |
@@ -700,7 +916,6 @@ static struct dvb_usb_device_properties dw2102_properties = { | |||
700 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | 916 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, |
701 | .usb_ctrl = DEVICE_SPECIFIC, | 917 | .usb_ctrl = DEVICE_SPECIFIC, |
702 | .firmware = "dvb-usb-dw2102.fw", | 918 | .firmware = "dvb-usb-dw2102.fw", |
703 | .size_of_priv = sizeof(struct dw210x_state), | ||
704 | .no_reconnect = 1, | 919 | .no_reconnect = 1, |
705 | 920 | ||
706 | .i2c_algo = &dw2102_serit_i2c_algo, | 921 | .i2c_algo = &dw2102_serit_i2c_algo, |
@@ -714,7 +929,7 @@ static struct dvb_usb_device_properties dw2102_properties = { | |||
714 | .num_adapters = 1, | 929 | .num_adapters = 1, |
715 | .download_firmware = dw2102_load_firmware, | 930 | .download_firmware = dw2102_load_firmware, |
716 | .read_mac_address = dw210x_read_mac_address, | 931 | .read_mac_address = dw210x_read_mac_address, |
717 | .adapter = { | 932 | .adapter = { |
718 | { | 933 | { |
719 | .frontend_attach = dw2102_frontend_attach, | 934 | .frontend_attach = dw2102_frontend_attach, |
720 | .streaming_ctrl = NULL, | 935 | .streaming_ctrl = NULL, |
@@ -752,7 +967,6 @@ static struct dvb_usb_device_properties dw2104_properties = { | |||
752 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | 967 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, |
753 | .usb_ctrl = DEVICE_SPECIFIC, | 968 | .usb_ctrl = DEVICE_SPECIFIC, |
754 | .firmware = "dvb-usb-dw2104.fw", | 969 | .firmware = "dvb-usb-dw2104.fw", |
755 | .size_of_priv = sizeof(struct dw210x_state), | ||
756 | .no_reconnect = 1, | 970 | .no_reconnect = 1, |
757 | 971 | ||
758 | .i2c_algo = &dw2104_i2c_algo, | 972 | .i2c_algo = &dw2104_i2c_algo, |
@@ -796,12 +1010,57 @@ static struct dvb_usb_device_properties dw2104_properties = { | |||
796 | } | 1010 | } |
797 | }; | 1011 | }; |
798 | 1012 | ||
1013 | static struct dvb_usb_device_properties dw3101_properties = { | ||
1014 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | ||
1015 | .usb_ctrl = DEVICE_SPECIFIC, | ||
1016 | .firmware = "dvb-usb-dw3101.fw", | ||
1017 | .no_reconnect = 1, | ||
1018 | |||
1019 | .i2c_algo = &dw3101_i2c_algo, | ||
1020 | .rc_key_map = dw210x_rc_keys, | ||
1021 | .rc_key_map_size = ARRAY_SIZE(dw210x_rc_keys), | ||
1022 | .rc_interval = 150, | ||
1023 | .rc_query = dw2102_rc_query, | ||
1024 | |||
1025 | .generic_bulk_ctrl_endpoint = 0x81, | ||
1026 | /* parameter for the MPEG2-data transfer */ | ||
1027 | .num_adapters = 1, | ||
1028 | .download_firmware = dw2102_load_firmware, | ||
1029 | .read_mac_address = dw210x_read_mac_address, | ||
1030 | .adapter = { | ||
1031 | { | ||
1032 | .frontend_attach = dw3101_frontend_attach, | ||
1033 | .streaming_ctrl = NULL, | ||
1034 | .tuner_attach = dw3101_tuner_attach, | ||
1035 | .stream = { | ||
1036 | .type = USB_BULK, | ||
1037 | .count = 8, | ||
1038 | .endpoint = 0x82, | ||
1039 | .u = { | ||
1040 | .bulk = { | ||
1041 | .buffersize = 4096, | ||
1042 | } | ||
1043 | } | ||
1044 | }, | ||
1045 | } | ||
1046 | }, | ||
1047 | .num_device_descs = 1, | ||
1048 | .devices = { | ||
1049 | { "DVBWorld DVB-C 3101 USB2.0", | ||
1050 | {&dw2102_table[5], NULL}, | ||
1051 | {NULL}, | ||
1052 | }, | ||
1053 | } | ||
1054 | }; | ||
1055 | |||
799 | static int dw2102_probe(struct usb_interface *intf, | 1056 | static int dw2102_probe(struct usb_interface *intf, |
800 | const struct usb_device_id *id) | 1057 | const struct usb_device_id *id) |
801 | { | 1058 | { |
802 | if (0 == dvb_usb_device_init(intf, &dw2102_properties, | 1059 | if (0 == dvb_usb_device_init(intf, &dw2102_properties, |
803 | THIS_MODULE, NULL, adapter_nr) || | 1060 | THIS_MODULE, NULL, adapter_nr) || |
804 | 0 == dvb_usb_device_init(intf, &dw2104_properties, | 1061 | 0 == dvb_usb_device_init(intf, &dw2104_properties, |
1062 | THIS_MODULE, NULL, adapter_nr) || | ||
1063 | 0 == dvb_usb_device_init(intf, &dw3101_properties, | ||
805 | THIS_MODULE, NULL, adapter_nr)) { | 1064 | THIS_MODULE, NULL, adapter_nr)) { |
806 | return 0; | 1065 | return 0; |
807 | } | 1066 | } |
@@ -833,6 +1092,8 @@ module_init(dw2102_module_init); | |||
833 | module_exit(dw2102_module_exit); | 1092 | module_exit(dw2102_module_exit); |
834 | 1093 | ||
835 | MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by"); | 1094 | MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by"); |
836 | MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104 USB2.0 device"); | 1095 | MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104," |
1096 | " DVB-C 3101 USB2.0," | ||
1097 | " TeVii S600, S650 USB2.0 devices"); | ||
837 | MODULE_VERSION("0.1"); | 1098 | MODULE_VERSION("0.1"); |
838 | MODULE_LICENSE("GPL"); | 1099 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb/dvb-usb/dw2102.h b/drivers/media/dvb/dvb-usb/dw2102.h index e3370734e95a..5cd0b0eb6ce1 100644 --- a/drivers/media/dvb/dvb-usb/dw2102.h +++ b/drivers/media/dvb/dvb-usb/dw2102.h | |||
@@ -5,4 +5,5 @@ | |||
5 | #include "dvb-usb.h" | 5 | #include "dvb-usb.h" |
6 | 6 | ||
7 | #define deb_xfer(args...) dprintk(dvb_usb_dw2102_debug, 0x02, args) | 7 | #define deb_xfer(args...) dprintk(dvb_usb_dw2102_debug, 0x02, args) |
8 | #define deb_rc(args...) dprintk(dvb_usb_dw2102_debug, 0x04, args) | ||
8 | #endif | 9 | #endif |
diff --git a/drivers/media/dvb/dvb-usb/gp8psk.c b/drivers/media/dvb/dvb-usb/gp8psk.c index 3dd6843864ed..afb444db43ad 100644 --- a/drivers/media/dvb/dvb-usb/gp8psk.c +++ b/drivers/media/dvb/dvb-usb/gp8psk.c | |||
@@ -223,7 +223,7 @@ static struct usb_device_id gp8psk_usb_table [] = { | |||
223 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_1_WARM) }, | 223 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_1_WARM) }, |
224 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_2) }, | 224 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_2) }, |
225 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_1) }, | 225 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_1) }, |
226 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_CW3K) }, | 226 | /* { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_CW3K) }, */ |
227 | { 0 }, | 227 | { 0 }, |
228 | }; | 228 | }; |
229 | MODULE_DEVICE_TABLE(usb, gp8psk_usb_table); | 229 | MODULE_DEVICE_TABLE(usb, gp8psk_usb_table); |
@@ -254,7 +254,7 @@ static struct dvb_usb_device_properties gp8psk_properties = { | |||
254 | 254 | ||
255 | .generic_bulk_ctrl_endpoint = 0x01, | 255 | .generic_bulk_ctrl_endpoint = 0x01, |
256 | 256 | ||
257 | .num_device_descs = 4, | 257 | .num_device_descs = 3, |
258 | .devices = { | 258 | .devices = { |
259 | { .name = "Genpix 8PSK-to-USB2 Rev.1 DVB-S receiver", | 259 | { .name = "Genpix 8PSK-to-USB2 Rev.1 DVB-S receiver", |
260 | .cold_ids = { &gp8psk_usb_table[0], NULL }, | 260 | .cold_ids = { &gp8psk_usb_table[0], NULL }, |
@@ -268,10 +268,6 @@ static struct dvb_usb_device_properties gp8psk_properties = { | |||
268 | .cold_ids = { NULL }, | 268 | .cold_ids = { NULL }, |
269 | .warm_ids = { &gp8psk_usb_table[3], NULL }, | 269 | .warm_ids = { &gp8psk_usb_table[3], NULL }, |
270 | }, | 270 | }, |
271 | { .name = "Genpix SkyWalker-CW3K DVB-S receiver", | ||
272 | .cold_ids = { NULL }, | ||
273 | .warm_ids = { &gp8psk_usb_table[4], NULL }, | ||
274 | }, | ||
275 | { NULL }, | 271 | { NULL }, |
276 | } | 272 | } |
277 | }; | 273 | }; |
diff --git a/drivers/media/dvb/firewire/firedtv-rc.c b/drivers/media/dvb/firewire/firedtv-rc.c index 46a6324d7b73..27bca2e283df 100644 --- a/drivers/media/dvb/firewire/firedtv-rc.c +++ b/drivers/media/dvb/firewire/firedtv-rc.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include "firedtv.h" | 18 | #include "firedtv.h" |
19 | 19 | ||
20 | /* fixed table with older keycodes, geared towards MythTV */ | 20 | /* fixed table with older keycodes, geared towards MythTV */ |
21 | const static u16 oldtable[] = { | 21 | static const u16 oldtable[] = { |
22 | 22 | ||
23 | /* code from device: 0x4501...0x451f */ | 23 | /* code from device: 0x4501...0x451f */ |
24 | 24 | ||
@@ -62,7 +62,7 @@ const static u16 oldtable[] = { | |||
62 | }; | 62 | }; |
63 | 63 | ||
64 | /* user-modifiable table for a remote as sold in 2008 */ | 64 | /* user-modifiable table for a remote as sold in 2008 */ |
65 | const static u16 keytable[] = { | 65 | static const u16 keytable[] = { |
66 | 66 | ||
67 | /* code from device: 0x0300...0x031f */ | 67 | /* code from device: 0x0300...0x031f */ |
68 | 68 | ||
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig index 23e4cffeba38..be967ac09a39 100644 --- a/drivers/media/dvb/frontends/Kconfig +++ b/drivers/media/dvb/frontends/Kconfig | |||
@@ -35,6 +35,21 @@ config DVB_STB6100 | |||
35 | A Silicon tuner from ST used in conjunction with the STB0899 | 35 | A Silicon tuner from ST used in conjunction with the STB0899 |
36 | demodulator. Say Y when you want to support this tuner. | 36 | demodulator. Say Y when you want to support this tuner. |
37 | 37 | ||
38 | config DVB_STV090x | ||
39 | tristate "STV0900/STV0903(A/B) based" | ||
40 | depends on DVB_CORE && I2C | ||
41 | default m if DVB_FE_CUSTOMISE | ||
42 | help | ||
43 | DVB-S/S2/DSS Multistandard Professional/Broadcast demodulators. | ||
44 | Say Y when you want to support these frontends. | ||
45 | |||
46 | config DVB_STV6110x | ||
47 | tristate "STV6110/(A) based tuners" | ||
48 | depends on DVB_CORE && I2C | ||
49 | default m if DVB_FE_CUSTOMISE | ||
50 | help | ||
51 | A Silicon tuner that supports DVB-S and DVB-S2 modes | ||
52 | |||
38 | comment "DVB-S (satellite) frontends" | 53 | comment "DVB-S (satellite) frontends" |
39 | depends on DVB_CORE | 54 | depends on DVB_CORE |
40 | 55 | ||
@@ -506,6 +521,13 @@ config DVB_ISL6421 | |||
506 | help | 521 | help |
507 | An SEC control chip. | 522 | An SEC control chip. |
508 | 523 | ||
524 | config DVB_ISL6423 | ||
525 | tristate "ISL6423 SEC controller" | ||
526 | depends on DVB_CORE && I2C | ||
527 | default m if DVB_FE_CUSTOMISE | ||
528 | help | ||
529 | A SEC controller chip from Intersil | ||
530 | |||
509 | config DVB_LGS8GL5 | 531 | config DVB_LGS8GL5 |
510 | tristate "Silicon Legend LGS-8GL5 demodulator (OFDM)" | 532 | tristate "Silicon Legend LGS-8GL5 demodulator (OFDM)" |
511 | depends on DVB_CORE && I2C | 533 | depends on DVB_CORE && I2C |
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile index bc2b00abd106..832473c1e512 100644 --- a/drivers/media/dvb/frontends/Makefile +++ b/drivers/media/dvb/frontends/Makefile | |||
@@ -71,4 +71,6 @@ obj-$(CONFIG_DVB_STB6000) += stb6000.o | |||
71 | obj-$(CONFIG_DVB_S921) += s921.o | 71 | obj-$(CONFIG_DVB_S921) += s921.o |
72 | obj-$(CONFIG_DVB_STV6110) += stv6110.o | 72 | obj-$(CONFIG_DVB_STV6110) += stv6110.o |
73 | obj-$(CONFIG_DVB_STV0900) += stv0900.o | 73 | obj-$(CONFIG_DVB_STV0900) += stv0900.o |
74 | 74 | obj-$(CONFIG_DVB_STV090x) += stv090x.o | |
75 | obj-$(CONFIG_DVB_STV6110x) += stv6110x.o | ||
76 | obj-$(CONFIG_DVB_ISL6423) += isl6423.o | ||
diff --git a/drivers/media/dvb/frontends/af9013.c b/drivers/media/dvb/frontends/af9013.c index b2b50fb4cfd3..136c5863d81b 100644 --- a/drivers/media/dvb/frontends/af9013.c +++ b/drivers/media/dvb/frontends/af9013.c | |||
@@ -1455,7 +1455,7 @@ static int af9013_download_firmware(struct af9013_state *state) | |||
1455 | af9013_ops.info.name); | 1455 | af9013_ops.info.name); |
1456 | 1456 | ||
1457 | /* request the firmware, this will block and timeout */ | 1457 | /* request the firmware, this will block and timeout */ |
1458 | ret = request_firmware(&fw, fw_file, &state->i2c->dev); | 1458 | ret = request_firmware(&fw, fw_file, state->i2c->dev.parent); |
1459 | if (ret) { | 1459 | if (ret) { |
1460 | err("did not find the firmware file. (%s) " | 1460 | err("did not find the firmware file. (%s) " |
1461 | "Please see linux/Documentation/dvb/ for more details" \ | 1461 | "Please see linux/Documentation/dvb/ for more details" \ |
diff --git a/drivers/media/dvb/frontends/au8522_dig.c b/drivers/media/dvb/frontends/au8522_dig.c index 35731258bb0a..956b80f4979c 100644 --- a/drivers/media/dvb/frontends/au8522_dig.c +++ b/drivers/media/dvb/frontends/au8522_dig.c | |||
@@ -367,11 +367,90 @@ static struct { | |||
367 | { 0x8231, 0x13 }, | 367 | { 0x8231, 0x13 }, |
368 | }; | 368 | }; |
369 | 369 | ||
370 | /* QAM Modulation table */ | 370 | /* QAM64 Modulation table */ |
371 | static struct { | 371 | static struct { |
372 | u16 reg; | 372 | u16 reg; |
373 | u16 data; | 373 | u16 data; |
374 | } QAM_mod_tab[] = { | 374 | } QAM64_mod_tab[] = { |
375 | { 0x00a3, 0x09 }, | ||
376 | { 0x00a4, 0x00 }, | ||
377 | { 0x0081, 0xc4 }, | ||
378 | { 0x00a5, 0x40 }, | ||
379 | { 0x00aa, 0x77 }, | ||
380 | { 0x00ad, 0x77 }, | ||
381 | { 0x00a6, 0x67 }, | ||
382 | { 0x0262, 0x20 }, | ||
383 | { 0x021c, 0x30 }, | ||
384 | { 0x00b8, 0x3e }, | ||
385 | { 0x00b9, 0xf0 }, | ||
386 | { 0x00ba, 0x01 }, | ||
387 | { 0x00bb, 0x18 }, | ||
388 | { 0x00bc, 0x50 }, | ||
389 | { 0x00bd, 0x00 }, | ||
390 | { 0x00be, 0xea }, | ||
391 | { 0x00bf, 0xef }, | ||
392 | { 0x00c0, 0xfc }, | ||
393 | { 0x00c1, 0xbd }, | ||
394 | { 0x00c2, 0x1f }, | ||
395 | { 0x00c3, 0xfc }, | ||
396 | { 0x00c4, 0xdd }, | ||
397 | { 0x00c5, 0xaf }, | ||
398 | { 0x00c6, 0x00 }, | ||
399 | { 0x00c7, 0x38 }, | ||
400 | { 0x00c8, 0x30 }, | ||
401 | { 0x00c9, 0x05 }, | ||
402 | { 0x00ca, 0x4a }, | ||
403 | { 0x00cb, 0xd0 }, | ||
404 | { 0x00cc, 0x01 }, | ||
405 | { 0x00cd, 0xd9 }, | ||
406 | { 0x00ce, 0x6f }, | ||
407 | { 0x00cf, 0xf9 }, | ||
408 | { 0x00d0, 0x70 }, | ||
409 | { 0x00d1, 0xdf }, | ||
410 | { 0x00d2, 0xf7 }, | ||
411 | { 0x00d3, 0xc2 }, | ||
412 | { 0x00d4, 0xdf }, | ||
413 | { 0x00d5, 0x02 }, | ||
414 | { 0x00d6, 0x9a }, | ||
415 | { 0x00d7, 0xd0 }, | ||
416 | { 0x0250, 0x0d }, | ||
417 | { 0x0251, 0xcd }, | ||
418 | { 0x0252, 0xe0 }, | ||
419 | { 0x0253, 0x05 }, | ||
420 | { 0x0254, 0xa7 }, | ||
421 | { 0x0255, 0xff }, | ||
422 | { 0x0256, 0xed }, | ||
423 | { 0x0257, 0x5b }, | ||
424 | { 0x0258, 0xae }, | ||
425 | { 0x0259, 0xe6 }, | ||
426 | { 0x025a, 0x3d }, | ||
427 | { 0x025b, 0x0f }, | ||
428 | { 0x025c, 0x0d }, | ||
429 | { 0x025d, 0xea }, | ||
430 | { 0x025e, 0xf2 }, | ||
431 | { 0x025f, 0x51 }, | ||
432 | { 0x0260, 0xf5 }, | ||
433 | { 0x0261, 0x06 }, | ||
434 | { 0x021a, 0x00 }, | ||
435 | { 0x0546, 0x40 }, | ||
436 | { 0x0210, 0xc7 }, | ||
437 | { 0x0211, 0xaa }, | ||
438 | { 0x0212, 0xab }, | ||
439 | { 0x0213, 0x02 }, | ||
440 | { 0x0502, 0x00 }, | ||
441 | { 0x0121, 0x04 }, | ||
442 | { 0x0122, 0x04 }, | ||
443 | { 0x052e, 0x10 }, | ||
444 | { 0x00a4, 0xca }, | ||
445 | { 0x00a7, 0x40 }, | ||
446 | { 0x0526, 0x01 }, | ||
447 | }; | ||
448 | |||
449 | /* QAM256 Modulation table */ | ||
450 | static struct { | ||
451 | u16 reg; | ||
452 | u16 data; | ||
453 | } QAM256_mod_tab[] = { | ||
375 | { 0x80a3, 0x09 }, | 454 | { 0x80a3, 0x09 }, |
376 | { 0x80a4, 0x00 }, | 455 | { 0x80a4, 0x00 }, |
377 | { 0x8081, 0xc4 }, | 456 | { 0x8081, 0xc4 }, |
@@ -464,12 +543,19 @@ static int au8522_enable_modulation(struct dvb_frontend *fe, | |||
464 | au8522_set_if(fe, state->config->vsb_if); | 543 | au8522_set_if(fe, state->config->vsb_if); |
465 | break; | 544 | break; |
466 | case QAM_64: | 545 | case QAM_64: |
546 | dprintk("%s() QAM 64\n", __func__); | ||
547 | for (i = 0; i < ARRAY_SIZE(QAM64_mod_tab); i++) | ||
548 | au8522_writereg(state, | ||
549 | QAM64_mod_tab[i].reg, | ||
550 | QAM64_mod_tab[i].data); | ||
551 | au8522_set_if(fe, state->config->qam_if); | ||
552 | break; | ||
467 | case QAM_256: | 553 | case QAM_256: |
468 | dprintk("%s() QAM 64/256\n", __func__); | 554 | dprintk("%s() QAM 256\n", __func__); |
469 | for (i = 0; i < ARRAY_SIZE(QAM_mod_tab); i++) | 555 | for (i = 0; i < ARRAY_SIZE(QAM256_mod_tab); i++) |
470 | au8522_writereg(state, | 556 | au8522_writereg(state, |
471 | QAM_mod_tab[i].reg, | 557 | QAM256_mod_tab[i].reg, |
472 | QAM_mod_tab[i].data); | 558 | QAM256_mod_tab[i].data); |
473 | au8522_set_if(fe, state->config->qam_if); | 559 | au8522_set_if(fe, state->config->qam_if); |
474 | break; | 560 | break; |
475 | default: | 561 | default: |
diff --git a/drivers/media/dvb/frontends/cx24116.c b/drivers/media/dvb/frontends/cx24116.c index 9b9f57264cef..2410d8b59b6b 100644 --- a/drivers/media/dvb/frontends/cx24116.c +++ b/drivers/media/dvb/frontends/cx24116.c | |||
@@ -492,7 +492,7 @@ static int cx24116_firmware_ondemand(struct dvb_frontend *fe) | |||
492 | printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", | 492 | printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", |
493 | __func__, CX24116_DEFAULT_FIRMWARE); | 493 | __func__, CX24116_DEFAULT_FIRMWARE); |
494 | ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE, | 494 | ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE, |
495 | &state->i2c->dev); | 495 | state->i2c->dev.parent); |
496 | printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", | 496 | printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", |
497 | __func__); | 497 | __func__); |
498 | if (ret) { | 498 | if (ret) { |
diff --git a/drivers/media/dvb/frontends/drx397xD.c b/drivers/media/dvb/frontends/drx397xD.c index 172f1f928f02..010075535221 100644 --- a/drivers/media/dvb/frontends/drx397xD.c +++ b/drivers/media/dvb/frontends/drx397xD.c | |||
@@ -123,10 +123,10 @@ static int drx_load_fw(struct drx397xD_state *s, enum fw_ix ix) | |||
123 | } | 123 | } |
124 | memset(&fw[ix].data[0], 0, sizeof(fw[0].data)); | 124 | memset(&fw[ix].data[0], 0, sizeof(fw[0].data)); |
125 | 125 | ||
126 | if (request_firmware(&fw[ix].file, fw[ix].name, &s->i2c->dev) != 0) { | 126 | rc = request_firmware(&fw[ix].file, fw[ix].name, s->i2c->dev.parent); |
127 | if (rc != 0) { | ||
127 | printk(KERN_ERR "%s: Firmware \"%s\" not available\n", | 128 | printk(KERN_ERR "%s: Firmware \"%s\" not available\n", |
128 | mod_name, fw[ix].name); | 129 | mod_name, fw[ix].name); |
129 | rc = -ENOENT; | ||
130 | goto exit_err; | 130 | goto exit_err; |
131 | } | 131 | } |
132 | 132 | ||
diff --git a/drivers/media/dvb/frontends/isl6423.c b/drivers/media/dvb/frontends/isl6423.c new file mode 100644 index 000000000000..dca5bebfeeb5 --- /dev/null +++ b/drivers/media/dvb/frontends/isl6423.c | |||
@@ -0,0 +1,308 @@ | |||
1 | /* | ||
2 | Intersil ISL6423 SEC and LNB Power supply controller | ||
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/delay.h> | ||
22 | #include <linux/errno.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/string.h> | ||
27 | #include <linux/slab.h> | ||
28 | |||
29 | #include "dvb_frontend.h" | ||
30 | #include "isl6423.h" | ||
31 | |||
32 | static unsigned int verbose; | ||
33 | module_param(verbose, int, 0644); | ||
34 | MODULE_PARM_DESC(verbose, "Set Verbosity level"); | ||
35 | |||
36 | #define FE_ERROR 0 | ||
37 | #define FE_NOTICE 1 | ||
38 | #define FE_INFO 2 | ||
39 | #define FE_DEBUG 3 | ||
40 | #define FE_DEBUGREG 4 | ||
41 | |||
42 | #define dprintk(__y, __z, format, arg...) do { \ | ||
43 | if (__z) { \ | ||
44 | if ((verbose > FE_ERROR) && (verbose > __y)) \ | ||
45 | printk(KERN_ERR "%s: " format "\n", __func__ , ##arg); \ | ||
46 | else if ((verbose > FE_NOTICE) && (verbose > __y)) \ | ||
47 | printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg); \ | ||
48 | else if ((verbose > FE_INFO) && (verbose > __y)) \ | ||
49 | printk(KERN_INFO "%s: " format "\n", __func__ , ##arg); \ | ||
50 | else if ((verbose > FE_DEBUG) && (verbose > __y)) \ | ||
51 | printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg); \ | ||
52 | } else { \ | ||
53 | if (verbose > __y) \ | ||
54 | printk(format, ##arg); \ | ||
55 | } \ | ||
56 | } while (0) | ||
57 | |||
58 | struct isl6423_dev { | ||
59 | const struct isl6423_config *config; | ||
60 | struct i2c_adapter *i2c; | ||
61 | |||
62 | u8 reg_3; | ||
63 | u8 reg_4; | ||
64 | |||
65 | unsigned int verbose; | ||
66 | }; | ||
67 | |||
68 | static int isl6423_write(struct isl6423_dev *isl6423, u8 reg) | ||
69 | { | ||
70 | struct i2c_adapter *i2c = isl6423->i2c; | ||
71 | u8 addr = isl6423->config->addr; | ||
72 | int err = 0; | ||
73 | |||
74 | struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = ®, .len = 1 }; | ||
75 | |||
76 | dprintk(FE_DEBUG, 1, "write reg %02X", reg); | ||
77 | err = i2c_transfer(i2c, &msg, 1); | ||
78 | if (err < 0) | ||
79 | goto exit; | ||
80 | return 0; | ||
81 | |||
82 | exit: | ||
83 | dprintk(FE_ERROR, 1, "I/O error <%d>", err); | ||
84 | return err; | ||
85 | } | ||
86 | |||
87 | static int isl6423_set_modulation(struct dvb_frontend *fe) | ||
88 | { | ||
89 | struct isl6423_dev *isl6423 = (struct isl6423_dev *) fe->sec_priv; | ||
90 | const struct isl6423_config *config = isl6423->config; | ||
91 | int err = 0; | ||
92 | u8 reg_2 = 0; | ||
93 | |||
94 | reg_2 = 0x01 << 5; | ||
95 | |||
96 | if (config->mod_extern) | ||
97 | reg_2 |= (1 << 3); | ||
98 | else | ||
99 | reg_2 |= (1 << 4); | ||
100 | |||
101 | err = isl6423_write(isl6423, reg_2); | ||
102 | if (err < 0) | ||
103 | goto exit; | ||
104 | return 0; | ||
105 | |||
106 | exit: | ||
107 | dprintk(FE_ERROR, 1, "I/O error <%d>", err); | ||
108 | return err; | ||
109 | } | ||
110 | |||
111 | static int isl6423_voltage_boost(struct dvb_frontend *fe, long arg) | ||
112 | { | ||
113 | struct isl6423_dev *isl6423 = (struct isl6423_dev *) fe->sec_priv; | ||
114 | u8 reg_3 = isl6423->reg_3; | ||
115 | u8 reg_4 = isl6423->reg_4; | ||
116 | int err = 0; | ||
117 | |||
118 | if (arg) { | ||
119 | /* EN = 1, VSPEN = 1, VBOT = 1 */ | ||
120 | reg_4 |= (1 << 4); | ||
121 | reg_4 |= 0x1; | ||
122 | reg_3 |= (1 << 3); | ||
123 | } else { | ||
124 | /* EN = 1, VSPEN = 1, VBOT = 0 */ | ||
125 | reg_4 |= (1 << 4); | ||
126 | reg_4 &= ~0x1; | ||
127 | reg_3 |= (1 << 3); | ||
128 | } | ||
129 | err = isl6423_write(isl6423, reg_3); | ||
130 | if (err < 0) | ||
131 | goto exit; | ||
132 | |||
133 | err = isl6423_write(isl6423, reg_4); | ||
134 | if (err < 0) | ||
135 | goto exit; | ||
136 | |||
137 | isl6423->reg_3 = reg_3; | ||
138 | isl6423->reg_4 = reg_4; | ||
139 | |||
140 | return 0; | ||
141 | exit: | ||
142 | dprintk(FE_ERROR, 1, "I/O error <%d>", err); | ||
143 | return err; | ||
144 | } | ||
145 | |||
146 | |||
147 | static int isl6423_set_voltage(struct dvb_frontend *fe, | ||
148 | enum fe_sec_voltage voltage) | ||
149 | { | ||
150 | struct isl6423_dev *isl6423 = (struct isl6423_dev *) fe->sec_priv; | ||
151 | u8 reg_3 = isl6423->reg_3; | ||
152 | u8 reg_4 = isl6423->reg_4; | ||
153 | int err = 0; | ||
154 | |||
155 | switch (voltage) { | ||
156 | case SEC_VOLTAGE_OFF: | ||
157 | /* EN = 0 */ | ||
158 | reg_4 &= ~(1 << 4); | ||
159 | break; | ||
160 | |||
161 | case SEC_VOLTAGE_13: | ||
162 | /* EN = 1, VSPEN = 1, VTOP = 0, VBOT = 0 */ | ||
163 | reg_4 |= (1 << 4); | ||
164 | reg_4 &= ~0x3; | ||
165 | reg_3 |= (1 << 3); | ||
166 | break; | ||
167 | |||
168 | case SEC_VOLTAGE_18: | ||
169 | /* EN = 1, VSPEN = 1, VTOP = 1, VBOT = 0 */ | ||
170 | reg_4 |= (1 << 4); | ||
171 | reg_4 |= 0x2; | ||
172 | reg_4 &= ~0x1; | ||
173 | reg_3 |= (1 << 3); | ||
174 | break; | ||
175 | |||
176 | default: | ||
177 | break; | ||
178 | } | ||
179 | err = isl6423_write(isl6423, reg_3); | ||
180 | if (err < 0) | ||
181 | goto exit; | ||
182 | |||
183 | err = isl6423_write(isl6423, reg_4); | ||
184 | if (err < 0) | ||
185 | goto exit; | ||
186 | |||
187 | isl6423->reg_3 = reg_3; | ||
188 | isl6423->reg_4 = reg_4; | ||
189 | |||
190 | return 0; | ||
191 | exit: | ||
192 | dprintk(FE_ERROR, 1, "I/O error <%d>", err); | ||
193 | return err; | ||
194 | } | ||
195 | |||
196 | static int isl6423_set_current(struct dvb_frontend *fe) | ||
197 | { | ||
198 | struct isl6423_dev *isl6423 = (struct isl6423_dev *) fe->sec_priv; | ||
199 | u8 reg_3 = isl6423->reg_3; | ||
200 | const struct isl6423_config *config = isl6423->config; | ||
201 | int err = 0; | ||
202 | |||
203 | switch (config->current_max) { | ||
204 | case SEC_CURRENT_275m: | ||
205 | /* 275mA */ | ||
206 | /* ISELH = 0, ISELL = 0 */ | ||
207 | reg_3 &= ~0x3; | ||
208 | break; | ||
209 | |||
210 | case SEC_CURRENT_515m: | ||
211 | /* 515mA */ | ||
212 | /* ISELH = 0, ISELL = 1 */ | ||
213 | reg_3 &= ~0x2; | ||
214 | reg_3 |= 0x1; | ||
215 | break; | ||
216 | |||
217 | case SEC_CURRENT_635m: | ||
218 | /* 635mA */ | ||
219 | /* ISELH = 1, ISELL = 0 */ | ||
220 | reg_3 &= ~0x1; | ||
221 | reg_3 |= 0x2; | ||
222 | break; | ||
223 | |||
224 | case SEC_CURRENT_800m: | ||
225 | /* 800mA */ | ||
226 | /* ISELH = 1, ISELL = 1 */ | ||
227 | reg_3 |= 0x3; | ||
228 | break; | ||
229 | } | ||
230 | |||
231 | err = isl6423_write(isl6423, reg_3); | ||
232 | if (err < 0) | ||
233 | goto exit; | ||
234 | |||
235 | switch (config->curlim) { | ||
236 | case SEC_CURRENT_LIM_ON: | ||
237 | /* DCL = 0 */ | ||
238 | reg_3 &= ~0x10; | ||
239 | break; | ||
240 | |||
241 | case SEC_CURRENT_LIM_OFF: | ||
242 | /* DCL = 1 */ | ||
243 | reg_3 |= 0x10; | ||
244 | break; | ||
245 | } | ||
246 | |||
247 | err = isl6423_write(isl6423, reg_3); | ||
248 | if (err < 0) | ||
249 | goto exit; | ||
250 | |||
251 | isl6423->reg_3 = reg_3; | ||
252 | |||
253 | return 0; | ||
254 | exit: | ||
255 | dprintk(FE_ERROR, 1, "I/O error <%d>", err); | ||
256 | return err; | ||
257 | } | ||
258 | |||
259 | static void isl6423_release(struct dvb_frontend *fe) | ||
260 | { | ||
261 | isl6423_set_voltage(fe, SEC_VOLTAGE_OFF); | ||
262 | |||
263 | kfree(fe->sec_priv); | ||
264 | fe->sec_priv = NULL; | ||
265 | } | ||
266 | |||
267 | struct dvb_frontend *isl6423_attach(struct dvb_frontend *fe, | ||
268 | struct i2c_adapter *i2c, | ||
269 | const struct isl6423_config *config) | ||
270 | { | ||
271 | struct isl6423_dev *isl6423; | ||
272 | |||
273 | isl6423 = kzalloc(sizeof(struct isl6423_dev), GFP_KERNEL); | ||
274 | if (!isl6423) | ||
275 | return NULL; | ||
276 | |||
277 | isl6423->config = config; | ||
278 | isl6423->i2c = i2c; | ||
279 | fe->sec_priv = isl6423; | ||
280 | |||
281 | /* SR3H = 0, SR3M = 1, SR3L = 0 */ | ||
282 | isl6423->reg_3 = 0x02 << 5; | ||
283 | /* SR4H = 0, SR4M = 1, SR4L = 1 */ | ||
284 | isl6423->reg_4 = 0x03 << 5; | ||
285 | |||
286 | if (isl6423_set_current(fe)) | ||
287 | goto exit; | ||
288 | |||
289 | if (isl6423_set_modulation(fe)) | ||
290 | goto exit; | ||
291 | |||
292 | fe->ops.release_sec = isl6423_release; | ||
293 | fe->ops.set_voltage = isl6423_set_voltage; | ||
294 | fe->ops.enable_high_lnb_voltage = isl6423_voltage_boost; | ||
295 | isl6423->verbose = verbose; | ||
296 | |||
297 | return fe; | ||
298 | |||
299 | exit: | ||
300 | kfree(isl6423); | ||
301 | fe->sec_priv = NULL; | ||
302 | return NULL; | ||
303 | } | ||
304 | EXPORT_SYMBOL(isl6423_attach); | ||
305 | |||
306 | MODULE_DESCRIPTION("ISL6423 SEC"); | ||
307 | MODULE_AUTHOR("Manu Abraham"); | ||
308 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/isl6423.h b/drivers/media/dvb/frontends/isl6423.h new file mode 100644 index 000000000000..e1a37fba01ca --- /dev/null +++ b/drivers/media/dvb/frontends/isl6423.h | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | Intersil ISL6423 SEC and LNB Power supply controller | ||
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 __ISL_6423_H | ||
22 | #define __ISL_6423_H | ||
23 | |||
24 | #include <linux/dvb/frontend.h> | ||
25 | |||
26 | enum isl6423_current { | ||
27 | SEC_CURRENT_275m = 0, | ||
28 | SEC_CURRENT_515m, | ||
29 | SEC_CURRENT_635m, | ||
30 | SEC_CURRENT_800m, | ||
31 | }; | ||
32 | |||
33 | enum isl6423_curlim { | ||
34 | SEC_CURRENT_LIM_ON = 1, | ||
35 | SEC_CURRENT_LIM_OFF | ||
36 | }; | ||
37 | |||
38 | struct isl6423_config { | ||
39 | enum isl6423_current current_max; | ||
40 | enum isl6423_curlim curlim; | ||
41 | u8 addr; | ||
42 | u8 mod_extern; | ||
43 | }; | ||
44 | |||
45 | #if defined(CONFIG_DVB_ISL6423) || (defined(CONFIG_DVB_ISL6423_MODULE) && defined(MODULE)) | ||
46 | |||
47 | |||
48 | extern struct dvb_frontend *isl6423_attach(struct dvb_frontend *fe, | ||
49 | struct i2c_adapter *i2c, | ||
50 | const struct isl6423_config *config); | ||
51 | |||
52 | #else | ||
53 | static inline struct dvb_frontend *isl6423_attach(struct dvb_frontend *fe, | ||
54 | struct i2c_adapter *i2c, | ||
55 | const struct isl6423_config *config) | ||
56 | { | ||
57 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
58 | return NULL; | ||
59 | } | ||
60 | |||
61 | #endif /* CONFIG_DVB_ISL6423 */ | ||
62 | |||
63 | #endif /* __ISL_6423_H */ | ||
diff --git a/drivers/media/dvb/frontends/lgdt3305.c b/drivers/media/dvb/frontends/lgdt3305.c index d92d0557a80b..fde8c59700fb 100644 --- a/drivers/media/dvb/frontends/lgdt3305.c +++ b/drivers/media/dvb/frontends/lgdt3305.c | |||
@@ -19,6 +19,7 @@ | |||
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <asm/div64.h> | ||
22 | #include <linux/dvb/frontend.h> | 23 | #include <linux/dvb/frontend.h> |
23 | #include "dvb_math.h" | 24 | #include "dvb_math.h" |
24 | #include "lgdt3305.h" | 25 | #include "lgdt3305.h" |
@@ -496,27 +497,15 @@ static int lgdt3305_set_if(struct lgdt3305_state *state, | |||
496 | 497 | ||
497 | nco = if_freq_khz / 10; | 498 | nco = if_freq_khz / 10; |
498 | 499 | ||
499 | #define LGDT3305_64BIT_DIVISION_ENABLED 0 | ||
500 | /* FIXME: 64bit division disabled to avoid linking error: | ||
501 | * WARNING: "__udivdi3" [lgdt3305.ko] undefined! | ||
502 | */ | ||
503 | switch (param->u.vsb.modulation) { | 500 | switch (param->u.vsb.modulation) { |
504 | case VSB_8: | 501 | case VSB_8: |
505 | #if LGDT3305_64BIT_DIVISION_ENABLED | ||
506 | nco <<= 24; | 502 | nco <<= 24; |
507 | nco /= 625; | 503 | do_div(nco, 625); |
508 | #else | ||
509 | nco *= ((1 << 24) / 625); | ||
510 | #endif | ||
511 | break; | 504 | break; |
512 | case QAM_64: | 505 | case QAM_64: |
513 | case QAM_256: | 506 | case QAM_256: |
514 | #if LGDT3305_64BIT_DIVISION_ENABLED | ||
515 | nco <<= 28; | 507 | nco <<= 28; |
516 | nco /= 625; | 508 | do_div(nco, 625); |
517 | #else | ||
518 | nco *= ((1 << 28) / 625); | ||
519 | #endif | ||
520 | break; | 509 | break; |
521 | default: | 510 | default: |
522 | return -EINVAL; | 511 | return -EINVAL; |
diff --git a/drivers/media/dvb/frontends/lgs8gxx.c b/drivers/media/dvb/frontends/lgs8gxx.c index f9785dfe735b..fde27645bbed 100644 --- a/drivers/media/dvb/frontends/lgs8gxx.c +++ b/drivers/media/dvb/frontends/lgs8gxx.c | |||
@@ -37,14 +37,14 @@ | |||
37 | } while (0) | 37 | } while (0) |
38 | 38 | ||
39 | static int debug; | 39 | static int debug; |
40 | static int fake_signal_str; | 40 | static int fake_signal_str = 1; |
41 | 41 | ||
42 | module_param(debug, int, 0644); | 42 | module_param(debug, int, 0644); |
43 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); | 43 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); |
44 | 44 | ||
45 | module_param(fake_signal_str, int, 0644); | 45 | module_param(fake_signal_str, int, 0644); |
46 | MODULE_PARM_DESC(fake_signal_str, "fake signal strength for LGS8913." | 46 | MODULE_PARM_DESC(fake_signal_str, "fake signal strength for LGS8913." |
47 | "Signal strength calculation is slow.(default:off)."); | 47 | "Signal strength calculation is slow.(default:on)."); |
48 | 48 | ||
49 | /* LGS8GXX internal helper functions */ | 49 | /* LGS8GXX internal helper functions */ |
50 | 50 | ||
@@ -610,7 +610,7 @@ static int lgs8gxx_read_signal_agc(struct lgs8gxx_state *priv, u16 *signal) | |||
610 | else | 610 | else |
611 | cat = 0; | 611 | cat = 0; |
612 | 612 | ||
613 | *signal = cat; | 613 | *signal = cat * 65535 / 5; |
614 | 614 | ||
615 | return 0; | 615 | return 0; |
616 | } | 616 | } |
@@ -630,8 +630,8 @@ static int lgs8913_read_signal_strength(struct lgs8gxx_state *priv, u16 *signal) | |||
630 | 630 | ||
631 | if (fake_signal_str) { | 631 | if (fake_signal_str) { |
632 | if ((t & 0xC0) == 0xC0) { | 632 | if ((t & 0xC0) == 0xC0) { |
633 | dprintk("Fake signal strength as 50\n"); | 633 | dprintk("Fake signal strength\n"); |
634 | *signal = 0x32; | 634 | *signal = 0x7FFF; |
635 | } else | 635 | } else |
636 | *signal = 0; | 636 | *signal = 0; |
637 | return 0; | 637 | return 0; |
diff --git a/drivers/media/dvb/frontends/lnbp21.c b/drivers/media/dvb/frontends/lnbp21.c index 1dcc56f32bff..71f607fe8fc7 100644 --- a/drivers/media/dvb/frontends/lnbp21.c +++ b/drivers/media/dvb/frontends/lnbp21.c | |||
@@ -133,7 +133,7 @@ static struct dvb_frontend *lnbx2x_attach(struct dvb_frontend *fe, | |||
133 | /* override frontend ops */ | 133 | /* override frontend ops */ |
134 | fe->ops.set_voltage = lnbp21_set_voltage; | 134 | fe->ops.set_voltage = lnbp21_set_voltage; |
135 | fe->ops.enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; | 135 | fe->ops.enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; |
136 | printk(KERN_INFO "LNBx2x attached on addr=%x", lnbp21->i2c_addr); | 136 | printk(KERN_INFO "LNBx2x attached on addr=%x\n", lnbp21->i2c_addr); |
137 | 137 | ||
138 | return fe; | 138 | return fe; |
139 | } | 139 | } |
diff --git a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c index 5ac9b15920f8..a621f727935f 100644 --- a/drivers/media/dvb/frontends/mt312.c +++ b/drivers/media/dvb/frontends/mt312.c | |||
@@ -77,7 +77,7 @@ static int mt312_read(struct mt312_state *state, const enum mt312_reg_addr reg, | |||
77 | ret = i2c_transfer(state->i2c, msg, 2); | 77 | ret = i2c_transfer(state->i2c, msg, 2); |
78 | 78 | ||
79 | if (ret != 2) { | 79 | if (ret != 2) { |
80 | printk(KERN_ERR "%s: ret == %d\n", __func__, ret); | 80 | printk(KERN_DEBUG "%s: ret == %d\n", __func__, ret); |
81 | return -EREMOTEIO; | 81 | return -EREMOTEIO; |
82 | } | 82 | } |
83 | 83 | ||
diff --git a/drivers/media/dvb/frontends/nxt200x.c b/drivers/media/dvb/frontends/nxt200x.c index a8429ebfa8a2..eac20650499f 100644 --- a/drivers/media/dvb/frontends/nxt200x.c +++ b/drivers/media/dvb/frontends/nxt200x.c | |||
@@ -879,7 +879,8 @@ static int nxt2002_init(struct dvb_frontend* fe) | |||
879 | 879 | ||
880 | /* request the firmware, this will block until someone uploads it */ | 880 | /* request the firmware, this will block until someone uploads it */ |
881 | printk("nxt2002: Waiting for firmware upload (%s)...\n", NXT2002_DEFAULT_FIRMWARE); | 881 | printk("nxt2002: Waiting for firmware upload (%s)...\n", NXT2002_DEFAULT_FIRMWARE); |
882 | ret = request_firmware(&fw, NXT2002_DEFAULT_FIRMWARE, &state->i2c->dev); | 882 | ret = request_firmware(&fw, NXT2002_DEFAULT_FIRMWARE, |
883 | state->i2c->dev.parent); | ||
883 | printk("nxt2002: Waiting for firmware upload(2)...\n"); | 884 | printk("nxt2002: Waiting for firmware upload(2)...\n"); |
884 | if (ret) { | 885 | if (ret) { |
885 | printk("nxt2002: No firmware uploaded (timeout or file not found?)\n"); | 886 | printk("nxt2002: No firmware uploaded (timeout or file not found?)\n"); |
@@ -943,7 +944,8 @@ static int nxt2004_init(struct dvb_frontend* fe) | |||
943 | 944 | ||
944 | /* request the firmware, this will block until someone uploads it */ | 945 | /* request the firmware, this will block until someone uploads it */ |
945 | printk("nxt2004: Waiting for firmware upload (%s)...\n", NXT2004_DEFAULT_FIRMWARE); | 946 | printk("nxt2004: Waiting for firmware upload (%s)...\n", NXT2004_DEFAULT_FIRMWARE); |
946 | ret = request_firmware(&fw, NXT2004_DEFAULT_FIRMWARE, &state->i2c->dev); | 947 | ret = request_firmware(&fw, NXT2004_DEFAULT_FIRMWARE, |
948 | state->i2c->dev.parent); | ||
947 | printk("nxt2004: Waiting for firmware upload(2)...\n"); | 949 | printk("nxt2004: Waiting for firmware upload(2)...\n"); |
948 | if (ret) { | 950 | if (ret) { |
949 | printk("nxt2004: No firmware uploaded (timeout or file not found?)\n"); | 951 | printk("nxt2004: No firmware uploaded (timeout or file not found?)\n"); |
diff --git a/drivers/media/dvb/frontends/or51132.c b/drivers/media/dvb/frontends/or51132.c index 5ed32544de39..8133ea3cddd7 100644 --- a/drivers/media/dvb/frontends/or51132.c +++ b/drivers/media/dvb/frontends/or51132.c | |||
@@ -340,7 +340,7 @@ static int or51132_set_parameters(struct dvb_frontend* fe, | |||
340 | } | 340 | } |
341 | printk("or51132: Waiting for firmware upload(%s)...\n", | 341 | printk("or51132: Waiting for firmware upload(%s)...\n", |
342 | fwname); | 342 | fwname); |
343 | ret = request_firmware(&fw, fwname, &state->i2c->dev); | 343 | ret = request_firmware(&fw, fwname, state->i2c->dev.parent); |
344 | if (ret) { | 344 | if (ret) { |
345 | printk(KERN_WARNING "or51132: No firmware up" | 345 | printk(KERN_WARNING "or51132: No firmware up" |
346 | "loaded(timeout or file not found?)\n"); | 346 | "loaded(timeout or file not found?)\n"); |
diff --git a/drivers/media/dvb/frontends/stv0900_priv.h b/drivers/media/dvb/frontends/stv0900_priv.h index 762d5af62d7a..67dc8ec634e2 100644 --- a/drivers/media/dvb/frontends/stv0900_priv.h +++ b/drivers/media/dvb/frontends/stv0900_priv.h | |||
@@ -60,8 +60,6 @@ | |||
60 | } \ | 60 | } \ |
61 | } while (0) | 61 | } while (0) |
62 | 62 | ||
63 | #define dmd_choose(a, b) (demod = STV0900_DEMOD_2 ? b : a)) | ||
64 | |||
65 | static int stvdebug; | 63 | static int stvdebug; |
66 | 64 | ||
67 | #define dprintk(args...) \ | 65 | #define dprintk(args...) \ |
diff --git a/drivers/media/dvb/frontends/stv090x.c b/drivers/media/dvb/frontends/stv090x.c new file mode 100644 index 000000000000..96ef745a2e4e --- /dev/null +++ b/drivers/media/dvb/frontends/stv090x.c | |||
@@ -0,0 +1,4299 @@ | |||
1 | /* | ||
2 | STV0900/0903 Multistandard Broadcast Frontend driver | ||
3 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
4 | |||
5 | Copyright (C) ST Microelectronics | ||
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/init.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/module.h> | ||
25 | #include <linux/string.h> | ||
26 | #include <linux/mutex.h> | ||
27 | |||
28 | #include <linux/dvb/frontend.h> | ||
29 | #include "dvb_frontend.h" | ||
30 | |||
31 | #include "stv6110x.h" /* for demodulator internal modes */ | ||
32 | |||
33 | #include "stv090x_reg.h" | ||
34 | #include "stv090x.h" | ||
35 | #include "stv090x_priv.h" | ||
36 | |||
37 | static unsigned int verbose; | ||
38 | module_param(verbose, int, 0644); | ||
39 | |||
40 | struct mutex demod_lock; | ||
41 | |||
42 | /* DVBS1 and DSS C/N Lookup table */ | ||
43 | static const struct stv090x_tab stv090x_s1cn_tab[] = { | ||
44 | { 0, 8917 }, /* 0.0dB */ | ||
45 | { 5, 8801 }, /* 0.5dB */ | ||
46 | { 10, 8667 }, /* 1.0dB */ | ||
47 | { 15, 8522 }, /* 1.5dB */ | ||
48 | { 20, 8355 }, /* 2.0dB */ | ||
49 | { 25, 8175 }, /* 2.5dB */ | ||
50 | { 30, 7979 }, /* 3.0dB */ | ||
51 | { 35, 7763 }, /* 3.5dB */ | ||
52 | { 40, 7530 }, /* 4.0dB */ | ||
53 | { 45, 7282 }, /* 4.5dB */ | ||
54 | { 50, 7026 }, /* 5.0dB */ | ||
55 | { 55, 6781 }, /* 5.5dB */ | ||
56 | { 60, 6514 }, /* 6.0dB */ | ||
57 | { 65, 6241 }, /* 6.5dB */ | ||
58 | { 70, 5965 }, /* 7.0dB */ | ||
59 | { 75, 5690 }, /* 7.5dB */ | ||
60 | { 80, 5424 }, /* 8.0dB */ | ||
61 | { 85, 5161 }, /* 8.5dB */ | ||
62 | { 90, 4902 }, /* 9.0dB */ | ||
63 | { 95, 4654 }, /* 9.5dB */ | ||
64 | { 100, 4417 }, /* 10.0dB */ | ||
65 | { 105, 4186 }, /* 10.5dB */ | ||
66 | { 110, 3968 }, /* 11.0dB */ | ||
67 | { 115, 3757 }, /* 11.5dB */ | ||
68 | { 120, 3558 }, /* 12.0dB */ | ||
69 | { 125, 3366 }, /* 12.5dB */ | ||
70 | { 130, 3185 }, /* 13.0dB */ | ||
71 | { 135, 3012 }, /* 13.5dB */ | ||
72 | { 140, 2850 }, /* 14.0dB */ | ||
73 | { 145, 2698 }, /* 14.5dB */ | ||
74 | { 150, 2550 }, /* 15.0dB */ | ||
75 | { 160, 2283 }, /* 16.0dB */ | ||
76 | { 170, 2042 }, /* 17.0dB */ | ||
77 | { 180, 1827 }, /* 18.0dB */ | ||
78 | { 190, 1636 }, /* 19.0dB */ | ||
79 | { 200, 1466 }, /* 20.0dB */ | ||
80 | { 210, 1315 }, /* 21.0dB */ | ||
81 | { 220, 1181 }, /* 22.0dB */ | ||
82 | { 230, 1064 }, /* 23.0dB */ | ||
83 | { 240, 960 }, /* 24.0dB */ | ||
84 | { 250, 869 }, /* 25.0dB */ | ||
85 | { 260, 792 }, /* 26.0dB */ | ||
86 | { 270, 724 }, /* 27.0dB */ | ||
87 | { 280, 665 }, /* 28.0dB */ | ||
88 | { 290, 616 }, /* 29.0dB */ | ||
89 | { 300, 573 }, /* 30.0dB */ | ||
90 | { 310, 537 }, /* 31.0dB */ | ||
91 | { 320, 507 }, /* 32.0dB */ | ||
92 | { 330, 483 }, /* 33.0dB */ | ||
93 | { 400, 398 }, /* 40.0dB */ | ||
94 | { 450, 381 }, /* 45.0dB */ | ||
95 | { 500, 377 } /* 50.0dB */ | ||
96 | }; | ||
97 | |||
98 | /* DVBS2 C/N Lookup table */ | ||
99 | static const struct stv090x_tab stv090x_s2cn_tab[] = { | ||
100 | { -30, 13348 }, /* -3.0dB */ | ||
101 | { -20, 12640 }, /* -2d.0B */ | ||
102 | { -10, 11883 }, /* -1.0dB */ | ||
103 | { 0, 11101 }, /* -0.0dB */ | ||
104 | { 5, 10718 }, /* 0.5dB */ | ||
105 | { 10, 10339 }, /* 1.0dB */ | ||
106 | { 15, 9947 }, /* 1.5dB */ | ||
107 | { 20, 9552 }, /* 2.0dB */ | ||
108 | { 25, 9183 }, /* 2.5dB */ | ||
109 | { 30, 8799 }, /* 3.0dB */ | ||
110 | { 35, 8422 }, /* 3.5dB */ | ||
111 | { 40, 8062 }, /* 4.0dB */ | ||
112 | { 45, 7707 }, /* 4.5dB */ | ||
113 | { 50, 7353 }, /* 5.0dB */ | ||
114 | { 55, 7025 }, /* 5.5dB */ | ||
115 | { 60, 6684 }, /* 6.0dB */ | ||
116 | { 65, 6331 }, /* 6.5dB */ | ||
117 | { 70, 6036 }, /* 7.0dB */ | ||
118 | { 75, 5727 }, /* 7.5dB */ | ||
119 | { 80, 5437 }, /* 8.0dB */ | ||
120 | { 85, 5164 }, /* 8.5dB */ | ||
121 | { 90, 4902 }, /* 9.0dB */ | ||
122 | { 95, 4653 }, /* 9.5dB */ | ||
123 | { 100, 4408 }, /* 10.0dB */ | ||
124 | { 105, 4187 }, /* 10.5dB */ | ||
125 | { 110, 3961 }, /* 11.0dB */ | ||
126 | { 115, 3751 }, /* 11.5dB */ | ||
127 | { 120, 3558 }, /* 12.0dB */ | ||
128 | { 125, 3368 }, /* 12.5dB */ | ||
129 | { 130, 3191 }, /* 13.0dB */ | ||
130 | { 135, 3017 }, /* 13.5dB */ | ||
131 | { 140, 2862 }, /* 14.0dB */ | ||
132 | { 145, 2710 }, /* 14.5dB */ | ||
133 | { 150, 2565 }, /* 15.0dB */ | ||
134 | { 160, 2300 }, /* 16.0dB */ | ||
135 | { 170, 2058 }, /* 17.0dB */ | ||
136 | { 180, 1849 }, /* 18.0dB */ | ||
137 | { 190, 1663 }, /* 19.0dB */ | ||
138 | { 200, 1495 }, /* 20.0dB */ | ||
139 | { 210, 1349 }, /* 21.0dB */ | ||
140 | { 220, 1222 }, /* 22.0dB */ | ||
141 | { 230, 1110 }, /* 23.0dB */ | ||
142 | { 240, 1011 }, /* 24.0dB */ | ||
143 | { 250, 925 }, /* 25.0dB */ | ||
144 | { 260, 853 }, /* 26.0dB */ | ||
145 | { 270, 789 }, /* 27.0dB */ | ||
146 | { 280, 734 }, /* 28.0dB */ | ||
147 | { 290, 690 }, /* 29.0dB */ | ||
148 | { 300, 650 }, /* 30.0dB */ | ||
149 | { 310, 619 }, /* 31.0dB */ | ||
150 | { 320, 593 }, /* 32.0dB */ | ||
151 | { 330, 571 }, /* 33.0dB */ | ||
152 | { 400, 498 }, /* 40.0dB */ | ||
153 | { 450, 484 }, /* 45.0dB */ | ||
154 | { 500, 481 } /* 50.0dB */ | ||
155 | }; | ||
156 | |||
157 | /* RF level C/N lookup table */ | ||
158 | static const struct stv090x_tab stv090x_rf_tab[] = { | ||
159 | { -5, 0xcaa1 }, /* -5dBm */ | ||
160 | { -10, 0xc229 }, /* -10dBm */ | ||
161 | { -15, 0xbb08 }, /* -15dBm */ | ||
162 | { -20, 0xb4bc }, /* -20dBm */ | ||
163 | { -25, 0xad5a }, /* -25dBm */ | ||
164 | { -30, 0xa298 }, /* -30dBm */ | ||
165 | { -35, 0x98a8 }, /* -35dBm */ | ||
166 | { -40, 0x8389 }, /* -40dBm */ | ||
167 | { -45, 0x59be }, /* -45dBm */ | ||
168 | { -50, 0x3a14 }, /* -50dBm */ | ||
169 | { -55, 0x2d11 }, /* -55dBm */ | ||
170 | { -60, 0x210d }, /* -60dBm */ | ||
171 | { -65, 0xa14f }, /* -65dBm */ | ||
172 | { -70, 0x07aa } /* -70dBm */ | ||
173 | }; | ||
174 | |||
175 | |||
176 | static struct stv090x_reg stv0900_initval[] = { | ||
177 | |||
178 | { STV090x_OUTCFG, 0x00 }, | ||
179 | { STV090x_MODECFG, 0xff }, | ||
180 | { STV090x_AGCRF1CFG, 0x11 }, | ||
181 | { STV090x_AGCRF2CFG, 0x13 }, | ||
182 | { STV090x_TSGENERAL1X, 0x14 }, | ||
183 | { STV090x_TSTTNR2, 0x21 }, | ||
184 | { STV090x_TSTTNR4, 0x21 }, | ||
185 | { STV090x_P2_DISTXCTL, 0x22 }, | ||
186 | { STV090x_P2_F22TX, 0xc0 }, | ||
187 | { STV090x_P2_F22RX, 0xc0 }, | ||
188 | { STV090x_P2_DISRXCTL, 0x00 }, | ||
189 | { STV090x_P2_DMDCFGMD, 0xF9 }, | ||
190 | { STV090x_P2_DEMOD, 0x08 }, | ||
191 | { STV090x_P2_DMDCFG3, 0xc4 }, | ||
192 | { STV090x_P2_CARFREQ, 0xed }, | ||
193 | { STV090x_P2_LDT, 0xd0 }, | ||
194 | { STV090x_P2_LDT2, 0xb8 }, | ||
195 | { STV090x_P2_TMGCFG, 0xd2 }, | ||
196 | { STV090x_P2_TMGTHRISE, 0x20 }, | ||
197 | { STV090x_P1_TMGCFG, 0xd2 }, | ||
198 | |||
199 | { STV090x_P2_TMGTHFALL, 0x00 }, | ||
200 | { STV090x_P2_FECSPY, 0x88 }, | ||
201 | { STV090x_P2_FSPYDATA, 0x3a }, | ||
202 | { STV090x_P2_FBERCPT4, 0x00 }, | ||
203 | { STV090x_P2_FSPYBER, 0x10 }, | ||
204 | { STV090x_P2_ERRCTRL1, 0x35 }, | ||
205 | { STV090x_P2_ERRCTRL2, 0xc1 }, | ||
206 | { STV090x_P2_CFRICFG, 0xf8 }, | ||
207 | { STV090x_P2_NOSCFG, 0x1c }, | ||
208 | { STV090x_P2_DMDTOM, 0x20 }, | ||
209 | { STV090x_P2_CORRELMANT, 0x70 }, | ||
210 | { STV090x_P2_CORRELABS, 0x88 }, | ||
211 | { STV090x_P2_AGC2O, 0x5b }, | ||
212 | { STV090x_P2_AGC2REF, 0x38 }, | ||
213 | { STV090x_P2_CARCFG, 0xe4 }, | ||
214 | { STV090x_P2_ACLC, 0x1A }, | ||
215 | { STV090x_P2_BCLC, 0x09 }, | ||
216 | { STV090x_P2_CARHDR, 0x08 }, | ||
217 | { STV090x_P2_KREFTMG, 0xc1 }, | ||
218 | { STV090x_P2_SFRUPRATIO, 0xf0 }, | ||
219 | { STV090x_P2_SFRLOWRATIO, 0x70 }, | ||
220 | { STV090x_P2_SFRSTEP, 0x58 }, | ||
221 | { STV090x_P2_TMGCFG2, 0x01 }, | ||
222 | { STV090x_P2_CAR2CFG, 0x26 }, | ||
223 | { STV090x_P2_BCLC2S2Q, 0x86 }, | ||
224 | { STV090x_P2_BCLC2S28, 0x86 }, | ||
225 | { STV090x_P2_SMAPCOEF7, 0x77 }, | ||
226 | { STV090x_P2_SMAPCOEF6, 0x85 }, | ||
227 | { STV090x_P2_SMAPCOEF5, 0x77 }, | ||
228 | { STV090x_P2_TSCFGL, 0x20 }, | ||
229 | { STV090x_P2_DMDCFG2, 0x3b }, | ||
230 | { STV090x_P2_MODCODLST0, 0xff }, | ||
231 | { STV090x_P2_MODCODLST1, 0xff }, | ||
232 | { STV090x_P2_MODCODLST2, 0xff }, | ||
233 | { STV090x_P2_MODCODLST3, 0xff }, | ||
234 | { STV090x_P2_MODCODLST4, 0xff }, | ||
235 | { STV090x_P2_MODCODLST5, 0xff }, | ||
236 | { STV090x_P2_MODCODLST6, 0xff }, | ||
237 | { STV090x_P2_MODCODLST7, 0xcc }, | ||
238 | { STV090x_P2_MODCODLST8, 0xcc }, | ||
239 | { STV090x_P2_MODCODLST9, 0xcc }, | ||
240 | { STV090x_P2_MODCODLSTA, 0xcc }, | ||
241 | { STV090x_P2_MODCODLSTB, 0xcc }, | ||
242 | { STV090x_P2_MODCODLSTC, 0xcc }, | ||
243 | { STV090x_P2_MODCODLSTD, 0xcc }, | ||
244 | { STV090x_P2_MODCODLSTE, 0xcc }, | ||
245 | { STV090x_P2_MODCODLSTF, 0xcf }, | ||
246 | { STV090x_P1_DISTXCTL, 0x22 }, | ||
247 | { STV090x_P1_F22TX, 0xc0 }, | ||
248 | { STV090x_P1_F22RX, 0xc0 }, | ||
249 | { STV090x_P1_DISRXCTL, 0x00 }, | ||
250 | { STV090x_P1_DMDCFGMD, 0xf9 }, | ||
251 | { STV090x_P1_DEMOD, 0x08 }, | ||
252 | { STV090x_P1_DMDCFG3, 0xc4 }, | ||
253 | { STV090x_P1_DMDTOM, 0x20 }, | ||
254 | { STV090x_P1_CARFREQ, 0xed }, | ||
255 | { STV090x_P1_LDT, 0xd0 }, | ||
256 | { STV090x_P1_LDT2, 0xb8 }, | ||
257 | { STV090x_P1_TMGCFG, 0xd2 }, | ||
258 | { STV090x_P1_TMGTHRISE, 0x20 }, | ||
259 | { STV090x_P1_TMGTHFALL, 0x00 }, | ||
260 | { STV090x_P1_SFRUPRATIO, 0xf0 }, | ||
261 | { STV090x_P1_SFRLOWRATIO, 0x70 }, | ||
262 | { STV090x_P1_TSCFGL, 0x20 }, | ||
263 | { STV090x_P1_FECSPY, 0x88 }, | ||
264 | { STV090x_P1_FSPYDATA, 0x3a }, | ||
265 | { STV090x_P1_FBERCPT4, 0x00 }, | ||
266 | { STV090x_P1_FSPYBER, 0x10 }, | ||
267 | { STV090x_P1_ERRCTRL1, 0x35 }, | ||
268 | { STV090x_P1_ERRCTRL2, 0xc1 }, | ||
269 | { STV090x_P1_CFRICFG, 0xf8 }, | ||
270 | { STV090x_P1_NOSCFG, 0x1c }, | ||
271 | { STV090x_P1_CORRELMANT, 0x70 }, | ||
272 | { STV090x_P1_CORRELABS, 0x88 }, | ||
273 | { STV090x_P1_AGC2O, 0x5b }, | ||
274 | { STV090x_P1_AGC2REF, 0x38 }, | ||
275 | { STV090x_P1_CARCFG, 0xe4 }, | ||
276 | { STV090x_P1_ACLC, 0x1A }, | ||
277 | { STV090x_P1_BCLC, 0x09 }, | ||
278 | { STV090x_P1_CARHDR, 0x08 }, | ||
279 | { STV090x_P1_KREFTMG, 0xc1 }, | ||
280 | { STV090x_P1_SFRSTEP, 0x58 }, | ||
281 | { STV090x_P1_TMGCFG2, 0x01 }, | ||
282 | { STV090x_P1_CAR2CFG, 0x26 }, | ||
283 | { STV090x_P1_BCLC2S2Q, 0x86 }, | ||
284 | { STV090x_P1_BCLC2S28, 0x86 }, | ||
285 | { STV090x_P1_SMAPCOEF7, 0x77 }, | ||
286 | { STV090x_P1_SMAPCOEF6, 0x85 }, | ||
287 | { STV090x_P1_SMAPCOEF5, 0x77 }, | ||
288 | { STV090x_P1_DMDCFG2, 0x3b }, | ||
289 | { STV090x_P1_MODCODLST0, 0xff }, | ||
290 | { STV090x_P1_MODCODLST1, 0xff }, | ||
291 | { STV090x_P1_MODCODLST2, 0xff }, | ||
292 | { STV090x_P1_MODCODLST3, 0xff }, | ||
293 | { STV090x_P1_MODCODLST4, 0xff }, | ||
294 | { STV090x_P1_MODCODLST5, 0xff }, | ||
295 | { STV090x_P1_MODCODLST6, 0xff }, | ||
296 | { STV090x_P1_MODCODLST7, 0xcc }, | ||
297 | { STV090x_P1_MODCODLST8, 0xcc }, | ||
298 | { STV090x_P1_MODCODLST9, 0xcc }, | ||
299 | { STV090x_P1_MODCODLSTA, 0xcc }, | ||
300 | { STV090x_P1_MODCODLSTB, 0xcc }, | ||
301 | { STV090x_P1_MODCODLSTC, 0xcc }, | ||
302 | { STV090x_P1_MODCODLSTD, 0xcc }, | ||
303 | { STV090x_P1_MODCODLSTE, 0xcc }, | ||
304 | { STV090x_P1_MODCODLSTF, 0xcf }, | ||
305 | { STV090x_GENCFG, 0x1d }, | ||
306 | { STV090x_NBITER_NF4, 0x37 }, | ||
307 | { STV090x_NBITER_NF5, 0x29 }, | ||
308 | { STV090x_NBITER_NF6, 0x37 }, | ||
309 | { STV090x_NBITER_NF7, 0x33 }, | ||
310 | { STV090x_NBITER_NF8, 0x31 }, | ||
311 | { STV090x_NBITER_NF9, 0x2f }, | ||
312 | { STV090x_NBITER_NF10, 0x39 }, | ||
313 | { STV090x_NBITER_NF11, 0x3a }, | ||
314 | { STV090x_NBITER_NF12, 0x29 }, | ||
315 | { STV090x_NBITER_NF13, 0x37 }, | ||
316 | { STV090x_NBITER_NF14, 0x33 }, | ||
317 | { STV090x_NBITER_NF15, 0x2f }, | ||
318 | { STV090x_NBITER_NF16, 0x39 }, | ||
319 | { STV090x_NBITER_NF17, 0x3a }, | ||
320 | { STV090x_NBITERNOERR, 0x04 }, | ||
321 | { STV090x_GAINLLR_NF4, 0x0C }, | ||
322 | { STV090x_GAINLLR_NF5, 0x0F }, | ||
323 | { STV090x_GAINLLR_NF6, 0x11 }, | ||
324 | { STV090x_GAINLLR_NF7, 0x14 }, | ||
325 | { STV090x_GAINLLR_NF8, 0x17 }, | ||
326 | { STV090x_GAINLLR_NF9, 0x19 }, | ||
327 | { STV090x_GAINLLR_NF10, 0x20 }, | ||
328 | { STV090x_GAINLLR_NF11, 0x21 }, | ||
329 | { STV090x_GAINLLR_NF12, 0x0D }, | ||
330 | { STV090x_GAINLLR_NF13, 0x0F }, | ||
331 | { STV090x_GAINLLR_NF14, 0x13 }, | ||
332 | { STV090x_GAINLLR_NF15, 0x1A }, | ||
333 | { STV090x_GAINLLR_NF16, 0x1F }, | ||
334 | { STV090x_GAINLLR_NF17, 0x21 }, | ||
335 | { STV090x_RCCFGH, 0x20 }, | ||
336 | { STV090x_P1_FECM, 0x01 }, /* disable DSS modes */ | ||
337 | { STV090x_P2_FECM, 0x01 }, /* disable DSS modes */ | ||
338 | { STV090x_P1_PRVIT, 0x2F }, /* disable PR 6/7 */ | ||
339 | { STV090x_P2_PRVIT, 0x2F }, /* disable PR 6/7 */ | ||
340 | }; | ||
341 | |||
342 | static struct stv090x_reg stv0903_initval[] = { | ||
343 | { STV090x_OUTCFG, 0x00 }, | ||
344 | { STV090x_AGCRF1CFG, 0x11 }, | ||
345 | { STV090x_STOPCLK1, 0x48 }, | ||
346 | { STV090x_STOPCLK2, 0x14 }, | ||
347 | { STV090x_TSTTNR1, 0x27 }, | ||
348 | { STV090x_TSTTNR2, 0x21 }, | ||
349 | { STV090x_P1_DISTXCTL, 0x22 }, | ||
350 | { STV090x_P1_F22TX, 0xc0 }, | ||
351 | { STV090x_P1_F22RX, 0xc0 }, | ||
352 | { STV090x_P1_DISRXCTL, 0x00 }, | ||
353 | { STV090x_P1_DMDCFGMD, 0xF9 }, | ||
354 | { STV090x_P1_DEMOD, 0x08 }, | ||
355 | { STV090x_P1_DMDCFG3, 0xc4 }, | ||
356 | { STV090x_P1_CARFREQ, 0xed }, | ||
357 | { STV090x_P1_TNRCFG2, 0x82 }, | ||
358 | { STV090x_P1_LDT, 0xd0 }, | ||
359 | { STV090x_P1_LDT2, 0xb8 }, | ||
360 | { STV090x_P1_TMGCFG, 0xd2 }, | ||
361 | { STV090x_P1_TMGTHRISE, 0x20 }, | ||
362 | { STV090x_P1_TMGTHFALL, 0x00 }, | ||
363 | { STV090x_P1_SFRUPRATIO, 0xf0 }, | ||
364 | { STV090x_P1_SFRLOWRATIO, 0x70 }, | ||
365 | { STV090x_P1_TSCFGL, 0x20 }, | ||
366 | { STV090x_P1_FECSPY, 0x88 }, | ||
367 | { STV090x_P1_FSPYDATA, 0x3a }, | ||
368 | { STV090x_P1_FBERCPT4, 0x00 }, | ||
369 | { STV090x_P1_FSPYBER, 0x10 }, | ||
370 | { STV090x_P1_ERRCTRL1, 0x35 }, | ||
371 | { STV090x_P1_ERRCTRL2, 0xc1 }, | ||
372 | { STV090x_P1_CFRICFG, 0xf8 }, | ||
373 | { STV090x_P1_NOSCFG, 0x1c }, | ||
374 | { STV090x_P1_DMDTOM, 0x20 }, | ||
375 | { STV090x_P1_CORRELMANT, 0x70 }, | ||
376 | { STV090x_P1_CORRELABS, 0x88 }, | ||
377 | { STV090x_P1_AGC2O, 0x5b }, | ||
378 | { STV090x_P1_AGC2REF, 0x38 }, | ||
379 | { STV090x_P1_CARCFG, 0xe4 }, | ||
380 | { STV090x_P1_ACLC, 0x1A }, | ||
381 | { STV090x_P1_BCLC, 0x09 }, | ||
382 | { STV090x_P1_CARHDR, 0x08 }, | ||
383 | { STV090x_P1_KREFTMG, 0xc1 }, | ||
384 | { STV090x_P1_SFRSTEP, 0x58 }, | ||
385 | { STV090x_P1_TMGCFG2, 0x01 }, | ||
386 | { STV090x_P1_CAR2CFG, 0x26 }, | ||
387 | { STV090x_P1_BCLC2S2Q, 0x86 }, | ||
388 | { STV090x_P1_BCLC2S28, 0x86 }, | ||
389 | { STV090x_P1_SMAPCOEF7, 0x77 }, | ||
390 | { STV090x_P1_SMAPCOEF6, 0x85 }, | ||
391 | { STV090x_P1_SMAPCOEF5, 0x77 }, | ||
392 | { STV090x_P1_DMDCFG2, 0x3b }, | ||
393 | { STV090x_P1_MODCODLST0, 0xff }, | ||
394 | { STV090x_P1_MODCODLST1, 0xff }, | ||
395 | { STV090x_P1_MODCODLST2, 0xff }, | ||
396 | { STV090x_P1_MODCODLST3, 0xff }, | ||
397 | { STV090x_P1_MODCODLST4, 0xff }, | ||
398 | { STV090x_P1_MODCODLST5, 0xff }, | ||
399 | { STV090x_P1_MODCODLST6, 0xff }, | ||
400 | { STV090x_P1_MODCODLST7, 0xcc }, | ||
401 | { STV090x_P1_MODCODLST8, 0xcc }, | ||
402 | { STV090x_P1_MODCODLST9, 0xcc }, | ||
403 | { STV090x_P1_MODCODLSTA, 0xcc }, | ||
404 | { STV090x_P1_MODCODLSTB, 0xcc }, | ||
405 | { STV090x_P1_MODCODLSTC, 0xcc }, | ||
406 | { STV090x_P1_MODCODLSTD, 0xcc }, | ||
407 | { STV090x_P1_MODCODLSTE, 0xcc }, | ||
408 | { STV090x_P1_MODCODLSTF, 0xcf }, | ||
409 | { STV090x_GENCFG, 0x1c }, | ||
410 | { STV090x_NBITER_NF4, 0x37 }, | ||
411 | { STV090x_NBITER_NF5, 0x29 }, | ||
412 | { STV090x_NBITER_NF6, 0x37 }, | ||
413 | { STV090x_NBITER_NF7, 0x33 }, | ||
414 | { STV090x_NBITER_NF8, 0x31 }, | ||
415 | { STV090x_NBITER_NF9, 0x2f }, | ||
416 | { STV090x_NBITER_NF10, 0x39 }, | ||
417 | { STV090x_NBITER_NF11, 0x3a }, | ||
418 | { STV090x_NBITER_NF12, 0x29 }, | ||
419 | { STV090x_NBITER_NF13, 0x37 }, | ||
420 | { STV090x_NBITER_NF14, 0x33 }, | ||
421 | { STV090x_NBITER_NF15, 0x2f }, | ||
422 | { STV090x_NBITER_NF16, 0x39 }, | ||
423 | { STV090x_NBITER_NF17, 0x3a }, | ||
424 | { STV090x_NBITERNOERR, 0x04 }, | ||
425 | { STV090x_GAINLLR_NF4, 0x0C }, | ||
426 | { STV090x_GAINLLR_NF5, 0x0F }, | ||
427 | { STV090x_GAINLLR_NF6, 0x11 }, | ||
428 | { STV090x_GAINLLR_NF7, 0x14 }, | ||
429 | { STV090x_GAINLLR_NF8, 0x17 }, | ||
430 | { STV090x_GAINLLR_NF9, 0x19 }, | ||
431 | { STV090x_GAINLLR_NF10, 0x20 }, | ||
432 | { STV090x_GAINLLR_NF11, 0x21 }, | ||
433 | { STV090x_GAINLLR_NF12, 0x0D }, | ||
434 | { STV090x_GAINLLR_NF13, 0x0F }, | ||
435 | { STV090x_GAINLLR_NF14, 0x13 }, | ||
436 | { STV090x_GAINLLR_NF15, 0x1A }, | ||
437 | { STV090x_GAINLLR_NF16, 0x1F }, | ||
438 | { STV090x_GAINLLR_NF17, 0x21 }, | ||
439 | { STV090x_RCCFGH, 0x20 }, | ||
440 | { STV090x_P1_FECM, 0x01 }, /*disable the DSS mode */ | ||
441 | { STV090x_P1_PRVIT, 0x2f } /*disable puncture rate 6/7*/ | ||
442 | }; | ||
443 | |||
444 | static struct stv090x_reg stv0900_cut20_val[] = { | ||
445 | |||
446 | { STV090x_P2_DMDCFG3, 0xe8 }, | ||
447 | { STV090x_P2_DMDCFG4, 0x10 }, | ||
448 | { STV090x_P2_CARFREQ, 0x38 }, | ||
449 | { STV090x_P2_CARHDR, 0x20 }, | ||
450 | { STV090x_P2_KREFTMG, 0x5a }, | ||
451 | { STV090x_P2_SMAPCOEF7, 0x06 }, | ||
452 | { STV090x_P2_SMAPCOEF6, 0x00 }, | ||
453 | { STV090x_P2_SMAPCOEF5, 0x04 }, | ||
454 | { STV090x_P2_NOSCFG, 0x0c }, | ||
455 | { STV090x_P1_DMDCFG3, 0xe8 }, | ||
456 | { STV090x_P1_DMDCFG4, 0x10 }, | ||
457 | { STV090x_P1_CARFREQ, 0x38 }, | ||
458 | { STV090x_P1_CARHDR, 0x20 }, | ||
459 | { STV090x_P1_KREFTMG, 0x5a }, | ||
460 | { STV090x_P1_SMAPCOEF7, 0x06 }, | ||
461 | { STV090x_P1_SMAPCOEF6, 0x00 }, | ||
462 | { STV090x_P1_SMAPCOEF5, 0x04 }, | ||
463 | { STV090x_P1_NOSCFG, 0x0c }, | ||
464 | { STV090x_GAINLLR_NF4, 0x21 }, | ||
465 | { STV090x_GAINLLR_NF5, 0x21 }, | ||
466 | { STV090x_GAINLLR_NF6, 0x20 }, | ||
467 | { STV090x_GAINLLR_NF7, 0x1F }, | ||
468 | { STV090x_GAINLLR_NF8, 0x1E }, | ||
469 | { STV090x_GAINLLR_NF9, 0x1E }, | ||
470 | { STV090x_GAINLLR_NF10, 0x1D }, | ||
471 | { STV090x_GAINLLR_NF11, 0x1B }, | ||
472 | { STV090x_GAINLLR_NF12, 0x20 }, | ||
473 | { STV090x_GAINLLR_NF13, 0x20 }, | ||
474 | { STV090x_GAINLLR_NF14, 0x20 }, | ||
475 | { STV090x_GAINLLR_NF15, 0x20 }, | ||
476 | { STV090x_GAINLLR_NF16, 0x20 }, | ||
477 | { STV090x_GAINLLR_NF17, 0x21 }, | ||
478 | }; | ||
479 | |||
480 | static struct stv090x_reg stv0903_cut20_val[] = { | ||
481 | { STV090x_P1_DMDCFG3, 0xe8 }, | ||
482 | { STV090x_P1_DMDCFG4, 0x10 }, | ||
483 | { STV090x_P1_CARFREQ, 0x38 }, | ||
484 | { STV090x_P1_CARHDR, 0x20 }, | ||
485 | { STV090x_P1_KREFTMG, 0x5a }, | ||
486 | { STV090x_P1_SMAPCOEF7, 0x06 }, | ||
487 | { STV090x_P1_SMAPCOEF6, 0x00 }, | ||
488 | { STV090x_P1_SMAPCOEF5, 0x04 }, | ||
489 | { STV090x_P1_NOSCFG, 0x0c }, | ||
490 | { STV090x_GAINLLR_NF4, 0x21 }, | ||
491 | { STV090x_GAINLLR_NF5, 0x21 }, | ||
492 | { STV090x_GAINLLR_NF6, 0x20 }, | ||
493 | { STV090x_GAINLLR_NF7, 0x1F }, | ||
494 | { STV090x_GAINLLR_NF8, 0x1E }, | ||
495 | { STV090x_GAINLLR_NF9, 0x1E }, | ||
496 | { STV090x_GAINLLR_NF10, 0x1D }, | ||
497 | { STV090x_GAINLLR_NF11, 0x1B }, | ||
498 | { STV090x_GAINLLR_NF12, 0x20 }, | ||
499 | { STV090x_GAINLLR_NF13, 0x20 }, | ||
500 | { STV090x_GAINLLR_NF14, 0x20 }, | ||
501 | { STV090x_GAINLLR_NF15, 0x20 }, | ||
502 | { STV090x_GAINLLR_NF16, 0x20 }, | ||
503 | { STV090x_GAINLLR_NF17, 0x21 } | ||
504 | }; | ||
505 | |||
506 | /* Cut 2.0 Long Frame Tracking CR loop */ | ||
507 | static struct stv090x_long_frame_crloop stv090x_s2_crl_cut20[] = { | ||
508 | /* MODCOD 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
509 | { STV090x_QPSK_12, 0x1f, 0x3f, 0x1e, 0x3f, 0x3d, 0x1f, 0x3d, 0x3e, 0x3d, 0x1e }, | ||
510 | { STV090x_QPSK_35, 0x2f, 0x3f, 0x2e, 0x2f, 0x3d, 0x0f, 0x0e, 0x2e, 0x3d, 0x0e }, | ||
511 | { STV090x_QPSK_23, 0x2f, 0x3f, 0x2e, 0x2f, 0x0e, 0x0f, 0x0e, 0x1e, 0x3d, 0x3d }, | ||
512 | { STV090x_QPSK_34, 0x3f, 0x3f, 0x3e, 0x1f, 0x0e, 0x3e, 0x0e, 0x1e, 0x3d, 0x3d }, | ||
513 | { STV090x_QPSK_45, 0x3f, 0x3f, 0x3e, 0x1f, 0x0e, 0x3e, 0x0e, 0x1e, 0x3d, 0x3d }, | ||
514 | { STV090x_QPSK_56, 0x3f, 0x3f, 0x3e, 0x1f, 0x0e, 0x3e, 0x0e, 0x1e, 0x3d, 0x3d }, | ||
515 | { STV090x_QPSK_89, 0x3f, 0x3f, 0x3e, 0x1f, 0x1e, 0x3e, 0x0e, 0x1e, 0x3d, 0x3d }, | ||
516 | { STV090x_QPSK_910, 0x3f, 0x3f, 0x3e, 0x1f, 0x1e, 0x3e, 0x0e, 0x1e, 0x3d, 0x3d }, | ||
517 | { STV090x_8PSK_35, 0x3c, 0x3e, 0x1c, 0x2e, 0x0c, 0x1e, 0x2b, 0x2d, 0x1b, 0x1d }, | ||
518 | { STV090x_8PSK_23, 0x1d, 0x3e, 0x3c, 0x2e, 0x2c, 0x1e, 0x0c, 0x2d, 0x2b, 0x1d }, | ||
519 | { STV090x_8PSK_34, 0x0e, 0x3e, 0x3d, 0x2e, 0x0d, 0x1e, 0x2c, 0x2d, 0x0c, 0x1d }, | ||
520 | { STV090x_8PSK_56, 0x2e, 0x3e, 0x1e, 0x2e, 0x2d, 0x1e, 0x3c, 0x2d, 0x2c, 0x1d }, | ||
521 | { STV090x_8PSK_89, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, 0x1e, 0x0d, 0x2d, 0x3c, 0x1d }, | ||
522 | { STV090x_8PSK_910, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, 0x1e, 0x1d, 0x2d, 0x0d, 0x1d } | ||
523 | }; | ||
524 | |||
525 | /* Cut 3.0 Long Frame Tracking CR loop */ | ||
526 | static struct stv090x_long_frame_crloop stv090x_s2_crl_cut30[] = { | ||
527 | /* MODCOD 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
528 | { STV090x_QPSK_12, 0x3c, 0x2c, 0x0c, 0x2c, 0x1b, 0x2c, 0x1b, 0x1c, 0x0b, 0x3b }, | ||
529 | { STV090x_QPSK_35, 0x0d, 0x0d, 0x0c, 0x0d, 0x1b, 0x3c, 0x1b, 0x1c, 0x0b, 0x3b }, | ||
530 | { STV090x_QPSK_23, 0x1d, 0x0d, 0x0c, 0x1d, 0x2b, 0x3c, 0x1b, 0x1c, 0x0b, 0x3b }, | ||
531 | { STV090x_QPSK_34, 0x1d, 0x1d, 0x0c, 0x1d, 0x2b, 0x3c, 0x1b, 0x1c, 0x0b, 0x3b }, | ||
532 | { STV090x_QPSK_45, 0x2d, 0x1d, 0x1c, 0x1d, 0x2b, 0x3c, 0x2b, 0x0c, 0x1b, 0x3b }, | ||
533 | { STV090x_QPSK_56, 0x2d, 0x1d, 0x1c, 0x1d, 0x2b, 0x3c, 0x2b, 0x0c, 0x1b, 0x3b }, | ||
534 | { STV090x_QPSK_89, 0x3d, 0x2d, 0x1c, 0x1d, 0x3b, 0x3c, 0x2b, 0x0c, 0x1b, 0x3b }, | ||
535 | { STV090x_QPSK_910, 0x3d, 0x2d, 0x1c, 0x1d, 0x3b, 0x3c, 0x2b, 0x0c, 0x1b, 0x3b }, | ||
536 | { STV090x_8PSK_35, 0x39, 0x29, 0x39, 0x19, 0x19, 0x19, 0x19, 0x19, 0x09, 0x19 }, | ||
537 | { STV090x_8PSK_23, 0x2a, 0x39, 0x1a, 0x0a, 0x39, 0x0a, 0x29, 0x39, 0x29, 0x0a }, | ||
538 | { STV090x_8PSK_34, 0x2b, 0x3a, 0x1b, 0x1b, 0x3a, 0x1b, 0x1a, 0x0b, 0x1a, 0x3a }, | ||
539 | { STV090x_8PSK_56, 0x0c, 0x1b, 0x3b, 0x3b, 0x1b, 0x3b, 0x3a, 0x3b, 0x3a, 0x1b }, | ||
540 | { STV090x_8PSK_89, 0x0d, 0x3c, 0x2c, 0x2c, 0x2b, 0x0c, 0x0b, 0x3b, 0x0b, 0x1b }, | ||
541 | { STV090x_8PSK_910, 0x0d, 0x0d, 0x2c, 0x3c, 0x3b, 0x1c, 0x0b, 0x3b, 0x0b, 0x1b } | ||
542 | }; | ||
543 | |||
544 | /* Cut 2.0 Long Frame Tracking CR Loop */ | ||
545 | static struct stv090x_long_frame_crloop stv090x_s2_apsk_crl_cut20[] = { | ||
546 | /* MODCOD 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
547 | { STV090x_16APSK_23, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x0c, 0x3c, 0x0c, 0x2c, 0x0c }, | ||
548 | { STV090x_16APSK_34, 0x0c, 0x0c, 0x0c, 0x0c, 0x0e, 0x0c, 0x2d, 0x0c, 0x1d, 0x0c }, | ||
549 | { STV090x_16APSK_45, 0x0c, 0x0c, 0x0c, 0x0c, 0x1e, 0x0c, 0x3d, 0x0c, 0x2d, 0x0c }, | ||
550 | { STV090x_16APSK_56, 0x0c, 0x0c, 0x0c, 0x0c, 0x1e, 0x0c, 0x3d, 0x0c, 0x2d, 0x0c }, | ||
551 | { STV090x_16APSK_89, 0x0c, 0x0c, 0x0c, 0x0c, 0x2e, 0x0c, 0x0e, 0x0c, 0x3d, 0x0c }, | ||
552 | { STV090x_16APSK_910, 0x0c, 0x0c, 0x0c, 0x0c, 0x2e, 0x0c, 0x0e, 0x0c, 0x3d, 0x0c }, | ||
553 | { STV090x_32APSK_34, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c }, | ||
554 | { STV090x_32APSK_45, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c }, | ||
555 | { STV090x_32APSK_56, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c }, | ||
556 | { STV090x_32APSK_89, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c }, | ||
557 | { STV090x_32APSK_910, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c } | ||
558 | }; | ||
559 | |||
560 | /* Cut 3.0 Long Frame Tracking CR Loop */ | ||
561 | static struct stv090x_long_frame_crloop stv090x_s2_apsk_crl_cut30[] = { | ||
562 | /* MODCOD 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
563 | { STV090x_16APSK_23, 0x0a, 0x0a, 0x0a, 0x0a, 0x1a, 0x0a, 0x3a, 0x0a, 0x2a, 0x0a }, | ||
564 | { STV090x_16APSK_34, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x3b, 0x0a, 0x1b, 0x0a }, | ||
565 | { STV090x_16APSK_45, 0x0a, 0x0a, 0x0a, 0x0a, 0x1b, 0x0a, 0x3b, 0x0a, 0x2b, 0x0a }, | ||
566 | { STV090x_16APSK_56, 0x0a, 0x0a, 0x0a, 0x0a, 0x1b, 0x0a, 0x3b, 0x0a, 0x2b, 0x0a }, | ||
567 | { STV090x_16APSK_89, 0x0a, 0x0a, 0x0a, 0x0a, 0x2b, 0x0a, 0x0c, 0x0a, 0x3b, 0x0a }, | ||
568 | { STV090x_16APSK_910, 0x0a, 0x0a, 0x0a, 0x0a, 0x2b, 0x0a, 0x0c, 0x0a, 0x3b, 0x0a }, | ||
569 | { STV090x_32APSK_34, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a }, | ||
570 | { STV090x_32APSK_45, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a }, | ||
571 | { STV090x_32APSK_56, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a }, | ||
572 | { STV090x_32APSK_89, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a }, | ||
573 | { STV090x_32APSK_910, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a } | ||
574 | }; | ||
575 | |||
576 | static struct stv090x_long_frame_crloop stv090x_s2_lowqpsk_crl_cut20[] = { | ||
577 | /* MODCOD 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
578 | { STV090x_QPSK_14, 0x0f, 0x3f, 0x0e, 0x3f, 0x2d, 0x2f, 0x2d, 0x1f, 0x3d, 0x3e }, | ||
579 | { STV090x_QPSK_13, 0x0f, 0x3f, 0x0e, 0x3f, 0x2d, 0x2f, 0x3d, 0x0f, 0x3d, 0x2e }, | ||
580 | { STV090x_QPSK_25, 0x1f, 0x3f, 0x1e, 0x3f, 0x3d, 0x1f, 0x3d, 0x3e, 0x3d, 0x2e } | ||
581 | }; | ||
582 | |||
583 | static struct stv090x_long_frame_crloop stv090x_s2_lowqpsk_crl_cut30[] = { | ||
584 | /* MODCOD 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ | ||
585 | { STV090x_QPSK_14, 0x0c, 0x3c, 0x0b, 0x3c, 0x2a, 0x2c, 0x2a, 0x1c, 0x3a, 0x3b }, | ||
586 | { STV090x_QPSK_13, 0x0c, 0x3c, 0x0b, 0x3c, 0x2a, 0x2c, 0x3a, 0x0c, 0x3a, 0x2b }, | ||
587 | { STV090x_QPSK_25, 0x1c, 0x3c, 0x1b, 0x3c, 0x3a, 0x1c, 0x3a, 0x3b, 0x3a, 0x2b } | ||
588 | }; | ||
589 | |||
590 | /* Cut 2.0 Short Frame Tracking CR Loop */ | ||
591 | static struct stv090x_short_frame_crloop stv090x_s2_short_crl_cut20[] = { | ||
592 | /* MODCOD 2M 5M 10M 20M 30M */ | ||
593 | { STV090x_QPSK, 0x2f, 0x2e, 0x0e, 0x0e, 0x3d }, | ||
594 | { STV090x_8PSK, 0x3e, 0x0e, 0x2d, 0x0d, 0x3c }, | ||
595 | { STV090x_16APSK, 0x1e, 0x1e, 0x1e, 0x3d, 0x2d }, | ||
596 | { STV090x_32APSK, 0x1e, 0x1e, 0x1e, 0x3d, 0x2d } | ||
597 | }; | ||
598 | |||
599 | /* Cut 3.0 Short Frame Tracking CR Loop */ | ||
600 | static struct stv090x_short_frame_crloop stv090x_s2_short_crl_cut30[] = { | ||
601 | /* MODCOD 2M 5M 10M 20M 30M */ | ||
602 | { STV090x_QPSK, 0x2C, 0x2B, 0x0B, 0x0B, 0x3A }, | ||
603 | { STV090x_8PSK, 0x3B, 0x0B, 0x2A, 0x0A, 0x39 }, | ||
604 | { STV090x_16APSK, 0x1B, 0x1B, 0x1B, 0x3A, 0x2A }, | ||
605 | { STV090x_32APSK, 0x1B, 0x1B, 0x1B, 0x3A, 0x2A } | ||
606 | }; | ||
607 | |||
608 | static inline s32 comp2(s32 __x, s32 __width) | ||
609 | { | ||
610 | if (__width == 32) | ||
611 | return __x; | ||
612 | else | ||
613 | return (__x >= (1 << (__width - 1))) ? (__x - (1 << __width)) : __x; | ||
614 | } | ||
615 | |||
616 | static int stv090x_read_reg(struct stv090x_state *state, unsigned int reg) | ||
617 | { | ||
618 | const struct stv090x_config *config = state->config; | ||
619 | int ret; | ||
620 | |||
621 | u8 b0[] = { reg >> 8, reg & 0xff }; | ||
622 | u8 buf; | ||
623 | |||
624 | struct i2c_msg msg[] = { | ||
625 | { .addr = config->address, .flags = 0, .buf = b0, .len = 2 }, | ||
626 | { .addr = config->address, .flags = I2C_M_RD, .buf = &buf, .len = 1 } | ||
627 | }; | ||
628 | |||
629 | ret = i2c_transfer(state->i2c, msg, 2); | ||
630 | if (ret != 2) { | ||
631 | if (ret != -ERESTARTSYS) | ||
632 | dprintk(FE_ERROR, 1, | ||
633 | "Read error, Reg=[0x%02x], Status=%d", | ||
634 | reg, ret); | ||
635 | |||
636 | return ret < 0 ? ret : -EREMOTEIO; | ||
637 | } | ||
638 | if (unlikely(*state->verbose >= FE_DEBUGREG)) | ||
639 | dprintk(FE_ERROR, 1, "Reg=[0x%02x], data=%02x", | ||
640 | reg, buf); | ||
641 | |||
642 | return (unsigned int) buf; | ||
643 | } | ||
644 | |||
645 | static int stv090x_write_regs(struct stv090x_state *state, unsigned int reg, u8 *data, u32 count) | ||
646 | { | ||
647 | const struct stv090x_config *config = state->config; | ||
648 | int ret; | ||
649 | u8 buf[2 + count]; | ||
650 | struct i2c_msg i2c_msg = { .addr = config->address, .flags = 0, .buf = buf, .len = 2 + count }; | ||
651 | |||
652 | buf[0] = reg >> 8; | ||
653 | buf[1] = reg & 0xff; | ||
654 | memcpy(&buf[2], data, count); | ||
655 | |||
656 | if (unlikely(*state->verbose >= FE_DEBUGREG)) { | ||
657 | int i; | ||
658 | |||
659 | printk(KERN_DEBUG "%s [0x%04x]:", __func__, reg); | ||
660 | for (i = 0; i < count; i++) | ||
661 | printk(" %02x", data[i]); | ||
662 | printk("\n"); | ||
663 | } | ||
664 | |||
665 | ret = i2c_transfer(state->i2c, &i2c_msg, 1); | ||
666 | if (ret != 1) { | ||
667 | if (ret != -ERESTARTSYS) | ||
668 | dprintk(FE_ERROR, 1, "Reg=[0x%04x], Data=[0x%02x ...], Count=%u, Status=%d", | ||
669 | reg, data[0], count, ret); | ||
670 | return ret < 0 ? ret : -EREMOTEIO; | ||
671 | } | ||
672 | |||
673 | return 0; | ||
674 | } | ||
675 | |||
676 | static int stv090x_write_reg(struct stv090x_state *state, unsigned int reg, u8 data) | ||
677 | { | ||
678 | return stv090x_write_regs(state, reg, &data, 1); | ||
679 | } | ||
680 | |||
681 | static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | ||
682 | { | ||
683 | struct stv090x_state *state = fe->demodulator_priv; | ||
684 | u32 reg; | ||
685 | |||
686 | reg = STV090x_READ_DEMOD(state, I2CRPT); | ||
687 | if (enable) { | ||
688 | dprintk(FE_DEBUG, 1, "Enable Gate"); | ||
689 | STV090x_SETFIELD_Px(reg, I2CT_ON_FIELD, 1); | ||
690 | if (STV090x_WRITE_DEMOD(state, I2CRPT, reg) < 0) | ||
691 | goto err; | ||
692 | |||
693 | } else { | ||
694 | dprintk(FE_DEBUG, 1, "Disable Gate"); | ||
695 | STV090x_SETFIELD_Px(reg, I2CT_ON_FIELD, 0); | ||
696 | if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0) | ||
697 | goto err; | ||
698 | } | ||
699 | return 0; | ||
700 | err: | ||
701 | dprintk(FE_ERROR, 1, "I/O error"); | ||
702 | return -1; | ||
703 | } | ||
704 | |||
705 | static void stv090x_get_lock_tmg(struct stv090x_state *state) | ||
706 | { | ||
707 | switch (state->algo) { | ||
708 | case STV090x_BLIND_SEARCH: | ||
709 | dprintk(FE_DEBUG, 1, "Blind Search"); | ||
710 | if (state->srate <= 1500000) { /*10Msps< SR <=15Msps*/ | ||
711 | state->DemodTimeout = 1500; | ||
712 | state->FecTimeout = 400; | ||
713 | } else if (state->srate <= 5000000) { /*10Msps< SR <=15Msps*/ | ||
714 | state->DemodTimeout = 1000; | ||
715 | state->FecTimeout = 300; | ||
716 | } else { /*SR >20Msps*/ | ||
717 | state->DemodTimeout = 700; | ||
718 | state->FecTimeout = 100; | ||
719 | } | ||
720 | break; | ||
721 | |||
722 | case STV090x_COLD_SEARCH: | ||
723 | case STV090x_WARM_SEARCH: | ||
724 | default: | ||
725 | dprintk(FE_DEBUG, 1, "Normal Search"); | ||
726 | if (state->srate <= 1000000) { /*SR <=1Msps*/ | ||
727 | state->DemodTimeout = 4500; | ||
728 | state->FecTimeout = 1700; | ||
729 | } else if (state->srate <= 2000000) { /*1Msps < SR <= 2Msps */ | ||
730 | state->DemodTimeout = 2500; | ||
731 | state->FecTimeout = 1100; | ||
732 | } else if (state->srate <= 5000000) { /*2Msps < SR <= 5Msps */ | ||
733 | state->DemodTimeout = 1000; | ||
734 | state->FecTimeout = 550; | ||
735 | } else if (state->srate <= 10000000) { /*5Msps < SR <= 10Msps */ | ||
736 | state->DemodTimeout = 700; | ||
737 | state->FecTimeout = 250; | ||
738 | } else if (state->srate <= 20000000) { /*10Msps < SR <= 20Msps */ | ||
739 | state->DemodTimeout = 400; | ||
740 | state->FecTimeout = 130; | ||
741 | } else { /*SR >20Msps*/ | ||
742 | state->DemodTimeout = 300; | ||
743 | state->FecTimeout = 100; | ||
744 | } | ||
745 | break; | ||
746 | } | ||
747 | |||
748 | if (state->algo == STV090x_WARM_SEARCH) | ||
749 | state->DemodTimeout /= 2; | ||
750 | } | ||
751 | |||
752 | static int stv090x_set_srate(struct stv090x_state *state, u32 srate) | ||
753 | { | ||
754 | u32 sym; | ||
755 | |||
756 | if (srate > 60000000) { | ||
757 | sym = (srate << 4); /* SR * 2^16 / master_clk */ | ||
758 | sym /= (state->mclk >> 12); | ||
759 | } else if (srate > 6000000) { | ||
760 | sym = (srate << 6); | ||
761 | sym /= (state->mclk >> 10); | ||
762 | } else { | ||
763 | sym = (srate << 9); | ||
764 | sym /= (state->mclk >> 7); | ||
765 | } | ||
766 | |||
767 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0x7f) < 0) /* MSB */ | ||
768 | goto err; | ||
769 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, (sym & 0xff)) < 0) /* LSB */ | ||
770 | goto err; | ||
771 | |||
772 | return 0; | ||
773 | err: | ||
774 | dprintk(FE_ERROR, 1, "I/O error"); | ||
775 | return -1; | ||
776 | } | ||
777 | |||
778 | static int stv090x_set_max_srate(struct stv090x_state *state, u32 clk, u32 srate) | ||
779 | { | ||
780 | u32 sym; | ||
781 | |||
782 | srate = 105 * (srate / 100); | ||
783 | if (srate > 60000000) { | ||
784 | sym = (srate << 4); /* SR * 2^16 / master_clk */ | ||
785 | sym /= (state->mclk >> 12); | ||
786 | } else if (srate > 6000000) { | ||
787 | sym = (srate << 6); | ||
788 | sym /= (state->mclk >> 10); | ||
789 | } else { | ||
790 | sym = (srate << 9); | ||
791 | sym /= (state->mclk >> 7); | ||
792 | } | ||
793 | |||
794 | if (sym < 0x7fff) { | ||
795 | if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) /* MSB */ | ||
796 | goto err; | ||
797 | if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) /* LSB */ | ||
798 | goto err; | ||
799 | } else { | ||
800 | if (STV090x_WRITE_DEMOD(state, SFRUP1, 0x7f) < 0) /* MSB */ | ||
801 | goto err; | ||
802 | if (STV090x_WRITE_DEMOD(state, SFRUP0, 0xff) < 0) /* LSB */ | ||
803 | goto err; | ||
804 | } | ||
805 | |||
806 | return 0; | ||
807 | err: | ||
808 | dprintk(FE_ERROR, 1, "I/O error"); | ||
809 | return -1; | ||
810 | } | ||
811 | |||
812 | static int stv090x_set_min_srate(struct stv090x_state *state, u32 clk, u32 srate) | ||
813 | { | ||
814 | u32 sym; | ||
815 | |||
816 | srate = 95 * (srate / 100); | ||
817 | if (srate > 60000000) { | ||
818 | sym = (srate << 4); /* SR * 2^16 / master_clk */ | ||
819 | sym /= (state->mclk >> 12); | ||
820 | } else if (srate > 6000000) { | ||
821 | sym = (srate << 6); | ||
822 | sym /= (state->mclk >> 10); | ||
823 | } else { | ||
824 | sym = (srate << 9); | ||
825 | sym /= (state->mclk >> 7); | ||
826 | } | ||
827 | |||
828 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, ((sym >> 8) & 0xff)) < 0) /* MSB */ | ||
829 | goto err; | ||
830 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, (sym & 0xff)) < 0) /* LSB */ | ||
831 | goto err; | ||
832 | return 0; | ||
833 | err: | ||
834 | dprintk(FE_ERROR, 1, "I/O error"); | ||
835 | return -1; | ||
836 | } | ||
837 | |||
838 | static u32 stv090x_car_width(u32 srate, enum stv090x_rolloff rolloff) | ||
839 | { | ||
840 | u32 ro; | ||
841 | |||
842 | switch (rolloff) { | ||
843 | case STV090x_RO_20: | ||
844 | ro = 20; | ||
845 | break; | ||
846 | case STV090x_RO_25: | ||
847 | ro = 25; | ||
848 | break; | ||
849 | case STV090x_RO_35: | ||
850 | default: | ||
851 | ro = 35; | ||
852 | break; | ||
853 | } | ||
854 | |||
855 | return srate + (srate * ro) / 100; | ||
856 | } | ||
857 | |||
858 | static int stv090x_set_vit_thacq(struct stv090x_state *state) | ||
859 | { | ||
860 | if (STV090x_WRITE_DEMOD(state, VTH12, 0x96) < 0) | ||
861 | goto err; | ||
862 | if (STV090x_WRITE_DEMOD(state, VTH23, 0x64) < 0) | ||
863 | goto err; | ||
864 | if (STV090x_WRITE_DEMOD(state, VTH34, 0x36) < 0) | ||
865 | goto err; | ||
866 | if (STV090x_WRITE_DEMOD(state, VTH56, 0x23) < 0) | ||
867 | goto err; | ||
868 | if (STV090x_WRITE_DEMOD(state, VTH67, 0x1e) < 0) | ||
869 | goto err; | ||
870 | if (STV090x_WRITE_DEMOD(state, VTH78, 0x19) < 0) | ||
871 | goto err; | ||
872 | return 0; | ||
873 | err: | ||
874 | dprintk(FE_ERROR, 1, "I/O error"); | ||
875 | return -1; | ||
876 | } | ||
877 | |||
878 | static int stv090x_set_vit_thtracq(struct stv090x_state *state) | ||
879 | { | ||
880 | if (STV090x_WRITE_DEMOD(state, VTH12, 0xd0) < 0) | ||
881 | goto err; | ||
882 | if (STV090x_WRITE_DEMOD(state, VTH23, 0x7d) < 0) | ||
883 | goto err; | ||
884 | if (STV090x_WRITE_DEMOD(state, VTH34, 0x53) < 0) | ||
885 | goto err; | ||
886 | if (STV090x_WRITE_DEMOD(state, VTH56, 0x2f) < 0) | ||
887 | goto err; | ||
888 | if (STV090x_WRITE_DEMOD(state, VTH67, 0x24) < 0) | ||
889 | goto err; | ||
890 | if (STV090x_WRITE_DEMOD(state, VTH78, 0x1f) < 0) | ||
891 | goto err; | ||
892 | return 0; | ||
893 | err: | ||
894 | dprintk(FE_ERROR, 1, "I/O error"); | ||
895 | return -1; | ||
896 | } | ||
897 | |||
898 | static int stv090x_set_viterbi(struct stv090x_state *state) | ||
899 | { | ||
900 | switch (state->search_mode) { | ||
901 | case STV090x_SEARCH_AUTO: | ||
902 | if (STV090x_WRITE_DEMOD(state, FECM, 0x10) < 0) /* DVB-S and DVB-S2 */ | ||
903 | goto err; | ||
904 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x3f) < 0) /* all puncture rate */ | ||
905 | goto err; | ||
906 | break; | ||
907 | case STV090x_SEARCH_DVBS1: | ||
908 | if (STV090x_WRITE_DEMOD(state, FECM, 0x00) < 0) /* disable DSS */ | ||
909 | goto err; | ||
910 | switch (state->fec) { | ||
911 | case STV090x_PR12: | ||
912 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x01) < 0) | ||
913 | goto err; | ||
914 | break; | ||
915 | |||
916 | case STV090x_PR23: | ||
917 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x02) < 0) | ||
918 | goto err; | ||
919 | break; | ||
920 | |||
921 | case STV090x_PR34: | ||
922 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x04) < 0) | ||
923 | goto err; | ||
924 | break; | ||
925 | |||
926 | case STV090x_PR56: | ||
927 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x08) < 0) | ||
928 | goto err; | ||
929 | break; | ||
930 | |||
931 | case STV090x_PR78: | ||
932 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x20) < 0) | ||
933 | goto err; | ||
934 | break; | ||
935 | |||
936 | default: | ||
937 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x2f) < 0) /* all */ | ||
938 | goto err; | ||
939 | break; | ||
940 | } | ||
941 | break; | ||
942 | case STV090x_SEARCH_DSS: | ||
943 | if (STV090x_WRITE_DEMOD(state, FECM, 0x80) < 0) | ||
944 | goto err; | ||
945 | switch (state->fec) { | ||
946 | case STV090x_PR12: | ||
947 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x01) < 0) | ||
948 | goto err; | ||
949 | break; | ||
950 | |||
951 | case STV090x_PR23: | ||
952 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x02) < 0) | ||
953 | goto err; | ||
954 | break; | ||
955 | |||
956 | case STV090x_PR67: | ||
957 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x10) < 0) | ||
958 | goto err; | ||
959 | break; | ||
960 | |||
961 | default: | ||
962 | if (STV090x_WRITE_DEMOD(state, PRVIT, 0x13) < 0) /* 1/2, 2/3, 6/7 */ | ||
963 | goto err; | ||
964 | break; | ||
965 | } | ||
966 | break; | ||
967 | default: | ||
968 | break; | ||
969 | } | ||
970 | return 0; | ||
971 | err: | ||
972 | dprintk(FE_ERROR, 1, "I/O error"); | ||
973 | return -1; | ||
974 | } | ||
975 | |||
976 | static int stv090x_stop_modcod(struct stv090x_state *state) | ||
977 | { | ||
978 | if (STV090x_WRITE_DEMOD(state, MODCODLST0, 0xff) < 0) | ||
979 | goto err; | ||
980 | if (STV090x_WRITE_DEMOD(state, MODCODLST1, 0xff) < 0) | ||
981 | goto err; | ||
982 | if (STV090x_WRITE_DEMOD(state, MODCODLST2, 0xff) < 0) | ||
983 | goto err; | ||
984 | if (STV090x_WRITE_DEMOD(state, MODCODLST3, 0xff) < 0) | ||
985 | goto err; | ||
986 | if (STV090x_WRITE_DEMOD(state, MODCODLST4, 0xff) < 0) | ||
987 | goto err; | ||
988 | if (STV090x_WRITE_DEMOD(state, MODCODLST5, 0xff) < 0) | ||
989 | goto err; | ||
990 | if (STV090x_WRITE_DEMOD(state, MODCODLST6, 0xff) < 0) | ||
991 | goto err; | ||
992 | if (STV090x_WRITE_DEMOD(state, MODCODLST7, 0xff) < 0) | ||
993 | goto err; | ||
994 | if (STV090x_WRITE_DEMOD(state, MODCODLST8, 0xff) < 0) | ||
995 | goto err; | ||
996 | if (STV090x_WRITE_DEMOD(state, MODCODLST9, 0xff) < 0) | ||
997 | goto err; | ||
998 | if (STV090x_WRITE_DEMOD(state, MODCODLSTA, 0xff) < 0) | ||
999 | goto err; | ||
1000 | if (STV090x_WRITE_DEMOD(state, MODCODLSTB, 0xff) < 0) | ||
1001 | goto err; | ||
1002 | if (STV090x_WRITE_DEMOD(state, MODCODLSTC, 0xff) < 0) | ||
1003 | goto err; | ||
1004 | if (STV090x_WRITE_DEMOD(state, MODCODLSTD, 0xff) < 0) | ||
1005 | goto err; | ||
1006 | if (STV090x_WRITE_DEMOD(state, MODCODLSTE, 0xff) < 0) | ||
1007 | goto err; | ||
1008 | if (STV090x_WRITE_DEMOD(state, MODCODLSTF, 0xff) < 0) | ||
1009 | goto err; | ||
1010 | return 0; | ||
1011 | err: | ||
1012 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1013 | return -1; | ||
1014 | } | ||
1015 | |||
1016 | static int stv090x_activate_modcod(struct stv090x_state *state) | ||
1017 | { | ||
1018 | if (STV090x_WRITE_DEMOD(state, MODCODLST0, 0xff) < 0) | ||
1019 | goto err; | ||
1020 | if (STV090x_WRITE_DEMOD(state, MODCODLST1, 0xfc) < 0) | ||
1021 | goto err; | ||
1022 | if (STV090x_WRITE_DEMOD(state, MODCODLST2, 0xcc) < 0) | ||
1023 | goto err; | ||
1024 | if (STV090x_WRITE_DEMOD(state, MODCODLST3, 0xcc) < 0) | ||
1025 | goto err; | ||
1026 | if (STV090x_WRITE_DEMOD(state, MODCODLST4, 0xcc) < 0) | ||
1027 | goto err; | ||
1028 | if (STV090x_WRITE_DEMOD(state, MODCODLST5, 0xcc) < 0) | ||
1029 | goto err; | ||
1030 | if (STV090x_WRITE_DEMOD(state, MODCODLST6, 0xcc) < 0) | ||
1031 | goto err; | ||
1032 | if (STV090x_WRITE_DEMOD(state, MODCODLST7, 0xcc) < 0) | ||
1033 | goto err; | ||
1034 | if (STV090x_WRITE_DEMOD(state, MODCODLST8, 0xcc) < 0) | ||
1035 | goto err; | ||
1036 | if (STV090x_WRITE_DEMOD(state, MODCODLST9, 0xcc) < 0) | ||
1037 | goto err; | ||
1038 | if (STV090x_WRITE_DEMOD(state, MODCODLSTA, 0xcc) < 0) | ||
1039 | goto err; | ||
1040 | if (STV090x_WRITE_DEMOD(state, MODCODLSTB, 0xcc) < 0) | ||
1041 | goto err; | ||
1042 | if (STV090x_WRITE_DEMOD(state, MODCODLSTC, 0xcc) < 0) | ||
1043 | goto err; | ||
1044 | if (STV090x_WRITE_DEMOD(state, MODCODLSTD, 0xcc) < 0) | ||
1045 | goto err; | ||
1046 | if (STV090x_WRITE_DEMOD(state, MODCODLSTE, 0xcc) < 0) | ||
1047 | goto err; | ||
1048 | if (STV090x_WRITE_DEMOD(state, MODCODLSTF, 0xcf) < 0) | ||
1049 | goto err; | ||
1050 | |||
1051 | return 0; | ||
1052 | err: | ||
1053 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1054 | return -1; | ||
1055 | } | ||
1056 | |||
1057 | static int stv090x_activate_modcod_single(struct stv090x_state *state) | ||
1058 | { | ||
1059 | |||
1060 | if (STV090x_WRITE_DEMOD(state, MODCODLST0, 0xff) < 0) | ||
1061 | goto err; | ||
1062 | if (STV090x_WRITE_DEMOD(state, MODCODLST1, 0xf0) < 0) | ||
1063 | goto err; | ||
1064 | if (STV090x_WRITE_DEMOD(state, MODCODLST2, 0x00) < 0) | ||
1065 | goto err; | ||
1066 | if (STV090x_WRITE_DEMOD(state, MODCODLST3, 0x00) < 0) | ||
1067 | goto err; | ||
1068 | if (STV090x_WRITE_DEMOD(state, MODCODLST4, 0x00) < 0) | ||
1069 | goto err; | ||
1070 | if (STV090x_WRITE_DEMOD(state, MODCODLST5, 0x00) < 0) | ||
1071 | goto err; | ||
1072 | if (STV090x_WRITE_DEMOD(state, MODCODLST6, 0x00) < 0) | ||
1073 | goto err; | ||
1074 | if (STV090x_WRITE_DEMOD(state, MODCODLST7, 0x00) < 0) | ||
1075 | goto err; | ||
1076 | if (STV090x_WRITE_DEMOD(state, MODCODLST8, 0x00) < 0) | ||
1077 | goto err; | ||
1078 | if (STV090x_WRITE_DEMOD(state, MODCODLST9, 0x00) < 0) | ||
1079 | goto err; | ||
1080 | if (STV090x_WRITE_DEMOD(state, MODCODLSTA, 0x00) < 0) | ||
1081 | goto err; | ||
1082 | if (STV090x_WRITE_DEMOD(state, MODCODLSTB, 0x00) < 0) | ||
1083 | goto err; | ||
1084 | if (STV090x_WRITE_DEMOD(state, MODCODLSTC, 0x00) < 0) | ||
1085 | goto err; | ||
1086 | if (STV090x_WRITE_DEMOD(state, MODCODLSTD, 0x00) < 0) | ||
1087 | goto err; | ||
1088 | if (STV090x_WRITE_DEMOD(state, MODCODLSTE, 0x00) < 0) | ||
1089 | goto err; | ||
1090 | if (STV090x_WRITE_DEMOD(state, MODCODLSTF, 0x0f) < 0) | ||
1091 | goto err; | ||
1092 | |||
1093 | return 0; | ||
1094 | |||
1095 | err: | ||
1096 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1097 | return -1; | ||
1098 | } | ||
1099 | |||
1100 | static int stv090x_vitclk_ctl(struct stv090x_state *state, int enable) | ||
1101 | { | ||
1102 | u32 reg; | ||
1103 | |||
1104 | switch (state->demod) { | ||
1105 | case STV090x_DEMODULATOR_0: | ||
1106 | mutex_lock(&demod_lock); | ||
1107 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | ||
1108 | STV090x_SETFIELD(reg, STOP_CLKVIT1_FIELD, enable); | ||
1109 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | ||
1110 | goto err; | ||
1111 | mutex_unlock(&demod_lock); | ||
1112 | break; | ||
1113 | |||
1114 | case STV090x_DEMODULATOR_1: | ||
1115 | mutex_lock(&demod_lock); | ||
1116 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | ||
1117 | STV090x_SETFIELD(reg, STOP_CLKVIT2_FIELD, enable); | ||
1118 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | ||
1119 | goto err; | ||
1120 | mutex_unlock(&demod_lock); | ||
1121 | break; | ||
1122 | |||
1123 | default: | ||
1124 | dprintk(FE_ERROR, 1, "Wrong demodulator!"); | ||
1125 | break; | ||
1126 | } | ||
1127 | return 0; | ||
1128 | err: | ||
1129 | mutex_unlock(&demod_lock); | ||
1130 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1131 | return -1; | ||
1132 | } | ||
1133 | |||
1134 | static int stv090x_dvbs_track_crl(struct stv090x_state *state) | ||
1135 | { | ||
1136 | if (state->dev_ver >= 0x30) { | ||
1137 | /* Set ACLC BCLC optimised value vs SR */ | ||
1138 | if (state->srate >= 15000000) { | ||
1139 | if (STV090x_WRITE_DEMOD(state, ACLC, 0x2b) < 0) | ||
1140 | goto err; | ||
1141 | if (STV090x_WRITE_DEMOD(state, BCLC, 0x1a) < 0) | ||
1142 | goto err; | ||
1143 | } else if ((state->srate >= 7000000) && (15000000 > state->srate)) { | ||
1144 | if (STV090x_WRITE_DEMOD(state, ACLC, 0x0c) < 0) | ||
1145 | goto err; | ||
1146 | if (STV090x_WRITE_DEMOD(state, BCLC, 0x1b) < 0) | ||
1147 | goto err; | ||
1148 | } else if (state->srate < 7000000) { | ||
1149 | if (STV090x_WRITE_DEMOD(state, ACLC, 0x2c) < 0) | ||
1150 | goto err; | ||
1151 | if (STV090x_WRITE_DEMOD(state, BCLC, 0x1c) < 0) | ||
1152 | goto err; | ||
1153 | } | ||
1154 | |||
1155 | } else { | ||
1156 | /* Cut 2.0 */ | ||
1157 | if (STV090x_WRITE_DEMOD(state, ACLC, 0x1a) < 0) | ||
1158 | goto err; | ||
1159 | if (STV090x_WRITE_DEMOD(state, BCLC, 0x09) < 0) | ||
1160 | goto err; | ||
1161 | } | ||
1162 | return 0; | ||
1163 | err: | ||
1164 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1165 | return -1; | ||
1166 | } | ||
1167 | |||
1168 | static int stv090x_delivery_search(struct stv090x_state *state) | ||
1169 | { | ||
1170 | u32 reg; | ||
1171 | |||
1172 | switch (state->search_mode) { | ||
1173 | case STV090x_SEARCH_DVBS1: | ||
1174 | case STV090x_SEARCH_DSS: | ||
1175 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1176 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | ||
1177 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); | ||
1178 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1179 | goto err; | ||
1180 | |||
1181 | /* Activate Viterbi decoder in legacy search, | ||
1182 | * do not use FRESVIT1, might impact VITERBI2 | ||
1183 | */ | ||
1184 | if (stv090x_vitclk_ctl(state, 0) < 0) | ||
1185 | goto err; | ||
1186 | |||
1187 | if (stv090x_dvbs_track_crl(state) < 0) | ||
1188 | goto err; | ||
1189 | |||
1190 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x22) < 0) /* disable DVB-S2 */ | ||
1191 | goto err; | ||
1192 | |||
1193 | if (stv090x_set_vit_thacq(state) < 0) | ||
1194 | goto err; | ||
1195 | if (stv090x_set_viterbi(state) < 0) | ||
1196 | goto err; | ||
1197 | break; | ||
1198 | |||
1199 | case STV090x_SEARCH_DVBS2: | ||
1200 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1201 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 0); | ||
1202 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); | ||
1203 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1204 | goto err; | ||
1205 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | ||
1206 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); | ||
1207 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1208 | goto err; | ||
1209 | |||
1210 | if (stv090x_vitclk_ctl(state, 1) < 0) | ||
1211 | goto err; | ||
1212 | |||
1213 | if (STV090x_WRITE_DEMOD(state, ACLC, 0x1a) < 0) /* stop DVB-S CR loop */ | ||
1214 | goto err; | ||
1215 | if (STV090x_WRITE_DEMOD(state, BCLC, 0x09) < 0) | ||
1216 | goto err; | ||
1217 | |||
1218 | if (state->dev_ver <= 0x20) { | ||
1219 | /* enable S2 carrier loop */ | ||
1220 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) | ||
1221 | goto err; | ||
1222 | } else { | ||
1223 | /* > Cut 3: Stop carrier 3 */ | ||
1224 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x66) < 0) | ||
1225 | goto err; | ||
1226 | } | ||
1227 | |||
1228 | if (state->demod_mode != STV090x_SINGLE) { | ||
1229 | /* Cut 2: enable link during search */ | ||
1230 | if (stv090x_activate_modcod(state) < 0) | ||
1231 | goto err; | ||
1232 | } else { | ||
1233 | /* Single demodulator | ||
1234 | * Authorize SHORT and LONG frames, | ||
1235 | * QPSK, 8PSK, 16APSK and 32APSK | ||
1236 | */ | ||
1237 | if (stv090x_activate_modcod_single(state) < 0) | ||
1238 | goto err; | ||
1239 | } | ||
1240 | |||
1241 | break; | ||
1242 | |||
1243 | case STV090x_SEARCH_AUTO: | ||
1244 | default: | ||
1245 | /* enable DVB-S2 and DVB-S2 in Auto MODE */ | ||
1246 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1247 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | ||
1248 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); | ||
1249 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1250 | goto err; | ||
1251 | |||
1252 | if (stv090x_vitclk_ctl(state, 0) < 0) | ||
1253 | goto err; | ||
1254 | |||
1255 | if (stv090x_dvbs_track_crl(state) < 0) | ||
1256 | goto err; | ||
1257 | |||
1258 | if (state->dev_ver <= 0x20) { | ||
1259 | /* enable S2 carrier loop */ | ||
1260 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) | ||
1261 | goto err; | ||
1262 | } else { | ||
1263 | /* > Cut 3: Stop carrier 3 */ | ||
1264 | if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x66) < 0) | ||
1265 | goto err; | ||
1266 | } | ||
1267 | |||
1268 | if (state->demod_mode != STV090x_SINGLE) { | ||
1269 | /* Cut 2: enable link during search */ | ||
1270 | if (stv090x_activate_modcod(state) < 0) | ||
1271 | goto err; | ||
1272 | } else { | ||
1273 | /* Single demodulator | ||
1274 | * Authorize SHORT and LONG frames, | ||
1275 | * QPSK, 8PSK, 16APSK and 32APSK | ||
1276 | */ | ||
1277 | if (stv090x_activate_modcod_single(state) < 0) | ||
1278 | goto err; | ||
1279 | } | ||
1280 | |||
1281 | if (state->srate >= 2000000) { | ||
1282 | /* Srate >= 2MSPS, Viterbi threshold to acquire */ | ||
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 | |||
1293 | if (stv090x_set_viterbi(state) < 0) | ||
1294 | goto err; | ||
1295 | break; | ||
1296 | } | ||
1297 | return 0; | ||
1298 | err: | ||
1299 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1300 | return -1; | ||
1301 | } | ||
1302 | |||
1303 | static int stv090x_start_search(struct stv090x_state *state) | ||
1304 | { | ||
1305 | u32 reg, freq_abs; | ||
1306 | s16 freq; | ||
1307 | |||
1308 | /* Reset demodulator */ | ||
1309 | reg = STV090x_READ_DEMOD(state, DMDISTATE); | ||
1310 | STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x1f); | ||
1311 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) | ||
1312 | goto err; | ||
1313 | |||
1314 | if (state->dev_ver <= 0x20) { | ||
1315 | if (state->srate <= 5000000) { | ||
1316 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0x44) < 0) | ||
1317 | goto err; | ||
1318 | if (STV090x_WRITE_DEMOD(state, CFRUP1, 0x0f) < 0) | ||
1319 | goto err; | ||
1320 | if (STV090x_WRITE_DEMOD(state, CFRUP1, 0xff) < 0) | ||
1321 | goto err; | ||
1322 | if (STV090x_WRITE_DEMOD(state, CFRLOW1, 0xf0) < 0) | ||
1323 | goto err; | ||
1324 | if (STV090x_WRITE_DEMOD(state, CFRLOW0, 0x00) < 0) | ||
1325 | goto err; | ||
1326 | |||
1327 | /*enlarge the timing bandwith for Low SR*/ | ||
1328 | if (STV090x_WRITE_DEMOD(state, RTCS2, 0x68) < 0) | ||
1329 | goto err; | ||
1330 | } else { | ||
1331 | /* If the symbol rate is >5 Msps | ||
1332 | Set The carrier search up and low to auto mode */ | ||
1333 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0xc4) < 0) | ||
1334 | goto err; | ||
1335 | /*reduce the timing bandwith for high SR*/ | ||
1336 | if (STV090x_WRITE_DEMOD(state, RTCS2, 0x44) < 0) | ||
1337 | goto err; | ||
1338 | } | ||
1339 | } else { | ||
1340 | /* >= Cut 3 */ | ||
1341 | if (state->srate <= 5000000) { | ||
1342 | /* enlarge the timing bandwith for Low SR */ | ||
1343 | STV090x_WRITE_DEMOD(state, RTCS2, 0x68); | ||
1344 | } else { | ||
1345 | /* reduce timing bandwith for high SR */ | ||
1346 | STV090x_WRITE_DEMOD(state, RTCS2, 0x44); | ||
1347 | } | ||
1348 | |||
1349 | /* Set CFR min and max to manual mode */ | ||
1350 | STV090x_WRITE_DEMOD(state, CARCFG, 0x46); | ||
1351 | |||
1352 | if (state->algo == STV090x_WARM_SEARCH) { | ||
1353 | /* WARM Start | ||
1354 | * CFR min = -1MHz, | ||
1355 | * CFR max = +1MHz | ||
1356 | */ | ||
1357 | freq_abs = 1000 << 16; | ||
1358 | freq_abs /= (state->mclk / 1000); | ||
1359 | freq = (s16) freq_abs; | ||
1360 | } else { | ||
1361 | /* COLD Start | ||
1362 | * CFR min =- (SearchRange / 2 + 600KHz) | ||
1363 | * CFR max = +(SearchRange / 2 + 600KHz) | ||
1364 | * (600KHz for the tuner step size) | ||
1365 | */ | ||
1366 | freq_abs = (state->search_range / 2000) + 600; | ||
1367 | freq_abs = freq_abs << 16; | ||
1368 | freq_abs /= (state->mclk / 1000); | ||
1369 | freq = (s16) freq_abs; | ||
1370 | } | ||
1371 | |||
1372 | if (STV090x_WRITE_DEMOD(state, CFRUP1, MSB(freq)) < 0) | ||
1373 | goto err; | ||
1374 | if (STV090x_WRITE_DEMOD(state, CFRUP1, LSB(freq)) < 0) | ||
1375 | goto err; | ||
1376 | |||
1377 | freq *= -1; | ||
1378 | |||
1379 | if (STV090x_WRITE_DEMOD(state, CFRLOW1, MSB(freq)) < 0) | ||
1380 | goto err; | ||
1381 | if (STV090x_WRITE_DEMOD(state, CFRLOW0, LSB(freq)) < 0) | ||
1382 | goto err; | ||
1383 | |||
1384 | } | ||
1385 | |||
1386 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0) < 0) | ||
1387 | goto err; | ||
1388 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0) < 0) | ||
1389 | goto err; | ||
1390 | |||
1391 | if (state->dev_ver >= 0x20) { | ||
1392 | if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) | ||
1393 | goto err; | ||
1394 | if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) | ||
1395 | goto err; | ||
1396 | |||
1397 | if ((state->search_mode == STV090x_DVBS1) || | ||
1398 | (state->search_mode == STV090x_DSS) || | ||
1399 | (state->search_mode == STV090x_SEARCH_AUTO)) { | ||
1400 | |||
1401 | if (STV090x_WRITE_DEMOD(state, VITSCALE, 0x82) < 0) | ||
1402 | goto err; | ||
1403 | if (STV090x_WRITE_DEMOD(state, VAVSRVIT, 0x00) < 0) | ||
1404 | goto err; | ||
1405 | } | ||
1406 | } | ||
1407 | |||
1408 | if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x00) < 0) | ||
1409 | goto err; | ||
1410 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0xe0) < 0) | ||
1411 | goto err; | ||
1412 | if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0xc0) < 0) | ||
1413 | goto err; | ||
1414 | |||
1415 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1416 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 0); | ||
1417 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0); | ||
1418 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1419 | goto err; | ||
1420 | reg = STV090x_READ_DEMOD(state, DMDCFG2); | ||
1421 | STV090x_SETFIELD_Px(reg, S1S2_SEQUENTIAL_FIELD, 0x0); | ||
1422 | if (STV090x_WRITE_DEMOD(state, DMDCFG2, reg) < 0) | ||
1423 | goto err; | ||
1424 | |||
1425 | if (state->dev_ver >= 0x20) { | ||
1426 | /*Frequency offset detector setting*/ | ||
1427 | if (state->srate < 2000000) { | ||
1428 | if (state->dev_ver <= 0x20) { | ||
1429 | /* Cut 2 */ | ||
1430 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x39) < 0) | ||
1431 | goto err; | ||
1432 | } else { | ||
1433 | /* Cut 2 */ | ||
1434 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x89) < 0) | ||
1435 | goto err; | ||
1436 | } | ||
1437 | if (STV090x_WRITE_DEMOD(state, CARHDR, 0x40) < 0) | ||
1438 | goto err; | ||
1439 | } | ||
1440 | |||
1441 | if (state->srate < 10000000) { | ||
1442 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4c) < 0) | ||
1443 | goto err; | ||
1444 | } else { | ||
1445 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4b) < 0) | ||
1446 | goto err; | ||
1447 | } | ||
1448 | } else { | ||
1449 | if (state->srate < 10000000) { | ||
1450 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0xef) < 0) | ||
1451 | goto err; | ||
1452 | } else { | ||
1453 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0xed) < 0) | ||
1454 | goto err; | ||
1455 | } | ||
1456 | } | ||
1457 | |||
1458 | switch (state->algo) { | ||
1459 | case STV090x_WARM_SEARCH: | ||
1460 | /* The symbol rate and the exact | ||
1461 | * carrier Frequency are known | ||
1462 | */ | ||
1463 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) | ||
1464 | goto err; | ||
1465 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x18) < 0) | ||
1466 | goto err; | ||
1467 | break; | ||
1468 | |||
1469 | case STV090x_COLD_SEARCH: | ||
1470 | /* The symbol rate is known */ | ||
1471 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) | ||
1472 | goto err; | ||
1473 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0) | ||
1474 | goto err; | ||
1475 | break; | ||
1476 | |||
1477 | default: | ||
1478 | break; | ||
1479 | } | ||
1480 | return 0; | ||
1481 | err: | ||
1482 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1483 | return -1; | ||
1484 | } | ||
1485 | |||
1486 | static int stv090x_get_agc2_min_level(struct stv090x_state *state) | ||
1487 | { | ||
1488 | u32 agc2_min = 0, agc2 = 0, freq_init, freq_step, reg; | ||
1489 | s32 i, j, steps, dir; | ||
1490 | |||
1491 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) | ||
1492 | goto err; | ||
1493 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1494 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1); | ||
1495 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 1); | ||
1496 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1497 | goto err; | ||
1498 | |||
1499 | if (STV090x_WRITE_DEMOD(state, SFRUP1, 0x83) < 0) /* SR = 65 Msps Max */ | ||
1500 | goto err; | ||
1501 | if (STV090x_WRITE_DEMOD(state, SFRUP0, 0xc0) < 0) | ||
1502 | goto err; | ||
1503 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, 0x82) < 0) /* SR= 400 ksps Min */ | ||
1504 | goto err; | ||
1505 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, 0xa0) < 0) | ||
1506 | goto err; | ||
1507 | if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x00) < 0) /* stop acq @ coarse carrier state */ | ||
1508 | goto err; | ||
1509 | if (stv090x_set_srate(state, 1000000) < 0) | ||
1510 | goto err; | ||
1511 | |||
1512 | steps = -1 + state->search_range / 1000000; | ||
1513 | steps /= 2; | ||
1514 | steps = (2 * steps) + 1; | ||
1515 | if (steps < 0) | ||
1516 | steps = 1; | ||
1517 | |||
1518 | dir = 1; | ||
1519 | freq_step = (1000000 * 256) / (state->mclk / 256); | ||
1520 | freq_init = 0; | ||
1521 | |||
1522 | for (i = 0; i < steps; i++) { | ||
1523 | if (dir > 0) | ||
1524 | freq_init = freq_init + (freq_step * i); | ||
1525 | else | ||
1526 | freq_init = freq_init - (freq_step * i); | ||
1527 | |||
1528 | dir = -1; | ||
1529 | |||
1530 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod RESET */ | ||
1531 | goto err; | ||
1532 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, (freq_init >> 8) & 0xff) < 0) | ||
1533 | goto err; | ||
1534 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, freq_init & 0xff) < 0) | ||
1535 | goto err; | ||
1536 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x58) < 0) /* Demod RESET */ | ||
1537 | goto err; | ||
1538 | msleep(10); | ||
1539 | for (j = 0; j < 10; j++) { | ||
1540 | agc2 += STV090x_READ_DEMOD(state, AGC2I1) << 8; | ||
1541 | agc2 |= STV090x_READ_DEMOD(state, AGC2I0); | ||
1542 | } | ||
1543 | agc2 /= 10; | ||
1544 | agc2_min = 0xffff; | ||
1545 | if (agc2 < 0xffff) | ||
1546 | agc2_min = agc2; | ||
1547 | } | ||
1548 | |||
1549 | return agc2_min; | ||
1550 | err: | ||
1551 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1552 | return -1; | ||
1553 | } | ||
1554 | |||
1555 | static u32 stv090x_get_srate(struct stv090x_state *state, u32 clk) | ||
1556 | { | ||
1557 | u8 r3, r2, r1, r0; | ||
1558 | s32 srate, int_1, int_2, tmp_1, tmp_2; | ||
1559 | |||
1560 | r3 = STV090x_READ_DEMOD(state, SFR3); | ||
1561 | r2 = STV090x_READ_DEMOD(state, SFR2); | ||
1562 | r1 = STV090x_READ_DEMOD(state, SFR1); | ||
1563 | r0 = STV090x_READ_DEMOD(state, SFR0); | ||
1564 | |||
1565 | srate = ((r3 << 24) | (r2 << 16) | (r1 << 8) | r0); | ||
1566 | |||
1567 | int_1 = clk >> 16; | ||
1568 | int_2 = srate >> 16; | ||
1569 | |||
1570 | tmp_1 = clk % 0x10000; | ||
1571 | tmp_2 = srate % 0x10000; | ||
1572 | |||
1573 | srate = (int_1 * int_2) + | ||
1574 | ((int_1 * tmp_2) >> 16) + | ||
1575 | ((int_2 * tmp_1) >> 16); | ||
1576 | |||
1577 | return srate; | ||
1578 | } | ||
1579 | |||
1580 | static u32 stv090x_srate_srch_coarse(struct stv090x_state *state) | ||
1581 | { | ||
1582 | struct dvb_frontend *fe = &state->frontend; | ||
1583 | |||
1584 | int tmg_lock = 0, i; | ||
1585 | s32 tmg_cpt = 0, dir = 1, steps, cur_step = 0, freq; | ||
1586 | u32 srate_coarse = 0, agc2 = 0, car_step = 1200, reg; | ||
1587 | |||
1588 | reg = STV090x_READ_DEMOD(state, DMDISTATE); | ||
1589 | STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x1f); /* Demod RESET */ | ||
1590 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) | ||
1591 | goto err; | ||
1592 | if (STV090x_WRITE_DEMOD(state, TMGCFG, 0x12) < 0) | ||
1593 | goto err; | ||
1594 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0xf0) < 0) | ||
1595 | goto err; | ||
1596 | if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0xe0) < 0) | ||
1597 | goto err; | ||
1598 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1599 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1); | ||
1600 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 1); | ||
1601 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1602 | goto err; | ||
1603 | |||
1604 | if (STV090x_WRITE_DEMOD(state, SFRUP1, 0x83) < 0) | ||
1605 | goto err; | ||
1606 | if (STV090x_WRITE_DEMOD(state, SFRUP0, 0xc0) < 0) | ||
1607 | goto err; | ||
1608 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, 0x82) < 0) | ||
1609 | goto err; | ||
1610 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, 0xa0) < 0) | ||
1611 | goto err; | ||
1612 | if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x00) < 0) | ||
1613 | goto err; | ||
1614 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x60) < 0) | ||
1615 | goto err; | ||
1616 | |||
1617 | if (state->dev_ver >= 0x30) { | ||
1618 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x99) < 0) | ||
1619 | goto err; | ||
1620 | if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0) | ||
1621 | goto err; | ||
1622 | |||
1623 | } else if (state->dev_ver >= 0x20) { | ||
1624 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x6a) < 0) | ||
1625 | goto err; | ||
1626 | if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0) | ||
1627 | goto err; | ||
1628 | } | ||
1629 | |||
1630 | if (state->srate <= 2000000) | ||
1631 | car_step = 1000; | ||
1632 | else if (state->srate <= 5000000) | ||
1633 | car_step = 2000; | ||
1634 | else if (state->srate <= 12000000) | ||
1635 | car_step = 3000; | ||
1636 | else | ||
1637 | car_step = 5000; | ||
1638 | |||
1639 | steps = -1 + ((state->search_range / 1000) / car_step); | ||
1640 | steps /= 2; | ||
1641 | steps = (2 * steps) + 1; | ||
1642 | if (steps < 0) | ||
1643 | steps = 1; | ||
1644 | else if (steps > 10) { | ||
1645 | steps = 11; | ||
1646 | car_step = (state->search_range / 1000) / 10; | ||
1647 | } | ||
1648 | cur_step = 0; | ||
1649 | dir = 1; | ||
1650 | freq = state->frequency; | ||
1651 | |||
1652 | while ((!tmg_lock) && (cur_step < steps)) { | ||
1653 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5f) < 0) /* Demod RESET */ | ||
1654 | goto err; | ||
1655 | reg = STV090x_READ_DEMOD(state, DMDISTATE); | ||
1656 | STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x00); /* trigger acquisition */ | ||
1657 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) | ||
1658 | goto err; | ||
1659 | msleep(50); | ||
1660 | for (i = 0; i < 10; i++) { | ||
1661 | reg = STV090x_READ_DEMOD(state, DSTATUS); | ||
1662 | if (STV090x_GETFIELD_Px(reg, TMGLOCK_QUALITY_FIELD) >= 2) | ||
1663 | tmg_cpt++; | ||
1664 | agc2 += STV090x_READ_DEMOD(state, AGC2I1) << 8; | ||
1665 | agc2 |= STV090x_READ_DEMOD(state, AGC2I0); | ||
1666 | } | ||
1667 | agc2 /= 10; | ||
1668 | srate_coarse = stv090x_get_srate(state, state->mclk); | ||
1669 | cur_step++; | ||
1670 | dir *= -1; | ||
1671 | if ((tmg_cpt >= 5) && (agc2 < 0x1f00) && (srate_coarse < 55000000) && (srate_coarse > 850000)) | ||
1672 | tmg_lock = 1; | ||
1673 | else if (cur_step < steps) { | ||
1674 | if (dir > 0) | ||
1675 | freq += cur_step * car_step; | ||
1676 | else | ||
1677 | freq -= cur_step * car_step; | ||
1678 | |||
1679 | /* Setup tuner */ | ||
1680 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
1681 | goto err; | ||
1682 | |||
1683 | if (state->config->tuner_set_frequency) { | ||
1684 | if (state->config->tuner_set_frequency(fe, state->frequency) < 0) | ||
1685 | goto err; | ||
1686 | } | ||
1687 | |||
1688 | if (state->config->tuner_set_bandwidth) { | ||
1689 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | ||
1690 | goto err; | ||
1691 | } | ||
1692 | |||
1693 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
1694 | goto err; | ||
1695 | |||
1696 | msleep(50); | ||
1697 | |||
1698 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
1699 | goto err; | ||
1700 | |||
1701 | if (state->config->tuner_get_status) { | ||
1702 | if (state->config->tuner_get_status(fe, ®) < 0) | ||
1703 | goto err; | ||
1704 | } | ||
1705 | |||
1706 | if (reg) | ||
1707 | dprintk(FE_DEBUG, 1, "Tuner phase locked"); | ||
1708 | else | ||
1709 | dprintk(FE_DEBUG, 1, "Tuner unlocked"); | ||
1710 | |||
1711 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
1712 | goto err; | ||
1713 | |||
1714 | } | ||
1715 | } | ||
1716 | if (!tmg_lock) | ||
1717 | srate_coarse = 0; | ||
1718 | else | ||
1719 | srate_coarse = stv090x_get_srate(state, state->mclk); | ||
1720 | |||
1721 | return srate_coarse; | ||
1722 | err: | ||
1723 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1724 | return -1; | ||
1725 | } | ||
1726 | |||
1727 | static u32 stv090x_srate_srch_fine(struct stv090x_state *state) | ||
1728 | { | ||
1729 | u32 srate_coarse, freq_coarse, sym, reg; | ||
1730 | |||
1731 | srate_coarse = stv090x_get_srate(state, state->mclk); | ||
1732 | freq_coarse = STV090x_READ_DEMOD(state, CFR2) << 8; | ||
1733 | freq_coarse |= STV090x_READ_DEMOD(state, CFR1); | ||
1734 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ | ||
1735 | |||
1736 | if (sym < state->srate) | ||
1737 | srate_coarse = 0; | ||
1738 | else { | ||
1739 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) /* Demod RESET */ | ||
1740 | goto err; | ||
1741 | if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0x01) < 0) | ||
1742 | goto err; | ||
1743 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0x20) < 0) | ||
1744 | goto err; | ||
1745 | if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0x00) < 0) | ||
1746 | goto err; | ||
1747 | if (STV090x_WRITE_DEMOD(state, TMGCFG, 0xd2) < 0) | ||
1748 | goto err; | ||
1749 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1750 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0x00); | ||
1751 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1752 | goto err; | ||
1753 | |||
1754 | if (state->dev_ver >= 0x30) { | ||
1755 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x79) < 0) | ||
1756 | goto err; | ||
1757 | } else if (state->dev_ver >= 0x20) { | ||
1758 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) | ||
1759 | goto err; | ||
1760 | } | ||
1761 | |||
1762 | if (srate_coarse > 3000000) { | ||
1763 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ | ||
1764 | sym = (sym / 1000) * 65536; | ||
1765 | sym /= (state->mclk / 1000); | ||
1766 | if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) | ||
1767 | goto err; | ||
1768 | if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) | ||
1769 | goto err; | ||
1770 | sym = 10 * (srate_coarse / 13); /* SFRLOW = SFR - 30% */ | ||
1771 | sym = (sym / 1000) * 65536; | ||
1772 | sym /= (state->mclk / 1000); | ||
1773 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) | ||
1774 | goto err; | ||
1775 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) | ||
1776 | goto err; | ||
1777 | sym = (srate_coarse / 1000) * 65536; | ||
1778 | sym /= (state->mclk / 1000); | ||
1779 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) | ||
1780 | goto err; | ||
1781 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) | ||
1782 | goto err; | ||
1783 | } else { | ||
1784 | sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ | ||
1785 | sym = (sym / 100) * 65536; | ||
1786 | sym /= (state->mclk / 100); | ||
1787 | if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) | ||
1788 | goto err; | ||
1789 | if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) | ||
1790 | goto err; | ||
1791 | sym = 10 * (srate_coarse / 14); /* SFRLOW = SFR - 30% */ | ||
1792 | sym = (sym / 100) * 65536; | ||
1793 | sym /= (state->mclk / 100); | ||
1794 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) | ||
1795 | goto err; | ||
1796 | if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) | ||
1797 | goto err; | ||
1798 | sym = (srate_coarse / 100) * 65536; | ||
1799 | sym /= (state->mclk / 100); | ||
1800 | if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) | ||
1801 | goto err; | ||
1802 | if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) | ||
1803 | goto err; | ||
1804 | } | ||
1805 | if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x20) < 0) | ||
1806 | goto err; | ||
1807 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, (freq_coarse >> 8) & 0xff) < 0) | ||
1808 | goto err; | ||
1809 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, freq_coarse & 0xff) < 0) | ||
1810 | goto err; | ||
1811 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0) /* trigger acquisition */ | ||
1812 | goto err; | ||
1813 | } | ||
1814 | |||
1815 | return srate_coarse; | ||
1816 | |||
1817 | err: | ||
1818 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1819 | return -1; | ||
1820 | } | ||
1821 | |||
1822 | static int stv090x_get_dmdlock(struct stv090x_state *state, s32 timeout) | ||
1823 | { | ||
1824 | s32 timer = 0, lock = 0; | ||
1825 | u32 reg; | ||
1826 | u8 stat; | ||
1827 | |||
1828 | while ((timer < timeout) && (!lock)) { | ||
1829 | reg = STV090x_READ_DEMOD(state, DMDSTATE); | ||
1830 | stat = STV090x_GETFIELD_Px(reg, HEADER_MODE_FIELD); | ||
1831 | |||
1832 | switch (stat) { | ||
1833 | case 0: /* searching */ | ||
1834 | case 1: /* first PLH detected */ | ||
1835 | default: | ||
1836 | dprintk(FE_DEBUG, 1, "Demodulator searching .."); | ||
1837 | lock = 0; | ||
1838 | break; | ||
1839 | case 2: /* DVB-S2 mode */ | ||
1840 | case 3: /* DVB-S1/legacy mode */ | ||
1841 | reg = STV090x_READ_DEMOD(state, DSTATUS); | ||
1842 | lock = STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD); | ||
1843 | break; | ||
1844 | } | ||
1845 | |||
1846 | if (!lock) | ||
1847 | msleep(10); | ||
1848 | else | ||
1849 | dprintk(FE_DEBUG, 1, "Demodulator acquired LOCK"); | ||
1850 | |||
1851 | timer += 10; | ||
1852 | } | ||
1853 | return lock; | ||
1854 | } | ||
1855 | |||
1856 | static int stv090x_blind_search(struct stv090x_state *state) | ||
1857 | { | ||
1858 | u32 agc2, reg, srate_coarse; | ||
1859 | s32 timeout_dmd = 500, cpt_fail, agc2_ovflw, i; | ||
1860 | u8 k_ref, k_max, k_min; | ||
1861 | int coarse_fail, lock; | ||
1862 | |||
1863 | k_max = 120; | ||
1864 | k_min = 30; | ||
1865 | |||
1866 | agc2 = stv090x_get_agc2_min_level(state); | ||
1867 | |||
1868 | if (agc2 > STV090x_SEARCH_AGC2_TH(state->dev_ver)) { | ||
1869 | lock = 0; | ||
1870 | } else { | ||
1871 | |||
1872 | if (state->dev_ver <= 0x20) { | ||
1873 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0xc4) < 0) | ||
1874 | goto err; | ||
1875 | } else { | ||
1876 | /* > Cut 3 */ | ||
1877 | if (STV090x_WRITE_DEMOD(state, CARCFG, 0x06) < 0) | ||
1878 | goto err; | ||
1879 | } | ||
1880 | |||
1881 | if (STV090x_WRITE_DEMOD(state, RTCS2, 0x44) < 0) | ||
1882 | goto err; | ||
1883 | |||
1884 | if (state->dev_ver >= 0x20) { | ||
1885 | if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) | ||
1886 | goto err; | ||
1887 | if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) | ||
1888 | goto err; | ||
1889 | if (STV090x_WRITE_DEMOD(state, VITSCALE, 0x82) < 0) | ||
1890 | goto err; | ||
1891 | if (STV090x_WRITE_DEMOD(state, VAVSRVIT, 0x00) < 0) /* set viterbi hysteresis */ | ||
1892 | goto err; | ||
1893 | } | ||
1894 | |||
1895 | k_ref = k_max; | ||
1896 | do { | ||
1897 | if (STV090x_WRITE_DEMOD(state, KREFTMG, k_ref) < 0) | ||
1898 | goto err; | ||
1899 | if (stv090x_srate_srch_coarse(state) != 0) { | ||
1900 | srate_coarse = stv090x_srate_srch_fine(state); | ||
1901 | if (srate_coarse != 0) { | ||
1902 | stv090x_get_lock_tmg(state); | ||
1903 | lock = stv090x_get_dmdlock(state, timeout_dmd); | ||
1904 | } else { | ||
1905 | lock = 0; | ||
1906 | } | ||
1907 | } else { | ||
1908 | cpt_fail = 0; | ||
1909 | agc2_ovflw = 0; | ||
1910 | for (i = 0; i < 10; i++) { | ||
1911 | agc2 = STV090x_READ_DEMOD(state, AGC2I1) << 8; | ||
1912 | agc2 |= STV090x_READ_DEMOD(state, AGC2I0); | ||
1913 | if (agc2 >= 0xff00) | ||
1914 | agc2_ovflw++; | ||
1915 | reg = STV090x_READ_DEMOD(state, DSTATUS2); | ||
1916 | if ((STV090x_GETFIELD_Px(reg, CFR_OVERFLOW_FIELD) == 0x01) && | ||
1917 | (STV090x_GETFIELD_Px(reg, DEMOD_DELOCK_FIELD) == 0x01)) | ||
1918 | |||
1919 | cpt_fail++; | ||
1920 | } | ||
1921 | if ((cpt_fail > 7) || (agc2_ovflw > 7)) | ||
1922 | coarse_fail = 1; | ||
1923 | |||
1924 | lock = 0; | ||
1925 | } | ||
1926 | k_ref -= 30; | ||
1927 | } while ((k_ref >= k_min) && (!lock) && (!coarse_fail)); | ||
1928 | } | ||
1929 | |||
1930 | return lock; | ||
1931 | |||
1932 | err: | ||
1933 | dprintk(FE_ERROR, 1, "I/O error"); | ||
1934 | return -1; | ||
1935 | } | ||
1936 | |||
1937 | static int stv090x_chk_tmg(struct stv090x_state *state) | ||
1938 | { | ||
1939 | u32 reg; | ||
1940 | s32 tmg_cpt = 0, i; | ||
1941 | u8 freq, tmg_thh, tmg_thl; | ||
1942 | int tmg_lock; | ||
1943 | |||
1944 | freq = STV090x_READ_DEMOD(state, CARFREQ); | ||
1945 | tmg_thh = STV090x_READ_DEMOD(state, TMGTHRISE); | ||
1946 | tmg_thl = STV090x_READ_DEMOD(state, TMGTHFALL); | ||
1947 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0x20) < 0) | ||
1948 | goto err; | ||
1949 | if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0x00) < 0) | ||
1950 | goto err; | ||
1951 | |||
1952 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
1953 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0x00); /* stop carrier offset search */ | ||
1954 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
1955 | goto err; | ||
1956 | if (STV090x_WRITE_DEMOD(state, RTC, 0x80) < 0) | ||
1957 | goto err; | ||
1958 | |||
1959 | if (STV090x_WRITE_DEMOD(state, RTCS2, 0x40) < 0) | ||
1960 | goto err; | ||
1961 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x00) < 0) | ||
1962 | goto err; | ||
1963 | |||
1964 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0) /* set car ofset to 0 */ | ||
1965 | goto err; | ||
1966 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0) | ||
1967 | goto err; | ||
1968 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x65) < 0) | ||
1969 | goto err; | ||
1970 | |||
1971 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x18) < 0) /* trigger acquisition */ | ||
1972 | goto err; | ||
1973 | msleep(10); | ||
1974 | |||
1975 | for (i = 0; i < 10; i++) { | ||
1976 | reg = STV090x_READ_DEMOD(state, DSTATUS); | ||
1977 | if (STV090x_GETFIELD_Px(reg, TMGLOCK_QUALITY_FIELD) >= 2) | ||
1978 | tmg_cpt++; | ||
1979 | msleep(1); | ||
1980 | } | ||
1981 | if (tmg_cpt >= 3) | ||
1982 | tmg_lock = 1; | ||
1983 | |||
1984 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) | ||
1985 | goto err; | ||
1986 | if (STV090x_WRITE_DEMOD(state, RTC, 0x88) < 0) /* DVB-S1 timing */ | ||
1987 | goto err; | ||
1988 | if (STV090x_WRITE_DEMOD(state, RTCS2, 0x68) < 0) /* DVB-S2 timing */ | ||
1989 | goto err; | ||
1990 | |||
1991 | if (STV090x_WRITE_DEMOD(state, CARFREQ, freq) < 0) | ||
1992 | goto err; | ||
1993 | if (STV090x_WRITE_DEMOD(state, TMGTHRISE, tmg_thh) < 0) | ||
1994 | goto err; | ||
1995 | if (STV090x_WRITE_DEMOD(state, TMGTHFALL, tmg_thl) < 0) | ||
1996 | goto err; | ||
1997 | |||
1998 | return tmg_lock; | ||
1999 | |||
2000 | err: | ||
2001 | dprintk(FE_ERROR, 1, "I/O error"); | ||
2002 | return -1; | ||
2003 | } | ||
2004 | |||
2005 | static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd) | ||
2006 | { | ||
2007 | struct dvb_frontend *fe = &state->frontend; | ||
2008 | |||
2009 | u32 reg; | ||
2010 | s32 car_step, steps, cur_step, dir, freq, timeout_lock; | ||
2011 | int lock = 0; | ||
2012 | |||
2013 | if (state->srate >= 10000000) | ||
2014 | timeout_lock = timeout_dmd / 3; | ||
2015 | else | ||
2016 | timeout_lock = timeout_dmd / 2; | ||
2017 | |||
2018 | lock = stv090x_get_dmdlock(state, timeout_lock); /* cold start wait */ | ||
2019 | if (!lock) { | ||
2020 | if (state->srate >= 10000000) { | ||
2021 | if (stv090x_chk_tmg(state)) { | ||
2022 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) | ||
2023 | goto err; | ||
2024 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0) | ||
2025 | goto err; | ||
2026 | lock = stv090x_get_dmdlock(state, timeout_dmd); | ||
2027 | } else { | ||
2028 | lock = 0; | ||
2029 | } | ||
2030 | } else { | ||
2031 | if (state->srate <= 4000000) | ||
2032 | car_step = 1000; | ||
2033 | else if (state->srate <= 7000000) | ||
2034 | car_step = 2000; | ||
2035 | else if (state->srate <= 10000000) | ||
2036 | car_step = 3000; | ||
2037 | else | ||
2038 | car_step = 5000; | ||
2039 | |||
2040 | steps = (state->search_range / 1000) / car_step; | ||
2041 | steps /= 2; | ||
2042 | steps = 2 * (steps + 1); | ||
2043 | if (steps < 0) | ||
2044 | steps = 2; | ||
2045 | else if (steps > 12) | ||
2046 | steps = 12; | ||
2047 | |||
2048 | cur_step = 1; | ||
2049 | dir = 1; | ||
2050 | |||
2051 | if (!lock) { | ||
2052 | freq = state->frequency; | ||
2053 | state->tuner_bw = stv090x_car_width(state->srate, state->rolloff) + state->srate; | ||
2054 | while ((cur_step <= steps) && (!lock)) { | ||
2055 | if (dir > 0) | ||
2056 | freq += cur_step * car_step; | ||
2057 | else | ||
2058 | freq -= cur_step * car_step; | ||
2059 | |||
2060 | /* Setup tuner */ | ||
2061 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
2062 | goto err; | ||
2063 | |||
2064 | if (state->config->tuner_set_frequency) { | ||
2065 | if (state->config->tuner_set_frequency(fe, state->frequency) < 0) | ||
2066 | goto err; | ||
2067 | } | ||
2068 | |||
2069 | if (state->config->tuner_set_bandwidth) { | ||
2070 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | ||
2071 | goto err; | ||
2072 | } | ||
2073 | |||
2074 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
2075 | goto err; | ||
2076 | |||
2077 | msleep(50); | ||
2078 | |||
2079 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
2080 | goto err; | ||
2081 | |||
2082 | if (state->config->tuner_get_status) { | ||
2083 | if (state->config->tuner_get_status(fe, ®) < 0) | ||
2084 | goto err; | ||
2085 | } | ||
2086 | |||
2087 | if (reg) | ||
2088 | dprintk(FE_DEBUG, 1, "Tuner phase locked"); | ||
2089 | else | ||
2090 | dprintk(FE_DEBUG, 1, "Tuner unlocked"); | ||
2091 | |||
2092 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
2093 | goto err; | ||
2094 | |||
2095 | 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) | ||
2108 | goto err; | ||
2109 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0) | ||
2110 | goto err; | ||
2111 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) | ||
2112 | goto err; | ||
2113 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0) | ||
2114 | goto err; | ||
2115 | lock = stv090x_get_dmdlock(state, (timeout_dmd / 3)); | ||
2116 | |||
2117 | dir *= -1; | ||
2118 | cur_step++; | ||
2119 | } | ||
2120 | } | ||
2121 | } | ||
2122 | } | ||
2123 | |||
2124 | return lock; | ||
2125 | |||
2126 | err: | ||
2127 | dprintk(FE_ERROR, 1, "I/O error"); | ||
2128 | return -1; | ||
2129 | } | ||
2130 | |||
2131 | static int stv090x_get_loop_params(struct stv090x_state *state, s32 *freq_inc, s32 *timeout_sw, s32 *steps) | ||
2132 | { | ||
2133 | s32 timeout, inc, steps_max, srate, car_max; | ||
2134 | |||
2135 | srate = state->srate; | ||
2136 | car_max = state->search_range / 1000; | ||
2137 | car_max += car_max / 10; | ||
2138 | car_max = 65536 * (car_max / 2); | ||
2139 | car_max /= (state->mclk / 1000); | ||
2140 | |||
2141 | if (car_max > 0x4000) | ||
2142 | car_max = 0x4000 ; /* maxcarrier should be<= +-1/4 Mclk */ | ||
2143 | |||
2144 | inc = srate; | ||
2145 | inc /= state->mclk / 1000; | ||
2146 | inc *= 256; | ||
2147 | inc *= 256; | ||
2148 | inc /= 1000; | ||
2149 | |||
2150 | switch (state->search_mode) { | ||
2151 | case STV090x_SEARCH_DVBS1: | ||
2152 | case STV090x_SEARCH_DSS: | ||
2153 | inc *= 3; /* freq step = 3% of srate */ | ||
2154 | timeout = 20; | ||
2155 | break; | ||
2156 | |||
2157 | case STV090x_SEARCH_DVBS2: | ||
2158 | inc *= 4; | ||
2159 | timeout = 25; | ||
2160 | break; | ||
2161 | |||
2162 | case STV090x_SEARCH_AUTO: | ||
2163 | default: | ||
2164 | inc *= 3; | ||
2165 | timeout = 25; | ||
2166 | break; | ||
2167 | } | ||
2168 | inc /= 100; | ||
2169 | if ((inc > car_max) || (inc < 0)) | ||
2170 | inc = car_max / 2; /* increment <= 1/8 Mclk */ | ||
2171 | |||
2172 | timeout *= 27500; /* 27.5 Msps reference */ | ||
2173 | if (srate > 0) | ||
2174 | timeout /= (srate / 1000); | ||
2175 | |||
2176 | if ((timeout > 100) || (timeout < 0)) | ||
2177 | timeout = 100; | ||
2178 | |||
2179 | steps_max = (car_max / inc) + 1; /* min steps = 3 */ | ||
2180 | if ((steps_max > 100) || (steps_max < 0)) { | ||
2181 | steps_max = 100; /* max steps <= 100 */ | ||
2182 | inc = car_max / steps_max; | ||
2183 | } | ||
2184 | *freq_inc = inc; | ||
2185 | *timeout_sw = timeout; | ||
2186 | *steps = steps_max; | ||
2187 | |||
2188 | return 0; | ||
2189 | } | ||
2190 | |||
2191 | static int stv090x_chk_signal(struct stv090x_state *state) | ||
2192 | { | ||
2193 | s32 offst_car, agc2, car_max; | ||
2194 | int no_signal; | ||
2195 | |||
2196 | offst_car = STV090x_READ_DEMOD(state, CFR2) << 8; | ||
2197 | offst_car |= STV090x_READ_DEMOD(state, CFR1); | ||
2198 | offst_car = comp2(offst_car, 16); | ||
2199 | |||
2200 | agc2 = STV090x_READ_DEMOD(state, AGC2I1) << 8; | ||
2201 | agc2 |= STV090x_READ_DEMOD(state, AGC2I0); | ||
2202 | car_max = state->search_range / 1000; | ||
2203 | |||
2204 | car_max += (car_max / 10); /* 10% margin */ | ||
2205 | car_max = (65536 * car_max / 2); | ||
2206 | car_max /= state->mclk / 1000; | ||
2207 | |||
2208 | if (car_max > 0x4000) | ||
2209 | car_max = 0x4000; | ||
2210 | |||
2211 | if ((agc2 > 0x2000) || (offst_car > 2 * car_max) || (offst_car < -2 * car_max)) { | ||
2212 | no_signal = 1; | ||
2213 | dprintk(FE_DEBUG, 1, "No Signal"); | ||
2214 | } else { | ||
2215 | no_signal = 0; | ||
2216 | dprintk(FE_DEBUG, 1, "Found Signal"); | ||
2217 | } | ||
2218 | |||
2219 | return no_signal; | ||
2220 | } | ||
2221 | |||
2222 | static int stv090x_search_car_loop(struct stv090x_state *state, s32 inc, s32 timeout, int zigzag, s32 steps_max) | ||
2223 | { | ||
2224 | int no_signal, lock = 0; | ||
2225 | s32 cpt_step = 0, offst_freq, car_max; | ||
2226 | u32 reg; | ||
2227 | |||
2228 | car_max = state->search_range / 1000; | ||
2229 | car_max += (car_max / 10); | ||
2230 | car_max = (65536 * car_max / 2); | ||
2231 | car_max /= (state->mclk / 1000); | ||
2232 | if (car_max > 0x4000) | ||
2233 | car_max = 0x4000; | ||
2234 | |||
2235 | if (zigzag) | ||
2236 | offst_freq = 0; | ||
2237 | else | ||
2238 | offst_freq = -car_max + inc; | ||
2239 | |||
2240 | do { | ||
2241 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1c) < 0) | ||
2242 | goto err; | ||
2243 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, ((offst_freq / 256) & 0xff)) < 0) | ||
2244 | goto err; | ||
2245 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, offst_freq & 0xff) < 0) | ||
2246 | goto err; | ||
2247 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x18) < 0) | ||
2248 | goto err; | ||
2249 | |||
2250 | reg = STV090x_READ_DEMOD(state, PDELCTRL1); | ||
2251 | STV090x_SETFIELD_Px(reg, ALGOSWRST_FIELD, 0x1); /* stop DVB-S2 packet delin */ | ||
2252 | if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0) | ||
2253 | goto err; | ||
2254 | |||
2255 | if (zigzag) { | ||
2256 | if (offst_freq >= 0) | ||
2257 | offst_freq = -offst_freq - 2 * inc; | ||
2258 | else | ||
2259 | offst_freq = -offst_freq; | ||
2260 | } else { | ||
2261 | offst_freq += 2 * inc; | ||
2262 | } | ||
2263 | |||
2264 | cpt_step++; | ||
2265 | |||
2266 | lock = stv090x_get_dmdlock(state, timeout); | ||
2267 | no_signal = stv090x_chk_signal(state); | ||
2268 | |||
2269 | } while ((!lock) && | ||
2270 | (!no_signal) && | ||
2271 | ((offst_freq - inc) < car_max) && | ||
2272 | ((offst_freq + inc) > -car_max) && | ||
2273 | (cpt_step < steps_max)); | ||
2274 | |||
2275 | reg = STV090x_READ_DEMOD(state, PDELCTRL1); | ||
2276 | STV090x_SETFIELD_Px(reg, ALGOSWRST_FIELD, 0); | ||
2277 | if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0) | ||
2278 | goto err; | ||
2279 | |||
2280 | return lock; | ||
2281 | err: | ||
2282 | dprintk(FE_ERROR, 1, "I/O error"); | ||
2283 | return -1; | ||
2284 | } | ||
2285 | |||
2286 | static int stv090x_sw_algo(struct stv090x_state *state) | ||
2287 | { | ||
2288 | int no_signal, zigzag, lock = 0; | ||
2289 | u32 reg; | ||
2290 | |||
2291 | s32 dvbs2_fly_wheel; | ||
2292 | s32 inc, timeout_step, trials, steps_max; | ||
2293 | |||
2294 | /* get params */ | ||
2295 | stv090x_get_loop_params(state, &inc, &timeout_step, &steps_max); | ||
2296 | |||
2297 | switch (state->search_mode) { | ||
2298 | case STV090x_SEARCH_DVBS1: | ||
2299 | case STV090x_SEARCH_DSS: | ||
2300 | /* accelerate the frequency detector */ | ||
2301 | if (state->dev_ver >= 0x20) { | ||
2302 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3B) < 0) | ||
2303 | goto err; | ||
2304 | } | ||
2305 | |||
2306 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, 0x49) < 0) | ||
2307 | goto err; | ||
2308 | zigzag = 0; | ||
2309 | break; | ||
2310 | |||
2311 | case STV090x_SEARCH_DVBS2: | ||
2312 | if (state->dev_ver >= 0x20) { | ||
2313 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) | ||
2314 | goto err; | ||
2315 | } | ||
2316 | |||
2317 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, 0x89) < 0) | ||
2318 | goto err; | ||
2319 | zigzag = 1; | ||
2320 | break; | ||
2321 | |||
2322 | case STV090x_SEARCH_AUTO: | ||
2323 | default: | ||
2324 | /* accelerate the frequency detector */ | ||
2325 | if (state->dev_ver >= 0x20) { | ||
2326 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3b) < 0) | ||
2327 | goto err; | ||
2328 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) | ||
2329 | goto err; | ||
2330 | } | ||
2331 | |||
2332 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, 0xc9) < 0) | ||
2333 | goto err; | ||
2334 | zigzag = 0; | ||
2335 | break; | ||
2336 | } | ||
2337 | |||
2338 | trials = 0; | ||
2339 | do { | ||
2340 | lock = stv090x_search_car_loop(state, inc, timeout_step, zigzag, steps_max); | ||
2341 | no_signal = stv090x_chk_signal(state); | ||
2342 | trials++; | ||
2343 | |||
2344 | /*run the SW search 2 times maximum*/ | ||
2345 | if (lock || no_signal || (trials == 2)) { | ||
2346 | /*Check if the demod is not losing lock in DVBS2*/ | ||
2347 | if (state->dev_ver >= 0x20) { | ||
2348 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) | ||
2349 | goto err; | ||
2350 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) | ||
2351 | goto err; | ||
2352 | } | ||
2353 | |||
2354 | reg = STV090x_READ_DEMOD(state, DMDSTATE); | ||
2355 | if ((lock) && (STV090x_GETFIELD_Px(reg, HEADER_MODE_FIELD) == STV090x_DVBS2)) { | ||
2356 | /*Check if the demod is not losing lock in DVBS2*/ | ||
2357 | msleep(timeout_step); | ||
2358 | reg = STV090x_READ_DEMOD(state, DMDFLYW); | ||
2359 | dvbs2_fly_wheel = STV090x_GETFIELD_Px(reg, FLYWHEEL_CPT_FIELD); | ||
2360 | if (dvbs2_fly_wheel < 0xd) { /*if correct frames is decrementing */ | ||
2361 | msleep(timeout_step); | ||
2362 | reg = STV090x_READ_DEMOD(state, DMDFLYW); | ||
2363 | dvbs2_fly_wheel = STV090x_GETFIELD_Px(reg, FLYWHEEL_CPT_FIELD); | ||
2364 | } | ||
2365 | if (dvbs2_fly_wheel < 0xd) { | ||
2366 | /*FALSE lock, The demod is loosing lock */ | ||
2367 | lock = 0; | ||
2368 | if (trials < 2) { | ||
2369 | if (state->dev_ver >= 0x20) { | ||
2370 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) | ||
2371 | goto err; | ||
2372 | } | ||
2373 | |||
2374 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, 0x89) < 0) | ||
2375 | goto err; | ||
2376 | } | ||
2377 | } | ||
2378 | } | ||
2379 | } | ||
2380 | } while ((!lock) && (trials < 2) && (!no_signal)); | ||
2381 | |||
2382 | return lock; | ||
2383 | err: | ||
2384 | dprintk(FE_ERROR, 1, "I/O error"); | ||
2385 | return -1; | ||
2386 | } | ||
2387 | |||
2388 | static enum stv090x_delsys stv090x_get_std(struct stv090x_state *state) | ||
2389 | { | ||
2390 | u32 reg; | ||
2391 | enum stv090x_delsys delsys; | ||
2392 | |||
2393 | reg = STV090x_READ_DEMOD(state, DMDSTATE); | ||
2394 | if (STV090x_GETFIELD_Px(reg, HEADER_MODE_FIELD) == 2) | ||
2395 | delsys = STV090x_DVBS2; | ||
2396 | else if (STV090x_GETFIELD_Px(reg, HEADER_MODE_FIELD) == 3) { | ||
2397 | reg = STV090x_READ_DEMOD(state, FECM); | ||
2398 | if (STV090x_GETFIELD_Px(reg, DSS_DVB_FIELD) == 1) | ||
2399 | delsys = STV090x_DSS; | ||
2400 | else | ||
2401 | delsys = STV090x_DVBS1; | ||
2402 | } else { | ||
2403 | delsys = STV090x_ERROR; | ||
2404 | } | ||
2405 | |||
2406 | return delsys; | ||
2407 | } | ||
2408 | |||
2409 | /* in Hz */ | ||
2410 | static s32 stv090x_get_car_freq(struct stv090x_state *state, u32 mclk) | ||
2411 | { | ||
2412 | s32 derot, int_1, int_2, tmp_1, tmp_2; | ||
2413 | |||
2414 | derot = STV090x_READ_DEMOD(state, CFR2) << 16; | ||
2415 | derot |= STV090x_READ_DEMOD(state, CFR1) << 8; | ||
2416 | derot |= STV090x_READ_DEMOD(state, CFR0); | ||
2417 | |||
2418 | derot = comp2(derot, 24); | ||
2419 | int_1 = state->mclk >> 12; | ||
2420 | int_2 = derot >> 12; | ||
2421 | |||
2422 | /* carrier_frequency = MasterClock * Reg / 2^24 */ | ||
2423 | tmp_1 = state->mclk % 0x1000; | ||
2424 | tmp_2 = derot % 0x1000; | ||
2425 | |||
2426 | derot = (int_1 * int_2) + | ||
2427 | ((int_1 * tmp_2) >> 12) + | ||
2428 | ((int_1 * tmp_1) >> 12); | ||
2429 | |||
2430 | return derot; | ||
2431 | } | ||
2432 | |||
2433 | static int stv090x_get_viterbi(struct stv090x_state *state) | ||
2434 | { | ||
2435 | u32 reg, rate; | ||
2436 | |||
2437 | reg = STV090x_READ_DEMOD(state, VITCURPUN); | ||
2438 | rate = STV090x_GETFIELD_Px(reg, VIT_CURPUN_FIELD); | ||
2439 | |||
2440 | switch (rate) { | ||
2441 | case 13: | ||
2442 | state->fec = STV090x_PR12; | ||
2443 | break; | ||
2444 | |||
2445 | case 18: | ||
2446 | state->fec = STV090x_PR23; | ||
2447 | break; | ||
2448 | |||
2449 | case 21: | ||
2450 | state->fec = STV090x_PR34; | ||
2451 | break; | ||
2452 | |||
2453 | case 24: | ||
2454 | state->fec = STV090x_PR56; | ||
2455 | break; | ||
2456 | |||
2457 | case 25: | ||
2458 | state->fec = STV090x_PR67; | ||
2459 | break; | ||
2460 | |||
2461 | case 26: | ||
2462 | state->fec = STV090x_PR78; | ||
2463 | break; | ||
2464 | |||
2465 | default: | ||
2466 | state->fec = STV090x_PRERR; | ||
2467 | break; | ||
2468 | } | ||
2469 | |||
2470 | return 0; | ||
2471 | } | ||
2472 | |||
2473 | static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *state) | ||
2474 | { | ||
2475 | struct dvb_frontend *fe = &state->frontend; | ||
2476 | |||
2477 | u8 tmg; | ||
2478 | u32 reg; | ||
2479 | s32 i = 0, offst_freq; | ||
2480 | |||
2481 | msleep(5); | ||
2482 | |||
2483 | if (state->algo == STV090x_BLIND_SEARCH) { | ||
2484 | tmg = STV090x_READ_DEMOD(state, TMGREG2); | ||
2485 | STV090x_WRITE_DEMOD(state, SFRSTEP, 0x5c); | ||
2486 | while ((i <= 50) && (tmg != 0) && (tmg != 0xff)) { | ||
2487 | tmg = STV090x_READ_DEMOD(state, TMGREG2); | ||
2488 | msleep(5); | ||
2489 | i += 5; | ||
2490 | } | ||
2491 | } | ||
2492 | state->delsys = stv090x_get_std(state); | ||
2493 | |||
2494 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
2495 | goto err; | ||
2496 | |||
2497 | if (state->config->tuner_get_frequency) { | ||
2498 | if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) | ||
2499 | goto err; | ||
2500 | } | ||
2501 | |||
2502 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
2503 | goto err; | ||
2504 | |||
2505 | offst_freq = stv090x_get_car_freq(state, state->mclk) / 1000; | ||
2506 | state->frequency += offst_freq; | ||
2507 | |||
2508 | if (stv090x_get_viterbi(state) < 0) | ||
2509 | goto err; | ||
2510 | |||
2511 | reg = STV090x_READ_DEMOD(state, DMDMODCOD); | ||
2512 | state->modcod = STV090x_GETFIELD_Px(reg, DEMOD_MODCOD_FIELD); | ||
2513 | state->pilots = STV090x_GETFIELD_Px(reg, DEMOD_TYPE_FIELD) & 0x01; | ||
2514 | state->frame_len = STV090x_GETFIELD_Px(reg, DEMOD_TYPE_FIELD) >> 1; | ||
2515 | reg = STV090x_READ_DEMOD(state, TMGOBS); | ||
2516 | state->rolloff = STV090x_GETFIELD_Px(reg, ROLLOFF_STATUS_FIELD); | ||
2517 | reg = STV090x_READ_DEMOD(state, FECM); | ||
2518 | state->inversion = STV090x_GETFIELD_Px(reg, IQINV_FIELD); | ||
2519 | |||
2520 | if ((state->algo == STV090x_BLIND_SEARCH) || (state->srate < 10000000)) { | ||
2521 | |||
2522 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
2523 | goto err; | ||
2524 | |||
2525 | if (state->config->tuner_get_frequency) { | ||
2526 | if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) | ||
2527 | goto err; | ||
2528 | } | ||
2529 | |||
2530 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
2531 | goto err; | ||
2532 | |||
2533 | if (abs(offst_freq) <= ((state->search_range / 2000) + 500)) | ||
2534 | return STV090x_RANGEOK; | ||
2535 | else if (abs(offst_freq) <= (stv090x_car_width(state->srate, state->rolloff) / 2000)) | ||
2536 | return STV090x_RANGEOK; | ||
2537 | else | ||
2538 | return STV090x_OUTOFRANGE; /* Out of Range */ | ||
2539 | } else { | ||
2540 | if (abs(offst_freq) <= ((state->search_range / 2000) + 500)) | ||
2541 | return STV090x_RANGEOK; | ||
2542 | else | ||
2543 | return STV090x_OUTOFRANGE; | ||
2544 | } | ||
2545 | |||
2546 | return STV090x_OUTOFRANGE; | ||
2547 | err: | ||
2548 | dprintk(FE_ERROR, 1, "I/O error"); | ||
2549 | return -1; | ||
2550 | } | ||
2551 | |||
2552 | static u32 stv090x_get_tmgoffst(struct stv090x_state *state, u32 srate) | ||
2553 | { | ||
2554 | s32 offst_tmg; | ||
2555 | |||
2556 | offst_tmg = STV090x_READ_DEMOD(state, TMGREG2) << 16; | ||
2557 | offst_tmg |= STV090x_READ_DEMOD(state, TMGREG1) << 8; | ||
2558 | offst_tmg |= STV090x_READ_DEMOD(state, TMGREG0); | ||
2559 | |||
2560 | offst_tmg = comp2(offst_tmg, 24); /* 2's complement */ | ||
2561 | if (!offst_tmg) | ||
2562 | offst_tmg = 1; | ||
2563 | |||
2564 | offst_tmg = ((s32) srate * 10) / ((s32) 0x1000000 / offst_tmg); | ||
2565 | offst_tmg /= 320; | ||
2566 | |||
2567 | return offst_tmg; | ||
2568 | } | ||
2569 | |||
2570 | static u8 stv090x_optimize_carloop(struct stv090x_state *state, enum stv090x_modcod modcod, s32 pilots) | ||
2571 | { | ||
2572 | u8 aclc = 0x29; | ||
2573 | s32 i; | ||
2574 | struct stv090x_long_frame_crloop *car_loop, *car_loop_qpsk_low, *car_loop_apsk_low; | ||
2575 | |||
2576 | if (state->dev_ver == 0x20) { | ||
2577 | car_loop = stv090x_s2_crl_cut20; | ||
2578 | car_loop_qpsk_low = stv090x_s2_lowqpsk_crl_cut20; | ||
2579 | car_loop_apsk_low = stv090x_s2_apsk_crl_cut20; | ||
2580 | } else { | ||
2581 | /* >= Cut 3 */ | ||
2582 | car_loop = stv090x_s2_crl_cut30; | ||
2583 | car_loop_qpsk_low = stv090x_s2_lowqpsk_crl_cut30; | ||
2584 | car_loop_apsk_low = stv090x_s2_apsk_crl_cut30; | ||
2585 | } | ||
2586 | |||
2587 | if (modcod < STV090x_QPSK_12) { | ||
2588 | i = 0; | ||
2589 | while ((i < 3) && (modcod != car_loop_qpsk_low[i].modcod)) | ||
2590 | i++; | ||
2591 | |||
2592 | if (i >= 3) | ||
2593 | i = 2; | ||
2594 | |||
2595 | } else { | ||
2596 | i = 0; | ||
2597 | while ((i < 14) && (modcod != car_loop[i].modcod)) | ||
2598 | i++; | ||
2599 | |||
2600 | if (i >= 14) { | ||
2601 | i = 0; | ||
2602 | while ((i < 11) && (modcod != car_loop_apsk_low[i].modcod)) | ||
2603 | i++; | ||
2604 | |||
2605 | if (i >= 11) | ||
2606 | i = 10; | ||
2607 | } | ||
2608 | } | ||
2609 | |||
2610 | if (modcod <= STV090x_QPSK_25) { | ||
2611 | if (pilots) { | ||
2612 | if (state->srate <= 3000000) | ||
2613 | aclc = car_loop_qpsk_low[i].crl_pilots_on_2; | ||
2614 | else if (state->srate <= 7000000) | ||
2615 | aclc = car_loop_qpsk_low[i].crl_pilots_on_5; | ||
2616 | else if (state->srate <= 15000000) | ||
2617 | aclc = car_loop_qpsk_low[i].crl_pilots_on_10; | ||
2618 | else if (state->srate <= 25000000) | ||
2619 | aclc = car_loop_qpsk_low[i].crl_pilots_on_20; | ||
2620 | else | ||
2621 | aclc = car_loop_qpsk_low[i].crl_pilots_on_30; | ||
2622 | } else { | ||
2623 | if (state->srate <= 3000000) | ||
2624 | aclc = car_loop_qpsk_low[i].crl_pilots_off_2; | ||
2625 | else if (state->srate <= 7000000) | ||
2626 | aclc = car_loop_qpsk_low[i].crl_pilots_off_5; | ||
2627 | else if (state->srate <= 15000000) | ||
2628 | aclc = car_loop_qpsk_low[i].crl_pilots_off_10; | ||
2629 | else if (state->srate <= 25000000) | ||
2630 | aclc = car_loop_qpsk_low[i].crl_pilots_off_20; | ||
2631 | else | ||
2632 | aclc = car_loop_qpsk_low[i].crl_pilots_off_30; | ||
2633 | } | ||
2634 | |||
2635 | } else if (modcod <= STV090x_8PSK_910) { | ||
2636 | if (pilots) { | ||
2637 | if (state->srate <= 3000000) | ||
2638 | aclc = car_loop[i].crl_pilots_on_2; | ||
2639 | else if (state->srate <= 7000000) | ||
2640 | aclc = car_loop[i].crl_pilots_on_5; | ||
2641 | else if (state->srate <= 15000000) | ||
2642 | aclc = car_loop[i].crl_pilots_on_10; | ||
2643 | else if (state->srate <= 25000000) | ||
2644 | aclc = car_loop[i].crl_pilots_on_20; | ||
2645 | else | ||
2646 | aclc = car_loop[i].crl_pilots_on_30; | ||
2647 | } else { | ||
2648 | if (state->srate <= 3000000) | ||
2649 | aclc = car_loop[i].crl_pilots_off_2; | ||
2650 | else if (state->srate <= 7000000) | ||
2651 | aclc = car_loop[i].crl_pilots_off_5; | ||
2652 | else if (state->srate <= 15000000) | ||
2653 | aclc = car_loop[i].crl_pilots_off_10; | ||
2654 | else if (state->srate <= 25000000) | ||
2655 | aclc = car_loop[i].crl_pilots_off_20; | ||
2656 | else | ||
2657 | aclc = car_loop[i].crl_pilots_off_30; | ||
2658 | } | ||
2659 | } else { /* 16APSK and 32APSK */ | ||
2660 | if (state->srate <= 3000000) | ||
2661 | aclc = car_loop_apsk_low[i].crl_pilots_on_2; | ||
2662 | else if (state->srate <= 7000000) | ||
2663 | aclc = car_loop_apsk_low[i].crl_pilots_on_5; | ||
2664 | else if (state->srate <= 15000000) | ||
2665 | aclc = car_loop_apsk_low[i].crl_pilots_on_10; | ||
2666 | else if (state->srate <= 25000000) | ||
2667 | aclc = car_loop_apsk_low[i].crl_pilots_on_20; | ||
2668 | else | ||
2669 | aclc = car_loop_apsk_low[i].crl_pilots_on_30; | ||
2670 | } | ||
2671 | |||
2672 | return aclc; | ||
2673 | } | ||
2674 | |||
2675 | static u8 stv090x_optimize_carloop_short(struct stv090x_state *state) | ||
2676 | { | ||
2677 | struct stv090x_short_frame_crloop *short_crl; | ||
2678 | s32 index = 0; | ||
2679 | u8 aclc = 0x0b; | ||
2680 | |||
2681 | switch (state->modulation) { | ||
2682 | case STV090x_QPSK: | ||
2683 | default: | ||
2684 | index = 0; | ||
2685 | break; | ||
2686 | case STV090x_8PSK: | ||
2687 | index = 1; | ||
2688 | break; | ||
2689 | case STV090x_16APSK: | ||
2690 | index = 2; | ||
2691 | break; | ||
2692 | case STV090x_32APSK: | ||
2693 | index = 3; | ||
2694 | break; | ||
2695 | } | ||
2696 | |||
2697 | if (state->dev_ver >= 0x30) | ||
2698 | short_crl = stv090x_s2_short_crl_cut20; | ||
2699 | else if (state->dev_ver >= 0x20) | ||
2700 | short_crl = stv090x_s2_short_crl_cut30; | ||
2701 | |||
2702 | if (state->srate <= 3000000) | ||
2703 | aclc = short_crl[index].crl_2; | ||
2704 | else if (state->srate <= 7000000) | ||
2705 | aclc = short_crl[index].crl_5; | ||
2706 | else if (state->srate <= 15000000) | ||
2707 | aclc = short_crl[index].crl_10; | ||
2708 | else if (state->srate <= 25000000) | ||
2709 | aclc = short_crl[index].crl_20; | ||
2710 | else | ||
2711 | aclc = short_crl[index].crl_30; | ||
2712 | |||
2713 | return aclc; | ||
2714 | } | ||
2715 | |||
2716 | static int stv090x_optimize_track(struct stv090x_state *state) | ||
2717 | { | ||
2718 | struct dvb_frontend *fe = &state->frontend; | ||
2719 | |||
2720 | enum stv090x_rolloff rolloff; | ||
2721 | enum stv090x_modcod modcod; | ||
2722 | |||
2723 | s32 srate, pilots, aclc, f_1, f_0, i = 0, blind_tune = 0; | ||
2724 | u32 reg; | ||
2725 | |||
2726 | srate = stv090x_get_srate(state, state->mclk); | ||
2727 | srate += stv090x_get_tmgoffst(state, srate); | ||
2728 | |||
2729 | switch (state->delsys) { | ||
2730 | case STV090x_DVBS1: | ||
2731 | case STV090x_DSS: | ||
2732 | if (state->algo == STV090x_SEARCH_AUTO) { | ||
2733 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
2734 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | ||
2735 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); | ||
2736 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
2737 | goto err; | ||
2738 | } | ||
2739 | reg = STV090x_READ_DEMOD(state, DEMOD); | ||
2740 | STV090x_SETFIELD_Px(reg, ROLLOFF_CONTROL_FIELD, state->rolloff); | ||
2741 | STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 0x01); | ||
2742 | if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) | ||
2743 | goto err; | ||
2744 | |||
2745 | if (state->dev_ver >= 0x30) { | ||
2746 | if (stv090x_get_viterbi(state) < 0) | ||
2747 | goto err; | ||
2748 | |||
2749 | if (state->fec == STV090x_PR12) { | ||
2750 | if (STV090x_WRITE_DEMOD(state, GAUSSR0, 0x98) < 0) | ||
2751 | goto err; | ||
2752 | if (STV090x_WRITE_DEMOD(state, CCIR0, 0x18) < 0) | ||
2753 | goto err; | ||
2754 | } else { | ||
2755 | if (STV090x_WRITE_DEMOD(state, GAUSSR0, 0x18) < 0) | ||
2756 | goto err; | ||
2757 | if (STV090x_WRITE_DEMOD(state, CCIR0, 0x18) < 0) | ||
2758 | goto err; | ||
2759 | } | ||
2760 | } | ||
2761 | |||
2762 | if (STV090x_WRITE_DEMOD(state, ERRCTRL1, 0x75) < 0) | ||
2763 | goto err; | ||
2764 | break; | ||
2765 | |||
2766 | case STV090x_DVBS2: | ||
2767 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
2768 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 0); | ||
2769 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); | ||
2770 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
2771 | goto err; | ||
2772 | if (STV090x_WRITE_DEMOD(state, ACLC, 0) < 0) | ||
2773 | goto err; | ||
2774 | if (STV090x_WRITE_DEMOD(state, BCLC, 0) < 0) | ||
2775 | goto err; | ||
2776 | if (state->frame_len == STV090x_LONG_FRAME) { | ||
2777 | reg = STV090x_READ_DEMOD(state, DMDMODCOD); | ||
2778 | modcod = STV090x_GETFIELD_Px(reg, DEMOD_MODCOD_FIELD); | ||
2779 | pilots = STV090x_GETFIELD_Px(reg, DEMOD_TYPE_FIELD) & 0x01; | ||
2780 | aclc = stv090x_optimize_carloop(state, modcod, pilots); | ||
2781 | if (modcod <= STV090x_QPSK_910) { | ||
2782 | STV090x_WRITE_DEMOD(state, ACLC2S2Q, aclc); | ||
2783 | } else if (modcod <= STV090x_8PSK_910) { | ||
2784 | if (STV090x_WRITE_DEMOD(state, ACLC2S2Q, 0x2a) < 0) | ||
2785 | goto err; | ||
2786 | if (STV090x_WRITE_DEMOD(state, ACLC2S28, aclc) < 0) | ||
2787 | goto err; | ||
2788 | } | ||
2789 | if ((state->demod_mode == STV090x_SINGLE) && (modcod > STV090x_8PSK_910)) { | ||
2790 | if (modcod <= STV090x_16APSK_910) { | ||
2791 | if (STV090x_WRITE_DEMOD(state, ACLC2S2Q, 0x2a) < 0) | ||
2792 | goto err; | ||
2793 | if (STV090x_WRITE_DEMOD(state, ACLC2S216A, aclc) < 0) | ||
2794 | goto err; | ||
2795 | } else { | ||
2796 | if (STV090x_WRITE_DEMOD(state, ACLC2S2Q, 0x2a) < 0) | ||
2797 | goto err; | ||
2798 | if (STV090x_WRITE_DEMOD(state, ACLC2S232A, aclc) < 0) | ||
2799 | goto err; | ||
2800 | } | ||
2801 | } | ||
2802 | } else { | ||
2803 | /*Carrier loop setting for short frame*/ | ||
2804 | aclc = stv090x_optimize_carloop_short(state); | ||
2805 | if (state->modulation == STV090x_QPSK) { | ||
2806 | if (STV090x_WRITE_DEMOD(state, ACLC2S2Q, aclc) < 0) | ||
2807 | goto err; | ||
2808 | } else if (state->modulation == STV090x_8PSK) { | ||
2809 | if (STV090x_WRITE_DEMOD(state, ACLC2S2Q, 0x2a) < 0) | ||
2810 | goto err; | ||
2811 | if (STV090x_WRITE_DEMOD(state, ACLC2S28, aclc) < 0) | ||
2812 | goto err; | ||
2813 | } else if (state->modulation == STV090x_16APSK) { | ||
2814 | if (STV090x_WRITE_DEMOD(state, ACLC2S2Q, 0x2a) < 0) | ||
2815 | goto err; | ||
2816 | if (STV090x_WRITE_DEMOD(state, ACLC2S216A, aclc) < 0) | ||
2817 | goto err; | ||
2818 | } else if (state->modulation == STV090x_32APSK) { | ||
2819 | if (STV090x_WRITE_DEMOD(state, ACLC2S2Q, 0x2a) < 0) | ||
2820 | goto err; | ||
2821 | if (STV090x_WRITE_DEMOD(state, ACLC2S232A, aclc) < 0) | ||
2822 | goto err; | ||
2823 | } | ||
2824 | } | ||
2825 | |||
2826 | STV090x_WRITE_DEMOD(state, ERRCTRL1, 0x67); /* PER */ | ||
2827 | break; | ||
2828 | |||
2829 | case STV090x_UNKNOWN: | ||
2830 | default: | ||
2831 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
2832 | STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); | ||
2833 | STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); | ||
2834 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
2835 | goto err; | ||
2836 | break; | ||
2837 | } | ||
2838 | |||
2839 | f_1 = STV090x_READ_DEMOD(state, CFR2); | ||
2840 | f_0 = STV090x_READ_DEMOD(state, CFR1); | ||
2841 | reg = STV090x_READ_DEMOD(state, TMGOBS); | ||
2842 | rolloff = STV090x_GETFIELD_Px(reg, ROLLOFF_STATUS_FIELD); | ||
2843 | |||
2844 | if (state->algo == STV090x_BLIND_SEARCH) { | ||
2845 | STV090x_WRITE_DEMOD(state, SFRSTEP, 0x00); | ||
2846 | reg = STV090x_READ_DEMOD(state, DMDCFGMD); | ||
2847 | STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 0x00); | ||
2848 | STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0x00); | ||
2849 | if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) | ||
2850 | goto err; | ||
2851 | if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0xc1) < 0) | ||
2852 | goto err; | ||
2853 | |||
2854 | if (stv090x_set_srate(state, srate) < 0) | ||
2855 | goto err; | ||
2856 | blind_tune = 1; | ||
2857 | } | ||
2858 | |||
2859 | if (state->dev_ver >= 0x20) { | ||
2860 | if ((state->search_mode == STV090x_SEARCH_DVBS1) || | ||
2861 | (state->search_mode == STV090x_SEARCH_DSS) || | ||
2862 | (state->search_mode == STV090x_SEARCH_AUTO)) { | ||
2863 | |||
2864 | if (STV090x_WRITE_DEMOD(state, VAVSRVIT, 0x0a) < 0) | ||
2865 | goto err; | ||
2866 | if (STV090x_WRITE_DEMOD(state, VITSCALE, 0x00) < 0) | ||
2867 | goto err; | ||
2868 | } | ||
2869 | } | ||
2870 | |||
2871 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) | ||
2872 | goto err; | ||
2873 | |||
2874 | /* AUTO tracking MODE */ | ||
2875 | if (STV090x_WRITE_DEMOD(state, SFRUP1, 0x80) < 0) | ||
2876 | goto err; | ||
2877 | /* AUTO tracking MODE */ | ||
2878 | if (STV090x_WRITE_DEMOD(state, SFRLOW1, 0x80) < 0) | ||
2879 | goto err; | ||
2880 | |||
2881 | if ((state->dev_ver >= 0x20) || (blind_tune == 1) || (state->srate < 10000000)) { | ||
2882 | /* update initial carrier freq with the found freq offset */ | ||
2883 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, f_1) < 0) | ||
2884 | goto err; | ||
2885 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, f_0) < 0) | ||
2886 | goto err; | ||
2887 | state->tuner_bw = stv090x_car_width(srate, state->rolloff) + 10000000; | ||
2888 | |||
2889 | if ((state->dev_ver >= 0x20) || (blind_tune == 1)) { | ||
2890 | |||
2891 | if (state->algo != STV090x_WARM_SEARCH) { | ||
2892 | |||
2893 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
2894 | goto err; | ||
2895 | |||
2896 | if (state->config->tuner_set_bandwidth) { | ||
2897 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | ||
2898 | goto err; | ||
2899 | } | ||
2900 | |||
2901 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
2902 | goto err; | ||
2903 | |||
2904 | } | ||
2905 | } | ||
2906 | if ((state->algo == STV090x_BLIND_SEARCH) || (state->srate < 10000000)) | ||
2907 | msleep(50); /* blind search: wait 50ms for SR stabilization */ | ||
2908 | else | ||
2909 | msleep(5); | ||
2910 | |||
2911 | stv090x_get_lock_tmg(state); | ||
2912 | |||
2913 | if (!(stv090x_get_dmdlock(state, (state->DemodTimeout / 2)))) { | ||
2914 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) | ||
2915 | goto err; | ||
2916 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, f_1) < 0) | ||
2917 | goto err; | ||
2918 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, f_0) < 0) | ||
2919 | goto err; | ||
2920 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x18) < 0) | ||
2921 | goto err; | ||
2922 | |||
2923 | i = 0; | ||
2924 | |||
2925 | while ((!(stv090x_get_dmdlock(state, (state->DemodTimeout / 2)))) && (i <= 2)) { | ||
2926 | |||
2927 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) | ||
2928 | goto err; | ||
2929 | if (STV090x_WRITE_DEMOD(state, CFRINIT1, f_1) < 0) | ||
2930 | goto err; | ||
2931 | if (STV090x_WRITE_DEMOD(state, CFRINIT0, f_0) < 0) | ||
2932 | goto err; | ||
2933 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x18) < 0) | ||
2934 | goto err; | ||
2935 | i++; | ||
2936 | } | ||
2937 | } | ||
2938 | |||
2939 | } | ||
2940 | |||
2941 | if (state->dev_ver >= 0x20) { | ||
2942 | if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) | ||
2943 | goto err; | ||
2944 | } | ||
2945 | |||
2946 | if ((state->delsys == STV090x_DVBS1) || (state->delsys == STV090x_DSS)) | ||
2947 | stv090x_set_vit_thtracq(state); | ||
2948 | |||
2949 | return 0; | ||
2950 | err: | ||
2951 | dprintk(FE_ERROR, 1, "I/O error"); | ||
2952 | return -1; | ||
2953 | } | ||
2954 | |||
2955 | static int stv090x_get_feclock(struct stv090x_state *state, s32 timeout) | ||
2956 | { | ||
2957 | s32 timer = 0, lock = 0, stat; | ||
2958 | u32 reg; | ||
2959 | |||
2960 | while ((timer < timeout) && (!lock)) { | ||
2961 | reg = STV090x_READ_DEMOD(state, DMDSTATE); | ||
2962 | stat = STV090x_GETFIELD_Px(reg, HEADER_MODE_FIELD); | ||
2963 | |||
2964 | switch (stat) { | ||
2965 | case 0: /* searching */ | ||
2966 | case 1: /* first PLH detected */ | ||
2967 | default: | ||
2968 | lock = 0; | ||
2969 | break; | ||
2970 | |||
2971 | case 2: /* DVB-S2 mode */ | ||
2972 | reg = STV090x_READ_DEMOD(state, PDELSTATUS1); | ||
2973 | lock = STV090x_GETFIELD_Px(reg, PKTDELIN_LOCK_FIELD); | ||
2974 | break; | ||
2975 | |||
2976 | case 3: /* DVB-S1/legacy mode */ | ||
2977 | reg = STV090x_READ_DEMOD(state, VSTATUSVIT); | ||
2978 | lock = STV090x_GETFIELD_Px(reg, LOCKEDVIT_FIELD); | ||
2979 | break; | ||
2980 | } | ||
2981 | if (!lock) { | ||
2982 | msleep(10); | ||
2983 | timer += 10; | ||
2984 | } | ||
2985 | } | ||
2986 | return lock; | ||
2987 | } | ||
2988 | |||
2989 | static int stv090x_get_lock(struct stv090x_state *state, s32 timeout_dmd, s32 timeout_fec) | ||
2990 | { | ||
2991 | u32 reg; | ||
2992 | s32 timer = 0; | ||
2993 | int lock; | ||
2994 | |||
2995 | lock = stv090x_get_dmdlock(state, timeout_dmd); | ||
2996 | if (lock) | ||
2997 | lock = stv090x_get_feclock(state, timeout_fec); | ||
2998 | |||
2999 | if (lock) { | ||
3000 | lock = 0; | ||
3001 | |||
3002 | while ((timer < timeout_fec) && (!lock)) { | ||
3003 | reg = STV090x_READ_DEMOD(state, TSSTATUS); | ||
3004 | lock = STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD); | ||
3005 | msleep(1); | ||
3006 | timer++; | ||
3007 | } | ||
3008 | } | ||
3009 | |||
3010 | return lock; | ||
3011 | } | ||
3012 | |||
3013 | static int stv090x_set_s2rolloff(struct stv090x_state *state) | ||
3014 | { | ||
3015 | u32 reg; | ||
3016 | |||
3017 | if (state->dev_ver <= 0x20) { | ||
3018 | /* rolloff to auto mode if DVBS2 */ | ||
3019 | reg = STV090x_READ_DEMOD(state, DEMOD); | ||
3020 | STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 0x00); | ||
3021 | if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) | ||
3022 | goto err; | ||
3023 | } else { | ||
3024 | /* DVB-S2 rolloff to auto mode if DVBS2 */ | ||
3025 | reg = STV090x_READ_DEMOD(state, DEMOD); | ||
3026 | STV090x_SETFIELD_Px(reg, MANUAL_S2ROLLOFF_FIELD, 0x00); | ||
3027 | if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) | ||
3028 | goto err; | ||
3029 | } | ||
3030 | return 0; | ||
3031 | err: | ||
3032 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3033 | return -1; | ||
3034 | } | ||
3035 | |||
3036 | |||
3037 | static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state) | ||
3038 | { | ||
3039 | struct dvb_frontend *fe = &state->frontend; | ||
3040 | enum stv090x_signal_state signal_state = STV090x_NOCARRIER; | ||
3041 | u32 reg; | ||
3042 | s32 timeout_dmd = 500, timeout_fec = 50, agc1_power, power_iq = 0, i; | ||
3043 | int lock = 0, low_sr = 0, no_signal = 0; | ||
3044 | |||
3045 | reg = STV090x_READ_DEMOD(state, TSCFGH); | ||
3046 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 1); /* Stop path 1 stream merger */ | ||
3047 | if (STV090x_WRITE_DEMOD(state, TSCFGH, reg) < 0) | ||
3048 | goto err; | ||
3049 | |||
3050 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod stop */ | ||
3051 | goto err; | ||
3052 | |||
3053 | if (state->dev_ver >= 0x20) { | ||
3054 | if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) /* cut 2.0 */ | ||
3055 | goto err; | ||
3056 | } | ||
3057 | |||
3058 | stv090x_get_lock_tmg(state); | ||
3059 | |||
3060 | if (state->algo == STV090x_BLIND_SEARCH) { | ||
3061 | state->tuner_bw = 2 * 36000000; /* wide bw for unknown srate */ | ||
3062 | if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0xc0) < 0) /* wider srate scan */ | ||
3063 | goto err; | ||
3064 | if (STV090x_WRITE_DEMOD(state, CORRELMANT, 0x70) < 0) | ||
3065 | goto err; | ||
3066 | if (stv090x_set_srate(state, 1000000) < 0) /* inital srate = 1Msps */ | ||
3067 | goto err; | ||
3068 | } else { | ||
3069 | /* known srate */ | ||
3070 | if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x20) < 0) | ||
3071 | goto err; | ||
3072 | if (STV090x_WRITE_DEMOD(state, TMGCFG, 0xd2) < 0) | ||
3073 | goto err; | ||
3074 | |||
3075 | if (state->srate < 2000000) { | ||
3076 | /* SR < 2MSPS */ | ||
3077 | if (STV090x_WRITE_DEMOD(state, CORRELMANT, 0x63) < 0) | ||
3078 | goto err; | ||
3079 | } else { | ||
3080 | /* SR >= 2Msps */ | ||
3081 | if (STV090x_WRITE_DEMOD(state, CORRELMANT, 0x70) < 0) | ||
3082 | goto err; | ||
3083 | } | ||
3084 | |||
3085 | if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) | ||
3086 | goto err; | ||
3087 | |||
3088 | if (state->dev_ver >= 0x20) { | ||
3089 | if (STV090x_WRITE_DEMOD(state, KREFTMG, 0x5a) < 0) | ||
3090 | goto err; | ||
3091 | if (state->algo == STV090x_COLD_SEARCH) | ||
3092 | state->tuner_bw = (15 * (stv090x_car_width(state->srate, state->rolloff) + 10000000)) / 10; | ||
3093 | else if (state->algo == STV090x_WARM_SEARCH) | ||
3094 | state->tuner_bw = stv090x_car_width(state->srate, state->rolloff) + 10000000; | ||
3095 | } | ||
3096 | |||
3097 | /* if cold start or warm (Symbolrate is known) | ||
3098 | * use a Narrow symbol rate scan range | ||
3099 | */ | ||
3100 | if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0xc1) < 0) /* narrow srate scan */ | ||
3101 | goto err; | ||
3102 | |||
3103 | if (stv090x_set_srate(state, state->srate) < 0) | ||
3104 | goto err; | ||
3105 | |||
3106 | if (stv090x_set_max_srate(state, state->mclk, state->srate) < 0) | ||
3107 | goto err; | ||
3108 | if (stv090x_set_min_srate(state, state->mclk, state->srate) < 0) | ||
3109 | goto err; | ||
3110 | |||
3111 | if (state->srate >= 10000000) | ||
3112 | low_sr = 0; | ||
3113 | else | ||
3114 | low_sr = 1; | ||
3115 | } | ||
3116 | |||
3117 | /* Setup tuner */ | ||
3118 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
3119 | goto err; | ||
3120 | |||
3121 | if (state->config->tuner_set_bbgain) { | ||
3122 | if (state->config->tuner_set_bbgain(fe, 10) < 0) /* 10dB */ | ||
3123 | goto err; | ||
3124 | } | ||
3125 | |||
3126 | if (state->config->tuner_set_frequency) { | ||
3127 | if (state->config->tuner_set_frequency(fe, state->frequency) < 0) | ||
3128 | goto err; | ||
3129 | } | ||
3130 | |||
3131 | if (state->config->tuner_set_bandwidth) { | ||
3132 | if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) | ||
3133 | goto err; | ||
3134 | } | ||
3135 | |||
3136 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
3137 | goto err; | ||
3138 | |||
3139 | msleep(50); | ||
3140 | |||
3141 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
3142 | goto err; | ||
3143 | |||
3144 | if (state->config->tuner_get_status) { | ||
3145 | if (state->config->tuner_get_status(fe, ®) < 0) | ||
3146 | goto err; | ||
3147 | } | ||
3148 | |||
3149 | if (reg) | ||
3150 | dprintk(FE_DEBUG, 1, "Tuner phase locked"); | ||
3151 | else | ||
3152 | dprintk(FE_DEBUG, 1, "Tuner unlocked"); | ||
3153 | |||
3154 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
3155 | goto err; | ||
3156 | |||
3157 | msleep(10); | ||
3158 | agc1_power = MAKEWORD16(STV090x_READ_DEMOD(state, AGCIQIN1), | ||
3159 | STV090x_READ_DEMOD(state, AGCIQIN0)); | ||
3160 | |||
3161 | if (agc1_power == 0) { | ||
3162 | /* If AGC1 integrator value is 0 | ||
3163 | * then read POWERI, POWERQ | ||
3164 | */ | ||
3165 | for (i = 0; i < 5; i++) { | ||
3166 | power_iq += (STV090x_READ_DEMOD(state, POWERI) + | ||
3167 | STV090x_READ_DEMOD(state, POWERQ)) >> 1; | ||
3168 | } | ||
3169 | power_iq /= 5; | ||
3170 | } | ||
3171 | |||
3172 | if ((agc1_power == 0) && (power_iq < STV090x_IQPOWER_THRESHOLD)) { | ||
3173 | dprintk(FE_ERROR, 1, "No Signal: POWER_IQ=0x%02x", power_iq); | ||
3174 | lock = 0; | ||
3175 | |||
3176 | } else { | ||
3177 | reg = STV090x_READ_DEMOD(state, DEMOD); | ||
3178 | STV090x_SETFIELD_Px(reg, SPECINV_CONTROL_FIELD, state->inversion); | ||
3179 | |||
3180 | if (state->dev_ver <= 0x20) { | ||
3181 | /* rolloff to auto mode if DVBS2 */ | ||
3182 | STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 1); | ||
3183 | } else { | ||
3184 | /* DVB-S2 rolloff to auto mode if DVBS2 */ | ||
3185 | STV090x_SETFIELD_Px(reg, MANUAL_S2ROLLOFF_FIELD, 1); | ||
3186 | } | ||
3187 | if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) | ||
3188 | goto err; | ||
3189 | |||
3190 | if (stv090x_delivery_search(state) < 0) | ||
3191 | goto err; | ||
3192 | |||
3193 | if (state->algo != STV090x_BLIND_SEARCH) { | ||
3194 | if (stv090x_start_search(state) < 0) | ||
3195 | goto err; | ||
3196 | } | ||
3197 | } | ||
3198 | |||
3199 | /* need to check for AGC1 state */ | ||
3200 | |||
3201 | |||
3202 | |||
3203 | if (state->algo == STV090x_BLIND_SEARCH) | ||
3204 | lock = stv090x_blind_search(state); | ||
3205 | |||
3206 | else if (state->algo == STV090x_COLD_SEARCH) | ||
3207 | lock = stv090x_get_coldlock(state, timeout_dmd); | ||
3208 | |||
3209 | else if (state->algo == STV090x_WARM_SEARCH) | ||
3210 | lock = stv090x_get_dmdlock(state, timeout_dmd); | ||
3211 | |||
3212 | if ((!lock) && (state->algo == STV090x_COLD_SEARCH)) { | ||
3213 | if (!low_sr) { | ||
3214 | if (stv090x_chk_tmg(state)) | ||
3215 | lock = stv090x_sw_algo(state); | ||
3216 | } | ||
3217 | } | ||
3218 | |||
3219 | if (lock) | ||
3220 | signal_state = stv090x_get_sig_params(state); | ||
3221 | |||
3222 | if ((lock) && (signal_state == STV090x_RANGEOK)) { /* signal within Range */ | ||
3223 | stv090x_optimize_track(state); | ||
3224 | |||
3225 | if (state->dev_ver >= 0x20) { | ||
3226 | /* >= Cut 2.0 :release TS reset after | ||
3227 | * demod lock and optimized Tracking | ||
3228 | */ | ||
3229 | reg = STV090x_READ_DEMOD(state, TSCFGH); | ||
3230 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0); /* release merger reset */ | ||
3231 | if (STV090x_WRITE_DEMOD(state, TSCFGH, reg) < 0) | ||
3232 | goto err; | ||
3233 | |||
3234 | msleep(3); | ||
3235 | |||
3236 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 1); /* merger reset */ | ||
3237 | if (STV090x_WRITE_DEMOD(state, TSCFGH, reg) < 0) | ||
3238 | goto err; | ||
3239 | |||
3240 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0); /* release merger reset */ | ||
3241 | if (STV090x_WRITE_DEMOD(state, TSCFGH, reg) < 0) | ||
3242 | goto err; | ||
3243 | } | ||
3244 | |||
3245 | if (stv090x_get_lock(state, timeout_fec, timeout_fec)) { | ||
3246 | lock = 1; | ||
3247 | if (state->delsys == STV090x_DVBS2) { | ||
3248 | stv090x_set_s2rolloff(state); | ||
3249 | |||
3250 | reg = STV090x_READ_DEMOD(state, PDELCTRL2); | ||
3251 | STV090x_SETFIELD_Px(reg, RESET_UPKO_COUNT, 1); | ||
3252 | if (STV090x_WRITE_DEMOD(state, PDELCTRL2, reg) < 0) | ||
3253 | goto err; | ||
3254 | /* Reset DVBS2 packet delinator error counter */ | ||
3255 | reg = STV090x_READ_DEMOD(state, PDELCTRL2); | ||
3256 | STV090x_SETFIELD_Px(reg, RESET_UPKO_COUNT, 0); | ||
3257 | if (STV090x_WRITE_DEMOD(state, PDELCTRL2, reg) < 0) | ||
3258 | goto err; | ||
3259 | |||
3260 | if (STV090x_WRITE_DEMOD(state, ERRCTRL1, 0x67) < 0) /* PER */ | ||
3261 | goto err; | ||
3262 | } else { | ||
3263 | if (STV090x_WRITE_DEMOD(state, ERRCTRL1, 0x75) < 0) | ||
3264 | goto err; | ||
3265 | } | ||
3266 | /* Reset the Total packet counter */ | ||
3267 | if (STV090x_WRITE_DEMOD(state, FBERCPT4, 0x00) < 0) | ||
3268 | goto err; | ||
3269 | /* Reset the packet Error counter2 */ | ||
3270 | if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0) | ||
3271 | goto err; | ||
3272 | } else { | ||
3273 | lock = 0; | ||
3274 | signal_state = STV090x_NODATA; | ||
3275 | no_signal = stv090x_chk_signal(state); | ||
3276 | } | ||
3277 | } | ||
3278 | return signal_state; | ||
3279 | |||
3280 | err: | ||
3281 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3282 | return -1; | ||
3283 | } | ||
3284 | |||
3285 | static enum dvbfe_search stv090x_search(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) | ||
3286 | { | ||
3287 | struct stv090x_state *state = fe->demodulator_priv; | ||
3288 | struct dtv_frontend_properties *props = &fe->dtv_property_cache; | ||
3289 | |||
3290 | state->delsys = props->delivery_system; | ||
3291 | state->frequency = p->frequency; | ||
3292 | state->srate = p->u.qpsk.symbol_rate; | ||
3293 | state->search_mode = STV090x_SEARCH_AUTO; | ||
3294 | state->algo = STV090x_COLD_SEARCH; | ||
3295 | state->fec = STV090x_PRERR; | ||
3296 | state->search_range = 2000000; | ||
3297 | |||
3298 | if (stv090x_algo(state) == STV090x_RANGEOK) { | ||
3299 | dprintk(FE_DEBUG, 1, "Search success!"); | ||
3300 | return DVBFE_ALGO_SEARCH_SUCCESS; | ||
3301 | } else { | ||
3302 | dprintk(FE_DEBUG, 1, "Search failed!"); | ||
3303 | return DVBFE_ALGO_SEARCH_FAILED; | ||
3304 | } | ||
3305 | |||
3306 | return DVBFE_ALGO_SEARCH_ERROR; | ||
3307 | } | ||
3308 | |||
3309 | /* FIXME! */ | ||
3310 | static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status) | ||
3311 | { | ||
3312 | struct stv090x_state *state = fe->demodulator_priv; | ||
3313 | u32 reg; | ||
3314 | u8 search_state; | ||
3315 | |||
3316 | reg = STV090x_READ_DEMOD(state, DMDSTATE); | ||
3317 | search_state = STV090x_GETFIELD_Px(reg, HEADER_MODE_FIELD); | ||
3318 | |||
3319 | switch (search_state) { | ||
3320 | case 0: /* searching */ | ||
3321 | case 1: /* first PLH detected */ | ||
3322 | default: | ||
3323 | dprintk(FE_DEBUG, 1, "Status: Unlocked (Searching ..)"); | ||
3324 | *status = 0; | ||
3325 | break; | ||
3326 | |||
3327 | case 2: /* DVB-S2 mode */ | ||
3328 | dprintk(FE_DEBUG, 1, "Delivery system: DVB-S2"); | ||
3329 | reg = STV090x_READ_DEMOD(state, DSTATUS); | ||
3330 | if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) { | ||
3331 | reg = STV090x_READ_DEMOD(state, TSSTATUS); | ||
3332 | if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { | ||
3333 | *status = FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; | ||
3334 | } | ||
3335 | } | ||
3336 | break; | ||
3337 | |||
3338 | case 3: /* DVB-S1/legacy mode */ | ||
3339 | dprintk(FE_DEBUG, 1, "Delivery system: DVB-S"); | ||
3340 | reg = STV090x_READ_DEMOD(state, DSTATUS); | ||
3341 | if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) { | ||
3342 | reg = STV090x_READ_DEMOD(state, VSTATUSVIT); | ||
3343 | if (STV090x_GETFIELD_Px(reg, LOCKEDVIT_FIELD)) { | ||
3344 | reg = STV090x_READ_DEMOD(state, TSSTATUS); | ||
3345 | if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { | ||
3346 | *status = FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; | ||
3347 | } | ||
3348 | } | ||
3349 | } | ||
3350 | break; | ||
3351 | } | ||
3352 | |||
3353 | return 0; | ||
3354 | } | ||
3355 | |||
3356 | static int stv090x_read_per(struct dvb_frontend *fe, u32 *per) | ||
3357 | { | ||
3358 | struct stv090x_state *state = fe->demodulator_priv; | ||
3359 | |||
3360 | s32 count_4, count_3, count_2, count_1, count_0, count; | ||
3361 | u32 reg, h, m, l; | ||
3362 | enum fe_status status; | ||
3363 | |||
3364 | stv090x_read_status(fe, &status); | ||
3365 | if (!(status & FE_HAS_LOCK)) { | ||
3366 | *per = 1 << 23; /* Max PER */ | ||
3367 | } else { | ||
3368 | /* Counter 2 */ | ||
3369 | reg = STV090x_READ_DEMOD(state, ERRCNT22); | ||
3370 | h = STV090x_GETFIELD_Px(reg, ERR_CNT2_FIELD); | ||
3371 | |||
3372 | reg = STV090x_READ_DEMOD(state, ERRCNT21); | ||
3373 | m = STV090x_GETFIELD_Px(reg, ERR_CNT21_FIELD); | ||
3374 | |||
3375 | reg = STV090x_READ_DEMOD(state, ERRCNT20); | ||
3376 | l = STV090x_GETFIELD_Px(reg, ERR_CNT20_FIELD); | ||
3377 | |||
3378 | *per = ((h << 16) | (m << 8) | l); | ||
3379 | |||
3380 | count_4 = STV090x_READ_DEMOD(state, FBERCPT4); | ||
3381 | count_3 = STV090x_READ_DEMOD(state, FBERCPT3); | ||
3382 | count_2 = STV090x_READ_DEMOD(state, FBERCPT2); | ||
3383 | count_1 = STV090x_READ_DEMOD(state, FBERCPT1); | ||
3384 | count_0 = STV090x_READ_DEMOD(state, FBERCPT0); | ||
3385 | |||
3386 | if ((!count_4) && (!count_3)) { | ||
3387 | count = (count_2 & 0xff) << 16; | ||
3388 | count |= (count_1 & 0xff) << 8; | ||
3389 | count |= count_0 & 0xff; | ||
3390 | } else { | ||
3391 | count = 1 << 24; | ||
3392 | } | ||
3393 | if (count == 0) | ||
3394 | *per = 1; | ||
3395 | } | ||
3396 | if (STV090x_WRITE_DEMOD(state, FBERCPT4, 0) < 0) | ||
3397 | goto err; | ||
3398 | if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0) | ||
3399 | goto err; | ||
3400 | |||
3401 | return 0; | ||
3402 | err: | ||
3403 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3404 | return -1; | ||
3405 | } | ||
3406 | |||
3407 | static int stv090x_table_lookup(const struct stv090x_tab *tab, int max, int val) | ||
3408 | { | ||
3409 | int res = 0; | ||
3410 | int min = 0, med; | ||
3411 | |||
3412 | if (val < tab[min].read) | ||
3413 | res = tab[min].real; | ||
3414 | else if (val >= tab[max].read) | ||
3415 | res = tab[max].real; | ||
3416 | else { | ||
3417 | while ((max - min) > 1) { | ||
3418 | med = (max + min) / 2; | ||
3419 | if (val >= tab[min].read && val < tab[med].read) | ||
3420 | max = med; | ||
3421 | else | ||
3422 | min = med; | ||
3423 | } | ||
3424 | res = ((val - tab[min].read) * | ||
3425 | (tab[max].real - tab[min].real) / | ||
3426 | (tab[max].read - tab[min].read)) + | ||
3427 | tab[min].real; | ||
3428 | } | ||
3429 | |||
3430 | return res; | ||
3431 | } | ||
3432 | |||
3433 | static int stv090x_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | ||
3434 | { | ||
3435 | struct stv090x_state *state = fe->demodulator_priv; | ||
3436 | u32 reg; | ||
3437 | s32 agc; | ||
3438 | |||
3439 | reg = STV090x_READ_DEMOD(state, AGCIQIN1); | ||
3440 | agc = STV090x_GETFIELD_Px(reg, AGCIQ_VALUE_FIELD); | ||
3441 | |||
3442 | *strength = stv090x_table_lookup(stv090x_rf_tab, ARRAY_SIZE(stv090x_rf_tab) - 1, agc); | ||
3443 | if (agc > stv090x_rf_tab[0].read) | ||
3444 | *strength = 5; | ||
3445 | else if (agc < stv090x_rf_tab[ARRAY_SIZE(stv090x_rf_tab) - 1].read) | ||
3446 | *strength = -100; | ||
3447 | |||
3448 | return 0; | ||
3449 | } | ||
3450 | |||
3451 | static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr) | ||
3452 | { | ||
3453 | struct stv090x_state *state = fe->demodulator_priv; | ||
3454 | u32 reg_0, reg_1, reg, i; | ||
3455 | s32 val_0, val_1, val = 0; | ||
3456 | u8 lock_f; | ||
3457 | |||
3458 | switch (state->delsys) { | ||
3459 | case STV090x_DVBS2: | ||
3460 | reg = STV090x_READ_DEMOD(state, DSTATUS); | ||
3461 | lock_f = STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD); | ||
3462 | if (lock_f) { | ||
3463 | msleep(5); | ||
3464 | for (i = 0; i < 16; i++) { | ||
3465 | reg_1 = STV090x_READ_DEMOD(state, NNOSPLHT1); | ||
3466 | val_1 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD); | ||
3467 | reg_0 = STV090x_READ_DEMOD(state, NNOSPLHT0); | ||
3468 | val_0 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD); | ||
3469 | val += MAKEWORD16(val_1, val_0); | ||
3470 | msleep(1); | ||
3471 | } | ||
3472 | val /= 16; | ||
3473 | *cnr = stv090x_table_lookup(stv090x_s2cn_tab, ARRAY_SIZE(stv090x_s2cn_tab) - 1, val); | ||
3474 | if (val < stv090x_s2cn_tab[ARRAY_SIZE(stv090x_s2cn_tab) - 1].read) | ||
3475 | *cnr = 1000; | ||
3476 | } | ||
3477 | break; | ||
3478 | |||
3479 | case STV090x_DVBS1: | ||
3480 | case STV090x_DSS: | ||
3481 | reg = STV090x_READ_DEMOD(state, DSTATUS); | ||
3482 | lock_f = STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD); | ||
3483 | if (lock_f) { | ||
3484 | msleep(5); | ||
3485 | for (i = 0; i < 16; i++) { | ||
3486 | reg_1 = STV090x_READ_DEMOD(state, NOSDATAT1); | ||
3487 | val_1 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD); | ||
3488 | reg_0 = STV090x_READ_DEMOD(state, NOSDATAT0); | ||
3489 | val_0 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD); | ||
3490 | val += MAKEWORD16(val_1, val_0); | ||
3491 | msleep(1); | ||
3492 | } | ||
3493 | val /= 16; | ||
3494 | *cnr = stv090x_table_lookup(stv090x_s1cn_tab, ARRAY_SIZE(stv090x_s1cn_tab) - 1, val); | ||
3495 | if (val < stv090x_s2cn_tab[ARRAY_SIZE(stv090x_s1cn_tab) - 1].read) | ||
3496 | *cnr = 1000; | ||
3497 | } | ||
3498 | break; | ||
3499 | default: | ||
3500 | break; | ||
3501 | } | ||
3502 | |||
3503 | return 0; | ||
3504 | } | ||
3505 | |||
3506 | static int stv090x_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | ||
3507 | { | ||
3508 | struct stv090x_state *state = fe->demodulator_priv; | ||
3509 | u32 reg; | ||
3510 | |||
3511 | reg = STV090x_READ_DEMOD(state, DISTXCTL); | ||
3512 | switch (tone) { | ||
3513 | case SEC_TONE_ON: | ||
3514 | STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD, 0); | ||
3515 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1); | ||
3516 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3517 | goto err; | ||
3518 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 0); | ||
3519 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3520 | goto err; | ||
3521 | break; | ||
3522 | |||
3523 | case SEC_TONE_OFF: | ||
3524 | STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD, 0); | ||
3525 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1); | ||
3526 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3527 | goto err; | ||
3528 | break; | ||
3529 | default: | ||
3530 | return -EINVAL; | ||
3531 | } | ||
3532 | |||
3533 | return 0; | ||
3534 | err: | ||
3535 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3536 | return -1; | ||
3537 | } | ||
3538 | |||
3539 | |||
3540 | static enum dvbfe_algo stv090x_frontend_algo(struct dvb_frontend *fe) | ||
3541 | { | ||
3542 | return DVBFE_ALGO_CUSTOM; | ||
3543 | } | ||
3544 | |||
3545 | static int stv090x_send_diseqc_msg(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd *cmd) | ||
3546 | { | ||
3547 | struct stv090x_state *state = fe->demodulator_priv; | ||
3548 | u32 reg, idle = 0, fifo_full = 1; | ||
3549 | int i; | ||
3550 | |||
3551 | reg = STV090x_READ_DEMOD(state, DISTXCTL); | ||
3552 | |||
3553 | STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD, 2); | ||
3554 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1); | ||
3555 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3556 | goto err; | ||
3557 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 0); | ||
3558 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3559 | goto err; | ||
3560 | |||
3561 | STV090x_SETFIELD_Px(reg, DIS_PRECHARGE_FIELD, 1); | ||
3562 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3563 | goto err; | ||
3564 | |||
3565 | for (i = 0; i < cmd->msg_len; i++) { | ||
3566 | |||
3567 | while (fifo_full) { | ||
3568 | reg = STV090x_READ_DEMOD(state, DISTXSTATUS); | ||
3569 | fifo_full = STV090x_GETFIELD_Px(reg, FIFO_FULL_FIELD); | ||
3570 | } | ||
3571 | |||
3572 | if (STV090x_WRITE_DEMOD(state, DISTXDATA, cmd->msg[i]) < 0) | ||
3573 | goto err; | ||
3574 | } | ||
3575 | reg = STV090x_READ_DEMOD(state, DISTXCTL); | ||
3576 | STV090x_SETFIELD_Px(reg, DIS_PRECHARGE_FIELD, 0); | ||
3577 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3578 | goto err; | ||
3579 | |||
3580 | i = 0; | ||
3581 | |||
3582 | while ((!idle) && (i < 10)) { | ||
3583 | reg = STV090x_READ_DEMOD(state, DISTXSTATUS); | ||
3584 | idle = STV090x_GETFIELD_Px(reg, TX_IDLE_FIELD); | ||
3585 | msleep(10); | ||
3586 | i++; | ||
3587 | } | ||
3588 | |||
3589 | return 0; | ||
3590 | err: | ||
3591 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3592 | return -1; | ||
3593 | } | ||
3594 | |||
3595 | static int stv090x_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) | ||
3596 | { | ||
3597 | struct stv090x_state *state = fe->demodulator_priv; | ||
3598 | u32 reg, idle = 0, fifo_full = 1; | ||
3599 | u8 mode, value; | ||
3600 | int i; | ||
3601 | |||
3602 | reg = STV090x_READ_DEMOD(state, DISTXCTL); | ||
3603 | |||
3604 | if (burst == SEC_MINI_A) { | ||
3605 | mode = 3; | ||
3606 | value = 0x00; | ||
3607 | } else { | ||
3608 | mode = 2; | ||
3609 | value = 0xFF; | ||
3610 | } | ||
3611 | |||
3612 | STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD, mode); | ||
3613 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1); | ||
3614 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3615 | goto err; | ||
3616 | STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 0); | ||
3617 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3618 | goto err; | ||
3619 | |||
3620 | STV090x_SETFIELD_Px(reg, DIS_PRECHARGE_FIELD, 1); | ||
3621 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3622 | goto err; | ||
3623 | |||
3624 | while (fifo_full) { | ||
3625 | reg = STV090x_READ_DEMOD(state, DISTXSTATUS); | ||
3626 | fifo_full = STV090x_GETFIELD_Px(reg, FIFO_FULL_FIELD); | ||
3627 | } | ||
3628 | |||
3629 | if (STV090x_WRITE_DEMOD(state, DISTXDATA, value) < 0) | ||
3630 | goto err; | ||
3631 | |||
3632 | reg = STV090x_READ_DEMOD(state, DISTXCTL); | ||
3633 | STV090x_SETFIELD_Px(reg, DIS_PRECHARGE_FIELD, 0); | ||
3634 | if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) | ||
3635 | goto err; | ||
3636 | |||
3637 | i = 0; | ||
3638 | |||
3639 | while ((!idle) && (i < 10)) { | ||
3640 | reg = STV090x_READ_DEMOD(state, DISTXSTATUS); | ||
3641 | idle = STV090x_GETFIELD_Px(reg, TX_IDLE_FIELD); | ||
3642 | msleep(10); | ||
3643 | i++; | ||
3644 | } | ||
3645 | |||
3646 | return 0; | ||
3647 | err: | ||
3648 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3649 | return -1; | ||
3650 | } | ||
3651 | |||
3652 | static int stv090x_recv_slave_reply(struct dvb_frontend *fe, struct dvb_diseqc_slave_reply *reply) | ||
3653 | { | ||
3654 | struct stv090x_state *state = fe->demodulator_priv; | ||
3655 | u32 reg = 0, i = 0, rx_end = 0; | ||
3656 | |||
3657 | while ((rx_end != 1) && (i < 10)) { | ||
3658 | msleep(10); | ||
3659 | i++; | ||
3660 | reg = STV090x_READ_DEMOD(state, DISRX_ST0); | ||
3661 | rx_end = STV090x_GETFIELD_Px(reg, RX_END_FIELD); | ||
3662 | } | ||
3663 | |||
3664 | if (rx_end) { | ||
3665 | reply->msg_len = STV090x_GETFIELD_Px(reg, FIFO_BYTENBR_FIELD); | ||
3666 | for (i = 0; i < reply->msg_len; i++) | ||
3667 | reply->msg[i] = STV090x_READ_DEMOD(state, DISRXDATA); | ||
3668 | } | ||
3669 | |||
3670 | return 0; | ||
3671 | } | ||
3672 | |||
3673 | static int stv090x_sleep(struct dvb_frontend *fe) | ||
3674 | { | ||
3675 | struct stv090x_state *state = fe->demodulator_priv; | ||
3676 | u32 reg; | ||
3677 | |||
3678 | dprintk(FE_DEBUG, 1, "Set %s to sleep", | ||
3679 | state->device == STV0900 ? "STV0900" : "STV0903"); | ||
3680 | |||
3681 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); | ||
3682 | STV090x_SETFIELD(reg, STANDBY_FIELD, 0x01); | ||
3683 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, reg) < 0) | ||
3684 | goto err; | ||
3685 | |||
3686 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); | ||
3687 | STV090x_SETFIELD(reg, ADC1_PON_FIELD, 0); | ||
3688 | if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0) | ||
3689 | goto err; | ||
3690 | |||
3691 | return 0; | ||
3692 | err: | ||
3693 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3694 | return -1; | ||
3695 | } | ||
3696 | |||
3697 | static int stv090x_wakeup(struct dvb_frontend *fe) | ||
3698 | { | ||
3699 | struct stv090x_state *state = fe->demodulator_priv; | ||
3700 | u32 reg; | ||
3701 | |||
3702 | dprintk(FE_DEBUG, 1, "Wake %s from standby", | ||
3703 | state->device == STV0900 ? "STV0900" : "STV0903"); | ||
3704 | |||
3705 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); | ||
3706 | STV090x_SETFIELD(reg, STANDBY_FIELD, 0x00); | ||
3707 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, reg) < 0) | ||
3708 | goto err; | ||
3709 | |||
3710 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); | ||
3711 | STV090x_SETFIELD(reg, ADC1_PON_FIELD, 1); | ||
3712 | if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0) | ||
3713 | goto err; | ||
3714 | |||
3715 | return 0; | ||
3716 | err: | ||
3717 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3718 | return -1; | ||
3719 | } | ||
3720 | |||
3721 | static void stv090x_release(struct dvb_frontend *fe) | ||
3722 | { | ||
3723 | struct stv090x_state *state = fe->demodulator_priv; | ||
3724 | |||
3725 | kfree(state); | ||
3726 | } | ||
3727 | |||
3728 | static int stv090x_ldpc_mode(struct stv090x_state *state, enum stv090x_mode ldpc_mode) | ||
3729 | { | ||
3730 | u32 reg = 0; | ||
3731 | |||
3732 | switch (ldpc_mode) { | ||
3733 | case STV090x_DUAL: | ||
3734 | default: | ||
3735 | if ((state->demod_mode != STV090x_DUAL) || (STV090x_GETFIELD(reg, DDEMOD_FIELD) != 1)) { | ||
3736 | /* set LDPC to dual mode */ | ||
3737 | if (stv090x_write_reg(state, STV090x_GENCFG, 0x1d) < 0) | ||
3738 | goto err; | ||
3739 | |||
3740 | state->demod_mode = STV090x_DUAL; | ||
3741 | |||
3742 | reg = stv090x_read_reg(state, STV090x_TSTRES0); | ||
3743 | STV090x_SETFIELD(reg, FRESFEC_FIELD, 0x1); | ||
3744 | if (stv090x_write_reg(state, STV090x_TSTRES0, reg) < 0) | ||
3745 | goto err; | ||
3746 | STV090x_SETFIELD(reg, FRESFEC_FIELD, 0x0); | ||
3747 | if (stv090x_write_reg(state, STV090x_TSTRES0, reg) < 0) | ||
3748 | goto err; | ||
3749 | |||
3750 | if (STV090x_WRITE_DEMOD(state, MODCODLST0, 0xff) < 0) | ||
3751 | goto err; | ||
3752 | if (STV090x_WRITE_DEMOD(state, MODCODLST1, 0xff) < 0) | ||
3753 | goto err; | ||
3754 | if (STV090x_WRITE_DEMOD(state, MODCODLST2, 0xff) < 0) | ||
3755 | goto err; | ||
3756 | if (STV090x_WRITE_DEMOD(state, MODCODLST3, 0xff) < 0) | ||
3757 | goto err; | ||
3758 | if (STV090x_WRITE_DEMOD(state, MODCODLST4, 0xff) < 0) | ||
3759 | goto err; | ||
3760 | if (STV090x_WRITE_DEMOD(state, MODCODLST5, 0xff) < 0) | ||
3761 | goto err; | ||
3762 | if (STV090x_WRITE_DEMOD(state, MODCODLST6, 0xff) < 0) | ||
3763 | goto err; | ||
3764 | |||
3765 | if (STV090x_WRITE_DEMOD(state, MODCODLST7, 0xcc) < 0) | ||
3766 | goto err; | ||
3767 | if (STV090x_WRITE_DEMOD(state, MODCODLST8, 0xcc) < 0) | ||
3768 | goto err; | ||
3769 | if (STV090x_WRITE_DEMOD(state, MODCODLST9, 0xcc) < 0) | ||
3770 | goto err; | ||
3771 | if (STV090x_WRITE_DEMOD(state, MODCODLSTA, 0xcc) < 0) | ||
3772 | goto err; | ||
3773 | if (STV090x_WRITE_DEMOD(state, MODCODLSTB, 0xcc) < 0) | ||
3774 | goto err; | ||
3775 | if (STV090x_WRITE_DEMOD(state, MODCODLSTC, 0xcc) < 0) | ||
3776 | goto err; | ||
3777 | if (STV090x_WRITE_DEMOD(state, MODCODLSTD, 0xcc) < 0) | ||
3778 | goto err; | ||
3779 | |||
3780 | if (STV090x_WRITE_DEMOD(state, MODCODLSTE, 0xff) < 0) | ||
3781 | goto err; | ||
3782 | if (STV090x_WRITE_DEMOD(state, MODCODLSTF, 0xcf) < 0) | ||
3783 | goto err; | ||
3784 | } | ||
3785 | break; | ||
3786 | |||
3787 | case STV090x_SINGLE: | ||
3788 | if (stv090x_stop_modcod(state) < 0) | ||
3789 | goto err; | ||
3790 | if (stv090x_activate_modcod_single(state) < 0) | ||
3791 | goto err; | ||
3792 | |||
3793 | if (state->demod == STV090x_DEMODULATOR_1) { | ||
3794 | if (stv090x_write_reg(state, STV090x_GENCFG, 0x06) < 0) /* path 2 */ | ||
3795 | goto err; | ||
3796 | } else { | ||
3797 | if (stv090x_write_reg(state, STV090x_GENCFG, 0x04) < 0) /* path 1 */ | ||
3798 | goto err; | ||
3799 | } | ||
3800 | |||
3801 | reg = stv090x_read_reg(state, STV090x_TSTRES0); | ||
3802 | STV090x_SETFIELD(reg, FRESFEC_FIELD, 0x1); | ||
3803 | if (stv090x_write_reg(state, STV090x_TSTRES0, reg) < 0) | ||
3804 | goto err; | ||
3805 | STV090x_SETFIELD(reg, FRESFEC_FIELD, 0x0); | ||
3806 | if (stv090x_write_reg(state, STV090x_TSTRES0, reg) < 0) | ||
3807 | goto err; | ||
3808 | |||
3809 | reg = STV090x_READ_DEMOD(state, PDELCTRL1); | ||
3810 | STV090x_SETFIELD_Px(reg, ALGOSWRST_FIELD, 0x01); | ||
3811 | if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0) | ||
3812 | goto err; | ||
3813 | STV090x_SETFIELD_Px(reg, ALGOSWRST_FIELD, 0x00); | ||
3814 | if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0) | ||
3815 | goto err; | ||
3816 | break; | ||
3817 | } | ||
3818 | |||
3819 | return 0; | ||
3820 | err: | ||
3821 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3822 | return -1; | ||
3823 | } | ||
3824 | |||
3825 | /* return (Hz), clk in Hz*/ | ||
3826 | static u32 stv090x_get_mclk(struct stv090x_state *state) | ||
3827 | { | ||
3828 | const struct stv090x_config *config = state->config; | ||
3829 | u32 div, reg; | ||
3830 | u8 ratio; | ||
3831 | |||
3832 | div = stv090x_read_reg(state, STV090x_NCOARSE); | ||
3833 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); | ||
3834 | ratio = STV090x_GETFIELD(reg, SELX1RATIO_FIELD) ? 4 : 6; | ||
3835 | |||
3836 | return (div + 1) * config->xtal / ratio; /* kHz */ | ||
3837 | } | ||
3838 | |||
3839 | static int stv090x_set_mclk(struct stv090x_state *state, u32 mclk, u32 clk) | ||
3840 | { | ||
3841 | const struct stv090x_config *config = state->config; | ||
3842 | u32 reg, div, clk_sel; | ||
3843 | |||
3844 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); | ||
3845 | clk_sel = ((STV090x_GETFIELD(reg, SELX1RATIO_FIELD) == 1) ? 4 : 6); | ||
3846 | |||
3847 | div = ((clk_sel * mclk) / config->xtal) - 1; | ||
3848 | |||
3849 | reg = stv090x_read_reg(state, STV090x_NCOARSE); | ||
3850 | STV090x_SETFIELD(reg, M_DIV_FIELD, div); | ||
3851 | if (stv090x_write_reg(state, STV090x_NCOARSE, reg) < 0) | ||
3852 | goto err; | ||
3853 | |||
3854 | state->mclk = stv090x_get_mclk(state); | ||
3855 | |||
3856 | /*Set the DiseqC frequency to 22KHz */ | ||
3857 | div = state->mclk / 704000; | ||
3858 | if (STV090x_WRITE_DEMOD(state, F22TX, div) < 0) | ||
3859 | goto err; | ||
3860 | if (STV090x_WRITE_DEMOD(state, F22RX, div) < 0) | ||
3861 | goto err; | ||
3862 | |||
3863 | return 0; | ||
3864 | err: | ||
3865 | dprintk(FE_ERROR, 1, "I/O error"); | ||
3866 | return -1; | ||
3867 | } | ||
3868 | |||
3869 | static int stv090x_set_tspath(struct stv090x_state *state) | ||
3870 | { | ||
3871 | u32 reg; | ||
3872 | |||
3873 | if (state->dev_ver >= 0x20) { | ||
3874 | switch (state->config->ts1_mode) { | ||
3875 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
3876 | case STV090x_TSMODE_DVBCI: | ||
3877 | switch (state->config->ts2_mode) { | ||
3878 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
3879 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
3880 | default: | ||
3881 | stv090x_write_reg(state, STV090x_TSGENERAL, 0x00); | ||
3882 | break; | ||
3883 | |||
3884 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
3885 | case STV090x_TSMODE_DVBCI: | ||
3886 | if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x06) < 0) /* Mux'd stream mode */ | ||
3887 | goto err; | ||
3888 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGM); | ||
3889 | STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3); | ||
3890 | if (stv090x_write_reg(state, STV090x_P1_TSCFGM, reg) < 0) | ||
3891 | goto err; | ||
3892 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGM); | ||
3893 | STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3); | ||
3894 | if (stv090x_write_reg(state, STV090x_P2_TSCFGM, reg) < 0) | ||
3895 | goto err; | ||
3896 | if (stv090x_write_reg(state, STV090x_P1_TSSPEED, 0x14) < 0) | ||
3897 | goto err; | ||
3898 | if (stv090x_write_reg(state, STV090x_P2_TSSPEED, 0x28) < 0) | ||
3899 | goto err; | ||
3900 | break; | ||
3901 | } | ||
3902 | break; | ||
3903 | |||
3904 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
3905 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
3906 | default: | ||
3907 | switch (state->config->ts2_mode) { | ||
3908 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
3909 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
3910 | default: | ||
3911 | if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x0c) < 0) | ||
3912 | goto err; | ||
3913 | break; | ||
3914 | |||
3915 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
3916 | case STV090x_TSMODE_DVBCI: | ||
3917 | if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x0a) < 0) | ||
3918 | goto err; | ||
3919 | break; | ||
3920 | } | ||
3921 | break; | ||
3922 | } | ||
3923 | } else { | ||
3924 | switch (state->config->ts1_mode) { | ||
3925 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
3926 | case STV090x_TSMODE_DVBCI: | ||
3927 | switch (state->config->ts2_mode) { | ||
3928 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
3929 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
3930 | default: | ||
3931 | stv090x_write_reg(state, STV090x_TSGENERAL1X, 0x10); | ||
3932 | break; | ||
3933 | |||
3934 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
3935 | case STV090x_TSMODE_DVBCI: | ||
3936 | stv090x_write_reg(state, STV090x_TSGENERAL1X, 0x16); | ||
3937 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGM); | ||
3938 | STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3); | ||
3939 | if (stv090x_write_reg(state, STV090x_P1_TSCFGM, reg) < 0) | ||
3940 | goto err; | ||
3941 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGM); | ||
3942 | STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 0); | ||
3943 | if (stv090x_write_reg(state, STV090x_P1_TSCFGM, reg) < 0) | ||
3944 | goto err; | ||
3945 | if (stv090x_write_reg(state, STV090x_P1_TSSPEED, 0x14) < 0) | ||
3946 | goto err; | ||
3947 | if (stv090x_write_reg(state, STV090x_P2_TSSPEED, 0x28) < 0) | ||
3948 | goto err; | ||
3949 | break; | ||
3950 | } | ||
3951 | break; | ||
3952 | |||
3953 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
3954 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
3955 | default: | ||
3956 | switch (state->config->ts2_mode) { | ||
3957 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
3958 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
3959 | default: | ||
3960 | stv090x_write_reg(state, STV090x_TSGENERAL1X, 0x14); | ||
3961 | break; | ||
3962 | |||
3963 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
3964 | case STV090x_TSMODE_DVBCI: | ||
3965 | stv090x_write_reg(state, STV090x_TSGENERAL1X, 0x12); | ||
3966 | break; | ||
3967 | } | ||
3968 | break; | ||
3969 | } | ||
3970 | } | ||
3971 | |||
3972 | switch (state->config->ts1_mode) { | ||
3973 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
3974 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGH); | ||
3975 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x00); | ||
3976 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x00); | ||
3977 | if (stv090x_write_reg(state, STV090x_P1_TSCFGH, reg) < 0) | ||
3978 | goto err; | ||
3979 | break; | ||
3980 | |||
3981 | case STV090x_TSMODE_DVBCI: | ||
3982 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGH); | ||
3983 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x00); | ||
3984 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x01); | ||
3985 | if (stv090x_write_reg(state, STV090x_P1_TSCFGH, reg) < 0) | ||
3986 | goto err; | ||
3987 | break; | ||
3988 | |||
3989 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
3990 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGH); | ||
3991 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x01); | ||
3992 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x00); | ||
3993 | if (stv090x_write_reg(state, STV090x_P1_TSCFGH, reg) < 0) | ||
3994 | goto err; | ||
3995 | break; | ||
3996 | |||
3997 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
3998 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGH); | ||
3999 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x01); | ||
4000 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x01); | ||
4001 | if (stv090x_write_reg(state, STV090x_P1_TSCFGH, reg) < 0) | ||
4002 | goto err; | ||
4003 | break; | ||
4004 | |||
4005 | default: | ||
4006 | break; | ||
4007 | } | ||
4008 | |||
4009 | switch (state->config->ts2_mode) { | ||
4010 | case STV090x_TSMODE_PARALLEL_PUNCTURED: | ||
4011 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); | ||
4012 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x00); | ||
4013 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x00); | ||
4014 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) | ||
4015 | goto err; | ||
4016 | break; | ||
4017 | |||
4018 | case STV090x_TSMODE_DVBCI: | ||
4019 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); | ||
4020 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x00); | ||
4021 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x01); | ||
4022 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) | ||
4023 | goto err; | ||
4024 | break; | ||
4025 | |||
4026 | case STV090x_TSMODE_SERIAL_PUNCTURED: | ||
4027 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); | ||
4028 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x01); | ||
4029 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x00); | ||
4030 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) | ||
4031 | goto err; | ||
4032 | break; | ||
4033 | |||
4034 | case STV090x_TSMODE_SERIAL_CONTINUOUS: | ||
4035 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); | ||
4036 | STV090x_SETFIELD_Px(reg, TSFIFO_SERIAL_FIELD, 0x01); | ||
4037 | STV090x_SETFIELD_Px(reg, TSFIFO_DVBCI_FIELD, 0x01); | ||
4038 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) | ||
4039 | goto err; | ||
4040 | break; | ||
4041 | |||
4042 | default: | ||
4043 | break; | ||
4044 | } | ||
4045 | reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); | ||
4046 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x01); | ||
4047 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) | ||
4048 | goto err; | ||
4049 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x00); | ||
4050 | if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) | ||
4051 | goto err; | ||
4052 | |||
4053 | reg = stv090x_read_reg(state, STV090x_P1_TSCFGH); | ||
4054 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x01); | ||
4055 | if (stv090x_write_reg(state, STV090x_P1_TSCFGH, reg) < 0) | ||
4056 | goto err; | ||
4057 | STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x00); | ||
4058 | if (stv090x_write_reg(state, STV090x_P1_TSCFGH, reg) < 0) | ||
4059 | goto err; | ||
4060 | |||
4061 | return 0; | ||
4062 | err: | ||
4063 | dprintk(FE_ERROR, 1, "I/O error"); | ||
4064 | return -1; | ||
4065 | } | ||
4066 | |||
4067 | static int stv090x_init(struct dvb_frontend *fe) | ||
4068 | { | ||
4069 | struct stv090x_state *state = fe->demodulator_priv; | ||
4070 | const struct stv090x_config *config = state->config; | ||
4071 | u32 reg; | ||
4072 | |||
4073 | if (stv090x_wakeup(fe) < 0) { | ||
4074 | dprintk(FE_ERROR, 1, "Error waking device"); | ||
4075 | goto err; | ||
4076 | } | ||
4077 | |||
4078 | if (stv090x_ldpc_mode(state, state->demod_mode) < 0) | ||
4079 | goto err; | ||
4080 | |||
4081 | reg = STV090x_READ_DEMOD(state, TNRCFG2); | ||
4082 | STV090x_SETFIELD_Px(reg, TUN_IQSWAP_FIELD, state->inversion); | ||
4083 | if (STV090x_WRITE_DEMOD(state, TNRCFG2, reg) < 0) | ||
4084 | goto err; | ||
4085 | reg = STV090x_READ_DEMOD(state, DEMOD); | ||
4086 | STV090x_SETFIELD_Px(reg, ROLLOFF_CONTROL_FIELD, state->rolloff); | ||
4087 | if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) | ||
4088 | goto err; | ||
4089 | |||
4090 | if (stv090x_i2c_gate_ctrl(fe, 1) < 0) | ||
4091 | goto err; | ||
4092 | |||
4093 | if (config->tuner_set_mode) { | ||
4094 | if (config->tuner_set_mode(fe, TUNER_WAKE) < 0) | ||
4095 | goto err; | ||
4096 | } | ||
4097 | |||
4098 | if (config->tuner_init) { | ||
4099 | if (config->tuner_init(fe) < 0) | ||
4100 | goto err; | ||
4101 | } | ||
4102 | |||
4103 | if (stv090x_i2c_gate_ctrl(fe, 0) < 0) | ||
4104 | goto err; | ||
4105 | |||
4106 | if (stv090x_set_tspath(state) < 0) | ||
4107 | goto err; | ||
4108 | |||
4109 | return 0; | ||
4110 | err: | ||
4111 | dprintk(FE_ERROR, 1, "I/O error"); | ||
4112 | return -1; | ||
4113 | } | ||
4114 | |||
4115 | static int stv090x_setup(struct dvb_frontend *fe) | ||
4116 | { | ||
4117 | struct stv090x_state *state = fe->demodulator_priv; | ||
4118 | const struct stv090x_config *config = state->config; | ||
4119 | const struct stv090x_reg *stv090x_initval = NULL; | ||
4120 | const struct stv090x_reg *stv090x_cut20_val = NULL; | ||
4121 | unsigned long t1_size = 0, t2_size = 0; | ||
4122 | u32 reg = 0; | ||
4123 | |||
4124 | int i; | ||
4125 | |||
4126 | if (state->device == STV0900) { | ||
4127 | dprintk(FE_DEBUG, 1, "Initializing STV0900"); | ||
4128 | stv090x_initval = stv0900_initval; | ||
4129 | t1_size = ARRAY_SIZE(stv0900_initval); | ||
4130 | stv090x_cut20_val = stv0900_cut20_val; | ||
4131 | t2_size = ARRAY_SIZE(stv0900_cut20_val); | ||
4132 | } else if (state->device == STV0903) { | ||
4133 | dprintk(FE_DEBUG, 1, "Initializing STV0903"); | ||
4134 | stv090x_initval = stv0903_initval; | ||
4135 | t1_size = ARRAY_SIZE(stv0903_initval); | ||
4136 | stv090x_cut20_val = stv0903_cut20_val; | ||
4137 | t2_size = ARRAY_SIZE(stv0903_cut20_val); | ||
4138 | } | ||
4139 | |||
4140 | /* STV090x init */ | ||
4141 | if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Stop Demod */ | ||
4142 | goto err; | ||
4143 | |||
4144 | msleep(5); | ||
4145 | |||
4146 | if (STV090x_WRITE_DEMOD(state, TNRCFG, 0x6c) < 0) /* check register ! (No Tuner Mode) */ | ||
4147 | goto err; | ||
4148 | |||
4149 | STV090x_SETFIELD_Px(reg, ENARPT_LEVEL_FIELD, config->repeater_level); | ||
4150 | if (STV090x_WRITE_DEMOD(state, I2CRPT, reg) < 0) /* repeater OFF */ | ||
4151 | goto err; | ||
4152 | |||
4153 | if (stv090x_write_reg(state, STV090x_NCOARSE, 0x13) < 0) /* set PLL divider */ | ||
4154 | goto err; | ||
4155 | msleep(5); | ||
4156 | if (stv090x_write_reg(state, STV090x_I2CCFG, 0x08) < 0) /* 1/41 oversampling */ | ||
4157 | goto err; | ||
4158 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, 0x20 | config->clk_mode) < 0) /* enable PLL */ | ||
4159 | goto err; | ||
4160 | msleep(5); | ||
4161 | |||
4162 | /* write initval */ | ||
4163 | dprintk(FE_DEBUG, 1, "Setting up initial values"); | ||
4164 | for (i = 0; i < t1_size; i++) { | ||
4165 | if (stv090x_write_reg(state, stv090x_initval[i].addr, stv090x_initval[i].data) < 0) | ||
4166 | goto err; | ||
4167 | } | ||
4168 | |||
4169 | state->dev_ver = stv090x_read_reg(state, STV090x_MID); | ||
4170 | if (state->dev_ver >= 0x20) { | ||
4171 | if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x0c) < 0) | ||
4172 | goto err; | ||
4173 | |||
4174 | /* write cut20_val*/ | ||
4175 | dprintk(FE_DEBUG, 1, "Setting up Cut 2.0 initial values"); | ||
4176 | for (i = 0; i < t2_size; i++) { | ||
4177 | if (stv090x_write_reg(state, stv090x_cut20_val[i].addr, stv090x_cut20_val[i].data) < 0) | ||
4178 | goto err; | ||
4179 | } | ||
4180 | |||
4181 | } else if (state->dev_ver < 0x20) { | ||
4182 | dprintk(FE_ERROR, 1, "ERROR: Unsupported Cut: 0x%02x!", | ||
4183 | state->dev_ver); | ||
4184 | |||
4185 | goto err; | ||
4186 | } else if (state->dev_ver > 0x30) { | ||
4187 | /* we shouldn't bail out from here */ | ||
4188 | dprintk(FE_ERROR, 1, "INFO: Cut: 0x%02x probably incomplete support!", | ||
4189 | state->dev_ver); | ||
4190 | } | ||
4191 | |||
4192 | if (stv090x_write_reg(state, STV090x_TSTRES0, 0x80) < 0) | ||
4193 | goto err; | ||
4194 | if (stv090x_write_reg(state, STV090x_TSTRES0, 0x00) < 0) | ||
4195 | goto err; | ||
4196 | |||
4197 | stv090x_set_mclk(state, 135000000, config->xtal); /* 135 Mhz */ | ||
4198 | msleep(5); | ||
4199 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, 0x20 | config->clk_mode) < 0) | ||
4200 | goto err; | ||
4201 | stv090x_get_mclk(state); | ||
4202 | |||
4203 | return 0; | ||
4204 | err: | ||
4205 | dprintk(FE_ERROR, 1, "I/O error"); | ||
4206 | return -1; | ||
4207 | } | ||
4208 | |||
4209 | static struct dvb_frontend_ops stv090x_ops = { | ||
4210 | |||
4211 | .info = { | ||
4212 | .name = "STV090x Multistandard", | ||
4213 | .type = FE_QPSK, | ||
4214 | .frequency_min = 950000, | ||
4215 | .frequency_max = 2150000, | ||
4216 | .frequency_stepsize = 0, | ||
4217 | .frequency_tolerance = 0, | ||
4218 | .symbol_rate_min = 1000000, | ||
4219 | .symbol_rate_max = 45000000, | ||
4220 | .caps = FE_CAN_INVERSION_AUTO | | ||
4221 | FE_CAN_FEC_AUTO | | ||
4222 | FE_CAN_QPSK | | ||
4223 | FE_CAN_2G_MODULATION | ||
4224 | }, | ||
4225 | |||
4226 | .release = stv090x_release, | ||
4227 | .init = stv090x_init, | ||
4228 | |||
4229 | .sleep = stv090x_sleep, | ||
4230 | .get_frontend_algo = stv090x_frontend_algo, | ||
4231 | |||
4232 | .i2c_gate_ctrl = stv090x_i2c_gate_ctrl, | ||
4233 | |||
4234 | .diseqc_send_master_cmd = stv090x_send_diseqc_msg, | ||
4235 | .diseqc_send_burst = stv090x_send_diseqc_burst, | ||
4236 | .diseqc_recv_slave_reply = stv090x_recv_slave_reply, | ||
4237 | .set_tone = stv090x_set_tone, | ||
4238 | |||
4239 | .search = stv090x_search, | ||
4240 | .read_status = stv090x_read_status, | ||
4241 | .read_ber = stv090x_read_per, | ||
4242 | .read_signal_strength = stv090x_read_signal_strength, | ||
4243 | .read_snr = stv090x_read_cnr | ||
4244 | }; | ||
4245 | |||
4246 | |||
4247 | struct dvb_frontend *stv090x_attach(const struct stv090x_config *config, | ||
4248 | struct i2c_adapter *i2c, | ||
4249 | enum stv090x_demodulator demod) | ||
4250 | { | ||
4251 | struct stv090x_state *state = NULL; | ||
4252 | |||
4253 | state = kzalloc(sizeof (struct stv090x_state), GFP_KERNEL); | ||
4254 | if (state == NULL) | ||
4255 | goto error; | ||
4256 | |||
4257 | state->verbose = &verbose; | ||
4258 | state->config = config; | ||
4259 | state->i2c = i2c; | ||
4260 | state->frontend.ops = stv090x_ops; | ||
4261 | state->frontend.demodulator_priv = state; | ||
4262 | state->demod = demod; | ||
4263 | state->demod_mode = config->demod_mode; /* Single or Dual mode */ | ||
4264 | state->device = config->device; | ||
4265 | state->rolloff = STV090x_RO_35; /* default */ | ||
4266 | |||
4267 | if (state->demod == STV090x_DEMODULATOR_0) | ||
4268 | mutex_init(&demod_lock); | ||
4269 | |||
4270 | if (stv090x_sleep(&state->frontend) < 0) { | ||
4271 | dprintk(FE_ERROR, 1, "Error putting device to sleep"); | ||
4272 | goto error; | ||
4273 | } | ||
4274 | |||
4275 | if (stv090x_setup(&state->frontend) < 0) { | ||
4276 | dprintk(FE_ERROR, 1, "Error setting up device"); | ||
4277 | goto error; | ||
4278 | } | ||
4279 | if (stv090x_wakeup(&state->frontend) < 0) { | ||
4280 | dprintk(FE_ERROR, 1, "Error waking device"); | ||
4281 | goto error; | ||
4282 | } | ||
4283 | |||
4284 | dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x\n", | ||
4285 | state->device == STV0900 ? "STV0900" : "STV0903", | ||
4286 | demod, | ||
4287 | state->dev_ver); | ||
4288 | |||
4289 | return &state->frontend; | ||
4290 | |||
4291 | error: | ||
4292 | kfree(state); | ||
4293 | return NULL; | ||
4294 | } | ||
4295 | EXPORT_SYMBOL(stv090x_attach); | ||
4296 | MODULE_PARM_DESC(verbose, "Set Verbosity level"); | ||
4297 | MODULE_AUTHOR("Manu Abraham"); | ||
4298 | MODULE_DESCRIPTION("STV090x Multi-Std Broadcast frontend"); | ||
4299 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/stv090x.h b/drivers/media/dvb/frontends/stv090x.h new file mode 100644 index 000000000000..e968c98bb70f --- /dev/null +++ b/drivers/media/dvb/frontends/stv090x.h | |||
@@ -0,0 +1,106 @@ | |||
1 | /* | ||
2 | STV0900/0903 Multistandard Broadcast Frontend driver | ||
3 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
4 | |||
5 | Copyright (C) ST Microelectronics | ||
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 __STV090x_H | ||
23 | #define __STV090x_H | ||
24 | |||
25 | enum stv090x_demodulator { | ||
26 | STV090x_DEMODULATOR_0 = 1, | ||
27 | STV090x_DEMODULATOR_1 | ||
28 | }; | ||
29 | |||
30 | enum stv090x_device { | ||
31 | STV0903 = 0, | ||
32 | STV0900, | ||
33 | }; | ||
34 | |||
35 | enum stv090x_mode { | ||
36 | STV090x_DUAL = 0, | ||
37 | STV090x_SINGLE | ||
38 | }; | ||
39 | |||
40 | enum stv090x_tsmode { | ||
41 | STV090x_TSMODE_SERIAL_PUNCTURED = 1, | ||
42 | STV090x_TSMODE_SERIAL_CONTINUOUS, | ||
43 | STV090x_TSMODE_PARALLEL_PUNCTURED, | ||
44 | STV090x_TSMODE_DVBCI | ||
45 | }; | ||
46 | |||
47 | enum stv090x_clkmode { | ||
48 | STV090x_CLK_INT = 0, /* Clk i/p = CLKI */ | ||
49 | STV090x_CLK_EXT = 2 /* Clk i/p = XTALI */ | ||
50 | }; | ||
51 | |||
52 | enum stv090x_i2crpt { | ||
53 | STV090x_RPTLEVEL_256 = 0, | ||
54 | STV090x_RPTLEVEL_128 = 1, | ||
55 | STV090x_RPTLEVEL_64 = 2, | ||
56 | STV090x_RPTLEVEL_32 = 3, | ||
57 | STV090x_RPTLEVEL_16 = 4, | ||
58 | STV090x_RPTLEVEL_8 = 5, | ||
59 | STV090x_RPTLEVEL_4 = 6, | ||
60 | STV090x_RPTLEVEL_2 = 7, | ||
61 | }; | ||
62 | |||
63 | struct stv090x_config { | ||
64 | enum stv090x_device device; | ||
65 | enum stv090x_mode demod_mode; | ||
66 | enum stv090x_clkmode clk_mode; | ||
67 | |||
68 | u32 xtal; /* default: 8000000 */ | ||
69 | u8 address; /* default: 0x68 */ | ||
70 | |||
71 | u32 ref_clk; /* default: 16000000 FIXME to tuner config */ | ||
72 | |||
73 | u8 ts1_mode; | ||
74 | u8 ts2_mode; | ||
75 | |||
76 | enum stv090x_i2crpt repeater_level; | ||
77 | |||
78 | int (*tuner_init) (struct dvb_frontend *fe); | ||
79 | int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); | ||
80 | int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); | ||
81 | int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency); | ||
82 | int (*tuner_set_bandwidth) (struct dvb_frontend *fe, u32 bandwidth); | ||
83 | int (*tuner_get_bandwidth) (struct dvb_frontend *fe, u32 *bandwidth); | ||
84 | int (*tuner_set_bbgain) (struct dvb_frontend *fe, u32 gain); | ||
85 | int (*tuner_get_bbgain) (struct dvb_frontend *fe, u32 *gain); | ||
86 | int (*tuner_set_refclk) (struct dvb_frontend *fe, u32 refclk); | ||
87 | int (*tuner_get_status) (struct dvb_frontend *fe, u32 *status); | ||
88 | }; | ||
89 | |||
90 | #if defined(CONFIG_DVB_STV090x) || (defined(CONFIG_DVB_STV090x_MODULE) && defined(MODULE)) | ||
91 | |||
92 | extern struct dvb_frontend *stv090x_attach(const struct stv090x_config *config, | ||
93 | struct i2c_adapter *i2c, | ||
94 | enum stv090x_demodulator demod); | ||
95 | #else | ||
96 | |||
97 | static inline struct dvb_frontend *stv090x_attach(const struct stv090x_config *config, | ||
98 | struct i2c_adapter *i2c, | ||
99 | enum stv090x_demodulator demod) | ||
100 | { | ||
101 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
102 | return NULL; | ||
103 | } | ||
104 | #endif /* CONFIG_DVB_STV090x */ | ||
105 | |||
106 | #endif /* __STV090x_H */ | ||
diff --git a/drivers/media/dvb/frontends/stv090x_priv.h b/drivers/media/dvb/frontends/stv090x_priv.h new file mode 100644 index 000000000000..5a4a01740d88 --- /dev/null +++ b/drivers/media/dvb/frontends/stv090x_priv.h | |||
@@ -0,0 +1,269 @@ | |||
1 | /* | ||
2 | STV0900/0903 Multistandard Broadcast Frontend driver | ||
3 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
4 | |||
5 | Copyright (C) ST Microelectronics | ||
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 __STV090x_PRIV_H | ||
23 | #define __STV090x_PRIV_H | ||
24 | |||
25 | #include "dvb_frontend.h" | ||
26 | |||
27 | #define FE_ERROR 0 | ||
28 | #define FE_NOTICE 1 | ||
29 | #define FE_INFO 2 | ||
30 | #define FE_DEBUG 3 | ||
31 | #define FE_DEBUGREG 4 | ||
32 | |||
33 | #define dprintk(__y, __z, format, arg...) do { \ | ||
34 | if (__z) { \ | ||
35 | if ((verbose > FE_ERROR) && (verbose > __y)) \ | ||
36 | printk(KERN_ERR "%s: " format "\n", __func__ , ##arg); \ | ||
37 | else if ((verbose > FE_NOTICE) && (verbose > __y)) \ | ||
38 | printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg); \ | ||
39 | else if ((verbose > FE_INFO) && (verbose > __y)) \ | ||
40 | printk(KERN_INFO "%s: " format "\n", __func__ , ##arg); \ | ||
41 | else if ((verbose > FE_DEBUG) && (verbose > __y)) \ | ||
42 | printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg); \ | ||
43 | } else { \ | ||
44 | if (verbose > __y) \ | ||
45 | printk(format, ##arg); \ | ||
46 | } \ | ||
47 | } while (0) | ||
48 | |||
49 | #define STV090x_READ_DEMOD(__state, __reg) (( \ | ||
50 | (__state)->demod == STV090x_DEMODULATOR_1) ? \ | ||
51 | stv090x_read_reg(__state, STV090x_P2_##__reg) : \ | ||
52 | stv090x_read_reg(__state, STV090x_P1_##__reg)) | ||
53 | |||
54 | #define STV090x_WRITE_DEMOD(__state, __reg, __data) (( \ | ||
55 | (__state)->demod == STV090x_DEMODULATOR_1) ? \ | ||
56 | stv090x_write_reg(__state, STV090x_P2_##__reg, __data) :\ | ||
57 | stv090x_write_reg(__state, STV090x_P1_##__reg, __data)) | ||
58 | |||
59 | #define STV090x_ADDR_OFFST(__state, __x) (( \ | ||
60 | (__state->demod) == STV090x_DEMODULATOR_1) ? \ | ||
61 | STV090x_P1_##__x : \ | ||
62 | STV090x_P2_##__x) | ||
63 | |||
64 | |||
65 | #define STV090x_SETFIELD(mask, bitf, val) (mask = (mask & (~(((1 << STV090x_WIDTH_##bitf) - 1) <<\ | ||
66 | STV090x_OFFST_##bitf))) | \ | ||
67 | (val << STV090x_OFFST_##bitf)) | ||
68 | |||
69 | #define STV090x_GETFIELD(val, bitf) ((val >> STV090x_OFFST_##bitf) & ((1 << STV090x_WIDTH_##bitf) - 1)) | ||
70 | |||
71 | |||
72 | #define STV090x_SETFIELD_Px(mask, bitf, val) (mask = (mask & (~(((1 << STV090x_WIDTH_Px_##bitf) - 1) <<\ | ||
73 | STV090x_OFFST_Px_##bitf))) | \ | ||
74 | (val << STV090x_OFFST_Px_##bitf)) | ||
75 | |||
76 | #define STV090x_GETFIELD_Px(val, bitf) ((val >> STV090x_OFFST_Px_##bitf) & ((1 << STV090x_WIDTH_Px_##bitf) - 1)) | ||
77 | |||
78 | #define MAKEWORD16(__a, __b) (((__a) << 8) | (__b)) | ||
79 | |||
80 | #define MSB(__x) ((__x >> 8) & 0xff) | ||
81 | #define LSB(__x) (__x & 0xff) | ||
82 | |||
83 | |||
84 | #define STV090x_IQPOWER_THRESHOLD 30 | ||
85 | #define STV090x_SEARCH_AGC2_TH_CUT20 700 | ||
86 | #define STV090x_SEARCH_AGC2_TH_CUT30 1200 | ||
87 | |||
88 | #define STV090x_SEARCH_AGC2_TH(__ver) \ | ||
89 | ((__ver <= 0x20) ? \ | ||
90 | STV090x_SEARCH_AGC2_TH_CUT20 : \ | ||
91 | STV090x_SEARCH_AGC2_TH_CUT30) | ||
92 | |||
93 | enum stv090x_signal_state { | ||
94 | STV090x_NOCARRIER, | ||
95 | STV090x_NODATA, | ||
96 | STV090x_DATAOK, | ||
97 | STV090x_RANGEOK, | ||
98 | STV090x_OUTOFRANGE | ||
99 | }; | ||
100 | |||
101 | enum stv090x_fec { | ||
102 | STV090x_PR12 = 0, | ||
103 | STV090x_PR23, | ||
104 | STV090x_PR34, | ||
105 | STV090x_PR45, | ||
106 | STV090x_PR56, | ||
107 | STV090x_PR67, | ||
108 | STV090x_PR78, | ||
109 | STV090x_PR89, | ||
110 | STV090x_PR910, | ||
111 | STV090x_PRERR | ||
112 | }; | ||
113 | |||
114 | enum stv090x_modulation { | ||
115 | STV090x_QPSK, | ||
116 | STV090x_8PSK, | ||
117 | STV090x_16APSK, | ||
118 | STV090x_32APSK, | ||
119 | STV090x_UNKNOWN | ||
120 | }; | ||
121 | |||
122 | enum stv090x_frame { | ||
123 | STV090x_LONG_FRAME, | ||
124 | STV090x_SHORT_FRAME | ||
125 | }; | ||
126 | |||
127 | enum stv090x_pilot { | ||
128 | STV090x_PILOTS_OFF, | ||
129 | STV090x_PILOTS_ON | ||
130 | }; | ||
131 | |||
132 | enum stv090x_rolloff { | ||
133 | STV090x_RO_35, | ||
134 | STV090x_RO_25, | ||
135 | STV090x_RO_20 | ||
136 | }; | ||
137 | |||
138 | enum stv090x_inversion { | ||
139 | STV090x_IQ_AUTO, | ||
140 | STV090x_IQ_NORMAL, | ||
141 | STV090x_IQ_SWAP | ||
142 | }; | ||
143 | |||
144 | enum stv090x_modcod { | ||
145 | STV090x_DUMMY_PLF = 0, | ||
146 | STV090x_QPSK_14, | ||
147 | STV090x_QPSK_13, | ||
148 | STV090x_QPSK_25, | ||
149 | STV090x_QPSK_12, | ||
150 | STV090x_QPSK_35, | ||
151 | STV090x_QPSK_23, | ||
152 | STV090x_QPSK_34, | ||
153 | STV090x_QPSK_45, | ||
154 | STV090x_QPSK_56, | ||
155 | STV090x_QPSK_89, | ||
156 | STV090x_QPSK_910, | ||
157 | STV090x_8PSK_35, | ||
158 | STV090x_8PSK_23, | ||
159 | STV090x_8PSK_34, | ||
160 | STV090x_8PSK_56, | ||
161 | STV090x_8PSK_89, | ||
162 | STV090x_8PSK_910, | ||
163 | STV090x_16APSK_23, | ||
164 | STV090x_16APSK_34, | ||
165 | STV090x_16APSK_45, | ||
166 | STV090x_16APSK_56, | ||
167 | STV090x_16APSK_89, | ||
168 | STV090x_16APSK_910, | ||
169 | STV090x_32APSK_34, | ||
170 | STV090x_32APSK_45, | ||
171 | STV090x_32APSK_56, | ||
172 | STV090x_32APSK_89, | ||
173 | STV090x_32APSK_910, | ||
174 | STV090x_MODCODE_UNKNOWN | ||
175 | }; | ||
176 | |||
177 | enum stv090x_search { | ||
178 | STV090x_SEARCH_DSS = 0, | ||
179 | STV090x_SEARCH_DVBS1, | ||
180 | STV090x_SEARCH_DVBS2, | ||
181 | STV090x_SEARCH_AUTO | ||
182 | }; | ||
183 | |||
184 | enum stv090x_algo { | ||
185 | STV090x_BLIND_SEARCH, | ||
186 | STV090x_COLD_SEARCH, | ||
187 | STV090x_WARM_SEARCH | ||
188 | }; | ||
189 | |||
190 | enum stv090x_delsys { | ||
191 | STV090x_ERROR = 0, | ||
192 | STV090x_DVBS1 = 1, | ||
193 | STV090x_DVBS2, | ||
194 | STV090x_DSS | ||
195 | }; | ||
196 | |||
197 | struct stv090x_long_frame_crloop { | ||
198 | enum stv090x_modcod modcod; | ||
199 | |||
200 | u8 crl_pilots_on_2; | ||
201 | u8 crl_pilots_off_2; | ||
202 | u8 crl_pilots_on_5; | ||
203 | u8 crl_pilots_off_5; | ||
204 | u8 crl_pilots_on_10; | ||
205 | u8 crl_pilots_off_10; | ||
206 | u8 crl_pilots_on_20; | ||
207 | u8 crl_pilots_off_20; | ||
208 | u8 crl_pilots_on_30; | ||
209 | u8 crl_pilots_off_30; | ||
210 | }; | ||
211 | |||
212 | struct stv090x_short_frame_crloop { | ||
213 | enum stv090x_modulation modulation; | ||
214 | |||
215 | u8 crl_2; /* SR < 3M */ | ||
216 | u8 crl_5; /* 3 < SR <= 7M */ | ||
217 | u8 crl_10; /* 7 < SR <= 15M */ | ||
218 | u8 crl_20; /* 10 < SR <= 25M */ | ||
219 | u8 crl_30; /* 10 < SR <= 45M */ | ||
220 | }; | ||
221 | |||
222 | struct stv090x_reg { | ||
223 | u16 addr; | ||
224 | u8 data; | ||
225 | }; | ||
226 | |||
227 | struct stv090x_tab { | ||
228 | s32 real; | ||
229 | s32 read; | ||
230 | }; | ||
231 | |||
232 | struct stv090x_state { | ||
233 | enum stv090x_device device; | ||
234 | enum stv090x_demodulator demod; | ||
235 | enum stv090x_mode demod_mode; | ||
236 | u32 dev_ver; | ||
237 | |||
238 | struct i2c_adapter *i2c; | ||
239 | const struct stv090x_config *config; | ||
240 | struct dvb_frontend frontend; | ||
241 | |||
242 | u32 *verbose; /* Cached module verbosity */ | ||
243 | |||
244 | enum stv090x_delsys delsys; | ||
245 | enum stv090x_fec fec; | ||
246 | enum stv090x_modulation modulation; | ||
247 | enum stv090x_modcod modcod; | ||
248 | enum stv090x_search search_mode; | ||
249 | enum stv090x_frame frame_len; | ||
250 | enum stv090x_pilot pilots; | ||
251 | enum stv090x_rolloff rolloff; | ||
252 | enum stv090x_inversion inversion; | ||
253 | enum stv090x_algo algo; | ||
254 | |||
255 | u32 frequency; | ||
256 | u32 srate; | ||
257 | |||
258 | s32 mclk; /* Masterclock Divider factor */ | ||
259 | s32 tuner_bw; | ||
260 | |||
261 | u32 tuner_refclk; | ||
262 | |||
263 | s32 search_range; | ||
264 | |||
265 | s32 DemodTimeout; | ||
266 | s32 FecTimeout; | ||
267 | }; | ||
268 | |||
269 | #endif /* __STV090x_PRIV_H */ | ||
diff --git a/drivers/media/dvb/frontends/stv090x_reg.h b/drivers/media/dvb/frontends/stv090x_reg.h new file mode 100644 index 000000000000..57b6abbbd32d --- /dev/null +++ b/drivers/media/dvb/frontends/stv090x_reg.h | |||
@@ -0,0 +1,2373 @@ | |||
1 | /* | ||
2 | STV0900/0903 Multistandard Broadcast Frontend driver | ||
3 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
4 | |||
5 | Copyright (C) ST Microelectronics | ||
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 __STV090x_REG_H | ||
23 | #define __STV090x_REG_H | ||
24 | |||
25 | #define STV090x_MID 0xf100 | ||
26 | #define STV090x_OFFST_MCHIP_IDENT_FIELD 4 | ||
27 | #define STV090x_WIDTH_MCHIP_IDENT_FIELD 4 | ||
28 | #define STV090x_OFFST_MRELEASE_FIELD 0 | ||
29 | #define STV090x_WIDTH_MRELEASE_FIELD 4 | ||
30 | |||
31 | #define STV090x_DACR1 0xf113 | ||
32 | #define STV090x_OFFST_DACR1_MODE_FIELD 5 | ||
33 | #define STV090x_WIDTH_DACR1_MODE_FIELD 3 | ||
34 | #define STV090x_OFFST_DACR1_VALUE_FIELD 0 | ||
35 | #define STV090x_WIDTH_DACR1_VALUE_FIELD 4 | ||
36 | |||
37 | #define STV090x_DACR2 0xf114 | ||
38 | #define STV090x_OFFST_DACR2_VALUE_FIELD 0 | ||
39 | #define STV090x_WIDTH_DACR2_VALUE_FIELD 8 | ||
40 | |||
41 | #define STV090x_OUTCFG 0xf11c | ||
42 | #define STV090x_OFFST_OUTSERRS1_HZ_FIELD 6 | ||
43 | #define STV090x_WIDTH_OUTSERRS1_HZ_FIELD 1 | ||
44 | #define STV090x_OFFST_OUTSERRS2_HZ_FIELD 5 | ||
45 | #define STV090x_WIDTH_OUTSERRS2_HZ_FIELD 1 | ||
46 | #define STV090x_OFFST_OUTSERRS3_HZ_FIELD 4 | ||
47 | #define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1 | ||
48 | #define STV090x_OFFST_OUTPARRS3_HZ_FIELD 3 | ||
49 | #define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1 | ||
50 | |||
51 | #define STV090x_MODECFG 0xf11d | ||
52 | |||
53 | #define STV090x_IRQSTATUS3 0xf120 | ||
54 | #define STV090x_OFFST_SPLL_LOCK_FIELD 5 | ||
55 | #define STV090x_WIDTH_SPLL_LOCK_FIELD 1 | ||
56 | #define STV090x_OFFST_SSTREAM_LCK_3_FIELD 4 | ||
57 | #define STV090x_WIDTH_SSTREAM_LCK_3_FIELD 1 | ||
58 | #define STV090x_OFFST_SSTREAM_LCK_2_FIELD 3 | ||
59 | #define STV090x_WIDTH_SSTREAM_LCK_2_FIELD 1 | ||
60 | #define STV090x_OFFST_SSTREAM_LCK_1_FIELD 2 | ||
61 | #define STV090x_WIDTH_SSTREAM_LCK_1_FIELD 1 | ||
62 | #define STV090x_OFFST_SDVBS1_PRF_2_FIELD 1 | ||
63 | #define STV090x_WIDTH_SDVBS1_PRF_2_FIELD 1 | ||
64 | #define STV090x_OFFST_SDVBS1_PRF_1_FIELD 0 | ||
65 | #define STV090x_WIDTH_SDVBS1_PRF_1_FIELD 1 | ||
66 | |||
67 | #define STV090x_IRQSTATUS2 0xf121 | ||
68 | #define STV090x_OFFST_SSPY_ENDSIM_3_FIELD 7 | ||
69 | #define STV090x_WIDTH_SSPY_ENDSIM_3_FIELD 1 | ||
70 | #define STV090x_OFFST_SSPY_ENDSIM_2_FIELD 6 | ||
71 | #define STV090x_WIDTH_SSPY_ENDSIM_2_FIELD 1 | ||
72 | #define STV090x_OFFST_SSPY_ENDSIM_1_FIELD 5 | ||
73 | #define STV090x_WIDTH_SSPY_ENDSIM_1_FIELD 1 | ||
74 | #define STV090x_OFFST_SPKTDEL_ERROR_2_FIELD 4 | ||
75 | #define STV090x_WIDTH_SPKTDEL_ERROR_2_FIELD 1 | ||
76 | #define STV090x_OFFST_SPKTDEL_LOCKB_2_FIELD 3 | ||
77 | #define STV090x_WIDTH_SPKTDEL_LOCKB_2_FIELD 1 | ||
78 | #define STV090x_OFFST_SPKTDEL_LOCK_2_FIELD 2 | ||
79 | #define STV090x_WIDTH_SPKTDEL_LOCK_2_FIELD 1 | ||
80 | #define STV090x_OFFST_SPKTDEL_ERROR_1_FIELD 1 | ||
81 | #define STV090x_WIDTH_SPKTDEL_ERROR_1_FIELD 1 | ||
82 | #define STV090x_OFFST_SPKTDEL_LOCKB_1_FIELD 0 | ||
83 | #define STV090x_WIDTH_SPKTDEL_LOCKB_1_FIELD 1 | ||
84 | |||
85 | #define STV090x_IRQSTATUS1 0xf122 | ||
86 | #define STV090x_OFFST_SPKTDEL_LOCK_1_FIELD 7 | ||
87 | #define STV090x_WIDTH_SPKTDEL_LOCK_1_FIELD 1 | ||
88 | #define STV090x_OFFST_SDEMOD_LOCKB_2_FIELD 2 | ||
89 | #define STV090x_WIDTH_SDEMOD_LOCKB_2_FIELD 1 | ||
90 | #define STV090x_OFFST_SDEMOD_LOCK_2_FIELD 1 | ||
91 | #define STV090x_WIDTH_SDEMOD_LOCK_2_FIELD 1 | ||
92 | #define STV090x_OFFST_SDEMOD_IRQ_2_FIELD 0 | ||
93 | #define STV090x_WIDTH_SDEMOD_IRQ_2_FIELD 1 | ||
94 | |||
95 | #define STV090x_IRQSTATUS0 0xf123 | ||
96 | #define STV090x_OFFST_SDEMOD_LOCKB_1_FIELD 7 | ||
97 | #define STV090x_WIDTH_SDEMOD_LOCKB_1_FIELD 1 | ||
98 | #define STV090x_OFFST_SDEMOD_LOCK_1_FIELD 6 | ||
99 | #define STV090x_WIDTH_SDEMOD_LOCK_1_FIELD 1 | ||
100 | #define STV090x_OFFST_SDEMOD_IRQ_1_FIELD 5 | ||
101 | #define STV090x_WIDTH_SDEMOD_IRQ_1_FIELD 1 | ||
102 | #define STV090x_OFFST_SBCH_ERRFLAG_FIELD 4 | ||
103 | #define STV090x_WIDTH_SBCH_ERRFLAG_FIELD 1 | ||
104 | #define STV090x_OFFST_SDISEQC2RX_IRQ_FIELD 3 | ||
105 | #define STV090x_WIDTH_SDISEQC2RX_IRQ_FIELD 1 | ||
106 | #define STV090x_OFFST_SDISEQC2TX_IRQ_FIELD 2 | ||
107 | #define STV090x_WIDTH_SDISEQC2TX_IRQ_FIELD 1 | ||
108 | #define STV090x_OFFST_SDISEQC1RX_IRQ_FIELD 1 | ||
109 | #define STV090x_WIDTH_SDISEQC1RX_IRQ_FIELD 1 | ||
110 | #define STV090x_OFFST_SDISEQC1TX_IRQ_FIELD 0 | ||
111 | #define STV090x_WIDTH_SDISEQC1TX_IRQ_FIELD 1 | ||
112 | |||
113 | #define STV090x_IRQMASK3 0xf124 | ||
114 | #define STV090x_OFFST_MPLL_LOCK_FIELD 5 | ||
115 | #define STV090x_WIDTH_MPLL_LOCK_FIELD 1 | ||
116 | #define STV090x_OFFST_MSTREAM_LCK_3_FIELD 2 | ||
117 | #define STV090x_WIDTH_MSTREAM_LCK_3_FIELD 3 | ||
118 | #define STV090x_OFFST_MSTREAM_LCK_2_FIELD 2 | ||
119 | #define STV090x_WIDTH_MSTREAM_LCK_2_FIELD 3 | ||
120 | #define STV090x_OFFST_MSTREAM_LCK_1_FIELD 2 | ||
121 | #define STV090x_WIDTH_MSTREAM_LCK_1_FIELD 3 | ||
122 | #define STV090x_OFFST_MDVBS1_PRF_2_FIELD 1 | ||
123 | #define STV090x_WIDTH_MDVBS1_PRF_2_FIELD 1 | ||
124 | #define STV090x_OFFST_MDVBS1_PRF_1_FIELD 0 | ||
125 | #define STV090x_WIDTH_MDVBS1_PRF_1_FIELD 1 | ||
126 | |||
127 | #define STV090x_IRQMASK2 0xf125 | ||
128 | #define STV090x_OFFST_MSPY_ENDSIM_3_FIELD 5 | ||
129 | #define STV090x_WIDTH_MSPY_ENDSIM_3_FIELD 3 | ||
130 | #define STV090x_OFFST_MSPY_ENDSIM_2_FIELD 5 | ||
131 | #define STV090x_WIDTH_MSPY_ENDSIM_2_FIELD 3 | ||
132 | #define STV090x_OFFST_MSPY_ENDSIM_1_FIELD 5 | ||
133 | #define STV090x_WIDTH_MSPY_ENDSIM_1_FIELD 3 | ||
134 | #define STV090x_OFFST_MPKTDEL_ERROR_2_FIELD 4 | ||
135 | #define STV090x_WIDTH_MPKTDEL_ERROR_2_FIELD 1 | ||
136 | #define STV090x_OFFST_MPKTDEL_LOCKB_2_FIELD 3 | ||
137 | #define STV090x_WIDTH_MPKTDEL_LOCKB_2_FIELD 1 | ||
138 | #define STV090x_OFFST_MPKTDEL_LOCK_2_FIELD 2 | ||
139 | #define STV090x_WIDTH_MPKTDEL_LOCK_2_FIELD 1 | ||
140 | #define STV090x_OFFST_MPKTDEL_ERROR_1_FIELD 1 | ||
141 | #define STV090x_WIDTH_MPKTDEL_ERROR_1_FIELD 1 | ||
142 | #define STV090x_OFFST_MPKTDEL_LOCKB_1_FIELD 0 | ||
143 | #define STV090x_WIDTH_MPKTDEL_LOCKB_1_FIELD 1 | ||
144 | |||
145 | #define STV090x_IRQMASK1 0xf126 | ||
146 | #define STV090x_OFFST_MPKTDEL_LOCK_1_FIELD 7 | ||
147 | #define STV090x_WIDTH_MPKTDEL_LOCK_1_FIELD 1 | ||
148 | #define STV090x_OFFST_MEXTPINB2_FIELD 6 | ||
149 | #define STV090x_WIDTH_MEXTPINB2_FIELD 1 | ||
150 | #define STV090x_OFFST_MEXTPIN2_FIELD 5 | ||
151 | #define STV090x_WIDTH_MEXTPIN2_FIELD 1 | ||
152 | #define STV090x_OFFST_MEXTPINB1_FIELD 4 | ||
153 | #define STV090x_WIDTH_MEXTPINB1_FIELD 1 | ||
154 | #define STV090x_OFFST_MEXTPIN1_FIELD 3 | ||
155 | #define STV090x_WIDTH_MEXTPIN1_FIELD 1 | ||
156 | #define STV090x_OFFST_MDEMOD_LOCKB_2_FIELD 2 | ||
157 | #define STV090x_WIDTH_MDEMOD_LOCKB_2_FIELD 1 | ||
158 | #define STV090x_OFFST_MDEMOD_LOCK_2_FIELD 1 | ||
159 | #define STV090x_WIDTH_MDEMOD_LOCK_2_FIELD 1 | ||
160 | #define STV090x_OFFST_MDEMOD_IRQ_2_FIELD 0 | ||
161 | #define STV090x_WIDTH_MDEMOD_IRQ_2_FIELD 1 | ||
162 | |||
163 | #define STV090x_IRQMASK0 0xf127 | ||
164 | #define STV090x_OFFST_MDEMOD_LOCKB_1_FIELD 7 | ||
165 | #define STV090x_WIDTH_MDEMOD_LOCKB_1_FIELD 1 | ||
166 | #define STV090x_OFFST_MDEMOD_LOCK_1_FIELD 6 | ||
167 | #define STV090x_WIDTH_MDEMOD_LOCK_1_FIELD 1 | ||
168 | #define STV090x_OFFST_MDEMOD_IRQ_1_FIELD 5 | ||
169 | #define STV090x_WIDTH_MDEMOD_IRQ_1_FIELD 1 | ||
170 | #define STV090x_OFFST_MBCH_ERRFLAG_FIELD 4 | ||
171 | #define STV090x_WIDTH_MBCH_ERRFLAG_FIELD 1 | ||
172 | #define STV090x_OFFST_MDISEQC2RX_IRQ_FIELD 3 | ||
173 | #define STV090x_WIDTH_MDISEQC2RX_IRQ_FIELD 1 | ||
174 | #define STV090x_OFFST_MDISEQC2TX_IRQ_FIELD 2 | ||
175 | #define STV090x_WIDTH_MDISEQC2TX_IRQ_FIELD 1 | ||
176 | #define STV090x_OFFST_MDISEQC1RX_IRQ_FIELD 1 | ||
177 | #define STV090x_WIDTH_MDISEQC1RX_IRQ_FIELD 1 | ||
178 | #define STV090x_OFFST_MDISEQC1TX_IRQ_FIELD 0 | ||
179 | #define STV090x_WIDTH_MDISEQC1TX_IRQ_FIELD 1 | ||
180 | |||
181 | #define STV090x_I2CCFG 0xf129 | ||
182 | #define STV090x_OFFST_12C_FASTMODE_FIELD 3 | ||
183 | #define STV090x_WIDTH_12C_FASTMODE_FIELD 1 | ||
184 | #define STV090x_OFFST_12CADDR_INC_FIELD 0 | ||
185 | #define STV090x_WIDTH_12CADDR_INC_FIELD 2 | ||
186 | |||
187 | #define STV090x_Px_I2CRPT(__x) (0xf12a + (__x - 1) * 0x1) | ||
188 | #define STV090x_P1_I2CRPT STV090x_Px_I2CRPT(1) | ||
189 | #define STV090x_P2_I2CRPT STV090x_Px_I2CRPT(2) | ||
190 | #define STV090x_OFFST_Px_I2CT_ON_FIELD 7 | ||
191 | #define STV090x_WIDTH_Px_I2CT_ON_FIELD 1 | ||
192 | #define STV090x_OFFST_Px_ENARPT_LEVEL_FIELD 4 | ||
193 | #define STV090x_WIDTH_Px_ENARPT_LEVEL_FIELD 3 | ||
194 | #define STV090x_OFFST_Px_SCLT_DELAY_FIELD 3 | ||
195 | #define STV090x_WIDTH_Px_SCLT_DELAY_FIELD 1 | ||
196 | #define STV090x_OFFST_Px_STOP_ENABLE_FIELD 2 | ||
197 | #define STV090x_WIDTH_Px_STOP_ENABLE_FIELD 1 | ||
198 | #define STV090x_OFFST_Px_STOP_SDAT2SDA_FIELD 1 | ||
199 | #define STV090x_WIDTH_Px_STOP_SDAT2SDA_FIELD 1 | ||
200 | |||
201 | #define STV090x_CLKI2CFG 0xf140 | ||
202 | #define STV090x_OFFST_CLKI2_OPD_FIELD 7 | ||
203 | #define STV090x_WIDTH_CLKI2_OPD_FIELD 1 | ||
204 | #define STV090x_OFFST_CLKI2_CONFIG_FIELD 1 | ||
205 | #define STV090x_WIDTH_CLKI2_CONFIG_FIELD 6 | ||
206 | #define STV090x_OFFST_CLKI2_XOR_FIELD 0 | ||
207 | #define STV090x_WIDTH_CLKI2_XOR_FIELD 1 | ||
208 | |||
209 | #define STV090x_GPIOxCFG(__x) (0xf141 + (__x - 1)) | ||
210 | #define STV090x_GPIO1CFG STV090x_GPIOxCFG(1) | ||
211 | #define STV090x_GPIO2CFG STV090x_GPIOxCFG(2) | ||
212 | #define STV090x_GPIO3CFG STV090x_GPIOxCFG(3) | ||
213 | #define STV090x_GPIO4CFG STV090x_GPIOxCFG(4) | ||
214 | #define STV090x_GPIO5CFG STV090x_GPIOxCFG(5) | ||
215 | #define STV090x_GPIO6CFG STV090x_GPIOxCFG(6) | ||
216 | #define STV090x_GPIO7CFG STV090x_GPIOxCFG(7) | ||
217 | #define STV090x_GPIO8CFG STV090x_GPIOxCFG(8) | ||
218 | #define STV090x_GPIO9CFG STV090x_GPIOxCFG(9) | ||
219 | #define STV090x_GPIO10CFG STV090x_GPIOxCFG(10) | ||
220 | #define STV090x_GPIO11CFG STV090x_GPIOxCFG(11) | ||
221 | #define STV090x_GPIO12CFG STV090x_GPIOxCFG(12) | ||
222 | #define STV090x_GPIO13CFG STV090x_GPIOxCFG(13) | ||
223 | #define STV090x_OFFST_GPIOx_OPD_FIELD 7 | ||
224 | #define STV090x_WIDTH_GPIOx_OPD_FIELD 1 | ||
225 | #define STV090x_OFFST_GPIOx_CONFIG_FIELD 1 | ||
226 | #define STV090x_WIDTH_GPIOx_CONFIG_FIELD 6 | ||
227 | #define STV090x_OFFST_GPIOx_XOR_FIELD 0 | ||
228 | #define STV090x_WIDTH_GPIOx_XOR_FIELD 1 | ||
229 | |||
230 | #define STV090x_CSxCFG(__x) (0xf14e + __x * 0x1) | ||
231 | #define STV090x_CS0CFG STV090x_CSxCFG(0) | ||
232 | #define STV090x_CS1CFG STV090x_CSxCFG(1) | ||
233 | #define STV090x_OFFST_CSX_OPD_FIELD 7 | ||
234 | #define STV090x_WIDTH_CSX_OPD_FIELD 1 | ||
235 | #define STV090x_OFFST_CSX_CONFIG_FIELD 1 | ||
236 | #define STV090x_WIDTH_CSX_CONFIG_FIELD 6 | ||
237 | #define STV090x_OFFST_CSX_XOR_FIELD 0 | ||
238 | #define STV090x_WIDTH_CSX_XOR_FIELD 1 | ||
239 | |||
240 | |||
241 | #define STV090x_STDBYCFG 0xf150 | ||
242 | #define STV090x_OFFST_STDBY_OPD_FIELD 7 | ||
243 | #define STV090x_WIDTH_STDBY_OPD_FIELD 1 | ||
244 | #define STV090x_OFFST_STDBY_CONFIG_FIELD 1 | ||
245 | #define STV090x_WIDTH_STDBY_CONFIG_FIELD 6 | ||
246 | #define STV090x_OFFST_STDBY_XOR_FIELD 0 | ||
247 | #define STV090x_WIDTH_STDBY_XOR_FIELD 1 | ||
248 | |||
249 | #define STV090x_DIRCLKCFG 0xf151 | ||
250 | #define STV090x_OFFST_DIRCLK_OPD_FIELD 7 | ||
251 | #define STV090x_WIDTH_DIRCLK_OPD_FIELD 1 | ||
252 | #define STV090x_OFFST_DIRCLK_CONFIG_FIELD 1 | ||
253 | #define STV090x_WIDTH_DIRCLK_CONFIG_FIELD 6 | ||
254 | #define STV090x_OFFST_DIRCLK_XOR_FIELD 0 | ||
255 | #define STV090x_WIDTH_DIRCLK_XOR_FIELD 1 | ||
256 | |||
257 | |||
258 | #define STV090x_AGCRFxCFG(__x) (0xf152 + (__x - 1) * 0x4) | ||
259 | #define STV090x_AGCRF1CFG STV090x_AGCRFxCFG(1) | ||
260 | #define STV090x_AGCRF2CFG STV090x_AGCRFxCFG(2) | ||
261 | #define STV090x_OFFST_AGCRFx_OPD_FIELD 7 | ||
262 | #define STV090x_WIDTH_AGCRFx_OPD_FIELD 1 | ||
263 | #define STV090x_OFFST_AGCRFx_CONFIG_FIELD 1 | ||
264 | #define STV090x_WIDTH_AGCRFx_CONFIG_FIELD 6 | ||
265 | #define STV090x_OFFST_AGCRFx_XOR_FIELD 0 | ||
266 | #define STV090x_WIDTH_AGCRFx_XOR_FIELD 1 | ||
267 | |||
268 | #define STV090x_SDATxCFG(__x) (0xf153 + (__x - 1) * 0x4) | ||
269 | #define STV090x_SDAT1CFG STV090x_SDATxCFG(1) | ||
270 | #define STV090x_SDAT2CFG STV090x_SDATxCFG(2) | ||
271 | #define STV090x_OFFST_SDATx_OPD_FIELD 7 | ||
272 | #define STV090x_WIDTH_SDATx_OPD_FIELD 1 | ||
273 | #define STV090x_OFFST_SDATx_CONFIG_FIELD 1 | ||
274 | #define STV090x_WIDTH_SDATx_CONFIG_FIELD 6 | ||
275 | #define STV090x_OFFST_SDATx_XOR_FIELD 0 | ||
276 | #define STV090x_WIDTH_SDATx_XOR_FIELD 1 | ||
277 | |||
278 | #define STV090x_SCLTxCFG(__x) (0xf154 + (__x - 1) * 0x4) | ||
279 | #define STV090x_SCLT1CFG STV090x_SCLTxCFG(1) | ||
280 | #define STV090x_SCLT2CFG STV090x_SCLTxCFG(2) | ||
281 | #define STV090x_OFFST_SCLTx_OPD_FIELD 7 | ||
282 | #define STV090x_WIDTH_SCLTx_OPD_FIELD 1 | ||
283 | #define STV090x_OFFST_SCLTx_CONFIG_FIELD 1 | ||
284 | #define STV090x_WIDTH_SCLTx_CONFIG_FIELD 6 | ||
285 | #define STV090x_OFFST_SCLTx_XOR_FIELD 0 | ||
286 | #define STV090x_WIDTH_SCLTx_XOR_FIELD 1 | ||
287 | |||
288 | #define STV090x_DISEQCOxCFG(__x) (0xf155 + (__x - 1) * 0x4) | ||
289 | #define STV090x_DISEQCO1CFG STV090x_DISEQCOxCFG(1) | ||
290 | #define STV090x_DISEQCO2CFG STV090x_DISEQCOxCFG(2) | ||
291 | #define STV090x_OFFST_DISEQCOx_OPD_FIELD 7 | ||
292 | #define STV090x_WIDTH_DISEQCOx_OPD_FIELD 1 | ||
293 | #define STV090x_OFFST_DISEQCOx_CONFIG_FIELD 1 | ||
294 | #define STV090x_WIDTH_DISEQCOx_CONFIG_FIELD 6 | ||
295 | #define STV090x_OFFST_DISEQCOx_XOR_FIELD 0 | ||
296 | #define STV090x_WIDTH_DISEQCOx_XOR_FIELD 1 | ||
297 | |||
298 | #define STV090x_CLKOUT27CFG 0xf15a | ||
299 | #define STV090x_OFFST_CLKOUT27_OPD_FIELD 7 | ||
300 | #define STV090x_WIDTH_CLKOUT27_OPD_FIELD 1 | ||
301 | #define STV090x_OFFST_CLKOUT27_CONFIG_FIELD 1 | ||
302 | #define STV090x_WIDTH_CLKOUT27_CONFIG_FIELD 6 | ||
303 | #define STV090x_OFFST_CLKOUT27_XOR_FIELD 0 | ||
304 | #define STV090x_WIDTH_CLKOUT27_XOR_FIELD 1 | ||
305 | |||
306 | #define STV090x_ERRORxCFG(__x) (0xf15b + (__x - 1) * 0x5) | ||
307 | #define STV090x_ERROR1CFG STV090x_ERRORxCFG(1) | ||
308 | #define STV090x_ERROR2CFG STV090x_ERRORxCFG(2) | ||
309 | #define STV090x_ERROR3CFG STV090x_ERRORxCFG(3) | ||
310 | #define STV090x_OFFST_ERRORx_OPD_FIELD 7 | ||
311 | #define STV090x_WIDTH_ERRORx_OPD_FIELD 1 | ||
312 | #define STV090x_OFFST_ERRORx_CONFIG_FIELD 1 | ||
313 | #define STV090x_WIDTH_ERRORx_CONFIG_FIELD 6 | ||
314 | #define STV090x_OFFST_ERRORx_XOR_FIELD 0 | ||
315 | #define STV090x_WIDTH_ERRORx_XOR_FIELD 1 | ||
316 | |||
317 | #define STV090x_DPNxCFG(__x) (0xf15c + (__x - 1) * 0x5) | ||
318 | #define STV090x_DPN1CFG STV090x_DPNxCFG(1) | ||
319 | #define STV090x_DPN2CFG STV090x_DPNxCFG(2) | ||
320 | #define STV090x_DPN3CFG STV090x_DPNxCFG(3) | ||
321 | #define STV090x_OFFST_DPNx_OPD_FIELD 7 | ||
322 | #define STV090x_WIDTH_DPNx_OPD_FIELD 1 | ||
323 | #define STV090x_OFFST_DPNx_CONFIG_FIELD 1 | ||
324 | #define STV090x_WIDTH_DPNx_CONFIG_FIELD 6 | ||
325 | #define STV090x_OFFST_DPNx_XOR_FIELD 0 | ||
326 | #define STV090x_WIDTH_DPNx_XOR_FIELD 1 | ||
327 | |||
328 | #define STV090x_STROUTxCFG(__x) (0xf15d + (__x - 1) * 0x5) | ||
329 | #define STV090x_STROUT1CFG STV090x_STROUTxCFG(1) | ||
330 | #define STV090x_STROUT2CFG STV090x_STROUTxCFG(2) | ||
331 | #define STV090x_STROUT3CFG STV090x_STROUTxCFG(3) | ||
332 | #define STV090x_OFFST_STROUTx_OPD_FIELD 7 | ||
333 | #define STV090x_WIDTH_STROUTx_OPD_FIELD 1 | ||
334 | #define STV090x_OFFST_STROUTx_CONFIG_FIELD 1 | ||
335 | #define STV090x_WIDTH_STROUTx_CONFIG_FIELD 6 | ||
336 | #define STV090x_OFFST_STROUTx_XOR_FIELD 0 | ||
337 | #define STV090x_WIDTH_STROUTx_XOR_FIELD 1 | ||
338 | |||
339 | #define STV090x_CLKOUTxCFG(__x) (0xf15e + (__x - 1) * 0x5) | ||
340 | #define STV090x_CLKOUT1CFG STV090x_CLKOUTxCFG(1) | ||
341 | #define STV090x_CLKOUT2CFG STV090x_CLKOUTxCFG(2) | ||
342 | #define STV090x_CLKOUT3CFG STV090x_CLKOUTxCFG(3) | ||
343 | #define STV090x_OFFST_CLKOUTx_OPD_FIELD 7 | ||
344 | #define STV090x_WIDTH_CLKOUTx_OPD_FIELD 1 | ||
345 | #define STV090x_OFFST_CLKOUTx_CONFIG_FIELD 1 | ||
346 | #define STV090x_WIDTH_CLKOUTx_CONFIG_FIELD 6 | ||
347 | #define STV090x_OFFST_CLKOUTx_XOR_FIELD 0 | ||
348 | #define STV090x_WIDTH_CLKOUTx_XOR_FIELD 1 | ||
349 | |||
350 | #define STV090x_DATAxCFG(__x) (0xf15f + (__x - 71) * 0x5) | ||
351 | #define STV090x_DATA71CFG STV090x_DATAxCFG(71) | ||
352 | #define STV090x_DATA72CFG STV090x_DATAxCFG(72) | ||
353 | #define STV090x_DATA73CFG STV090x_DATAxCFG(73) | ||
354 | #define STV090x_OFFST_DATAx_OPD_FIELD 7 | ||
355 | #define STV090x_WIDTH_DATAx_OPD_FIELD 1 | ||
356 | #define STV090x_OFFST_DATAx_CONFIG_FIELD 1 | ||
357 | #define STV090x_WIDTH_DATAx_CONFIG_FIELD 6 | ||
358 | #define STV090x_OFFST_DATAx_XOR_FIELD 0 | ||
359 | #define STV090x_WIDTH_DATAx_XOR_FIELD 1 | ||
360 | |||
361 | #define STV090x_NCOARSE 0xf1b3 | ||
362 | #define STV090x_OFFST_M_DIV_FIELD 0 | ||
363 | #define STV090x_WIDTH_M_DIV_FIELD 8 | ||
364 | |||
365 | #define STV090x_SYNTCTRL 0xf1b6 | ||
366 | #define STV090x_OFFST_STANDBY_FIELD 7 | ||
367 | #define STV090x_WIDTH_STANDBY_FIELD 1 | ||
368 | #define STV090x_OFFST_BYPASSPLLCORE_FIELD 6 | ||
369 | #define STV090x_WIDTH_BYPASSPLLCORE_FIELD 1 | ||
370 | #define STV090x_OFFST_SELX1RATIO_FIELD 5 | ||
371 | #define STV090x_WIDTH_SELX1RATIO_FIELD 1 | ||
372 | #define STV090x_OFFST_STOP_PLL_FIELD 3 | ||
373 | #define STV090x_WIDTH_SELX1RATIO_FIELD 1 | ||
374 | #define STV090x_OFFST_BYPASSPLLFSK_FIELD 2 | ||
375 | #define STV090x_WIDTH_BYPASSPLLFSK_FIELD 1 | ||
376 | #define STV090x_OFFST_SELOSCI_FIELD 1 | ||
377 | #define STV090x_WIDTH_SELOSCI_FIELD 1 | ||
378 | #define STV090x_OFFST_BYPASSPLLADC_FIELD 0 | ||
379 | #define STV090x_WIDTH_BYPASSPLLADC_FIELD 1 | ||
380 | |||
381 | #define STV090x_FILTCTRL 0xf1b7 | ||
382 | #define STV090x_OFFST_INV_CLK135_FIELD 7 | ||
383 | #define STV090x_WIDTH_INV_CLK135_FIELD 1 | ||
384 | #define STV090x_OFFST_SEL_FSKCKDIV_FIELD 2 | ||
385 | #define STV090x_WIDTH_SEL_FSKCKDIV_FIELD 1 | ||
386 | #define STV090x_OFFST_INV_CLKFSK_FIELD 1 | ||
387 | #define STV090x_WIDTH_INV_CLKFSK_FIELD 1 | ||
388 | #define STV090x_OFFST_BYPASS_APPLI_FIELD 0 | ||
389 | #define STV090x_WIDTH_BYPASS_APPLI_FIELD 1 | ||
390 | |||
391 | #define STV090x_PLLSTAT 0xf1b8 | ||
392 | #define STV090x_OFFST_PLLLOCK_FIELD 0 | ||
393 | #define STV090x_WIDTH_PLLLOCK_FIELD 1 | ||
394 | |||
395 | #define STV090x_STOPCLK1 0xf1c2 | ||
396 | #define STV090x_OFFST_STOP_CLKPKDT2_FIELD 6 | ||
397 | #define STV090x_WIDTH_STOP_CLKPKDT2_FIELD 1 | ||
398 | #define STV090x_OFFST_STOP_CLKPKDT1_FIELD 5 | ||
399 | #define STV090x_WIDTH_STOP_CLKPKDT1_FIELD 1 | ||
400 | #define STV090x_OFFST_STOP_CLKFEC_FIELD 4 | ||
401 | #define STV090x_WIDTH_STOP_CLKFEC_FIELD 1 | ||
402 | #define STV090x_OFFST_STOP_CLKADCI2_FIELD 3 | ||
403 | #define STV090x_WIDTH_STOP_CLKADCI2_FIELD 1 | ||
404 | #define STV090x_OFFST_INV_CLKADCI2_FIELD 2 | ||
405 | #define STV090x_WIDTH_INV_CLKADCI2_FIELD 1 | ||
406 | #define STV090x_OFFST_STOP_CLKADCI1_FIELD 1 | ||
407 | #define STV090x_WIDTH_STOP_CLKADCI1_FIELD 1 | ||
408 | #define STV090x_OFFST_INV_CLKADCI1_FIELD 0 | ||
409 | #define STV090x_WIDTH_INV_CLKADCI1_FIELD 1 | ||
410 | |||
411 | #define STV090x_STOPCLK2 0xf1c3 | ||
412 | #define STV090x_OFFST_STOP_CLKSAMP2_FIELD 4 | ||
413 | #define STV090x_WIDTH_STOP_CLKSAMP2_FIELD 1 | ||
414 | #define STV090x_OFFST_STOP_CLKSAMP1_FIELD 3 | ||
415 | #define STV090x_WIDTH_STOP_CLKSAMP1_FIELD 1 | ||
416 | #define STV090x_OFFST_STOP_CLKVIT2_FIELD 2 | ||
417 | #define STV090x_WIDTH_STOP_CLKVIT2_FIELD 1 | ||
418 | #define STV090x_OFFST_STOP_CLKVIT1_FIELD 1 | ||
419 | #define STV090x_WIDTH_STOP_CLKVIT1_FIELD 1 | ||
420 | #define STV090x_OFFST_STOP_CLKTS_FIELD 0 | ||
421 | #define STV090x_WIDTH_STOP_CLKTS_FIELD 1 | ||
422 | |||
423 | #define STV090x_TSTTNR0 0xf1df | ||
424 | #define STV090x_OFFST_SEL_FSK_FIELD 7 | ||
425 | #define STV090x_WIDTH_SEL_FSK_FIELD 1 | ||
426 | #define STV090x_OFFST_FSK_PON_FIELD 2 | ||
427 | #define STV090x_WIDTH_FSK_PON_FIELD 1 | ||
428 | |||
429 | #define STV090x_TSTTNR1 0xf1e0 | ||
430 | #define STV090x_OFFST_ADC1_PON_FIELD 1 | ||
431 | #define STV090x_WIDTH_ADC1_PON_FIELD 1 | ||
432 | #define STV090x_OFFST_ADC1_INMODE_FIELD 0 | ||
433 | #define STV090x_WIDTH_ADC1_INMODE_FIELD 1 | ||
434 | |||
435 | #define STV090x_TSTTNR2 0xf1e1 | ||
436 | #define STV090x_OFFST_DISEQC1_PON_FIELD 5 | ||
437 | #define STV090x_WIDTH_DISEQC1_PON_FIELD 1 | ||
438 | |||
439 | #define STV090x_TSTTNR3 0xf1e2 | ||
440 | #define STV090x_OFFST_ADC2_PON_FIELD 1 | ||
441 | #define STV090x_WIDTH_ADC2_PON_FIELD 1 | ||
442 | #define STV090x_OFFST_ADC2_INMODE_FIELD 0 | ||
443 | #define STV090x_WIDTH_ADC2_INMODE_FIELD 1 | ||
444 | |||
445 | #define STV090x_TSTTNR4 0xf1e3 | ||
446 | #define STV090x_OFFST_DISEQC2_PON_FIELD 5 | ||
447 | #define STV090x_WIDTH_DISEQC2_PON_FIELD 1 | ||
448 | |||
449 | #define STV090x_FSKTFC2 0xf170 | ||
450 | #define STV090x_OFFST_FSKT_KMOD_FIELD 2 | ||
451 | #define STV090x_WIDTH_FSKT_KMOD_FIELD 6 | ||
452 | #define STV090x_OFFST_FSKT_CAR_FIELD 0 | ||
453 | #define STV090x_WIDTH_FSKT_CAR_FIELD 2 | ||
454 | |||
455 | #define STV090x_FSKTFC1 0xf171 | ||
456 | #define STV090x_OFFST_FSKTC1_CAR_FIELD 0 | ||
457 | #define STV090x_WIDTH_FSKTC1_CAR_FIELD 8 | ||
458 | |||
459 | #define STV090x_FSKTFC0 0xf172 | ||
460 | #define STV090x_OFFST_FSKTC0_CAR_FIELD 0 | ||
461 | #define STV090x_WIDTH_FSKTC0_CAR_FIELD 8 | ||
462 | |||
463 | #define STV090x_FSKTDELTAF1 0xf173 | ||
464 | #define STV090x_OFFST_FSKTF1_DELTAF_FIELD 0 | ||
465 | #define STV090x_WIDTH_FSKTF1_DELTAF_FIELD 4 | ||
466 | |||
467 | #define STV090x_FSKTDELTAF0 0xf174 | ||
468 | #define STV090x_OFFST_FSKTF0_DELTAF_FIELD 0 | ||
469 | #define STV090x_WIDTH_FSKTF0_DELTAF_FIELD 8 | ||
470 | |||
471 | #define STV090x_FSKTCTRL 0xf175 | ||
472 | #define STV090x_OFFST_FSKT_EN_SGN_FIELD 6 | ||
473 | #define STV090x_WIDTH_FSKT_EN_SGN_FIELD 1 | ||
474 | #define STV090x_OFFST_FSKT_MOD_SGN_FIELD 5 | ||
475 | #define STV090x_WIDTH_FSKT_MOD_SGN_FIELD 1 | ||
476 | #define STV090x_OFFST_FSKT_MOD_EN_FIELD 2 | ||
477 | #define STV090x_WIDTH_FSKT_MOD_EN_FIELD 3 | ||
478 | #define STV090x_OFFST_FSKT_DACMODE_FIELD 0 | ||
479 | #define STV090x_WIDTH_FSKT_DACMODE_FIELD 2 | ||
480 | |||
481 | #define STV090x_FSKRFC2 0xf176 | ||
482 | #define STV090x_OFFST_FSKRC2_DETSGN_FIELD 6 | ||
483 | #define STV090x_WIDTH_FSKRC2_DETSGN_FIELD 1 | ||
484 | #define STV090x_OFFST_FSKRC2_OUTSGN_FIELD 5 | ||
485 | #define STV090x_WIDTH_FSKRC2_OUTSGN_FIELD 1 | ||
486 | #define STV090x_OFFST_FSKRC2_KAGC_FIELD 2 | ||
487 | #define STV090x_WIDTH_FSKRC2_KAGC_FIELD 3 | ||
488 | #define STV090x_OFFST_FSKRC2_CAR_FIELD 0 | ||
489 | #define STV090x_WIDTH_FSKRC2_CAR_FIELD 2 | ||
490 | |||
491 | #define STV090x_FSKRFC1 0xf177 | ||
492 | #define STV090x_OFFST_FSKRC1_CAR_FIELD 0 | ||
493 | #define STV090x_WIDTH_FSKRC1_CAR_FIELD 8 | ||
494 | |||
495 | #define STV090x_FSKRFC0 0xf178 | ||
496 | #define STV090x_OFFST_FSKRC0_CAR_FIELD 0 | ||
497 | #define STV090x_WIDTH_FSKRC0_CAR_FIELD 8 | ||
498 | |||
499 | #define STV090x_FSKRK1 0xf179 | ||
500 | #define STV090x_OFFST_FSKR_K1_EXP_FIELD 5 | ||
501 | #define STV090x_WIDTH_FSKR_K1_EXP_FIELD 3 | ||
502 | #define STV090x_OFFST_FSKR_K1_MANT_FIELD 0 | ||
503 | #define STV090x_WIDTH_FSKR_K1_MANT_FIELD 5 | ||
504 | |||
505 | #define STV090x_FSKRK2 0xf17a | ||
506 | #define STV090x_OFFST_FSKR_K2_EXP_FIELD 5 | ||
507 | #define STV090x_WIDTH_FSKR_K2_EXP_FIELD 3 | ||
508 | #define STV090x_OFFST_FSKR_K2_MANT_FIELD 0 | ||
509 | #define STV090x_WIDTH_FSKR_K2_MANT_FIELD 5 | ||
510 | |||
511 | #define STV090x_FSKRAGCR 0xf17b | ||
512 | #define STV090x_OFFST_FSKR_OUTCTL_FIELD 6 | ||
513 | #define STV090x_WIDTH_FSKR_OUTCTL_FIELD 2 | ||
514 | #define STV090x_OFFST_FSKR_AGC_REF_FIELD 0 | ||
515 | #define STV090x_WIDTH_FSKR_AGC_REF_FIELD 6 | ||
516 | |||
517 | #define STV090x_FSKRAGC 0xf17c | ||
518 | #define STV090x_OFFST_FSKR_AGC_ACCU_FIELD 0 | ||
519 | #define STV090x_WIDTH_FSKR_AGC_ACCU_FIELD 8 | ||
520 | |||
521 | #define STV090x_FSKRALPHA 0xf17d | ||
522 | #define STV090x_OFFST_FSKR_ALPHA_EXP_FIELD 2 | ||
523 | #define STV090x_WIDTH_FSKR_ALPHA_EXP_FIELD 3 | ||
524 | #define STV090x_OFFST_FSKR_ALPHA_M_FIELD 0 | ||
525 | #define STV090x_WIDTH_FSKR_ALPHA_M_FIELD 2 | ||
526 | |||
527 | #define STV090x_FSKRPLTH1 0xf17e | ||
528 | #define STV090x_OFFST_FSKR_BETA_FIELD 4 | ||
529 | #define STV090x_WIDTH_FSKR_BETA_FIELD 4 | ||
530 | #define STV090x_OFFST_FSKR_PLL_TRESH1_FIELD 0 | ||
531 | #define STV090x_WIDTH_FSKR_PLL_TRESH1_FIELD 4 | ||
532 | |||
533 | #define STV090x_FSKRPLTH0 0xf17f | ||
534 | #define STV090x_OFFST_FSKR_PLL_TRESH0_FIELD 0 | ||
535 | #define STV090x_WIDTH_FSKR_PLL_TRESH0_FIELD 8 | ||
536 | |||
537 | #define STV090x_FSKRDF1 0xf180 | ||
538 | #define STV090x_OFFST_FSKR_DELTAF1_FIELD 0 | ||
539 | #define STV090x_WIDTH_FSKR_DELTAF1_FIELD 5 | ||
540 | |||
541 | #define STV090x_FSKRDF0 0xf181 | ||
542 | #define STV090x_OFFST_FSKR_DELTAF0_FIELD 0 | ||
543 | #define STV090x_WIDTH_FSKR_DELTAF0_FIELD 8 | ||
544 | |||
545 | #define STV090x_FSKRSTEPP 0xf182 | ||
546 | #define STV090x_OFFST_FSKR_STEP_PLUS_FIELD 0 | ||
547 | #define STV090x_WIDTH_FSKR_STEP_PLUS_FIELD 8 | ||
548 | |||
549 | #define STV090x_FSKRSTEPM 0xf183 | ||
550 | #define STV090x_OFFST_FSKR_STEP_MINUS_FIELD 0 | ||
551 | #define STV090x_WIDTH_FSKR_STEP_MINUS_FIELD 8 | ||
552 | |||
553 | #define STV090x_FSKRDET1 0xf184 | ||
554 | #define STV090x_OFFST_FSKR_CARDET1_ACCU_FIELD 0 | ||
555 | #define STV090x_WIDTH_FSKR_CARDET1_ACCU_FIELD 4 | ||
556 | |||
557 | #define STV090x_FSKRDET0 0xf185 | ||
558 | #define STV090x_OFFST_FSKR_CARDET0_ACCU_FIELD 0 | ||
559 | #define STV090x_WIDTH_FSKR_CARDET0_ACCU_FIELD 8 | ||
560 | |||
561 | #define STV090x_FSKRDTH1 0xf186 | ||
562 | #define STV090x_OFFST_FSKR_CARLOSS_THRESH1_FIELD 4 | ||
563 | #define STV090x_WIDTH_FSKR_CARLOSS_THRESH1_FIELD 4 | ||
564 | #define STV090x_OFFST_FSKR_CARDET_THRESH1_FIELD 0 | ||
565 | #define STV090x_WIDTH_FSKR_CARDET_THRESH1_FIELD 4 | ||
566 | |||
567 | #define STV090x_FSKRDTH0 0xf187 | ||
568 | #define STV090x_OFFST_FSKR_CARDET_THRESH0_FIELD 0 | ||
569 | #define STV090x_WIDTH_FSKR_CARDET_THRESH0_FIELD 8 | ||
570 | |||
571 | #define STV090x_FSKRLOSS 0xf188 | ||
572 | #define STV090x_OFFST_FSKR_CARLOSS_THRESH_FIELD 0 | ||
573 | #define STV090x_WIDTH_FSKR_CARLOSS_THRESH_FIELD 8 | ||
574 | |||
575 | #define STV090x_Px_DISTXCTL(__x) (0xF1A0 - (__x - 1) * 0x10) | ||
576 | #define STV090x_P1_DISTXCTL STV090x_Px_DISTXCTL(1) | ||
577 | #define STV090x_P2_DISTXCTL STV090x_Px_DISTXCTL(2) | ||
578 | #define STV090x_OFFST_Px_TIM_OFF_FIELD 7 | ||
579 | #define STV090x_WIDTH_Px_TIM_OFF_FIELD 1 | ||
580 | #define STV090x_OFFST_Px_DISEQC_RESET_FIELD 6 | ||
581 | #define STV090x_WIDTH_Px_DISEQC_RESET_FIELD 1 | ||
582 | #define STV090x_OFFST_Px_TIM_CMD_FIELD 4 | ||
583 | #define STV090x_WIDTH_Px_TIM_CMD_FIELD 2 | ||
584 | #define STV090x_OFFST_Px_DIS_PRECHARGE_FIELD 3 | ||
585 | #define STV090x_WIDTH_Px_DIS_PRECHARGE_FIELD 1 | ||
586 | #define STV090x_OFFST_Px_DISTX_MODE_FIELD 0 | ||
587 | #define STV090x_WIDTH_Px_DISTX_MODE_FIELD 3 | ||
588 | |||
589 | #define STV090x_Px_DISRXCTL(__x) (0xf1a1 - (__x - 1) * 0x10) | ||
590 | #define STV090x_P1_DISRXCTL STV090x_Px_DISRXCTL(1) | ||
591 | #define STV090x_P2_DISRXCTL STV090x_Px_DISRXCTL(2) | ||
592 | #define STV090x_OFFST_Px_RECEIVER_ON_FIELD 7 | ||
593 | #define STV090x_WIDTH_Px_RECEIVER_ON_FIELD 1 | ||
594 | #define STV090x_OFFST_Px_IGNO_SHORT22K_FIELD 6 | ||
595 | #define STV090x_WIDTH_Px_IGNO_SHORT22K_FIELD 1 | ||
596 | #define STV090x_OFFST_Px_ONECHIP_TRX_FIELD 5 | ||
597 | #define STV090x_WIDTH_Px_ONECHIP_TRX_FIELD 1 | ||
598 | #define STV090x_OFFST_Px_EXT_ENVELOP_FIELD 4 | ||
599 | #define STV090x_WIDTH_Px_EXT_ENVELOP_FIELD 1 | ||
600 | #define STV090x_OFFST_Px_PIN_SELECT_FIELD 2 | ||
601 | #define STV090x_WIDTH_Px_PIN_SELECT_FIELD 2 | ||
602 | #define STV090x_OFFST_Px_IRQ_RXEND_FIELD 1 | ||
603 | #define STV090x_WIDTH_Px_IRQ_RXEND_FIELD 1 | ||
604 | #define STV090x_OFFST_Px_IRQ_4NBYTES_FIELD 0 | ||
605 | #define STV090x_WIDTH_Px_IRQ_4NBYTES_FIELD 1 | ||
606 | |||
607 | #define STV090x_Px_DISRX_ST0(__x) (0xf1a4 - (__x - 1) * 0x10) | ||
608 | #define STV090x_P1_DISRX_ST0 STV090x_Px_DISRX_ST0(1) | ||
609 | #define STV090x_P2_DISRX_ST0 STV090x_Px_DISRX_ST0(2) | ||
610 | #define STV090x_OFFST_Px_RX_END_FIELD 7 | ||
611 | #define STV090x_WIDTH_Px_RX_END_FIELD 1 | ||
612 | #define STV090x_OFFST_Px_RX_ACTIVE_FIELD 6 | ||
613 | #define STV090x_WIDTH_Px_RX_ACTIVE_FIELD 1 | ||
614 | #define STV090x_OFFST_Px_SHORT_22KHZ_FIELD 5 | ||
615 | #define STV090x_WIDTH_Px_SHORT_22KHZ_FIELD 1 | ||
616 | #define STV090x_OFFST_Px_CONT_TONE_FIELD 4 | ||
617 | #define STV090x_WIDTH_Px_CONT_TONE_FIELD 1 | ||
618 | #define STV090x_OFFST_Px_FIFO_4BREADY_FIELD 3 | ||
619 | #define STV090x_WIDTH_Px_FIFO_4BREADY_FIELD 2 | ||
620 | #define STV090x_OFFST_Px_FIFO_EMPTY_FIELD 2 | ||
621 | #define STV090x_WIDTH_Px_FIFO_EMPTY_FIELD 1 | ||
622 | #define STV090x_OFFST_Px_ABORT_DISRX_FIELD 0 | ||
623 | #define STV090x_WIDTH_Px_ABORT_DISRX_FIELD 1 | ||
624 | |||
625 | #define STV090x_Px_DISRX_ST1(__x) (0xf1a5 - (__x - 1) * 0x10) | ||
626 | #define STV090x_P1_DISRX_ST1 STV090x_Px_DISRX_ST1(1) | ||
627 | #define STV090x_P2_DISRX_ST1 STV090x_Px_DISRX_ST1(2) | ||
628 | #define STV090x_OFFST_Px_RX_FAIL_FIELD 7 | ||
629 | #define STV090x_WIDTH_Px_RX_FAIL_FIELD 1 | ||
630 | #define STV090x_OFFST_Px_FIFO_PARITYFAIL_FIELD 6 | ||
631 | #define STV090x_WIDTH_Px_FIFO_PARITYFAIL_FIELD 1 | ||
632 | #define STV090x_OFFST_Px_RX_NONBYTE_FIELD 5 | ||
633 | #define STV090x_WIDTH_Px_RX_NONBYTE_FIELD 1 | ||
634 | #define STV090x_OFFST_Px_FIFO_OVERFLOW_FIELD 4 | ||
635 | #define STV090x_WIDTH_Px_FIFO_OVERFLOW_FIELD 1 | ||
636 | #define STV090x_OFFST_Px_FIFO_BYTENBR_FIELD 0 | ||
637 | #define STV090x_WIDTH_Px_FIFO_BYTENBR_FIELD 4 | ||
638 | |||
639 | #define STV090x_Px_DISRXDATA(__x) (0xf1a6 - (__x - 1) * 0x10) | ||
640 | #define STV090x_P1_DISRXDATA STV090x_Px_DISRXDATA(1) | ||
641 | #define STV090x_P2_DISRXDATA STV090x_Px_DISRXDATA(2) | ||
642 | #define STV090x_OFFST_Px_DISRX_DATA_FIELD 0 | ||
643 | #define STV090x_WIDTH_Px_DISRX_DATA_FIELD 8 | ||
644 | |||
645 | #define STV090x_Px_DISTXDATA(__x) (0xf1a7 - (__x - 1) * 0x10) | ||
646 | #define STV090x_P1_DISTXDATA STV090x_Px_DISTXDATA(1) | ||
647 | #define STV090x_P2_DISTXDATA STV090x_Px_DISTXDATA(2) | ||
648 | #define STV090x_OFFST_Px_DISEQC_FIFO_FIELD 0 | ||
649 | #define STV090x_WIDTH_Px_DISEQC_FIFO_FIELD 8 | ||
650 | |||
651 | #define STV090x_Px_DISTXSTATUS(__x) (0xf1a8 - (__x - 1) * 0x10) | ||
652 | #define STV090x_P1_DISTXSTATUS STV090x_Px_DISTXSTATUS(1) | ||
653 | #define STV090x_P2_DISTXSTATUS STV090x_Px_DISTXSTATUS(2) | ||
654 | #define STV090x_OFFST_Px_TX_FAIL_FIELD 7 | ||
655 | #define STV090x_WIDTH_Px_TX_FAIL_FIELD 1 | ||
656 | #define STV090x_OFFST_Px_FIFO_FULL_FIELD 6 | ||
657 | #define STV090x_WIDTH_Px_FIFO_FULL_FIELD 1 | ||
658 | #define STV090x_OFFST_Px_TX_IDLE_FIELD 5 | ||
659 | #define STV090x_WIDTH_Px_TX_IDLE_FIELD 1 | ||
660 | #define STV090x_OFFST_Px_GAP_BURST_FIELD 4 | ||
661 | #define STV090x_WIDTH_Px_GAP_BURST_FIELD 1 | ||
662 | #define STV090x_OFFST_Px_TXFIFO_BYTES_FIELD 0 | ||
663 | #define STV090x_WIDTH_Px_TXFIFO_BYTES_FIELD 4 | ||
664 | |||
665 | #define STV090x_Px_F22TX(__x) (0xf1a9 - (__x - 1) * 0x10) | ||
666 | #define STV090x_P1_F22TX STV090x_Px_F22TX(1) | ||
667 | #define STV090x_P2_F22TX STV090x_Px_F22TX(2) | ||
668 | #define STV090x_OFFST_Px_F22_REG_FIELD 0 | ||
669 | #define STV090x_WIDTH_Px_F22_REG_FIELD 8 | ||
670 | |||
671 | #define STV090x_Px_F22RX(__x) (0xf1aa - (__x - 1) * 0x10) | ||
672 | #define STV090x_P1_F22RX STV090x_Px_F22RX(1) | ||
673 | #define STV090x_P2_F22RX STV090x_Px_F22RX(2) | ||
674 | #define STV090x_OFFST_Px_F22RX_REG_FIELD 0 | ||
675 | #define STV090x_WIDTH_Px_F22RX_REG_FIELD 8 | ||
676 | |||
677 | #define STV090x_Px_ACRPRESC(__x) (0xf1ac - (__x - 1) * 0x10) | ||
678 | #define STV090x_P1_ACRPRESC STV090x_Px_ACRPRESC(1) | ||
679 | #define STV090x_P2_ACRPRESC STV090x_Px_ACRPRESC(2) | ||
680 | #define STV090x_OFFST_Px_ACR_PRESC_FIELD 0 | ||
681 | #define STV090x_WIDTH_Px_ACR_PRESC_FIELD 3 | ||
682 | |||
683 | #define STV090x_Px_ACRDIV(__x) (0xf1ad - (__x - 1) * 0x10) | ||
684 | #define STV090x_P1_ACRDIV STV090x_Px_ACRDIV(1) | ||
685 | #define STV090x_P2_ACRDIV STV090x_Px_ACRDIV(2) | ||
686 | #define STV090x_OFFST_Px_ACR_DIV_FIELD 0 | ||
687 | #define STV090x_WIDTH_Px_ACR_DIV_FIELD 8 | ||
688 | |||
689 | #define STV090x_Px_IQCONST(__x) (0xF400 - (__x - 1) * 0x200) | ||
690 | #define STV090x_P1_IQCONST STV090x_Px_IQCONST(1) | ||
691 | #define STV090x_P2_IQCONST STV090x_Px_IQCONST(2) | ||
692 | #define STV090x_OFFST_Px_CONSTEL_SELECT_FIELD 5 | ||
693 | #define STV090x_WIDTH_Px_CONSTEL_SELECT_FIELD 2 | ||
694 | |||
695 | #define STV090x_Px_NOSCFG(__x) (0xF401 - (__x - 1) * 0x200) | ||
696 | #define STV090x_P1_NOSCFG STV090x_Px_NOSCFG(1) | ||
697 | #define STV090x_P2_NOSCFG STV090x_Px_NOSCFG(2) | ||
698 | #define STV090x_OFFST_Px_NOSPLH_BETA_FIELD 3 | ||
699 | #define STV090x_WIDTH_Px_NOSPLH_BETA_FIELD 2 | ||
700 | #define STV090x_OFFST_Px_NOSDATA_BETA_FIELD 0 | ||
701 | #define STV090x_WIDTH_Px_NOSDATA_BETA_FIELD 3 | ||
702 | |||
703 | #define STV090x_Px_ISYMB(__x) (0xF402 - (__x - 1) * 0x200) | ||
704 | #define STV090x_P1_ISYMB STV090x_Px_ISYMB(1) | ||
705 | #define STV090x_P2_ISYMB STV090x_Px_ISYMB(2) | ||
706 | #define STV090x_OFFST_Px_I_SYMBOL_FIELD 0 | ||
707 | #define STV090x_WIDTH_Px_I_SYMBOL_FIELD 8 | ||
708 | |||
709 | #define STV090x_Px_QSYMB(__x) (0xF403 - (__x - 1) * 0x200) | ||
710 | #define STV090x_P1_QSYMB STV090x_Px_QSYMB(1) | ||
711 | #define STV090x_P2_QSYMB STV090x_Px_QSYMB(2) | ||
712 | #define STV090x_OFFST_Px_Q_SYMBOL_FIELD 0 | ||
713 | #define STV090x_WIDTH_Px_Q_SYMBOL_FIELD 8 | ||
714 | |||
715 | #define STV090x_Px_AGC1CFG(__x) (0xF404 - (__x - 1) * 0x200) | ||
716 | #define STV090x_P1_AGC1CFG STV090x_Px_AGC1CFG(1) | ||
717 | #define STV090x_P2_AGC1CFG STV090x_Px_AGC1CFG(2) | ||
718 | #define STV090x_OFFST_Px_DC_FROZEN_FIELD 7 | ||
719 | #define STV090x_WIDTH_Px_DC_FROZEN_FIELD 1 | ||
720 | #define STV090x_OFFST_Px_DC_CORRECT_FIELD 6 | ||
721 | #define STV090x_WIDTH_Px_DC_CORRECT_FIELD 1 | ||
722 | #define STV090x_OFFST_Px_AMM_FROZEN_FIELD 5 | ||
723 | #define STV090x_WIDTH_Px_AMM_FROZEN_FIELD 1 | ||
724 | #define STV090x_OFFST_Px_AMM_CORRECT_FIELD 4 | ||
725 | #define STV090x_WIDTH_Px_AMM_CORRECT_FIELD 1 | ||
726 | #define STV090x_OFFST_Px_QUAD_FROZEN_FIELD 3 | ||
727 | #define STV090x_WIDTH_Px_QUAD_FROZEN_FIELD 1 | ||
728 | #define STV090x_OFFST_Px_QUAD_CORRECT_FIELD 2 | ||
729 | #define STV090x_WIDTH_Px_QUAD_CORRECT_FIELD 1 | ||
730 | |||
731 | #define STV090x_Px_AGC1CN(__x) (0xF406 - (__x - 1) * 0x200) | ||
732 | #define STV090x_P1_AGC1CN STV090x_Px_AGC1CN(1) | ||
733 | #define STV090x_P2_AGC1CN STV090x_Px_AGC1CN(2) | ||
734 | #define STV090x_WIDTH_Px_AGC1_LOCKED_FIELD 7 | ||
735 | #define STV090x_OFFST_Px_AGC1_LOCKED_FIELD 1 | ||
736 | #define STV090x_OFFST_Px_AGC1_MINPOWER_FIELD 4 | ||
737 | #define STV090x_WIDTH_Px_AGC1_MINPOWER_FIELD 1 | ||
738 | #define STV090x_OFFST_Px_AGCOUT_FAST_FIELD 3 | ||
739 | #define STV090x_WIDTH_Px_AGCOUT_FAST_FIELD 1 | ||
740 | #define STV090x_OFFST_Px_AGCIQ_BETA_FIELD 0 | ||
741 | #define STV090x_WIDTH_Px_AGCIQ_BETA_FIELD 3 | ||
742 | |||
743 | #define STV090x_Px_AGC1REF(__x) (0xF407 - (__x - 1) * 0x200) | ||
744 | #define STV090x_P1_AGC1REF STV090x_Px_AGC1REF(1) | ||
745 | #define STV090x_P2_AGC1REF STV090x_Px_AGC1REF(2) | ||
746 | #define STV090x_OFFST_Px_AGCIQ_REF_FIELD 0 | ||
747 | #define STV090x_WIDTH_Px_AGCIQ_REF_FIELD 8 | ||
748 | |||
749 | #define STV090x_Px_IDCCOMP(__x) (0xF408 - (__x - 1) * 0x200) | ||
750 | #define STV090x_P1_IDCCOMP STV090x_Px_IDCCOMP(1) | ||
751 | #define STV090x_P2_IDCCOMP STV090x_Px_IDCCOMP(2) | ||
752 | #define STV090x_OFFST_Px_IAVERAGE_ADJ_FIELD 0 | ||
753 | #define STV090x_WIDTH_Px_IAVERAGE_ADJ_FIELD 8 | ||
754 | |||
755 | #define STV090x_Px_QDCCOMP(__x) (0xF409 - (__x - 1) * 0x200) | ||
756 | #define STV090x_P1_QDCCOMP STV090x_Px_QDCCOMP(1) | ||
757 | #define STV090x_P2_QDCCOMP STV090x_Px_QDCCOMP(2) | ||
758 | #define STV090x_OFFST_Px_QAVERAGE_ADJ_FIELD 0 | ||
759 | #define STV090x_WIDTH_Px_QAVERAGE_ADJ_FIELD 8 | ||
760 | |||
761 | #define STV090x_Px_POWERI(__x) (0xF40A - (__x - 1) * 0x200) | ||
762 | #define STV090x_P1_POWERI STV090x_Px_POWERI(1) | ||
763 | #define STV090x_P2_POWERI STV090x_Px_POWERI(2) | ||
764 | #define STV090x_OFFST_Px_POWER_I_FIELD 0 | ||
765 | #define STV090x_WIDTH_Px_POWER_I_FIELD 8 | ||
766 | |||
767 | #define STV090x_Px_POWERQ(__x) (0xF40B - (__x - 1) * 0x200) | ||
768 | #define STV090x_P1_POWERQ STV090x_Px_POWERQ(1) | ||
769 | #define STV090x_P2_POWERQ STV090x_Px_POWERQ(2) | ||
770 | #define STV090x_OFFST_Px_POWER_Q_FIELD 0 | ||
771 | #define STV090x_WIDTH_Px_POWER_Q_FIELD 8 | ||
772 | |||
773 | #define STV090x_Px_AGC1AMM(__x) (0xF40C - (__x - 1) * 0x200) | ||
774 | #define STV090x_P1_AGC1AMM STV090x_Px_AGC1AMM(1) | ||
775 | #define STV090x_P2_AGC1AMM STV090x_Px_AGC1AMM(2) | ||
776 | #define STV090x_OFFST_Px_AMM_VALUE_FIELD 0 | ||
777 | #define STV090x_WIDTH_Px_AMM_VALUE_FIELD 8 | ||
778 | |||
779 | #define STV090x_Px_AGC1QUAD(__x) (0xF40D - (__x - 1) * 0x200) | ||
780 | #define STV090x_P1_AGC1QUAD STV090x_Px_AGC1QUAD(1) | ||
781 | #define STV090x_P2_AGC1QUAD STV090x_Px_AGC1QUAD(2) | ||
782 | #define STV090x_OFFST_Px_QUAD_VALUE_FIELD 0 | ||
783 | #define STV090x_WIDTH_Px_QUAD_VALUE_FIELD 8 | ||
784 | |||
785 | #define STV090x_Px_AGCIQINy(__x, __y) (0xF40F - (__x-1) * 0x200 - __y * 0x1) | ||
786 | #define STV090x_P1_AGCIQIN0 STV090x_Px_AGCIQINy(1, 0) | ||
787 | #define STV090x_P1_AGCIQIN1 STV090x_Px_AGCIQINy(1, 1) | ||
788 | #define STV090x_P2_AGCIQIN0 STV090x_Px_AGCIQINy(2, 0) | ||
789 | #define STV090x_P2_AGCIQIN1 STV090x_Px_AGCIQINy(2, 1) | ||
790 | #define STV090x_OFFST_Px_AGCIQ_VALUE_FIELD 0 | ||
791 | #define STV090x_WIDTH_Px_AGCIQ_VALUE_FIELD 8 | ||
792 | |||
793 | #define STV090x_Px_DEMOD(__x) (0xF410 - (__x - 1) * 0x200) | ||
794 | #define STV090x_P1_DEMOD STV090x_Px_DEMOD(1) | ||
795 | #define STV090x_P2_DEMOD STV090x_Px_DEMOD(2) | ||
796 | #define STV090x_OFFST_Px_MANUAL_S2ROLLOFF_FIELD 7 | ||
797 | #define STV090x_WIDTH_Px_MANUAL_S2ROLLOFF_FIELD 1 | ||
798 | #define STV090x_OFFST_Px_DEMOD_STOP_FIELD 6 | ||
799 | #define STV090x_WIDTH_Px_DEMOD_STOP_FIELD 1 | ||
800 | #define STV090x_OFFST_Px_SPECINV_CONTROL_FIELD 4 | ||
801 | #define STV090x_WIDTH_Px_SPECINV_CONTROL_FIELD 2 | ||
802 | #define STV090x_OFFST_Px_FORCE_ENASAMP_FIELD 3 | ||
803 | #define STV090x_WIDTH_Px_FORCE_ENASAMP_FIELD 1 | ||
804 | #define STV090x_OFFST_Px_MANUAL_SXROLLOFF_FIELD 2 | ||
805 | #define STV090x_WIDTH_Px_MANUAL_SXROLLOFF_FIELD 1 | ||
806 | #define STV090x_OFFST_Px_ROLLOFF_CONTROL_FIELD 0 | ||
807 | #define STV090x_WIDTH_Px_ROLLOFF_CONTROL_FIELD 2 | ||
808 | |||
809 | #define STV090x_Px_DMDMODCOD(__x) (0xF411 - (__x - 1) * 0x200) | ||
810 | #define STV090x_P1_DMDMODCOD STV090x_Px_DMDMODCOD(1) | ||
811 | #define STV090x_P2_DMDMODCOD STV090x_Px_DMDMODCOD(2) | ||
812 | #define STV090x_OFFST_Px_MANUAL_MODCOD_FIELD 7 | ||
813 | #define STV090x_WIDTH_Px_MANUAL_MODCOD_FIELD 1 | ||
814 | #define STV090x_OFFST_Px_DEMOD_MODCOD_FIELD 2 | ||
815 | #define STV090x_WIDTH_Px_DEMOD_MODCOD_FIELD 5 | ||
816 | #define STV090x_OFFST_Px_DEMOD_TYPE_FIELD 0 | ||
817 | #define STV090x_WIDTH_Px_DEMOD_TYPE_FIELD 2 | ||
818 | |||
819 | #define STV090x_Px_DSTATUS(__x) (0xF412 - (__x - 1) * 0x200) | ||
820 | #define STV090x_P1_DSTATUS STV090x_Px_DSTATUS(1) | ||
821 | #define STV090x_P2_DSTATUS STV090x_Px_DSTATUS(2) | ||
822 | #define STV090x_OFFST_Px_CAR_LOCK_FIELD 7 | ||
823 | #define STV090x_WIDTH_Px_CAR_LOCK_FIELD 1 | ||
824 | #define STV090x_OFFST_Px_TMGLOCK_QUALITY_FIELD 5 | ||
825 | #define STV090x_WIDTH_Px_TMGLOCK_QUALITY_FIELD 2 | ||
826 | #define STV090x_OFFST_Px_LOCK_DEFINITIF_FIELD 3 | ||
827 | #define STV090x_WIDTH_Px_LOCK_DEFINITIF_FIELD 1 | ||
828 | |||
829 | #define STV090x_Px_DSTATUS2(__x) (0xF413 - (__x - 1) * 0x200) | ||
830 | #define STV090x_P1_DSTATUS2 STV090x_Px_DSTATUS2(1) | ||
831 | #define STV090x_P2_DSTATUS2 STV090x_Px_DSTATUS2(2) | ||
832 | #define STV090x_OFFST_Px_DEMOD_DELOCK_FIELD 7 | ||
833 | #define STV090x_WIDTH_Px_DEMOD_DELOCK_FIELD 1 | ||
834 | #define STV090x_OFFST_Px_AGC1_NOSIGNALACK_FIELD 3 | ||
835 | #define STV090x_WIDTH_Px_AGC1_NOSIGNALACK_FIELD 1 | ||
836 | #define STV090x_OFFST_Px_AGC2_OVERFLOW_FIELD 2 | ||
837 | #define STV090x_WIDTH_Px_AGC2_OVERFLOW_FIELD 1 | ||
838 | #define STV090x_OFFST_Px_CFR_OVERFLOW_FIELD 1 | ||
839 | #define STV090x_WIDTH_Px_CFR_OVERFLOW_FIELD 1 | ||
840 | #define STV090x_OFFST_Px_GAMMA_OVERUNDER_FIELD 0 | ||
841 | #define STV090x_WIDTH_Px_GAMMA_OVERUNDER_FIELD 1 | ||
842 | |||
843 | #define STV090x_Px_DMDCFGMD(__x) (0xF414 - (__x - 1) * 0x200) | ||
844 | #define STV090x_P1_DMDCFGMD STV090x_Px_DMDCFGMD(1) | ||
845 | #define STV090x_P2_DMDCFGMD STV090x_Px_DMDCFGMD(2) | ||
846 | #define STV090x_OFFST_Px_DVBS2_ENABLE_FIELD 7 | ||
847 | #define STV090x_WIDTH_Px_DVBS2_ENABLE_FIELD 1 | ||
848 | #define STV090x_OFFST_Px_DVBS1_ENABLE_FIELD 6 | ||
849 | #define STV090x_WIDTH_Px_DVBS1_ENABLE_FIELD 1 | ||
850 | #define STV090x_OFFST_Px_CFR_AUTOSCAN_FIELD 5 /* check */ | ||
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 | ||
854 | #define STV090x_OFFST_Px_TUN_AUTOSCAN_FIELD 3 | ||
855 | #define STV090x_WIDTH_Px_TUN_AUTOSCAN_FIELD 1 | ||
856 | #define STV090x_OFFST_Px_NOFORCE_RELOCK_FIELD 2 | ||
857 | #define STV090x_WIDTH_Px_NOFORCE_RELOCK_FIELD 1 | ||
858 | #define STV090x_OFFST_Px_TUN_RNG_FIELD 0 | ||
859 | #define STV090x_WIDTH_Px_TUN_RNG_FIELD 2 | ||
860 | |||
861 | #define STV090x_Px_DMDCFG2(__x) (0xF415 - (__x - 1) * 0x200) | ||
862 | #define STV090x_P1_DMDCFG2 STV090x_Px_DMDCFG2(1) | ||
863 | #define STV090x_P2_DMDCFG2 STV090x_Px_DMDCFG2(2) | ||
864 | #define STV090x_OFFST_Px_S1S2_SEQUENTIAL_FIELD 6 | ||
865 | #define STV090x_WIDTH_Px_S1S2_SEQUENTIAL_FIELD 1 | ||
866 | |||
867 | #define STV090x_Px_DMDISTATE(__x) (0xF416 - (__x - 1) * 0x200) | ||
868 | #define STV090x_P1_DMDISTATE STV090x_Px_DMDISTATE(1) | ||
869 | #define STV090x_P2_DMDISTATE STV090x_Px_DMDISTATE(2) | ||
870 | #define STV090x_OFFST_Px_I2C_DEMOD_MODE_FIELD 0 | ||
871 | #define STV090x_WIDTH_Px_I2C_DEMOD_MODE_FIELD 5 | ||
872 | |||
873 | #define STV090x_Px_DMDTOM(__x) (0xF417 - (__x - 1) * 0x200) /* check */ | ||
874 | #define STV090x_P1_DMDTOM STV090x_Px_DMDTOM(1) | ||
875 | #define STV090x_P2_DMDTOM STV090x_Px_DMDTOM(2) | ||
876 | |||
877 | #define STV090x_Px_DMDSTATE(__x) (0xF41B - (__x - 1) * 0x200) | ||
878 | #define STV090x_P1_DMDSTATE STV090x_Px_DMDSTATE(1) | ||
879 | #define STV090x_P2_DMDSTATE STV090x_Px_DMDSTATE(2) | ||
880 | #define STV090x_OFFST_Px_HEADER_MODE_FIELD 5 | ||
881 | #define STV090x_WIDTH_Px_HEADER_MODE_FIELD 2 | ||
882 | |||
883 | #define STV090x_Px_DMDFLYW(__x) (0xF41C - (__x - 1) * 0x200) | ||
884 | #define STV090x_P1_DMDFLYW STV090x_Px_DMDFLYW(1) | ||
885 | #define STV090x_P2_DMDFLYW STV090x_Px_DMDFLYW(2) | ||
886 | #define STV090x_OFFST_Px_I2C_IRQVAL_FIELD 4 | ||
887 | #define STV090x_WIDTH_Px_I2C_IRQVAL_FIELD 4 | ||
888 | #define STV090x_OFFST_Px_FLYWHEEL_CPT_FIELD 0 /* check */ | ||
889 | #define STV090x_WIDTH_Px_FLYWHEEL_CPT_FIELD 4 | ||
890 | |||
891 | #define STV090x_Px_DSTATUS3(__x) (0xF41D - (__x - 1) * 0x200) | ||
892 | #define STV090x_P1_DSTATUS3 STV090x_Px_DSTATUS3(1) | ||
893 | #define STV090x_P2_DSTATUS3 STV090x_Px_DSTATUS3(2) | ||
894 | #define STV090x_OFFST_Px_DEMOD_CFGMODE_FIELD 5 | ||
895 | #define STV090x_WIDTH_Px_DEMOD_CFGMODE_FIELD 2 | ||
896 | |||
897 | #define STV090x_Px_DMDCFG3(__x) (0xF41E - (__x - 1) * 0x200) | ||
898 | #define STV090x_P1_DMDCFG3 STV090x_Px_DMDCFG3(1) | ||
899 | #define STV090x_P2_DMDCFG3 STV090x_Px_DMDCFG3(2) | ||
900 | #define STV090x_OFFST_Px_NOSTOP_FIFOFULL_FIELD 3 | ||
901 | #define STV090x_WIDTH_Px_NOSTOP_FIFOFULL_FIELD 1 | ||
902 | |||
903 | #define STV090x_Px_DMDCFG4(__x) (0xf41f - (__x - 1) * 0x200) | ||
904 | #define STV090x_P1_DMDCFG4 STV090x_Px_DMDCFG4(1) | ||
905 | #define STV090x_P2_DMDCFG4 STV090x_Px_DMDCFG4(2) | ||
906 | |||
907 | #define STV090x_Px_CORRELMANT(__x) (0xF420 - (__x - 1) * 0x200) | ||
908 | #define STV090x_P1_CORRELMANT STV090x_Px_CORRELMANT(1) | ||
909 | #define STV090x_P2_CORRELMANT STV090x_Px_CORRELMANT(2) | ||
910 | #define STV090x_OFFST_Px_CORREL_MANT_FIELD 0 | ||
911 | #define STV090x_WIDTH_Px_CORREL_MANT_FIELD 8 | ||
912 | |||
913 | #define STV090x_Px_CORRELABS(__x) (0xF421 - (__x - 1) * 0x200) | ||
914 | #define STV090x_P1_CORRELABS STV090x_Px_CORRELABS(1) | ||
915 | #define STV090x_P2_CORRELABS STV090x_Px_CORRELABS(2) | ||
916 | #define STV090x_OFFST_Px_CORREL_ABS_FIELD 0 | ||
917 | #define STV090x_WIDTH_Px_CORREL_ABS_FIELD 8 | ||
918 | |||
919 | #define STV090x_Px_CORRELEXP(__x) (0xF422 - (__x - 1) * 0x200) | ||
920 | #define STV090x_P1_CORRELEXP STV090x_Px_CORRELEXP(1) | ||
921 | #define STV090x_P2_CORRELEXP STV090x_Px_CORRELEXP(2) | ||
922 | #define STV090x_OFFST_Px_CORREL_ABSEXP_FIELD 4 | ||
923 | #define STV090x_WIDTH_Px_CORREL_ABSEXP_FIELD 4 | ||
924 | #define STV090x_OFFST_Px_CORREL_EXP_FIELD 0 | ||
925 | #define STV090x_WIDTH_Px_CORREL_EXP_FIELD 4 | ||
926 | |||
927 | #define STV090x_Px_PLHMODCOD(__x) (0xF424 - (__x - 1) * 0x200) | ||
928 | #define STV090x_P1_PLHMODCOD STV090x_Px_PLHMODCOD(1) | ||
929 | #define STV090x_P2_PLHMODCOD STV090x_Px_PLHMODCOD(2) | ||
930 | #define STV090x_OFFST_Px_SPECINV_DEMOD_FIELD 7 | ||
931 | #define STV090x_WIDTH_Px_SPECINV_DEMOD_FIELD 1 | ||
932 | #define STV090x_OFFST_Px_PLH_MODCOD_FIELD 2 | ||
933 | #define STV090x_WIDTH_Px_PLH_MODCOD_FIELD 5 | ||
934 | #define STV090x_OFFST_Px_PLH_TYPE_FIELD 0 | ||
935 | #define STV090x_WIDTH_Px_PLH_TYPE_FIELD 2 | ||
936 | |||
937 | #define STV090x_Px_AGCK32(__x) (0xf42b - (__x - 1) * 0x200) | ||
938 | #define STV090x_P1_AGCK32 STV090x_Px_AGCK32(1) | ||
939 | #define STV090x_P2_AGCK32 STV090x_Px_AGCK32(2) | ||
940 | |||
941 | #define STV090x_Px_AGC2O(__x) (0xF42C - (__x - 1) * 0x200) | ||
942 | #define STV090x_P1_AGC2O STV090x_Px_AGC2O(1) | ||
943 | #define STV090x_P2_AGC2O STV090x_Px_AGC2O(2) | ||
944 | |||
945 | #define STV090x_Px_AGC2REF(__x) (0xF42D - (__x - 1) * 0x200) | ||
946 | #define STV090x_P1_AGC2REF STV090x_Px_AGC2REF(1) | ||
947 | #define STV090x_P2_AGC2REF STV090x_Px_AGC2REF(2) | ||
948 | #define STV090x_OFFST_Px_AGC2_REF_FIELD 0 | ||
949 | #define STV090x_WIDTH_Px_AGC2_REF_FIELD 8 | ||
950 | |||
951 | #define STV090x_Px_AGC1ADJ(__x) (0xF42E - (__x - 1) * 0x200) | ||
952 | #define STV090x_P1_AGC1ADJ STV090x_Px_AGC1ADJ(1) | ||
953 | #define STV090x_P2_AGC1ADJ STV090x_Px_AGC1ADJ(2) | ||
954 | #define STV090x_OFFST_Px_AGC1_ADJUSTED_FIELD 0 | ||
955 | #define STV090x_WIDTH_Px_AGC1_ADJUSTED_FIELD 7 | ||
956 | |||
957 | #define STV090x_Px_AGC2Iy(__x, __y) (0xF437 - (__x - 1) * 0x200 - __y * 0x1) | ||
958 | #define STV090x_P1_AGC2I0 STV090x_Px_AGC2Iy(1, 0) | ||
959 | #define STV090x_P1_AGC2I1 STV090x_Px_AGC2Iy(1, 1) | ||
960 | #define STV090x_P2_AGC2I0 STV090x_Px_AGC2Iy(2, 0) | ||
961 | #define STV090x_P2_AGC2I1 STV090x_Px_AGC2Iy(2, 1) | ||
962 | #define STV090x_OFFST_Px_AGC2_INTEGRATOR_FIELD 0 | ||
963 | #define STV090x_WIDTH_Px_AGC2_INTEGRATOR_FIELD 8 | ||
964 | |||
965 | #define STV090x_Px_CARCFG(__x) (0xF438 - (__x - 1) * 0x200) | ||
966 | #define STV090x_P1_CARCFG STV090x_Px_CARCFG(1) | ||
967 | #define STV090x_P2_CARCFG STV090x_Px_CARCFG(2) | ||
968 | #define STV090x_OFFST_Px_EN_CAR2CENTER_FIELD 5 | ||
969 | #define STV090x_WIDTH_Px_EN_CAR2CENTER_FIELD 1 | ||
970 | #define STV090x_OFFST_Px_ROTATON_FIELD 2 | ||
971 | #define STV090x_WIDTH_Px_ROTATON_FIELD 1 | ||
972 | #define STV090x_OFFST_Px_PH_DET_ALGO_FIELD 0 | ||
973 | #define STV090x_WIDTH_Px_PH_DET_ALGO_FIELD 2 | ||
974 | |||
975 | #define STV090x_Px_ACLC(__x) (0xF439 - (__x - 1) * 0x200) | ||
976 | #define STV090x_P1_ACLC STV090x_Px_ACLC(1) | ||
977 | #define STV090x_P2_ACLC STV090x_Px_ACLC(2) | ||
978 | #define STV090x_OFFST_Px_CAR_ALPHA_MANT_FIELD 4 | ||
979 | #define STV090x_WIDTH_Px_CAR_ALPHA_MANT_FIELD 2 | ||
980 | #define STV090x_OFFST_Px_CAR_ALPHA_EXP_FIELD 0 | ||
981 | #define STV090x_WIDTH_Px_CAR_ALPHA_EXP_FIELD 4 | ||
982 | |||
983 | #define STV090x_Px_BCLC(__x) (0xF43A - (__x - 1) * 0x200) | ||
984 | #define STV090x_P1_BCLC STV090x_Px_BCLC(1) | ||
985 | #define STV090x_P2_BCLC STV090x_Px_BCLC(2) | ||
986 | #define STV090x_OFFST_Px_CAR_BETA_MANT_FIELD 4 | ||
987 | #define STV090x_WIDTH_Px_CAR_BETA_MANT_FIELD 2 | ||
988 | #define STV090x_OFFST_Px_CAR_BETA_EXP_FIELD 0 | ||
989 | #define STV090x_WIDTH_Px_CAR_BETA_EXP_FIELD 4 | ||
990 | |||
991 | #define STV090x_Px_CARFREQ(__x) (0xF43D - (__x - 1) * 0x200) | ||
992 | #define STV090x_P1_CARFREQ STV090x_Px_CARFREQ(1) | ||
993 | #define STV090x_P2_CARFREQ STV090x_Px_CARFREQ(2) | ||
994 | #define STV090x_OFFST_Px_KC_COARSE_EXP_FIELD 4 | ||
995 | #define STV090x_WIDTH_Px_KC_COARSE_EXP_FIELD 4 | ||
996 | #define STV090x_OFFST_Px_BETA_FREQ_FIELD 0 | ||
997 | #define STV090x_WIDTH_Px_BETA_FREQ_FIELD 4 | ||
998 | |||
999 | #define STV090x_Px_CARHDR(__x) (0xF43E - (__x - 1) * 0x200) | ||
1000 | #define STV090x_P1_CARHDR STV090x_Px_CARHDR(1) | ||
1001 | #define STV090x_P2_CARHDR STV090x_Px_CARHDR(2) | ||
1002 | #define STV090x_OFFST_Px_FREQ_HDR_FIELD 0 | ||
1003 | #define STV090x_WIDTH_Px_FREQ_HDR_FIELD 8 | ||
1004 | |||
1005 | #define STV090x_Px_LDT(__x) (0xF43F - (__x - 1) * 0x200) | ||
1006 | #define STV090x_P1_LDT STV090x_Px_LDT(1) | ||
1007 | #define STV090x_P2_LDT STV090x_Px_LDT(2) | ||
1008 | #define STV090x_OFFST_Px_CARLOCK_THRES_FIELD 0 | ||
1009 | #define STV090x_WIDTH_Px_CARLOCK_THRES_FIELD 8 | ||
1010 | |||
1011 | #define STV090x_Px_LDT2(__x) (0xF440 - (__x - 1) * 0x200) | ||
1012 | #define STV090x_P1_LDT2 STV090x_Px_LDT2(1) | ||
1013 | #define STV090x_P2_LDT2 STV090x_Px_LDT2(2) | ||
1014 | #define STV090x_OFFST_Px_CARLOCK_THRES2_FIELD 0 | ||
1015 | #define STV090x_WIDTH_Px_CARLOCK_THRES2_FIELD 8 | ||
1016 | |||
1017 | #define STV090x_Px_CFRICFG(__x) (0xF441 - (__x - 1) * 0x200) | ||
1018 | #define STV090x_P1_CFRICFG STV090x_Px_CFRICFG(1) | ||
1019 | #define STV090x_P2_CFRICFG STV090x_Px_CFRICFG(2) | ||
1020 | #define STV090x_OFFST_Px_NEG_CFRSTEP_FIELD 0 | ||
1021 | #define STV090x_WIDTH_Px_NEG_CFRSTEP_FIELD 1 | ||
1022 | |||
1023 | #define STV090x_Pn_CFRUPy(__x, __y) (0xF443 - (__x - 1) * 0x200 - __y * 0x1) | ||
1024 | #define STV090x_P1_CFRUP0 STV090x_Pn_CFRUPy(1, 0) | ||
1025 | #define STV090x_P1_CFRUP1 STV090x_Pn_CFRUPy(1, 1) | ||
1026 | #define STV090x_P2_CFRUP0 STV090x_Pn_CFRUPy(2, 0) | ||
1027 | #define STV090x_P2_CFRUP1 STV090x_Pn_CFRUPy(2, 1) | ||
1028 | #define STV090x_OFFST_Px_CFR_UP_FIELD 0 | ||
1029 | #define STV090x_WIDTH_Px_CFR_UP_FIELD 8 | ||
1030 | |||
1031 | #define STV090x_Pn_CFRLOWy(__x, __y) (0xF447 - (__x - 1) * 0x200 - __y * 0x1) | ||
1032 | #define STV090x_P1_CFRLOW0 STV090x_Pn_CFRLOWy(1, 0) | ||
1033 | #define STV090x_P1_CFRLOW1 STV090x_Pn_CFRLOWy(1, 1) | ||
1034 | #define STV090x_P2_CFRLOW0 STV090x_Pn_CFRLOWy(2, 0) | ||
1035 | #define STV090x_P2_CFRLOW1 STV090x_Pn_CFRLOWy(2, 1) | ||
1036 | #define STV090x_OFFST_Px_CFR_LOW_FIELD 0 | ||
1037 | #define STV090x_WIDTH_Px_CFR_LOW_FIELD 8 | ||
1038 | |||
1039 | #define STV090x_Pn_CFRINITy(__x, __y) (0xF449 - (__x - 1) * 0x200 - __y * 0x1) | ||
1040 | #define STV090x_P1_CFRINIT0 STV090x_Pn_CFRINITy(1, 0) | ||
1041 | #define STV090x_P1_CFRINIT1 STV090x_Pn_CFRINITy(1, 1) | ||
1042 | #define STV090x_P2_CFRINIT0 STV090x_Pn_CFRINITy(2, 0) | ||
1043 | #define STV090x_P2_CFRINIT1 STV090x_Pn_CFRINITy(2, 1) | ||
1044 | #define STV090x_OFFST_Px_CFR_INIT_FIELD 0 | ||
1045 | #define STV090x_WIDTH_Px_CFR_INIT_FIELD 8 | ||
1046 | |||
1047 | #define STV090x_Px_CFRINC1(__x) (0xF44A - (__x - 1) * 0x200) | ||
1048 | #define STV090x_P1_CFRINC1 STV090x_Px_CFRINC1(1) | ||
1049 | #define STV090x_P2_CFRINC1 STV090x_Px_CFRINC1(2) | ||
1050 | #define STV090x_OFFST_Px_CFR_INC1_FIELD 0 | ||
1051 | #define STV090x_WIDTH_Px_CFR_INC1_FIELD 7 | ||
1052 | |||
1053 | #define STV090x_Px_CFRINC0(__x) (0xF44B - (__x - 1) * 0x200) | ||
1054 | #define STV090x_P1_CFRINC0 STV090x_Px_CFRINC0(1) | ||
1055 | #define STV090x_P2_CFRINC0 STV090x_Px_CFRINC0(2) | ||
1056 | #define STV090x_OFFST_Px_CFR_INC0_FIELD 4 | ||
1057 | #define STV090x_WIDTH_Px_CFR_INC0_FIELD 4 | ||
1058 | |||
1059 | #define STV090x_Pn_CFRy(__x, __y) (0xF44E - (__x - 1) * 0x200 - __y * 0x1) | ||
1060 | #define STV090x_P1_CFR0 STV090x_Pn_CFRy(1, 0) | ||
1061 | #define STV090x_P1_CFR1 STV090x_Pn_CFRy(1, 1) | ||
1062 | #define STV090x_P1_CFR2 STV090x_Pn_CFRy(1, 2) | ||
1063 | #define STV090x_P2_CFR0 STV090x_Pn_CFRy(2, 0) | ||
1064 | #define STV090x_P2_CFR1 STV090x_Pn_CFRy(2, 1) | ||
1065 | #define STV090x_P2_CFR2 STV090x_Pn_CFRy(2, 2) | ||
1066 | #define STV090x_OFFST_Px_CAR_FREQ_FIELD 0 | ||
1067 | #define STV090x_WIDTH_Px_CAR_FREQ_FIELD 8 | ||
1068 | |||
1069 | #define STV090x_Px_LDI(__x) (0xF44F - (__x - 1) * 0x200) | ||
1070 | #define STV090x_P1_LDI STV090x_Px_LDI(1) | ||
1071 | #define STV090x_P2_LDI STV090x_Px_LDI(2) | ||
1072 | #define STV090x_OFFST_Px_LOCK_DET_INTEGR_FIELD 0 | ||
1073 | #define STV090x_WIDTH_Px_LOCK_DET_INTEGR_FIELD 8 | ||
1074 | |||
1075 | #define STV090x_Px_TMGCFG(__x) (0xF450 - (__x - 1) * 0x200) | ||
1076 | #define STV090x_P1_TMGCFG STV090x_Px_TMGCFG(1) | ||
1077 | #define STV090x_P2_TMGCFG STV090x_Px_TMGCFG(2) | ||
1078 | #define STV090x_OFFST_Px_TMGLOCK_BETA_FIELD 6 | ||
1079 | #define STV090x_WIDTH_Px_TMGLOCK_BETA_FIELD 2 | ||
1080 | #define STV090x_OFFST_Px_DO_TIMING_FIELD 4 | ||
1081 | #define STV090x_WIDTH_Px_DO_TIMING_FIELD 1 | ||
1082 | #define STV090x_OFFST_Px_TMG_MINFREQ_FIELD 0 | ||
1083 | #define STV090x_WIDTH_Px_TMG_MINFREQ_FIELD 2 | ||
1084 | |||
1085 | #define STV090x_Px_RTC(__x) (0xF451 - (__x - 1) * 0x200) | ||
1086 | #define STV090x_P1_RTC STV090x_Px_RTC(1) | ||
1087 | #define STV090x_P2_RTC STV090x_Px_RTC(2) | ||
1088 | #define STV090x_OFFST_Px_TMGALPHA_EXP_FIELD 4 | ||
1089 | #define STV090x_WIDTH_Px_TMGALPHA_EXP_FIELD 4 | ||
1090 | #define STV090x_OFFST_Px_TMGBETA_EXP_FIELD 0 | ||
1091 | #define STV090x_WIDTH_Px_TMGBETA_EXP_FIELD 4 | ||
1092 | |||
1093 | #define STV090x_Px_RTCS2(__x) (0xF452 - (__x - 1) * 0x200) | ||
1094 | #define STV090x_P1_RTCS2 STV090x_Px_RTCS2(1) | ||
1095 | #define STV090x_P2_RTCS2 STV090x_Px_RTCS2(2) | ||
1096 | #define STV090x_OFFST_Px_TMGALPHAS2_EXP_FIELD 4 | ||
1097 | #define STV090x_WIDTH_Px_TMGALPHAS2_EXP_FIELD 4 | ||
1098 | #define STV090x_OFFST_Px_TMGBETAS2_EXP_FIELD 0 | ||
1099 | #define STV090x_WIDTH_Px_TMGBETAS2_EXP_FIELD 4 | ||
1100 | |||
1101 | #define STV090x_Px_TMGTHRISE(__x) (0xF453 - (__x - 1) * 0x200) | ||
1102 | #define STV090x_P1_TMGTHRISE STV090x_Px_TMGTHRISE(1) | ||
1103 | #define STV090x_P2_TMGTHRISE STV090x_Px_TMGTHRISE(2) | ||
1104 | #define STV090x_OFFST_Px_TMGLOCK_THRISE_FIELD 0 | ||
1105 | #define STV090x_WIDTH_Px_TMGLOCK_THRISE_FIELD 8 | ||
1106 | |||
1107 | #define STV090x_Px_TMGTHFALL(__x) (0xF454 - (__x - 1) * 0x200) | ||
1108 | #define STV090x_P1_TMGTHFALL STV090x_Px_TMGTHFALL(1) | ||
1109 | #define STV090x_P2_TMGTHFALL STV090x_Px_TMGTHFALL(2) | ||
1110 | #define STV090x_OFFST_Px_TMGLOCK_THFALL_FIELD 0 | ||
1111 | #define STV090x_WIDTH_Px_TMGLOCK_THFALL_FIELD 8 | ||
1112 | |||
1113 | #define STV090x_Px_SFRUPRATIO(__x) (0xF455 - (__x - 1) * 0x200) | ||
1114 | #define STV090x_P1_SFRUPRATIO STV090x_Px_SFRUPRATIO(1) | ||
1115 | #define STV090x_P2_SFRUPRATIO STV090x_Px_SFRUPRATIO(2) | ||
1116 | #define STV090x_OFFST_Px_SFR_UPRATIO_FIELD 0 | ||
1117 | #define STV090x_WIDTH_Px_SFR_UPRATIO_FIELD 8 | ||
1118 | |||
1119 | #define STV090x_Px_SFRLOWRATIO(__x) (0xF456 - (__x - 1) * 0x200) | ||
1120 | #define STV090x_P1_SFRLOWRATIO STV090x_Px_SFRLOWRATIO(1) | ||
1121 | #define STV090x_P2_SFRLOWRATIO STV090x_Px_SFRLOWRATIO(2) | ||
1122 | #define STV090x_OFFST_Px_SFR_LOWRATIO_FIELD 0 | ||
1123 | #define STV090x_WIDTH_Px_SFR_LOWRATIO_FIELD 8 | ||
1124 | |||
1125 | #define STV090x_Px_KREFTMG(__x) (0xF458 - (__x - 1) * 0x200) | ||
1126 | #define STV090x_P1_KREFTMG STV090x_Px_KREFTMG(1) | ||
1127 | #define STV090x_P2_KREFTMG STV090x_Px_KREFTMG(2) | ||
1128 | #define STV090x_OFFST_Px_KREF_TMG_FIELD 0 | ||
1129 | #define STV090x_WIDTH_Px_KREF_TMG_FIELD 8 | ||
1130 | |||
1131 | #define STV090x_Px_SFRSTEP(__x) (0xF459 - (__x - 1) * 0x200) | ||
1132 | #define STV090x_P1_SFRSTEP STV090x_Px_SFRSTEP(1) | ||
1133 | #define STV090x_P2_SFRSTEP STV090x_Px_SFRSTEP(2) | ||
1134 | #define STV090x_OFFST_Px_SFR_SCANSTEP_FIELD 4 | ||
1135 | #define STV090x_WIDTH_Px_SFR_SCANSTEP_FIELD 4 | ||
1136 | #define STV090x_OFFST_Px_SFR_CENTERSTEP_FIELD 0 | ||
1137 | #define STV090x_WIDTH_Px_SFR_CENTERSTEP_FIELD 4 | ||
1138 | |||
1139 | #define STV090x_Px_TMGCFG2(__x) (0xF45A - (__x - 1) * 0x200) | ||
1140 | #define STV090x_P1_TMGCFG2 STV090x_Px_TMGCFG2(1) | ||
1141 | #define STV090x_P2_TMGCFG2 STV090x_Px_TMGCFG2(2) | ||
1142 | #define STV090x_OFFST_Px_SFRRATIO_FINE_FIELD 0 | ||
1143 | #define STV090x_WIDTH_Px_SFRRATIO_FINE_FIELD 1 | ||
1144 | |||
1145 | #define STV090x_Px_SFRINIT1(__x) (0xF45E - (__x - 1) * 0x200) | ||
1146 | #define STV090x_P1_SFRINIT1 STV090x_Px_SFRINIT1(1) | ||
1147 | #define STV090x_P2_SFRINIT1 STV090x_Px_SFRINIT1(2) | ||
1148 | #define STV090x_OFFST_Px_SFR_INIT_FIELD 0 | ||
1149 | #define STV090x_WIDTH_Px_SFR_INIT_FIELD 8 | ||
1150 | |||
1151 | #define STV090x_Px_SFRINIT0(__x) (0xF45F - (__x - 1) * 0x200) | ||
1152 | #define STV090x_P1_SFRINIT0 STV090x_Px_SFRINIT0(1) | ||
1153 | #define STV090x_P2_SFRINIT0 STV090x_Px_SFRINIT0(2) | ||
1154 | #define STV090x_OFFST_Px_SFR_INIT_FIELD 0 | ||
1155 | #define STV090x_WIDTH_Px_SFR_INIT_FIELD 8 | ||
1156 | |||
1157 | #define STV090x_Px_SFRUP1(__x) (0xF460 - (__x - 1) * 0x200) | ||
1158 | #define STV090x_P1_SFRUP1 STV090x_Px_SFRUP1(1) | ||
1159 | #define STV090x_P2_SFRUP1 STV090x_Px_SFRUP1(2) | ||
1160 | #define STV090x_OFFST_Px_SYMB_FREQ_UP1_FIELD 0 | ||
1161 | #define STV090x_WIDTH_Px_SYMB_FREQ_UP1_FIELD 7 | ||
1162 | |||
1163 | #define STV090x_Px_SFRUP0(__x) (0xF461 - (__x - 1) * 0x200) | ||
1164 | #define STV090x_P1_SFRUP0 STV090x_Px_SFRUP0(1) | ||
1165 | #define STV090x_P2_SFRUP0 STV090x_Px_SFRUP0(2) | ||
1166 | #define STV090x_OFFST_Px_SYMB_FREQ_UP0_FIELD 0 | ||
1167 | #define STV090x_WIDTH_Px_SYMB_FREQ_UP0_FIELD 8 | ||
1168 | |||
1169 | #define STV090x_Px_SFRLOW1(__x) (0xF462 - (__x - 1) * 0x200) | ||
1170 | #define STV090x_P1_SFRLOW1 STV090x_Px_SFRLOW1(1) | ||
1171 | #define STV090x_P2_SFRLOW1 STV090x_Px_SFRLOW1(2) | ||
1172 | #define STV090x_OFFST_Px_SYMB_FREQ_LOW1_FIELD 0 | ||
1173 | #define STV090x_WIDTH_Px_SYMB_FREQ_LOW1_FIELD 7 | ||
1174 | |||
1175 | #define STV090x_Px_SFRLOW0(__x) (0xF463 - (__x - 1) * 0x200) | ||
1176 | #define STV090x_P1_SFRLOW0 STV090x_Px_SFRLOW0(1) | ||
1177 | #define STV090x_P2_SFRLOW0 STV090x_Px_SFRLOW0(2) | ||
1178 | #define STV090x_OFFST_Px_SYMB_FREQ_LOW0_FIELD 0 | ||
1179 | #define STV090x_WIDTH_Px_SYMB_FREQ_LOW0_FIELD 8 | ||
1180 | |||
1181 | #define STV090x_Px_SFRy(__x, __y) (0xF464 - (__x-1) * 0x200 + (3 - __y)) | ||
1182 | #define STV090x_P1_SFR0 STV090x_Px_SFRy(1, 0) | ||
1183 | #define STV090x_P1_SFR1 STV090x_Px_SFRy(1, 1) | ||
1184 | #define STV090x_P1_SFR2 STV090x_Px_SFRy(1, 2) | ||
1185 | #define STV090x_P1_SFR3 STV090x_Px_SFRy(1, 3) | ||
1186 | #define STV090x_P2_SFR0 STV090x_Px_SFRy(2, 0) | ||
1187 | #define STV090x_P2_SFR1 STV090x_Px_SFRy(2, 1) | ||
1188 | #define STV090x_P2_SFR2 STV090x_Px_SFRy(2, 2) | ||
1189 | #define STV090x_P2_SFR3 STV090x_Px_SFRy(2, 3) | ||
1190 | #define STV090x_OFFST_Px_SYMB_FREQ_FIELD 0 | ||
1191 | #define STV090x_WIDTH_Px_SYMB_FREQ_FIELD 32 | ||
1192 | |||
1193 | #define STV090x_Px_TMGREG2(__x) (0xF468 - (__x - 1) * 0x200) | ||
1194 | #define STV090x_P1_TMGREG2 STV090x_Px_TMGREG2(1) | ||
1195 | #define STV090x_P2_TMGREG2 STV090x_Px_TMGREG2(2) | ||
1196 | #define STV090x_OFFST_Px_TMGREG_FIELD 0 | ||
1197 | #define STV090x_WIDTH_Px_TMGREG_FIELD 8 | ||
1198 | |||
1199 | #define STV090x_Px_TMGREG1(__x) (0xF469 - (__x - 1) * 0x200) | ||
1200 | #define STV090x_P1_TMGREG1 STV090x_Px_TMGREG1(1) | ||
1201 | #define STV090x_P2_TMGREG1 STV090x_Px_TMGREG1(2) | ||
1202 | #define STV090x_OFFST_Px_TMGREG_FIELD 0 | ||
1203 | #define STV090x_WIDTH_Px_TMGREG_FIELD 8 | ||
1204 | |||
1205 | #define STV090x_Px_TMGREG0(__x) (0xF46A - (__x - 1) * 0x200) | ||
1206 | #define STV090x_P1_TMGREG0 STV090x_Px_TMGREG0(1) | ||
1207 | #define STV090x_P2_TMGREG0 STV090x_Px_TMGREG0(2) | ||
1208 | #define STV090x_OFFST_Px_TMGREG_FIELD 0 | ||
1209 | #define STV090x_WIDTH_Px_TMGREG_FIELD 8 | ||
1210 | |||
1211 | #define STV090x_Px_TMGLOCKy(__x, __y) (0xF46C - (__x - 1) * 0x200 - __y * 0x1) | ||
1212 | #define STV090x_P1_TMGLOCK0 STV090x_Px_TMGLOCKy(1, 0) | ||
1213 | #define STV090x_P1_TMGLOCK1 STV090x_Px_TMGLOCKy(1, 1) | ||
1214 | #define STV090x_P2_TMGLOCK0 STV090x_Px_TMGLOCKy(2, 0) | ||
1215 | #define STV090x_P2_TMGLOCK1 STV090x_Px_TMGLOCKy(2, 1) | ||
1216 | #define STV090x_OFFST_Px_TMGLOCK_LEVEL_FIELD 0 | ||
1217 | #define STV090x_WIDTH_Px_TMGLOCK_LEVEL_FIELD 8 | ||
1218 | |||
1219 | #define STV090x_Px_TMGOBS(__x) (0xF46D - (__x - 1) * 0x200) | ||
1220 | #define STV090x_P1_TMGOBS STV090x_Px_TMGOBS(1) | ||
1221 | #define STV090x_P2_TMGOBS STV090x_Px_TMGOBS(2) | ||
1222 | #define STV090x_OFFST_Px_ROLLOFF_STATUS_FIELD 6 | ||
1223 | #define STV090x_WIDTH_Px_ROLLOFF_STATUS_FIELD 2 | ||
1224 | |||
1225 | #define STV090x_Px_EQUALCFG(__x) (0xF46F - (__x - 1) * 0x200) | ||
1226 | #define STV090x_P1_EQUALCFG STV090x_Px_EQUALCFG(1) | ||
1227 | #define STV090x_P2_EQUALCFG STV090x_Px_EQUALCFG(2) | ||
1228 | #define STV090x_OFFST_Px_EQUAL_ON_FIELD 6 | ||
1229 | #define STV090x_WIDTH_Px_EQUAL_ON_FIELD 1 | ||
1230 | #define STV090x_OFFST_Px_MU_EQUALDFE_FIELD 0 | ||
1231 | #define STV090x_WIDTH_Px_MU_EQUALDFE_FIELD 3 | ||
1232 | |||
1233 | #define STV090x_Px_EQUAIy(__x, __y) (0xf470 - (__x - 1) * 0x200 + (__y - 1)) | ||
1234 | #define STV090x_P1_EQUAI1 STV090x_Px_EQUAIy(1, 1) | ||
1235 | #define STV090x_P1_EQUAI2 STV090x_Px_EQUAIy(1, 2) | ||
1236 | #define STV090x_P1_EQUAI3 STV090x_Px_EQUAIy(1, 3) | ||
1237 | #define STV090x_P1_EQUAI4 STV090x_Px_EQUAIy(1, 4) | ||
1238 | #define STV090x_P1_EQUAI5 STV090x_Px_EQUAIy(1, 5) | ||
1239 | #define STV090x_P1_EQUAI6 STV090x_Px_EQUAIy(1, 6) | ||
1240 | #define STV090x_P1_EQUAI7 STV090x_Px_EQUAIy(1, 7) | ||
1241 | #define STV090x_P1_EQUAI8 STV090x_Px_EQUAIy(1, 8) | ||
1242 | |||
1243 | #define STV090x_P2_EQUAI1 STV090x_Px_EQUAIy(2, 1) | ||
1244 | #define STV090x_P2_EQUAI2 STV090x_Px_EQUAIy(2, 2) | ||
1245 | #define STV090x_P2_EQUAI3 STV090x_Px_EQUAIy(2, 3) | ||
1246 | #define STV090x_P2_EQUAI4 STV090x_Px_EQUAIy(2, 4) | ||
1247 | #define STV090x_P2_EQUAI5 STV090x_Px_EQUAIy(2, 5) | ||
1248 | #define STV090x_P2_EQUAI6 STV090x_Px_EQUAIy(2, 6) | ||
1249 | #define STV090x_P2_EQUAI7 STV090x_Px_EQUAIy(2, 7) | ||
1250 | #define STV090x_P2_EQUAI8 STV090x_Px_EQUAIy(2, 8) | ||
1251 | #define STV090x_OFFST_Px_EQUA_ACCIy_FIELD 0 | ||
1252 | #define STV090x_WIDTH_Px_EQUA_ACCIy_FIELD 8 | ||
1253 | |||
1254 | #define STV090x_Px_EQUAQy(__x, __y) (0xf471 - (__x - 1) * 0x200 + (__y - 1)) | ||
1255 | #define STV090x_P1_EQUAQ1 STV090x_Px_EQUAQy(1, 1) | ||
1256 | #define STV090x_P1_EQUAQ2 STV090x_Px_EQUAQy(1, 2) | ||
1257 | #define STV090x_P1_EQUAQ3 STV090x_Px_EQUAQy(1, 3) | ||
1258 | #define STV090x_P1_EQUAQ4 STV090x_Px_EQUAQy(1, 4) | ||
1259 | #define STV090x_P1_EQUAQ5 STV090x_Px_EQUAQy(1, 5) | ||
1260 | #define STV090x_P1_EQUAQ6 STV090x_Px_EQUAQy(1, 6) | ||
1261 | #define STV090x_P1_EQUAQ7 STV090x_Px_EQUAQy(1, 7) | ||
1262 | #define STV090x_P1_EQUAQ8 STV090x_Px_EQUAQy(1, 8) | ||
1263 | |||
1264 | #define STV090x_P2_EQUAQ1 STV090x_Px_EQUAQy(2, 1) | ||
1265 | #define STV090x_P2_EQUAQ2 STV090x_Px_EQUAQy(2, 2) | ||
1266 | #define STV090x_P2_EQUAQ3 STV090x_Px_EQUAQy(2, 3) | ||
1267 | #define STV090x_P2_EQUAQ4 STV090x_Px_EQUAQy(2, 4) | ||
1268 | #define STV090x_P2_EQUAQ5 STV090x_Px_EQUAQy(2, 5) | ||
1269 | #define STV090x_P2_EQUAQ6 STV090x_Px_EQUAQy(2, 6) | ||
1270 | #define STV090x_P2_EQUAQ7 STV090x_Px_EQUAQy(2, 7) | ||
1271 | #define STV090x_P2_EQUAQ8 STV090x_Px_EQUAQy(2, 8) | ||
1272 | #define STV090x_OFFST_Px_EQUA_ACCQy_FIELD 0 | ||
1273 | #define STV090x_WIDTH_Px_EQUA_ACCQy_FIELD 8 | ||
1274 | |||
1275 | #define STV090x_Px_NNOSDATATy(__x, __y) (0xf481 - (__x - 1) * 0x200 - __y * 0x1) | ||
1276 | #define STV090x_P1_NNOSDATAT0 STV090x_Px_NNOSDATATy(1, 0) | ||
1277 | #define STV090x_P1_NNOSDATAT1 STV090x_Px_NNOSDATATy(1, 1) | ||
1278 | #define STV090x_P2_NNOSDATAT0 STV090x_Px_NNOSDATATy(2, 0) | ||
1279 | #define STV090x_P2_NNOSDATAT1 STV090x_Px_NNOSDATATy(2, 1) | ||
1280 | #define STV090x_OFFST_Px_NOSDATAT_NORMED_FIELD 0 | ||
1281 | #define STV090x_WIDTH_Px_NOSDATAT_NORMED_FIELD 8 | ||
1282 | |||
1283 | #define STV090x_Px_NNOSDATAy(__x, __y) (0xf483 - (__x - 1) * 0x200 - __y * 0x1) | ||
1284 | #define STV090x_P1_NNOSDATA0 STV090x_Px_NNOSDATAy(1, 0) | ||
1285 | #define STV090x_P1_NNOSDATA1 STV090x_Px_NNOSDATAy(1, 1) | ||
1286 | #define STV090x_P2_NNOSDATA0 STV090x_Px_NNOSDATAy(2, 0) | ||
1287 | #define STV090x_P2_NNOSDATA1 STV090x_Px_NNOSDATAy(2, 1) | ||
1288 | #define STV090x_OFFST_Px_NOSDATA_NORMED_FIELD 0 | ||
1289 | #define STV090x_WIDTH_Px_NOSDATA_NORMED_FIELD 8 | ||
1290 | |||
1291 | #define STV090x_Px_NNOSPLHTy(__x, __y) (0xf485 - (__x - 1) * 0x200 - __y * 0x1) | ||
1292 | #define STV090x_P1_NNOSPLHT0 STV090x_Px_NNOSPLHTy(1, 0) | ||
1293 | #define STV090x_P1_NNOSPLHT1 STV090x_Px_NNOSPLHTy(1, 1) | ||
1294 | #define STV090x_P2_NNOSPLHT0 STV090x_Px_NNOSPLHTy(2, 0) | ||
1295 | #define STV090x_P2_NNOSPLHT1 STV090x_Px_NNOSPLHTy(2, 1) | ||
1296 | #define STV090x_OFFST_Px_NOSPLHT_NORMED_FIELD 0 | ||
1297 | #define STV090x_WIDTH_Px_NOSPLHT_NORMED_FIELD 8 | ||
1298 | |||
1299 | #define STV090x_Px_NNOSPLHy(__x, __y) (0xf487 - (__x - 1) * 0x200 - __y * 0x1) | ||
1300 | #define STV090x_P1_NNOSPLH0 STV090x_Px_NNOSPLHy(1, 0) | ||
1301 | #define STV090x_P1_NNOSPLH1 STV090x_Px_NNOSPLHy(1, 1) | ||
1302 | #define STV090x_P2_NNOSPLH0 STV090x_Px_NNOSPLHy(2, 0) | ||
1303 | #define STV090x_P2_NNOSPLH1 STV090x_Px_NNOSPLHy(2, 1) | ||
1304 | #define STV090x_OFFST_Px_NOSPLH_NORMED_FIELD 0 | ||
1305 | #define STV090x_WIDTH_Px_NOSPLH_NORMED_FIELD 8 | ||
1306 | |||
1307 | #define STV090x_Px_NOSDATATy(__x, __y) (0xf489 - (__x - 1) * 0x200 - __y * 0x1) | ||
1308 | #define STV090x_P1_NOSDATAT0 STV090x_Px_NOSDATATy(1, 0) | ||
1309 | #define STV090x_P1_NOSDATAT1 STV090x_Px_NOSDATATy(1, 1) | ||
1310 | #define STV090x_P2_NOSDATAT0 STV090x_Px_NOSDATATy(2, 0) | ||
1311 | #define STV090x_P2_NOSDATAT1 STV090x_Px_NOSDATATy(2, 1) | ||
1312 | #define STV090x_OFFST_Px_NOSDATAT_UNNORMED_FIELD 0 | ||
1313 | #define STV090x_WIDTH_Px_NOSDATAT_UNNORMED_FIELD 8 | ||
1314 | |||
1315 | #define STV090x_Px_NOSDATAy(__x, __y) (0xf48b - (__x - 1) * 0x200 - __y * 0x1) | ||
1316 | #define STV090x_P1_NOSDATA0 STV090x_Px_NOSDATAy(1, 0) | ||
1317 | #define STV090x_P1_NOSDATA1 STV090x_Px_NOSDATAy(1, 1) | ||
1318 | #define STV090x_P2_NOSDATA0 STV090x_Px_NOSDATAy(2, 0) | ||
1319 | #define STV090x_P2_NOSDATA1 STV090x_Px_NOSDATAy(2, 1) | ||
1320 | #define STV090x_OFFST_Px_NOSDATA_UNNORMED_FIELD 0 | ||
1321 | #define STV090x_WIDTH_Px_NOSDATA_UNNORMED_FIELD 8 | ||
1322 | |||
1323 | #define STV090x_Px_NOSPLHTy(__x, __y) (0xf48d - (__x - 1) * 0x200 - __y * 0x1) | ||
1324 | #define STV090x_P1_NOSPLHT0 STV090x_Px_NOSPLHTy(1, 0) | ||
1325 | #define STV090x_P1_NOSPLHT1 STV090x_Px_NOSPLHTy(1, 1) | ||
1326 | #define STV090x_P2_NOSPLHT0 STV090x_Px_NOSPLHTy(2, 0) | ||
1327 | #define STV090x_P2_NOSPLHT1 STV090x_Px_NOSPLHTy(2, 1) | ||
1328 | #define STV090x_OFFST_Px_NOSPLHT_UNNORMED_FIELD 0 | ||
1329 | #define STV090x_WIDTH_Px_NOSPLHT_UNNORMED_FIELD 8 | ||
1330 | |||
1331 | #define STV090x_Px_NOSPLHy(__x, __y) (0xf48f - (__x - 1) * 0x200 - __y * 0x1) | ||
1332 | #define STv090x_P1_NOSPLH0 STV090x_Px_NOSPLHy(1, 0) | ||
1333 | #define STv090x_P1_NOSPLH1 STV090x_Px_NOSPLHy(1, 1) | ||
1334 | #define STv090x_P2_NOSPLH0 STV090x_Px_NOSPLHy(2, 0) | ||
1335 | #define STv090x_P2_NOSPLH1 STV090x_Px_NOSPLHy(2, 1) | ||
1336 | #define STV090x_OFFST_Px_NOSPLH_UNNORMED_FIELD 0 | ||
1337 | #define STV090x_WIDTH_Px_NOSPLH_UNNORMED_FIELD 8 | ||
1338 | |||
1339 | #define STV090x_Px_CAR2CFG(__x) (0xf490 - (__x - 1) * 0x200) | ||
1340 | #define STV090x_P1_CAR2CFG STV090x_Px_CAR2CFG(1) | ||
1341 | #define STV090x_P2_CAR2CFG STV090x_Px_CAR2CFG(2) | ||
1342 | #define STV090x_OFFST_Px_PN4_SELECT_FIELD 6 | ||
1343 | #define STV090x_WIDTH_Px_PN4_SELECT_FIELD 1 | ||
1344 | #define STV090x_OFFST_Px_CFR2_STOPDVBS1_FIELD 5 | ||
1345 | #define STV090x_WIDTH_Px_CFR2_STOPDVBS1_FIELD 1 | ||
1346 | #define STV090x_OFFST_Px_ROTA2ON_FIELD 2 | ||
1347 | #define STV090x_WIDTH_Px_ROTA2ON_FIELD 1 | ||
1348 | #define STV090x_OFFST_Px_PH_DET_ALGO2_FIELD 0 | ||
1349 | #define STV090x_WIDTH_Px_PH_DET_ALGO2_FIELD 2 | ||
1350 | |||
1351 | #define STV090x_Px_ACLC2(__x) (0xf491 - (__x - 1) * 0x200) | ||
1352 | #define STV090x_P1_ACLC2 STV090x_Px_ACLC2(1) | ||
1353 | #define STV090x_P2_ACLC2 STV090x_Px_ACLC2(2) | ||
1354 | #define STV090x_OFFST_Px_CAR2_ALPHA_MANT_FIELD 4 | ||
1355 | #define STV090x_WIDTH_Px_CAR2_ALPHA_MANT_FIELD 2 | ||
1356 | #define STV090x_OFFST_Px_CAR2_ALPHA_EXP_FIELD 0 | ||
1357 | #define STV090x_WIDTH_Px_CAR2_ALPHA_EXP_FIELD 4 | ||
1358 | |||
1359 | #define STV090x_Px_BCLC2(__x) (0xf492 - (__x - 1) * 0x200) | ||
1360 | #define STV090x_P1_BCLC2 STV090x_Px_BCLC2(1) | ||
1361 | #define STV090x_P2_BCLC2 STV090x_Px_BCLC2(2) | ||
1362 | #define STV090x_OFFST_Px_CAR2_BETA_MANT_FIELD 4 | ||
1363 | #define STV090x_WIDTH_Px_CAR2_BETA_MANT_FIELD 2 | ||
1364 | #define STV090x_OFFST_Px_CAR2_BETA_EXP_FIELD 0 | ||
1365 | #define STV090x_WIDTH_Px_CAR2_BETA_EXP_FIELD 4 | ||
1366 | |||
1367 | #define STV090x_Px_ACLC2S2Q(__x) (0xf497 - (__x - 1) * 0x200) | ||
1368 | #define STV090x_P1_ACLC2S2Q STV090x_Px_ACLC2S2Q(1) | ||
1369 | #define STV090x_P2_ACLC2S2Q STV090x_Px_ACLC2S2Q(2) | ||
1370 | #define STV090x_OFFST_Px_ENAB_SPSKSYMB_FIELD 7 | ||
1371 | #define STV090x_WIDTH_Px_ENAB_SPSKSYMB_FIELD 1 | ||
1372 | #define STV090x_OFFST_Px_CAR2S2_Q_ALPH_M_FIELD 4 | ||
1373 | #define STV090x_WIDTH_Px_CAR2S2_Q_ALPH_M_FIELD 2 | ||
1374 | #define STV090x_OFFST_Px_CAR2S2_Q_ALPH_E_FIELD 0 | ||
1375 | #define STV090x_WIDTH_Px_CAR2S2_Q_ALPH_E_FIELD 4 | ||
1376 | |||
1377 | #define STV090x_Px_ACLC2S28(__x) (0xf498 - (__x - 1) * 0x200) | ||
1378 | #define STV090x_P1_ACLC2S28 STV090x_Px_ACLC2S28(1) | ||
1379 | #define STV090x_P2_ACLC2S28 STV090x_Px_ACLC2S28(2) | ||
1380 | #define STV090x_OFFST_Px_CAR2S2_8_ALPH_M_FIELD 4 | ||
1381 | #define STV090x_WIDTH_Px_CAR2S2_8_ALPH_M_FIELD 2 | ||
1382 | #define STV090x_OFFST_Px_CAR2S2_8_ALPH_E_FIELD 0 | ||
1383 | #define STV090x_WIDTH_Px_CAR2S2_8_ALPH_E_FIELD 4 | ||
1384 | |||
1385 | #define STV090x_Px_ACLC2S216A(__x) (0xf499 - (__x - 1) * 0x200) | ||
1386 | #define STV090x_P1_ACLC2S216A STV090x_Px_ACLC2S216A(1) | ||
1387 | #define STV090x_P2_ACLC2S216A STV090x_Px_ACLC2S216A(2) | ||
1388 | #define STV090x_OFFST_Px_CAR2S2_16A_ALPH_M_FIELD 4 | ||
1389 | #define STV090x_WIDTH_Px_CAR2S2_16A_ALPH_M_FIELD 2 | ||
1390 | #define STV090x_OFFST_Px_CAR2S2_16A_ALPH_E_FIELD 0 | ||
1391 | #define STV090x_WIDTH_Px_CAR2S2_16A_ALPH_E_FIELD 4 | ||
1392 | |||
1393 | #define STV090x_Px_ACLC2S232A(__x) (0xf499 - (__x - 1) * 0x200) | ||
1394 | #define STV090x_P1_ACLC2S232A STV090x_Px_ACLC2S232A(1) | ||
1395 | #define STV090x_P2_ACLC2S232A STV090x_Px_ACLC2S232A(2) | ||
1396 | #define STV090x_OFFST_Px_CAR2S2_32A_ALPH_M_FIELD 4 | ||
1397 | #define STV090x_WIDTH_Px_CAR2S2_32A_ALPH_M_FIELD 2 | ||
1398 | #define STV090x_OFFST_Px_CAR2S2_32A_ALPH_E_FIELD 0 | ||
1399 | #define STV090x_WIDTH_Px_CAR2S2_32A_ALPH_E_FIELD 4 | ||
1400 | |||
1401 | #define STV090x_Px_BCLC2S2Q(__x) (0xf49c - (__x - 1) * 0x200) | ||
1402 | #define STV090x_P1_BCLC2S2Q STV090x_Px_BCLC2S2Q(1) | ||
1403 | #define STV090x_P2_BCLC2S2Q STV090x_Px_BCLC2S2Q(2) | ||
1404 | #define STV090x_OFFST_Px_CAR2S2_Q_BETA_M_FIELD 4 | ||
1405 | #define STV090x_WIDTH_Px_CAR2S2_Q_BETA_M_FIELD 2 | ||
1406 | #define STV090x_OFFST_Px_CAR2S2_Q_BETA_E_FIELD 0 | ||
1407 | #define STV090x_WIDTH_Px_CAR2S2_Q_BETA_E_FIELD 4 | ||
1408 | |||
1409 | #define STV090x_Px_BCLC2S28(__x) (0xf49d - (__x - 1) * 0x200) | ||
1410 | #define STV090x_P1_BCLC2S28 STV090x_Px_BCLC2S28(1) | ||
1411 | #define STV090x_P2_BCLC2S28 STV090x_Px_BCLC2S28(1) | ||
1412 | #define STV090x_OFFST_Px_CAR2S2_8_BETA_M_FIELD 4 | ||
1413 | #define STV090x_WIDTH_Px_CAR2S2_8_BETA_M_FIELD 2 | ||
1414 | #define STV090x_OFFST_Px_CAR2S2_8_BETA_E_FIELD 0 | ||
1415 | #define STV090x_WIDTH_Px_CAR2S2_8_BETA_E_FIELD 4 | ||
1416 | |||
1417 | #define STV090x_Px_BCLC2S216A(__x) (0xf49d - (__x - 1) * 0x200) | ||
1418 | #define STV090x_P1_BCLC2S216A STV090x_Px_BCLC2S216A(1) | ||
1419 | #define STV090x_P2_BCLC2S216A STV090x_Px_BCLC2S216A(1) | ||
1420 | #define STV090x_OFFST_Px_CAR2S2_16A_BETA_M_FIELD 4 | ||
1421 | #define STV090x_WIDTH_Px_CAR2S2_16A_BETA_M_FIELD 2 | ||
1422 | #define STV090x_OFFST_Px_CAR2S2_16A_BETA_E_FIELD 0 | ||
1423 | #define STV090x_WIDTH_Px_CAR2S2_16A_BETA_E_FIELD 4 | ||
1424 | |||
1425 | #define STV090x_Px_BCLC2S232A(__x) (0xf49d - (__x - 1) * 0x200) | ||
1426 | #define STV090x_P1_BCLC2S232A STV090x_Px_BCLC2S232A(1) | ||
1427 | #define STV090x_P2_BCLC2S232A STV090x_Px_BCLC2S232A(1) | ||
1428 | #define STV090x_OFFST_Px_CAR2S2_32A_BETA_M_FIELD 4 | ||
1429 | #define STV090x_WIDTH_Px_CAR2S2_32A_BETA_M_FIELD 2 | ||
1430 | #define STV090x_OFFST_Px_CAR2S2_32A_BETA_E_FIELD 0 | ||
1431 | #define STV090x_WIDTH_Px_CAR2S2_32A_BETA_E_FIELD 4 | ||
1432 | |||
1433 | #define STV090x_Px_PLROOT2(__x) (0xf4ac - (__x - 1) * 0x200) | ||
1434 | #define STV090x_P1_PLROOT2 STV090x_Px_PLROOT2(1) | ||
1435 | #define STV090x_P2_PLROOT2 STV090x_Px_PLROOT2(2) | ||
1436 | #define STV090x_OFFST_Px_PLSCRAMB_MODE_FIELD 2 | ||
1437 | #define STV090x_WIDTH_Px_PLSCRAMB_MODE_FIELD 2 | ||
1438 | #define STV090x_OFFST_Px_PLSCRAMB_ROOT_FIELD 0 | ||
1439 | #define STV090x_WIDTH_Px_PLSCRAMB_ROOT_FIELD 2 | ||
1440 | |||
1441 | #define STV090x_Px_PLROOT1(__x) (0xf4ad - (__x - 1) * 0x200) | ||
1442 | #define STV090x_P1_PLROOT1 STV090x_Px_PLROOT1(1) | ||
1443 | #define STV090x_P2_PLROOT1 STV090x_Px_PLROOT1(2) | ||
1444 | #define STV090x_OFFST_Px_PLSCRAMB_ROOT1_FIELD 0 | ||
1445 | #define STV090x_WIDTH_Px_PLSCRAMB_ROOT1_FIELD 8 | ||
1446 | |||
1447 | #define STV090x_Px_PLROOT0(__x) (0xf4ae - (__x - 1) * 0x200) | ||
1448 | #define STV090x_P1_PLROOT0 STV090x_Px_PLROOT0(1) | ||
1449 | #define STV090x_P2_PLROOT0 STV090x_Px_PLROOT0(2) | ||
1450 | #define STV090x_OFFST_Px_PLSCRAMB_ROOT0_FIELD 0 | ||
1451 | #define STV090x_WIDTH_Px_PLSCRAMB_ROOT0_FIELD 8 | ||
1452 | |||
1453 | #define STV090x_Px_MODCODLST0(__x) (0xf4b0 - (__x - 1) * 0x200) /* check */ | ||
1454 | #define STV090x_P1_MODCODLST0 STV090x_Px_MODCODLST0(1) | ||
1455 | #define STV090x_P2_MODCODLST0 STV090x_Px_MODCODLST0(2) | ||
1456 | |||
1457 | #define STV090x_Px_MODCODLST1(__x) (0xf4b1 - (__x - 1) * 0x200) | ||
1458 | #define STV090x_P1_MODCODLST1 STV090x_Px_MODCODLST1(1) | ||
1459 | #define STV090x_P2_MODCODLST1 STV090x_Px_MODCODLST1(2) | ||
1460 | #define STV090x_OFFST_Px_DIS_MODCOD29_FIELD 4 | ||
1461 | #define STV090x_WIDTH_Px_DIS_MODCOD29T_FIELD 4 | ||
1462 | #define STV090x_OFFST_Px_DIS_32PSK_9_10_FIELD 0 | ||
1463 | #define STV090x_WIDTH_Px_DIS_32PSK_9_10_FIELD 4 | ||
1464 | |||
1465 | #define STV090x_Px_MODCODLST2(__x) (0xf4b2 - (__x - 1) * 0x200) | ||
1466 | #define STV090x_P1_MODCODLST2 STV090x_Px_MODCODLST2(1) | ||
1467 | #define STV090x_P2_MODCODLST2 STV090x_Px_MODCODLST2(2) | ||
1468 | #define STV090x_OFFST_Px_DIS_32PSK_8_9_FIELD 4 | ||
1469 | #define STV090x_WIDTH_Px_DIS_32PSK_8_9_FIELD 4 | ||
1470 | #define STV090x_OFFST_Px_DIS_32PSK_5_6_FIELD 0 | ||
1471 | #define STV090x_WIDTH_Px_DIS_32PSK_5_6_FIELD 4 | ||
1472 | |||
1473 | #define STV090x_Px_MODCODLST3(__x) (0xf4b3 - (__x - 1) * 0x200) | ||
1474 | #define STV090x_P1_MODCODLST3 STV090x_Px_MODCODLST3(1) | ||
1475 | #define STV090x_P2_MODCODLST3 STV090x_Px_MODCODLST3(2) | ||
1476 | #define STV090x_OFFST_Px_DIS_32PSK_4_5_FIELD 4 | ||
1477 | #define STV090x_WIDTH_Px_DIS_32PSK_4_5_FIELD 4 | ||
1478 | #define STV090x_OFFST_Px_DIS_32PSK_3_4_FIELD 0 | ||
1479 | #define STV090x_WIDTH_Px_DIS_32PSK_3_4_FIELD 4 | ||
1480 | |||
1481 | #define STV090x_Px_MODCODLST4(__x) (0xf4b4 - (__x - 1) * 0x200) | ||
1482 | #define STV090x_P1_MODCODLST4 STV090x_Px_MODCODLST4(1) | ||
1483 | #define STV090x_P2_MODCODLST4 STV090x_Px_MODCODLST4(2) | ||
1484 | #define STV090x_OFFST_Px_DIS_16PSK_9_10_FIELD 4 | ||
1485 | #define STV090x_WIDTH_Px_DIS_16PSK_9_10_FIELD 4 | ||
1486 | #define STV090x_OFFST_Px_DIS_16PSK_8_9_FIELD 0 | ||
1487 | #define STV090x_WIDTH_Px_DIS_16PSK_8_9_FIELD 4 | ||
1488 | |||
1489 | #define STV090x_Px_MODCODLST5(__x) (0xf4b5 - (__x - 1) * 0x200) | ||
1490 | #define STV090x_P1_MODCODLST5 STV090x_Px_MODCODLST5(1) | ||
1491 | #define STV090x_P2_MODCODLST5 STV090x_Px_MODCODLST5(2) | ||
1492 | #define STV090x_OFFST_Px_DIS_16PSK_5_6_FIELD 4 | ||
1493 | #define STV090x_WIDTH_Px_DIS_16PSK_5_6_FIELD 4 | ||
1494 | #define STV090x_OFFST_Px_DIS_16PSK_4_5_FIELD 0 | ||
1495 | #define STV090x_WIDTH_Px_DIS_16PSK_4_5_FIELD 4 | ||
1496 | |||
1497 | #define STV090x_Px_MODCODLST6(__x) (0xf4b6 - (__x - 1) * 0x200) | ||
1498 | #define STV090x_P1_MODCODLST6 STV090x_Px_MODCODLST6(1) | ||
1499 | #define STV090x_P2_MODCODLST6 STV090x_Px_MODCODLST6(2) | ||
1500 | #define STV090x_OFFST_Px_DIS_16PSK_3_4_FIELD 4 | ||
1501 | #define STV090x_WIDTH_Px_DIS_16PSK_3_4_FIELD 4 | ||
1502 | #define STV090x_OFFST_Px_DIS_16PSK_2_3_FIELD 0 | ||
1503 | #define STV090x_WIDTH_Px_DIS_16PSK_2_3_FIELD 4 | ||
1504 | |||
1505 | #define STV090x_Px_MODCODLST7(__x) (0xf4b7 - (__x - 1) * 0x200) | ||
1506 | #define STV090x_P1_MODCODLST7 STV090x_Px_MODCODLST7(1) | ||
1507 | #define STV090x_P2_MODCODLST7 STV090x_Px_MODCODLST7(2) | ||
1508 | #define STV090x_OFFST_Px_DIS_8P_9_10_FIELD 4 | ||
1509 | #define STV090x_WIDTH_Px_DIS_8P_9_10_FIELD 4 | ||
1510 | #define STV090x_OFFST_Px_DIS_8P_8_9_FIELD 0 | ||
1511 | #define STV090x_WIDTH_Px_DIS_8P_8_9_FIELD 4 | ||
1512 | |||
1513 | #define STV090x_Px_MODCODLST8(__x) (0xf4b8 - (__x - 1) * 0x200) | ||
1514 | #define STV090x_P1_MODCODLST8 STV090x_Px_MODCODLST8(1) | ||
1515 | #define STV090x_P2_MODCODLST8 STV090x_Px_MODCODLST8(2) | ||
1516 | #define STV090x_OFFST_Px_DIS_8P_5_6_FIELD 4 | ||
1517 | #define STV090x_WIDTH_Px_DIS_8P_5_6_FIELD 4 | ||
1518 | #define STV090x_OFFST_Px_DIS_8P_3_4_FIELD 0 | ||
1519 | #define STV090x_WIDTH_Px_DIS_8P_3_4_FIELD 4 | ||
1520 | |||
1521 | #define STV090x_Px_MODCODLST9(__x) (0xf4b9 - (__x - 1) * 0x200) | ||
1522 | #define STV090x_P1_MODCODLST9 STV090x_Px_MODCODLST9(1) | ||
1523 | #define STV090x_P2_MODCODLST9 STV090x_Px_MODCODLST9(2) | ||
1524 | #define STV090x_OFFST_Px_DIS_8P_2_3_FIELD 4 | ||
1525 | #define STV090x_WIDTH_Px_DIS_8P_2_3_FIELD 4 | ||
1526 | #define STV090x_OFFST_Px_DIS_8P_3_5_FIELD 0 | ||
1527 | #define STV090x_WIDTH_Px_DIS_8P_3_5_FIELD 4 | ||
1528 | |||
1529 | #define STV090x_Px_MODCODLSTA(__x) (0xf4ba - (__x - 1) * 0x200) | ||
1530 | #define STV090x_P1_MODCODLSTA STV090x_Px_MODCODLSTA(1) | ||
1531 | #define STV090x_P2_MODCODLSTA STV090x_Px_MODCODLSTA(2) | ||
1532 | #define STV090x_OFFST_Px_DIS_QP_9_10_FIELD 4 | ||
1533 | #define STV090x_WIDTH_Px_DIS_QP_9_10_FIELD 4 | ||
1534 | #define STV090x_OFFST_Px_DIS_QP_8_9_FIELD 0 | ||
1535 | #define STV090x_WIDTH_Px_DIS_QP_8_9_FIELD 4 | ||
1536 | |||
1537 | #define STV090x_Px_MODCODLSTB(__x) (0xf4bb - (__x - 1) * 0x200) | ||
1538 | #define STV090x_P1_MODCODLSTB STV090x_Px_MODCODLSTB(1) | ||
1539 | #define STV090x_P2_MODCODLSTB STV090x_Px_MODCODLSTB(2) | ||
1540 | #define STV090x_OFFST_Px_DIS_QP_5_6_FIELD 4 | ||
1541 | #define STV090x_WIDTH_Px_DIS_QP_5_6_FIELD 4 | ||
1542 | #define STV090x_OFFST_Px_DIS_QP_4_5_FIELD 0 | ||
1543 | #define STV090x_WIDTH_Px_DIS_QP_4_5_FIELD 4 | ||
1544 | |||
1545 | #define STV090x_Px_MODCODLSTC(__x) (0xf4bc - (__x - 1) * 0x200) | ||
1546 | #define STV090x_P1_MODCODLSTC STV090x_Px_MODCODLSTC(1) | ||
1547 | #define STV090x_P2_MODCODLSTC STV090x_Px_MODCODLSTC(2) | ||
1548 | #define STV090x_OFFST_Px_DIS_QP_3_4_FIELD 4 | ||
1549 | #define STV090x_WIDTH_Px_DIS_QP_3_4_FIELD 4 | ||
1550 | #define STV090x_OFFST_Px_DIS_QP_2_3_FIELD 0 | ||
1551 | #define STV090x_WIDTH_Px_DIS_QP_2_3_FIELD 4 | ||
1552 | |||
1553 | #define STV090x_Px_MODCODLSTD(__x) (0xf4bd - (__x - 1) * 0x200) | ||
1554 | #define STV090x_P1_MODCODLSTD STV090x_Px_MODCODLSTD(1) | ||
1555 | #define STV090x_P2_MODCODLSTD STV090x_Px_MODCODLSTD(2) | ||
1556 | #define STV090x_OFFST_Px_DIS_QP_3_5_FIELD 4 | ||
1557 | #define STV090x_WIDTH_Px_DIS_QP_3_5_FIELD 4 | ||
1558 | #define STV090x_OFFST_Px_DIS_QP_1_2_FIELD 0 | ||
1559 | #define STV090x_WIDTH_Px_DIS_QP_1_2_FIELD 4 | ||
1560 | |||
1561 | #define STV090x_Px_MODCODLSTE(__x) (0xf4be - (__x - 1) * 0x200) | ||
1562 | #define STV090x_P1_MODCODLSTE STV090x_Px_MODCODLSTE(1) | ||
1563 | #define STV090x_P2_MODCODLSTE STV090x_Px_MODCODLSTE(2) | ||
1564 | #define STV090x_OFFST_Px_DIS_QP_2_5_FIELD 4 | ||
1565 | #define STV090x_WIDTH_Px_DIS_QP_2_5_FIELD 4 | ||
1566 | #define STV090x_OFFST_Px_DIS_QP_1_3_FIELD 0 | ||
1567 | #define STV090x_WIDTH_Px_DIS_QP_1_3_FIELD 4 | ||
1568 | |||
1569 | #define STV090x_Px_MODCODLSTF(__x) (0xf4bf - (__x - 1) * 0x200) | ||
1570 | #define STV090x_P1_MODCODLSTF STV090x_Px_MODCODLSTF(1) | ||
1571 | #define STV090x_P2_MODCODLSTF STV090x_Px_MODCODLSTF(2) | ||
1572 | #define STV090x_OFFST_Px_DIS_QP_1_4_FIELD 4 | ||
1573 | #define STV090x_WIDTH_Px_DIS_QP_1_4_FIELD 4 | ||
1574 | |||
1575 | #define STV090x_Px_GAUSSR0(__x) (0xf4c0 - (__x - 1) * 0x200) | ||
1576 | #define STV090x_P1_GAUSSR0 STV090x_Px_GAUSSR0(1) | ||
1577 | #define STV090x_P2_GAUSSR0 STV090x_Px_GAUSSR0(2) | ||
1578 | #define STV090x_OFFST_Px_EN_CCIMODE_FIELD 7 | ||
1579 | #define STV090x_WIDTH_Px_EN_CCIMODE_FIELD 1 | ||
1580 | #define STV090x_OFFST_Px_R0_GAUSSIEN_FIELD 0 | ||
1581 | #define STV090x_WIDTH_Px_R0_GAUSSIEN_FIELD 7 | ||
1582 | |||
1583 | #define STV090x_Px_CCIR0(__x) (0xf4c1 - (__x - 1) * 0x200) | ||
1584 | #define STV090x_P1_CCIR0 STV090x_Px_CCIR0(1) | ||
1585 | #define STV090x_P2_CCIR0 STV090x_Px_CCIR0(2) | ||
1586 | #define STV090x_OFFST_Px_CCIDETECT_PLH_FIELD 7 | ||
1587 | #define STV090x_WIDTH_Px_CCIDETECT_PLH_FIELD 1 | ||
1588 | #define STV090x_OFFST_Px_R0_CCI_FIELD 0 | ||
1589 | #define STV090x_WIDTH_Px_R0_CCI_FIELD 7 | ||
1590 | |||
1591 | #define STV090x_Px_CCIQUANT(__x) (0xf4c2 - (__x - 1) * 0x200) | ||
1592 | #define STV090x_P1_CCIQUANT STV090x_Px_CCIQUANT(1) | ||
1593 | #define STV090x_P2_CCIQUANT STV090x_Px_CCIQUANT(2) | ||
1594 | #define STV090x_OFFST_Px_CCI_BETA_FIELD 5 | ||
1595 | #define STV090x_WIDTH_Px_CCI_BETA_FIELD 3 | ||
1596 | #define STV090x_OFFST_Px_CCI_QUANT_FIELD 0 | ||
1597 | #define STV090x_WIDTH_Px_CCI_QUANT_FIELD 5 | ||
1598 | |||
1599 | #define STV090x_Px_CCITHRESH(__x) (0xf4c3 - (__x - 1) * 0x200) | ||
1600 | #define STV090x_P1_CCITHRESH STV090x_Px_CCITHRESH(1) | ||
1601 | #define STV090x_P2_CCITHRESH STV090x_Px_CCITHRESH(2) | ||
1602 | #define STV090x_OFFST_Px_CCI_THRESHOLD_FIELD 0 | ||
1603 | #define STV090x_WIDTH_Px_CCI_THRESHOLD_FIELD 8 | ||
1604 | |||
1605 | #define STV090x_Px_CCIACC(__x) (0xf4c4 - (__x - 1) * 0x200) | ||
1606 | #define STV090x_P1_CCIACC STV090x_Px_CCIACC(1) | ||
1607 | #define STV090x_P2_CCIACC STV090x_Px_CCIACC(1) | ||
1608 | #define STV090x_OFFST_Px_CCI_VALUE_FIELD 0 | ||
1609 | #define STV090x_WIDTH_Px_CCI_VALUE_FIELD 8 | ||
1610 | |||
1611 | #define STV090x_Px_DMDRESCFG(__x) (0xF4C6 - (__x - 1) * 0x200) | ||
1612 | #define STV090x_P1_DMDRESCFG STV090x_Px_DMDRESCFG(1) | ||
1613 | #define STV090x_P2_DMDRESCFG STV090x_Px_DMDRESCFG(2) | ||
1614 | #define STV090x_OFFST_Px_DMDRES_RESET_FIELD 7 | ||
1615 | #define STV090x_WIDTH_Px_DMDRES_RESET_FIELD 1 | ||
1616 | |||
1617 | #define STV090x_Px_DMDRESADR(__x) (0xF4C7 - (__x - 1) * 0x200) | ||
1618 | #define STV090x_P1_DMDRESADR STV090x_Px_DMDRESADR(1) | ||
1619 | #define STV090x_P2_DMDRESADR STV090x_Px_DMDRESADR(2) | ||
1620 | #define STV090x_OFFST_Px_DMDRES_RESNBR_FIELD 0 | ||
1621 | #define STV090x_WIDTH_Px_DMDRES_RESNBR_FIELD 4 | ||
1622 | |||
1623 | #define STV090x_Px_DMDRESDATAy(__x, __y) (0xF4C8 - (__x - 1) * 0x200 + (7 - __y)) | ||
1624 | #define STV090x_P1_DMDRESDATA0 STV090x_Px_DMDRESDATAy(1, 0) | ||
1625 | #define STV090x_P1_DMDRESDATA1 STV090x_Px_DMDRESDATAy(1, 1) | ||
1626 | #define STV090x_P1_DMDRESDATA2 STV090x_Px_DMDRESDATAy(1, 2) | ||
1627 | #define STV090x_P1_DMDRESDATA3 STV090x_Px_DMDRESDATAy(1, 3) | ||
1628 | #define STV090x_P1_DMDRESDATA4 STV090x_Px_DMDRESDATAy(1, 4) | ||
1629 | #define STV090x_P1_DMDRESDATA5 STV090x_Px_DMDRESDATAy(1, 5) | ||
1630 | #define STV090x_P1_DMDRESDATA6 STV090x_Px_DMDRESDATAy(1, 6) | ||
1631 | #define STV090x_P1_DMDRESDATA7 STV090x_Px_DMDRESDATAy(1, 7) | ||
1632 | #define STV090x_P2_DMDRESDATA0 STV090x_Px_DMDRESDATAy(2, 0) | ||
1633 | #define STV090x_P2_DMDRESDATA1 STV090x_Px_DMDRESDATAy(2, 1) | ||
1634 | #define STV090x_P2_DMDRESDATA2 STV090x_Px_DMDRESDATAy(2, 2) | ||
1635 | #define STV090x_P2_DMDRESDATA3 STV090x_Px_DMDRESDATAy(2, 3) | ||
1636 | #define STV090x_P2_DMDRESDATA4 STV090x_Px_DMDRESDATAy(2, 4) | ||
1637 | #define STV090x_P2_DMDRESDATA5 STV090x_Px_DMDRESDATAy(2, 5) | ||
1638 | #define STV090x_P2_DMDRESDATA6 STV090x_Px_DMDRESDATAy(2, 6) | ||
1639 | #define STV090x_P2_DMDRESDATA7 STV090x_Px_DMDRESDATAy(2, 7) | ||
1640 | #define STV090x_OFFST_Px_DMDRES_DATA_FIELD 0 | ||
1641 | #define STV090x_WIDTH_Px_DMDRES_DATA_FIELD 8 | ||
1642 | |||
1643 | #define STV090x_Px_FFEIy(__x, __y) (0xf4d0 - (__x - 1) * 0x200 + 0x2 * (__y - 1)) | ||
1644 | #define STV090x_P1_FFEI1 STV090x_Px_FFEIy(1, 1) | ||
1645 | #define STV090x_P1_FFEI2 STV090x_Px_FFEIy(1, 2) | ||
1646 | #define STV090x_P1_FFEI3 STV090x_Px_FFEIy(1, 3) | ||
1647 | #define STV090x_P1_FFEI4 STV090x_Px_FFEIy(1, 4) | ||
1648 | #define STV090x_P2_FFEI1 STV090x_Px_FFEIy(2, 1) | ||
1649 | #define STV090x_P2_FFEI2 STV090x_Px_FFEIy(2, 2) | ||
1650 | #define STV090x_P2_FFEI3 STV090x_Px_FFEIy(2, 3) | ||
1651 | #define STV090x_P2_FFEI4 STV090x_Px_FFEIy(2, 4) | ||
1652 | #define STV090x_OFFST_Px_FFE_ACCIy_FIELD 0 | ||
1653 | #define STV090x_WIDTH_Px_FFE_ACCIy_FIELD 8 | ||
1654 | |||
1655 | #define STV090x_Px_FFEQy(__x, __y) (0xf4d1 - (__x - 1) * 0x200 + 0x2 * (__y - 1)) | ||
1656 | #define STV090x_P1_FFEQ1 STV090x_Px_FFEQy(1, 1) | ||
1657 | #define STV090x_P1_FFEQ2 STV090x_Px_FFEQy(1, 2) | ||
1658 | #define STV090x_P1_FFEQ3 STV090x_Px_FFEQy(1, 3) | ||
1659 | #define STV090x_P1_FFEQ4 STV090x_Px_FFEQy(1, 4) | ||
1660 | #define STV090x_P2_FFEQ1 STV090x_Px_FFEQy(2, 1) | ||
1661 | #define STV090x_P2_FFEQ2 STV090x_Px_FFEQy(2, 2) | ||
1662 | #define STV090x_P2_FFEQ3 STV090x_Px_FFEQy(2, 3) | ||
1663 | #define STV090x_P2_FFEQ4 STV090x_Px_FFEQy(2, 4) | ||
1664 | #define STV090x_OFFST_Px_FFE_ACCQy_FIELD 0 | ||
1665 | #define STV090x_WIDTH_Px_FFE_ACCQy_FIELD 8 | ||
1666 | |||
1667 | #define STV090x_Px_FFECFG(__x) (0xf4d8 - (__x - 1) * 0x200) | ||
1668 | #define STV090x_P1_FFECFG STV090x_Px_FFECFG(1) | ||
1669 | #define STV090x_P2_FFECFG STV090x_Px_FFECFG(2) | ||
1670 | #define STV090x_OFFST_Px_EQUALFFE_ON_FIELD 6 | ||
1671 | #define STV090x_WIDTH_Px_EQUALFFE_ON_FIELD 1 | ||
1672 | |||
1673 | #define STV090x_Px_SMAPCOEF7(__x) (0xf500 - (__x - 1) * 0x200) | ||
1674 | #define STV090x_P1_SMAPCOEF7 STV090x_Px_SMAPCOEF7(1) | ||
1675 | #define STV090x_P2_SMAPCOEF7 STV090x_Px_SMAPCOEF7(2) | ||
1676 | #define STV090x_OFFST_Px_DIS_QSCALE_FIELD 7 | ||
1677 | #define STV090x_WIDTH_Px_DIS_QSCALE_FIELD 1 | ||
1678 | #define STV090x_OFFST_Px_SMAPCOEF_Q_LLR12_FIELD 0 | ||
1679 | #define STV090x_WIDTH_Px_SMAPCOEF_Q_LLR12_FIELD 7 | ||
1680 | |||
1681 | #define STV090x_Px_SMAPCOEF6(__x) (0xf501 - (__x - 1) * 0x200) | ||
1682 | #define STV090x_P1_SMAPCOEF6 STV090x_Px_SMAPCOEF6(1) | ||
1683 | #define STV090x_P2_SMAPCOEF6 STV090x_Px_SMAPCOEF6(2) | ||
1684 | #define STV090x_OFFST_Px_ADJ_8PSKLLR1_FIELD 2 | ||
1685 | #define STV090x_WIDTH_Px_ADJ_8PSKLLR1_FIELD 1 | ||
1686 | #define STV090x_OFFST_Px_OLD_8PSKLLR1_FIELD 1 | ||
1687 | #define STV090x_WIDTH_Px_OLD_8PSKLLR1_FIELD 1 | ||
1688 | #define STV090x_OFFST_Px_DIS_AB8PSK_FIELD 0 | ||
1689 | #define STV090x_WIDTH_Px_DIS_AB8PSK_FIELD 1 | ||
1690 | |||
1691 | #define STV090x_Px_SMAPCOEF5(__x) (0xf502 - (__x - 1) * 0x200) | ||
1692 | #define STV090x_P1_SMAPCOEF5 STV090x_Px_SMAPCOEF5(1) | ||
1693 | #define STV090x_P2_SMAPCOEF5 STV090x_Px_SMAPCOEF5(2) | ||
1694 | #define STV090x_OFFST_Px_DIS_8SCALE_FIELD 7 | ||
1695 | #define STV090x_WIDTH_Px_DIS_8SCALE_FIELD 1 | ||
1696 | #define STV090x_OFFST_Px_SMAPCOEF_8P_LLR23_FIELD 0 | ||
1697 | #define STV090x_WIDTH_Px_SMAPCOEF_8P_LLR23_FIELD 7 | ||
1698 | |||
1699 | #define STV090x_Px_DMDPLHSTAT(__x) (0xF520 - (__x - 1) * 0x200) | ||
1700 | #define STV090x_P1_DMDPLHSTAT STV090x_Px_DMDPLHSTAT(1) | ||
1701 | #define STV090x_P2_DMDPLHSTAT STV090x_Px_DMDPLHSTAT(2) | ||
1702 | #define STV090x_OFFST_Px_PLH_STATISTIC_FIELD 0 | ||
1703 | #define STV090x_WIDTH_Px_PLH_STATISTIC_FIELD 8 | ||
1704 | |||
1705 | #define STV090x_Px_LOCKTIMEy(__x, __y) (0xF525 - (__x - 1) * 0x200 - __y * 0x1) | ||
1706 | #define STV090x_P1_LOCKTIME0 STV090x_Px_LOCKTIMEy(1, 0) | ||
1707 | #define STV090x_P1_LOCKTIME1 STV090x_Px_LOCKTIMEy(1, 1) | ||
1708 | #define STV090x_P1_LOCKTIME2 STV090x_Px_LOCKTIMEy(1, 2) | ||
1709 | #define STV090x_P1_LOCKTIME3 STV090x_Px_LOCKTIMEy(1, 3) | ||
1710 | #define STV090x_P2_LOCKTIME0 STV090x_Px_LOCKTIMEy(2, 0) | ||
1711 | #define STV090x_P2_LOCKTIME1 STV090x_Px_LOCKTIMEy(2, 1) | ||
1712 | #define STV090x_P2_LOCKTIME2 STV090x_Px_LOCKTIMEy(2, 2) | ||
1713 | #define STV090x_P2_LOCKTIME3 STV090x_Px_LOCKTIMEy(2, 3) | ||
1714 | #define STV090x_OFFST_Px_DEMOD_LOCKTIME_FIELD 0 | ||
1715 | #define STV090x_WIDTH_Px_DEMOD_LOCKTIME_FIELD 8 | ||
1716 | |||
1717 | #define STV090x_Px_TNRCFG(__x) (0xf4e0 - (__x - 1) * 0x200) /* check */ | ||
1718 | #define STV090x_P1_TNRCFG STV090x_Px_TNRCFG(1) | ||
1719 | #define STV090x_P2_TNRCFG STV090x_Px_TNRCFG(2) | ||
1720 | |||
1721 | #define STV090x_Px_TNRCFG2(__x) (0xf4e1 - (__x - 1) * 0x200) | ||
1722 | #define STV090x_P1_TNRCFG2 STV090x_Px_TNRCFG2(1) | ||
1723 | #define STV090x_P2_TNRCFG2 STV090x_Px_TNRCFG2(2) | ||
1724 | #define STV090x_OFFST_Px_TUN_IQSWAP_FIELD 7 | ||
1725 | #define STV090x_WIDTH_Px_TUN_IQSWAP_FIELD 1 | ||
1726 | |||
1727 | #define STV090x_Px_VITSCALE(__x) (0xf532 - (__x - 1) * 0x200) | ||
1728 | #define STV090x_P1_VITSCALE STV090x_Px_VITSCALE(1) | ||
1729 | #define STV090x_P2_VITSCALE STV090x_Px_VITSCALE(2) | ||
1730 | #define STV090x_OFFST_Px_NVTH_NOSRANGE_FIELD 7 | ||
1731 | #define STV090x_WIDTH_Px_NVTH_NOSRANGE_FIELD 1 | ||
1732 | #define STV090x_OFFST_Px_VERROR_MAXMODE_FIELD 6 | ||
1733 | #define STV090x_WIDTH_Px_VERROR_MAXMODE_FIELD 1 | ||
1734 | #define STV090x_OFFST_Px_NSLOWSN_LOCKED_FIELD 3 | ||
1735 | #define STV090x_WIDTH_Px_NSLOWSN_LOCKED_FIELD 1 | ||
1736 | #define STV090x_OFFST_Px_DIS_RSFLOCK_FIELD 1 | ||
1737 | #define STV090x_WIDTH_Px_DIS_RSFLOCK_FIELD 1 | ||
1738 | |||
1739 | #define STV090x_Px_FECM(__x) (0xf533 - (__x - 1) * 0x200) | ||
1740 | #define STV090x_P1_FECM STV090x_Px_FECM(1) | ||
1741 | #define STV090x_P2_FECM STV090x_Px_FECM(2) | ||
1742 | #define STV090x_OFFST_Px_DSS_DVB_FIELD 7 | ||
1743 | #define STV090x_WIDTH_Px_DSS_DVB_FIELD 1 | ||
1744 | #define STV090x_OFFST_Px_DSS_SRCH_FIELD 4 | ||
1745 | #define STV090x_WIDTH_Px_DSS_SRCH_FIELD 1 | ||
1746 | #define STV090x_OFFST_Px_SYNCVIT_FIELD 1 | ||
1747 | #define STV090x_WIDTH_Px_SYNCVIT_FIELD 1 | ||
1748 | #define STV090x_OFFST_Px_IQINV_FIELD 0 | ||
1749 | #define STV090x_WIDTH_Px_IQINV_FIELD 1 | ||
1750 | |||
1751 | #define STV090x_Px_VTH12(__x) (0xf534 - (__x - 1) * 0x200) | ||
1752 | #define STV090x_P1_VTH12 STV090x_Px_VTH12(1) | ||
1753 | #define STV090x_P2_VTH12 STV090x_Px_VTH12(2) | ||
1754 | #define STV090x_OFFST_Px_VTH12_FIELD 0 | ||
1755 | #define STV090x_WIDTH_Px_VTH12_FIELD 8 | ||
1756 | |||
1757 | #define STV090x_Px_VTH23(__x) (0xf535 - (__x - 1) * 0x200) | ||
1758 | #define STV090x_P1_VTH23 STV090x_Px_VTH23(1) | ||
1759 | #define STV090x_P2_VTH23 STV090x_Px_VTH23(2) | ||
1760 | #define STV090x_OFFST_Px_VTH23_FIELD 0 | ||
1761 | #define STV090x_WIDTH_Px_VTH23_FIELD 8 | ||
1762 | |||
1763 | #define STV090x_Px_VTH34(__x) (0xf536 - (__x - 1) * 0x200) | ||
1764 | #define STV090x_P1_VTH34 STV090x_Px_VTH34(1) | ||
1765 | #define STV090x_P2_VTH34 STV090x_Px_VTH34(2) | ||
1766 | #define STV090x_OFFST_Px_VTH34_FIELD 0 | ||
1767 | #define STV090x_WIDTH_Px_VTH34_FIELD 8 | ||
1768 | |||
1769 | #define STV090x_Px_VTH56(__x) (0xf537 - (__x - 1) * 0x200) | ||
1770 | #define STV090x_P1_VTH56 STV090x_Px_VTH56(1) | ||
1771 | #define STV090x_P2_VTH56 STV090x_Px_VTH56(2) | ||
1772 | #define STV090x_OFFST_Px_VTH56_FIELD 0 | ||
1773 | #define STV090x_WIDTH_Px_VTH56_FIELD 8 | ||
1774 | |||
1775 | #define STV090x_Px_VTH67(__x) (0xf538 - (__x - 1) * 0x200) | ||
1776 | #define STV090x_P1_VTH67 STV090x_Px_VTH67(1) | ||
1777 | #define STV090x_P2_VTH67 STV090x_Px_VTH67(2) | ||
1778 | #define STV090x_OFFST_Px_VTH67_FIELD 0 | ||
1779 | #define STV090x_WIDTH_Px_VTH67_FIELD 8 | ||
1780 | |||
1781 | #define STV090x_Px_VTH78(__x) (0xf539 - (__x - 1) * 0x200) | ||
1782 | #define STV090x_P1_VTH78 STV090x_Px_VTH78(1) | ||
1783 | #define STV090x_P2_VTH78 STV090x_Px_VTH78(2) | ||
1784 | #define STV090x_OFFST_Px_VTH78_FIELD 0 | ||
1785 | #define STV090x_WIDTH_Px_VTH78_FIELD 8 | ||
1786 | |||
1787 | #define STV090x_Px_VITCURPUN(__x) (0xf53a - (__x - 1) * 0x200) | ||
1788 | #define STV090x_P1_VITCURPUN STV090x_Px_VITCURPUN(1) | ||
1789 | #define STV090x_P2_VITCURPUN STV090x_Px_VITCURPUN(2) | ||
1790 | #define STV090x_OFFST_Px_VIT_CURPUN_FIELD 0 | ||
1791 | #define STV090x_WIDTH_Px_VIT_CURPUN_FIELD 5 | ||
1792 | |||
1793 | #define STV090x_Px_VERROR(__x) (0xf53b - (__x - 1) * 0x200) | ||
1794 | #define STV090x_P1_VERROR STV090x_Px_VERROR(1) | ||
1795 | #define STV090x_P2_VERROR STV090x_Px_VERROR(2) | ||
1796 | #define STV090x_OFFST_Px_REGERR_VIT_FIELD 0 | ||
1797 | #define STV090x_WIDTH_Px_REGERR_VIT_FIELD 8 | ||
1798 | |||
1799 | #define STV090x_Px_PRVIT(__x) (0xf53c - (__x - 1) * 0x200) | ||
1800 | #define STV090x_P1_PRVIT STV090x_Px_PRVIT(1) | ||
1801 | #define STV090x_P2_PRVIT STV090x_Px_PRVIT(2) | ||
1802 | #define STV090x_OFFST_Px_DIS_VTHLOCK_FIELD 6 | ||
1803 | #define STV090x_WIDTH_Px_DIS_VTHLOCK_FIELD 1 | ||
1804 | #define STV090x_OFFST_Px_E7_8VIT_FIELD 5 | ||
1805 | #define STV090x_WIDTH_Px_E7_8VIT_FIELD 1 | ||
1806 | #define STV090x_OFFST_Px_E6_7VIT_FIELD 4 | ||
1807 | #define STV090x_WIDTH_Px_E6_7VIT_FIELD 1 | ||
1808 | #define STV090x_OFFST_Px_E5_6VIT_FIELD 3 | ||
1809 | #define STV090x_WIDTH_Px_E5_6VIT_FIELD 1 | ||
1810 | #define STV090x_OFFST_Px_E3_4VIT_FIELD 2 | ||
1811 | #define STV090x_WIDTH_Px_E3_4VIT_FIELD 1 | ||
1812 | #define STV090x_OFFST_Px_E2_3VIT_FIELD 1 | ||
1813 | #define STV090x_WIDTH_Px_E2_3VIT_FIELD 1 | ||
1814 | #define STV090x_OFFST_Px_E1_2VIT_FIELD 0 | ||
1815 | #define STV090x_WIDTH_Px_E1_2VIT_FIELD 1 | ||
1816 | |||
1817 | #define STV090x_Px_VAVSRVIT(__x) (0xf53d - (__x - 1) * 0x200) | ||
1818 | #define STV090x_P1_VAVSRVIT STV090x_Px_VAVSRVIT(1) | ||
1819 | #define STV090x_P2_VAVSRVIT STV090x_Px_VAVSRVIT(2) | ||
1820 | #define STV090x_OFFST_Px_SNVIT_FIELD 4 | ||
1821 | #define STV090x_WIDTH_Px_SNVIT_FIELD 2 | ||
1822 | #define STV090x_OFFST_Px_TOVVIT_FIELD 2 | ||
1823 | #define STV090x_WIDTH_Px_TOVVIT_FIELD 2 | ||
1824 | #define STV090x_OFFST_Px_HYPVIT_FIELD 0 | ||
1825 | #define STV090x_WIDTH_Px_HYPVIT_FIELD 2 | ||
1826 | |||
1827 | #define STV090x_Px_VSTATUSVIT(__x) (0xf53e - (__x - 1) * 0x200) | ||
1828 | #define STV090x_P1_VSTATUSVIT STV090x_Px_VSTATUSVIT(1) | ||
1829 | #define STV090x_P2_VSTATUSVIT STV090x_Px_VSTATUSVIT(2) | ||
1830 | #define STV090x_OFFST_Px_PRFVIT_FIELD 4 | ||
1831 | #define STV090x_WIDTH_Px_PRFVIT_FIELD 1 | ||
1832 | #define STV090x_OFFST_Px_LOCKEDVIT_FIELD 3 | ||
1833 | #define STV090x_WIDTH_Px_LOCKEDVIT_FIELD 1 | ||
1834 | |||
1835 | #define STV090x_Px_VTHINUSE(__x) (0xf53f - (__x - 1) * 0x200) | ||
1836 | #define STV090x_P1_VTHINUSE STV090x_Px_VTHINUSE(1) | ||
1837 | #define STV090x_P2_VTHINUSE STV090x_Px_VTHINUSE(2) | ||
1838 | #define STV090x_OFFST_Px_VIT_INUSE_FIELD 0 | ||
1839 | #define STV090x_WIDTH_Px_VIT_INUSE_FIELD 8 | ||
1840 | |||
1841 | #define STV090x_Px_KDIV12(__x) (0xf540 - (__x - 1) * 0x200) | ||
1842 | #define STV090x_P1_KDIV12 STV090x_Px_KDIV12(1) | ||
1843 | #define STV090x_P2_KDIV12 STV090x_Px_KDIV12(2) | ||
1844 | #define STV090x_OFFST_Px_K_DIVIDER_12_FIELD 0 | ||
1845 | #define STV090x_WIDTH_Px_K_DIVIDER_12_FIELD 7 | ||
1846 | |||
1847 | #define STV090x_Px_KDIV23(__x) (0xf541 - (__x - 1) * 0x200) | ||
1848 | #define STV090x_P1_KDIV23 STV090x_Px_KDIV23(1) | ||
1849 | #define STV090x_P2_KDIV23 STV090x_Px_KDIV23(2) | ||
1850 | #define STV090x_OFFST_Px_K_DIVIDER_23_FIELD 0 | ||
1851 | #define STV090x_WIDTH_Px_K_DIVIDER_23_FIELD 7 | ||
1852 | |||
1853 | #define STV090x_Px_KDIV34(__x) (0xf542 - (__x - 1) * 0x200) | ||
1854 | #define STV090x_P1_KDIV34 STV090x_Px_KDIV34(1) | ||
1855 | #define STV090x_P2_KDIV34 STV090x_Px_KDIV34(2) | ||
1856 | #define STV090x_OFFST_Px_K_DIVIDER_34_FIELD 0 | ||
1857 | #define STV090x_WIDTH_Px_K_DIVIDER_34_FIELD 7 | ||
1858 | |||
1859 | #define STV090x_Px_KDIV56(__x) (0xf543 - (__x - 1) * 0x200) | ||
1860 | #define STV090x_P1_KDIV56 STV090x_Px_KDIV56(1) | ||
1861 | #define STV090x_P2_KDIV56 STV090x_Px_KDIV56(2) | ||
1862 | #define STV090x_OFFST_Px_K_DIVIDER_56_FIELD 0 | ||
1863 | #define STV090x_WIDTH_Px_K_DIVIDER_56_FIELD 7 | ||
1864 | |||
1865 | #define STV090x_Px_KDIV67(__x) (0xf544 - (__x - 1) * 0x200) | ||
1866 | #define STV090x_P1_KDIV67 STV090x_Px_KDIV67(1) | ||
1867 | #define STV090x_P2_KDIV67 STV090x_Px_KDIV67(2) | ||
1868 | #define STV090x_OFFST_Px_K_DIVIDER_67_FIELD 0 | ||
1869 | #define STV090x_WIDTH_Px_K_DIVIDER_67_FIELD 7 | ||
1870 | |||
1871 | #define STV090x_Px_KDIV78(__x) (0xf545 - (__x - 1) * 0x200) | ||
1872 | #define STV090x_P1_KDIV78 STV090x_Px_KDIV78(1) | ||
1873 | #define STV090x_P2_KDIV78 STV090x_Px_KDIV78(2) | ||
1874 | #define STV090x_OFFST_Px_K_DIVIDER_78_FIELD 0 | ||
1875 | #define STV090x_WIDTH_Px_K_DIVIDER_78_FIELD 7 | ||
1876 | |||
1877 | #define STV090x_Px_PDELCTRL1(__x) (0xf550 - (__x - 1) * 0x200) | ||
1878 | #define STV090x_P1_PDELCTRL1 STV090x_Px_PDELCTRL1(1) | ||
1879 | #define STV090x_P2_PDELCTRL1 STV090x_Px_PDELCTRL1(2) | ||
1880 | #define STV090x_OFFST_Px_INV_MISMASK_FIELD 7 | ||
1881 | #define STV090x_WIDTH_Px_INV_MISMASK_FIELD 1 | ||
1882 | #define STV090x_OFFST_Px_FILTER_EN_FIELD 5 | ||
1883 | #define STV090x_WIDTH_Px_FILTER_EN_FIELD 1 | ||
1884 | #define STV090x_OFFST_Px_EN_MIS00_FIELD 1 | ||
1885 | #define STV090x_WIDTH_Px_EN_MIS00_FIELD 1 | ||
1886 | #define STV090x_OFFST_Px_ALGOSWRST_FIELD 0 | ||
1887 | #define STV090x_WIDTH_Px_ALGOSWRST_FIELD 1 | ||
1888 | |||
1889 | #define STV090x_Px_PDELCTRL2(__x) (0xf551 - (__x - 1) * 0x200) | ||
1890 | #define STV090x_P1_PDELCTRL2 STV090x_Px_PDELCTRL2(1) | ||
1891 | #define STV090x_P2_PDELCTRL2 STV090x_Px_PDELCTRL2(2) | ||
1892 | #define STV090x_OFFST_Px_FORCE_CONTINUOUS 7 | ||
1893 | #define STV090x_WIDTH_Px_FORCE_CONTINUOUS 1 | ||
1894 | #define STV090x_OFFST_Px_RESET_UPKO_COUNT 6 | ||
1895 | #define STV090x_WIDTH_Px_RESET_UPKO_COUNT 1 | ||
1896 | #define STV090x_OFFST_Px_USER_PKTDELIN_NB 5 | ||
1897 | #define STV090x_WIDTH_Px_USER_PKTDELIN_NB 1 | ||
1898 | #define STV090x_OFFST_Px_FORCE_LOCKED 4 | ||
1899 | #define STV090x_WIDTH_Px_FORCE_LOCKED 1 | ||
1900 | #define STV090x_OFFST_Px_DATA_UNBBSCRAM 3 | ||
1901 | #define STV090x_WIDTH_Px_DATA_UNBBSCRAM 1 | ||
1902 | #define STV090x_OFFST_Px_FORCE_LONGPACKET 2 | ||
1903 | #define STV090x_WIDTH_Px_FORCE_LONGPACKET 1 | ||
1904 | #define STV090x_OFFST_Px_FRAME_MODE_FIELD 1 | ||
1905 | #define STV090x_WIDTH_Px_FRAME_MODE_FIELD 1 | ||
1906 | |||
1907 | #define STV090x_Px_HYSTTHRESH(__x) (0xf554 - (__x - 1) * 0x200) | ||
1908 | #define STV090x_P1_HYSTTHRESH STV090x_Px_HYSTTHRESH(1) | ||
1909 | #define STV090x_P2_HYSTTHRESH STV090x_Px_HYSTTHRESH(2) | ||
1910 | #define STV090x_OFFST_Px_UNLCK_THRESH_FIELD 4 | ||
1911 | #define STV090x_WIDTH_Px_UNLCK_THRESH_FIELD 4 | ||
1912 | #define STV090x_OFFST_Px_DELIN_LCK_THRESH_FIELD 0 | ||
1913 | #define STV090x_WIDTH_Px_DELIN_LCK_THRESH_FIELD 4 | ||
1914 | |||
1915 | #define STV090x_Px_ISIENTRY(__x) (0xf55e - (__x - 1) * 0x200) | ||
1916 | #define STV090x_P1_ISIENTRY STV090x_Px_ISIENTRY(1) | ||
1917 | #define STV090x_P2_ISIENTRY STV090x_Px_ISIENTRY(2) | ||
1918 | #define STV090x_OFFST_Px_ISI_ENTRY_FIELD 0 | ||
1919 | #define STV090x_WIDTH_Px_ISI_ENTRY_FIELD 8 | ||
1920 | |||
1921 | #define STV090x_Px_ISIBITENA(__x) (0xf55f - (__x - 1) * 0x200) | ||
1922 | #define STV090x_P1_ISIBITENA STV090x_Px_ISIBITENA(1) | ||
1923 | #define STV090x_P2_ISIBITENA STV090x_Px_ISIBITENA(2) | ||
1924 | #define STV090x_OFFST_Px_ISI_BIT_EN_FIELD 0 | ||
1925 | #define STV090x_WIDTH_Px_ISI_BIT_EN_FIELD 8 | ||
1926 | |||
1927 | #define STV090x_Px_MATSTRy(__x, __y) (0xf561 - (__x - 1) * 0x200 - __y * 0x1) | ||
1928 | #define STV090x_P1_MATSTR0 STV090x_Px_MATSTRy(1, 0) | ||
1929 | #define STV090x_P1_MATSTR1 STV090x_Px_MATSTRy(1, 1) | ||
1930 | #define STV090x_P2_MATSTR0 STV090x_Px_MATSTRy(2, 0) | ||
1931 | #define STV090x_P2_MATSTR1 STV090x_Px_MATSTRy(2, 1) | ||
1932 | #define STV090x_OFFST_Px_MATYPE_CURRENT_FIELD 0 | ||
1933 | #define STV090x_WIDTH_Px_MATYPE_CURRENT_FIELD 8 | ||
1934 | |||
1935 | #define STV090x_Px_UPLSTRy(__x, __y) (0xf563 - (__x - 1) * 0x200 - __y * 0x1) | ||
1936 | #define STV090x_P1_UPLSTR0 STV090x_Px_UPLSTRy(1, 0) | ||
1937 | #define STV090x_P1_UPLSTR1 STV090x_Px_UPLSTRy(1, 1) | ||
1938 | #define STV090x_P2_UPLSTR0 STV090x_Px_UPLSTRy(2, 0) | ||
1939 | #define STV090x_P2_UPLSTR1 STV090x_Px_UPLSTRy(2, 1) | ||
1940 | #define STV090x_OFFST_Px_UPL_CURRENT_FIELD 0 | ||
1941 | #define STV090x_WIDTH_Px_UPL_CURRENT_FIELD 8 | ||
1942 | |||
1943 | #define STV090x_Px_DFLSTRy(__x, __y) (0xf565 - (__x - 1) * 0x200 - __y * 0x1) | ||
1944 | #define STV090x_P1_DFLSTR0 STV090x_Px_DFLSTRy(1, 0) | ||
1945 | #define STV090x_P1_DFLSTR1 STV090x_Px_DFLSTRy(1, 1) | ||
1946 | #define STV090x_P2_DFLSTR0 STV090x_Px_DFLSTRy(2, 0) | ||
1947 | #define STV090x_P2_DFLSTR1 STV090x_Px_DFLSTRy(2, 1) | ||
1948 | #define STV090x_OFFST_Px_DFL_CURRENT_FIELD 0 | ||
1949 | #define STV090x_WIDTH_Px_DFL_CURRENT_FIELD 8 | ||
1950 | |||
1951 | #define STV090x_Px_SYNCSTR(__x) (0xf566 - (__x - 1) * 0x200) | ||
1952 | #define STV090x_P1_SYNCSTR STV090x_Px_SYNCSTR(1) | ||
1953 | #define STV090x_P2_SYNCSTR STV090x_Px_SYNCSTR(2) | ||
1954 | #define STV090x_OFFST_Px_SYNC_CURRENT_FIELD 0 | ||
1955 | #define STV090x_WIDTH_Px_SYNC_CURRENT_FIELD 8 | ||
1956 | |||
1957 | #define STV090x_Px_SYNCDSTRy(__x, __y) (0xf568 - (__x - 1) * 0x200 - __y * 0x1) | ||
1958 | #define STV090x_P1_SYNCDSTR0 STV090x_Px_SYNCDSTRy(1, 0) | ||
1959 | #define STV090x_P1_SYNCDSTR1 STV090x_Px_SYNCDSTRy(1, 1) | ||
1960 | #define STV090x_P2_SYNCDSTR0 STV090x_Px_SYNCDSTRy(2, 0) | ||
1961 | #define STV090x_P2_SYNCDSTR1 STV090x_Px_SYNCDSTRy(2, 1) | ||
1962 | #define STV090x_OFFST_Px_SYNCD_CURRENT_FIELD 0 | ||
1963 | #define STV090x_WIDTH_Px_SYNCD_CURRENT_FIELD 8 | ||
1964 | |||
1965 | #define STV090x_Px_PDELSTATUS1(__x) (0xf569 - (__x - 1) * 0x200) | ||
1966 | #define STV090x_P1_PDELSTATUS1 STV090x_Px_PDELSTATUS1(1) | ||
1967 | #define STV090x_P2_PDELSTATUS1 STV090x_Px_PDELSTATUS1(2) | ||
1968 | #define STV090x_OFFST_Px_PKTDELIN_LOCK_FIELD 1 | ||
1969 | #define STV090x_WIDTH_Px_PKTDELIN_LOCK_FIELD 1 | ||
1970 | #define STV090x_OFFST_Px_FIRST_LOCK_FIELD 0 | ||
1971 | #define STV090x_WIDTH_Px_FIRST_LOCK_FIELD 1 | ||
1972 | |||
1973 | #define STV090x_Px_PDELSTATUS2(__x) (0xf56a - (__x - 1) * 0x200) | ||
1974 | #define STV090x_P1_PDELSTATUS2 STV090x_Px_PDELSTATUS2(1) | ||
1975 | #define STV090x_P2_PDELSTATUS2 STV090x_Px_PDELSTATUS2(2) | ||
1976 | #define STV090x_OFFST_Px_FRAME_MODCOD_FIELD 2 | ||
1977 | #define STV090x_WIDTH_Px_FRAME_MODCOD_FIELD 5 | ||
1978 | #define STV090x_OFFST_Px_FRAME_TYPE_FIELD 0 | ||
1979 | #define STV090x_WIDTH_Px_FRAME_TYPE_FIELD 2 | ||
1980 | |||
1981 | #define STV090x_Px_BBFCRCKO1(__x) (0xf56b - (__x - 1) * 0x200) | ||
1982 | #define STV090x_P1_BBFCRCKO1 STV090x_Px_BBFCRCKO1(1) | ||
1983 | #define STV090x_P2_BBFCRCKO1 STV090x_Px_BBFCRCKO1(2) | ||
1984 | #define STV090x_OFFST_Px_BBHCRC_KOCNT_FIELD 0 | ||
1985 | #define STV090x_WIDTH_Px_BBHCRC_KOCNT_FIELD 8 | ||
1986 | |||
1987 | #define STV090x_Px_BBFCRCKO0(__x) (0xf56c - (__x - 1) * 0x200) | ||
1988 | #define STV090x_P1_BBFCRCKO0 STV090x_Px_BBFCRCKO0(1) | ||
1989 | #define STV090x_P2_BBFCRCKO0 STV090x_Px_BBFCRCKO0(2) | ||
1990 | #define STV090x_OFFST_Px_BBHCRC_KOCNT_FIELD 0 | ||
1991 | #define STV090x_WIDTH_Px_BBHCRC_KOCNT_FIELD 8 | ||
1992 | |||
1993 | #define STV090x_Px_UPCRCKO1(__x) (0xf56d - (__x - 1) * 0x200) | ||
1994 | #define STV090x_P1_UPCRCKO1 STV090x_Px_UPCRCKO1(1) | ||
1995 | #define STV090x_P2_UPCRCKO1 STV090x_Px_UPCRCKO1(2) | ||
1996 | #define STV090x_OFFST_Px_PKTCRC_KOCNT_FIELD 0 | ||
1997 | #define STV090x_WIDTH_Px_PKTCRC_KOCNT_FIELD 8 | ||
1998 | |||
1999 | #define STV090x_Px_UPCRCKO0(__x) (0xf56e - (__x - 1) * 0x200) | ||
2000 | #define STV090x_P1_UPCRCKO0 STV090x_Px_UPCRCKO0(1) | ||
2001 | #define STV090x_P2_UPCRCKO0 STV090x_Px_UPCRCKO0(2) | ||
2002 | #define STV090x_OFFST_Px_PKTCRC_KOCNT_FIELD 0 | ||
2003 | #define STV090x_WIDTH_Px_PKTCRC_KOCNT_FIELD 8 | ||
2004 | |||
2005 | #define STV090x_NBITER_NFx(__x) (0xFA03 + (__x - 4) * 0x1) | ||
2006 | #define STV090x_NBITER_NF4 STV090x_NBITER_NFx(4) | ||
2007 | #define STV090x_NBITER_NF5 STV090x_NBITER_NFx(5) | ||
2008 | #define STV090x_NBITER_NF6 STV090x_NBITER_NFx(6) | ||
2009 | #define STV090x_NBITER_NF7 STV090x_NBITER_NFx(7) | ||
2010 | #define STV090x_NBITER_NF8 STV090x_NBITER_NFx(8) | ||
2011 | #define STV090x_NBITER_NF9 STV090x_NBITER_NFx(9) | ||
2012 | #define STV090x_NBITER_NF10 STV090x_NBITER_NFx(10) | ||
2013 | #define STV090x_NBITER_NF11 STV090x_NBITER_NFx(11) | ||
2014 | #define STV090x_NBITER_NF12 STV090x_NBITER_NFx(12) | ||
2015 | #define STV090x_NBITER_NF13 STV090x_NBITER_NFx(13) | ||
2016 | #define STV090x_NBITER_NF14 STV090x_NBITER_NFx(14) | ||
2017 | #define STV090x_NBITER_NF15 STV090x_NBITER_NFx(15) | ||
2018 | #define STV090x_NBITER_NF16 STV090x_NBITER_NFx(16) | ||
2019 | #define STV090x_NBITER_NF17 STV090x_NBITER_NFx(17) | ||
2020 | |||
2021 | #define STV090x_NBITERNOERR 0xFA3F | ||
2022 | #define STV090x_OFFST_NBITER_STOP_CRIT_FIELD 0 | ||
2023 | #define STV090x_WIDTH_NBITER_STOP_CRIT_FIELD 4 | ||
2024 | |||
2025 | #define STV090x_GAINLLR_NFx(__x) (0xFA43 + (__x - 4) * 0x1) | ||
2026 | #define STV090x_GAINLLR_NF4 STV090x_GAINLLR_NFx(4) | ||
2027 | #define STV090x_OFFST_GAINLLR_NF_QP_1_2_FIELD 0 | ||
2028 | #define STV090x_WIDTH_GAINLLR_NF_QP_1_2_FIELD 7 | ||
2029 | |||
2030 | #define STV090x_GAINLLR_NF5 STV090x_GAINLLR_NFx(5) | ||
2031 | #define STV090x_OFFST_GAINLLR_NF_QP_3_5_FIELD 0 | ||
2032 | #define STV090x_WIDTH_GAINLLR_NF_QP_3_5_FIELD 7 | ||
2033 | |||
2034 | #define STV090x_GAINLLR_NF6 STV090x_GAINLLR_NFx(6) | ||
2035 | #define STV090x_OFFST_GAINLLR_NF_QP_2_3_FIELD 0 | ||
2036 | #define STV090x_WIDTH_GAINLLR_NF_QP_2_3_FIELD 7 | ||
2037 | |||
2038 | #define STV090x_GAINLLR_NF7 STV090x_GAINLLR_NFx(7) | ||
2039 | #define STV090x_OFFST_GAINLLR_NF_QP_3_4_FIELD 0 | ||
2040 | #define STV090x_WIDTH_GAINLLR_NF_QP_3_4_FIELD 7 | ||
2041 | |||
2042 | #define STV090x_GAINLLR_NF8 STV090x_GAINLLR_NFx(8) | ||
2043 | #define STV090x_OFFST_GAINLLR_NF_QP_4_5_FIELD 0 | ||
2044 | #define STV090x_WIDTH_GAINLLR_NF_QP_4_5_FIELD 7 | ||
2045 | |||
2046 | #define STV090x_GAINLLR_NF9 STV090x_GAINLLR_NFx(9) | ||
2047 | #define STV090x_OFFST_GAINLLR_NF_QP_5_6_FIELD 0 | ||
2048 | #define STV090x_WIDTH_GAINLLR_NF_QP_5_6_FIELD 7 | ||
2049 | |||
2050 | #define STV090x_GAINLLR_NF10 STV090x_GAINLLR_NFx(10) | ||
2051 | #define STV090x_OFFST_GAINLLR_NF_QP_8_9_FIELD 0 | ||
2052 | #define STV090x_WIDTH_GAINLLR_NF_QP_8_9_FIELD 7 | ||
2053 | |||
2054 | #define STV090x_GAINLLR_NF11 STV090x_GAINLLR_NFx(11) | ||
2055 | #define STV090x_OFFST_GAINLLR_NF_QP_9_10_FIELD 0 | ||
2056 | #define STV090x_WIDTH_GAINLLR_NF_QP_9_10_FIELD 7 | ||
2057 | |||
2058 | #define STV090x_GAINLLR_NF12 STV090x_GAINLLR_NFx(12) | ||
2059 | #define STV090x_OFFST_GAINLLR_NF_8P_3_5_FIELD 0 | ||
2060 | #define STV090x_WIDTH_GAINLLR_NF_8P_3_5_FIELD 7 | ||
2061 | |||
2062 | #define STV090x_GAINLLR_NF13 STV090x_GAINLLR_NFx(13) | ||
2063 | #define STV090x_OFFST_GAINLLR_NF_8P_2_3_FIELD 0 | ||
2064 | #define STV090x_WIDTH_GAINLLR_NF_8P_2_3_FIELD 7 | ||
2065 | |||
2066 | #define STV090x_GAINLLR_NF14 STV090x_GAINLLR_NFx(14) | ||
2067 | #define STV090x_OFFST_GAINLLR_NF_8P_3_4_FIELD 0 | ||
2068 | #define STV090x_WIDTH_GAINLLR_NF_8P_3_4_FIELD 7 | ||
2069 | |||
2070 | #define STV090x_GAINLLR_NF15 STV090x_GAINLLR_NFx(15) | ||
2071 | #define STV090x_OFFST_GAINLLR_NF_8P_5_6_FIELD 0 | ||
2072 | #define STV090x_WIDTH_GAINLLR_NF_8P_5_6_FIELD 7 | ||
2073 | |||
2074 | #define STV090x_GAINLLR_NF16 STV090x_GAINLLR_NFx(16) | ||
2075 | #define STV090x_OFFST_GAINLLR_NF_8P_8_9_FIELD 0 | ||
2076 | #define STV090x_WIDTH_GAINLLR_NF_8P_8_9_FIELD 7 | ||
2077 | |||
2078 | #define STV090x_GAINLLR_NF17 STV090x_GAINLLR_NFx(17) | ||
2079 | #define STV090x_OFFST_GAINLLR_NF_8P_9_10_FIELD 0 | ||
2080 | #define STV090x_WIDTH_GAINLLR_NF_8P_9_10_FIELD 7 | ||
2081 | |||
2082 | #define STV090x_GENCFG 0xFA86 | ||
2083 | #define STV090x_OFFST_BROADCAST_FIELD 4 | ||
2084 | #define STV090x_WIDTH_BROADCAST_FIELD 1 | ||
2085 | #define STV090x_OFFST_PRIORITY_FIELD 1 | ||
2086 | #define STV090x_WIDTH_PRIORITY_FIELD 1 | ||
2087 | #define STV090x_OFFST_DDEMOD_FIELD 0 | ||
2088 | #define STV090x_WIDTH_DDEMOD_FIELD 1 | ||
2089 | |||
2090 | #define STV090x_LDPCERRx(__x) (0xFA97 - (__x * 0x1)) | ||
2091 | #define STV090x_LDPCERR0 STV090x_LDPCERRx(0) | ||
2092 | #define STV090x_LDPCERR1 STV090x_LDPCERRx(1) | ||
2093 | #define STV090x_OFFST_Px_LDPC_ERRORS_COUNTER_FIELD 0 | ||
2094 | #define STV090x_WIDTH_Px_LDPC_ERRORS_COUNTER_FIELD 8 | ||
2095 | |||
2096 | #define STV090x_BCHERR 0xFA98 | ||
2097 | #define STV090x_OFFST_Px_ERRORFLAG_FIELD 4 | ||
2098 | #define STV090x_WIDTH_Px_ERRORFLAG_FIELD 1 | ||
2099 | #define STV090x_OFFST_Px_BCH_ERRORS_COUNTER_FIELD 0 | ||
2100 | #define STV090x_WIDTH_Px_BCH_ERRORS_COUNTER_FIELD 4 | ||
2101 | |||
2102 | #define STV090x_Px_TSSTATEM(__x) (0xF570 - (__x - 1) * 0x200) | ||
2103 | #define STV090x_P1_TSSTATEM STV090x_Px_TSSTATEM(1) | ||
2104 | #define STV090x_P2_TSSTATEM STV090x_Px_TSSTATEM(2) | ||
2105 | #define STV090x_OFFST_Px_TSDIL_ON_FIELD 7 | ||
2106 | #define STV090x_WIDTH_Px_TSDIL_ON_FIELD 1 | ||
2107 | #define STV090x_OFFST_Px_TSRS_ON_FIELD 5 | ||
2108 | #define STV090x_WIDTH_Px_TSRS_ON_FIELD 1 | ||
2109 | |||
2110 | #define STV090x_Px_TSCFGH(__x) (0xF572 - (__x - 1) * 0x200) | ||
2111 | #define STV090x_P1_TSCFGH STV090x_Px_TSCFGH(1) | ||
2112 | #define STV090x_P2_TSCFGH STV090x_Px_TSCFGH(2) | ||
2113 | #define STV090x_OFFST_Px_TSFIFO_DVBCI_FIELD 7 | ||
2114 | #define STV090x_WIDTH_Px_TSFIFO_DVBCI_FIELD 1 | ||
2115 | #define STV090x_OFFST_Px_TSFIFO_SERIAL_FIELD 6 | ||
2116 | #define STV090x_WIDTH_Px_TSFIFO_SERIAL_FIELD 1 | ||
2117 | #define STV090x_OFFST_Px_TSFIFO_TEIUPDATE_FIELD 5 | ||
2118 | #define STV090x_WIDTH_Px_TSFIFO_TEIUPDATE_FIELD 1 | ||
2119 | #define STV090x_OFFST_Px_TSFIFO_DUTY50_FIELD 4 | ||
2120 | #define STV090x_WIDTH_Px_TSFIFO_DUTY50_FIELD 1 | ||
2121 | #define STV090x_OFFST_Px_TSFIFO_HSGNLOUT_FIELD 3 | ||
2122 | #define STV090x_WIDTH_Px_TSFIFO_HSGNLOUT_FIELD 1 | ||
2123 | #define STV090x_OFFST_Px_TSFIFO_ERRORMODE_FIELD 1 | ||
2124 | #define STV090x_WIDTH_Px_TSFIFO_ERRORMODE_FIELD 2 | ||
2125 | #define STV090x_OFFST_Px_RST_HWARE_FIELD 0 | ||
2126 | #define STV090x_WIDTH_Px_RST_HWARE_FIELD 1 | ||
2127 | |||
2128 | #define STV090x_Px_TSCFGM(__x) (0xF573 - (__x - 1) * 0x200) | ||
2129 | #define STV090x_P1_TSCFGM STV090x_Px_TSCFGM(1) | ||
2130 | #define STV090x_P2_TSCFGM STV090x_Px_TSCFGM(2) | ||
2131 | #define STV090x_OFFST_Px_TSFIFO_MANSPEED_FIELD 6 | ||
2132 | #define STV090x_WIDTH_Px_TSFIFO_MANSPEED_FIELD 2 | ||
2133 | #define STV090x_OFFST_Px_TSFIFO_PERMDATA_FIELD 5 | ||
2134 | #define STV090x_WIDTH_Px_TSFIFO_PERMDATA_FIELD 1 | ||
2135 | #define STV090x_OFFST_Px_TSFIFO_INVDATA_FIELD 0 | ||
2136 | #define STV090x_WIDTH_Px_TSFIFO_INVDATA_FIELD 1 | ||
2137 | |||
2138 | #define STV090x_Px_TSCFGL(__x) (0xF574 - (__x - 1) * 0x200) | ||
2139 | #define STV090x_P1_TSCFGL STV090x_Px_TSCFGL(1) | ||
2140 | #define STV090x_P2_TSCFGL STV090x_Px_TSCFGL(2) | ||
2141 | #define STV090x_OFFST_Px_TSFIFO_BCLKDEL1CK_FIELD 6 | ||
2142 | #define STV090x_WIDTH_Px_TSFIFO_BCLKDEL1CK_FIELD 2 | ||
2143 | #define STV090x_OFFST_Px_BCHERROR_MODE_FIELD 4 | ||
2144 | #define STV090x_WIDTH_Px_BCHERROR_MODE_FIELD 2 | ||
2145 | #define STV090x_OFFST_Px_TSFIFO_NSGNL2DATA_FIELD 3 | ||
2146 | #define STV090x_WIDTH_Px_TSFIFO_NSGNL2DATA_FIELD 1 | ||
2147 | #define STV090x_OFFST_Px_TSFIFO_EMBINDVB_FIELD 2 | ||
2148 | #define STV090x_WIDTH_Px_TSFIFO_EMBINDVB_FIELD 1 | ||
2149 | #define STV090x_OFFST_Px_TSFIFO_DPUNACT_FIELD 1 | ||
2150 | #define STV090x_WIDTH_Px_TSFIFO_DPUNACT_FIELD 1 | ||
2151 | |||
2152 | #define STV090x_Px_TSINSDELH(__x) (0xF576 - (__x - 1) * 0x200) | ||
2153 | #define STV090x_P1_TSINSDELH STV090x_Px_TSINSDELH(1) | ||
2154 | #define STV090x_P2_TSINSDELH STV090x_Px_TSINSDELH(2) | ||
2155 | #define STV090x_OFFST_Px_TSDEL_SYNCBYTE_FIELD 7 | ||
2156 | #define STV090x_WIDTH_Px_TSDEL_SYNCBYTE_FIELD 1 | ||
2157 | #define STV090x_OFFST_Px_TSDEL_XXHEADER_FIELD 6 | ||
2158 | #define STV090x_WIDTH_Px_TSDEL_XXHEADER_FIELD 1 | ||
2159 | |||
2160 | #define STV090x_Px_TSSPEED(__x) (0xF580 - (__x - 1) * 0x200) | ||
2161 | #define STV090x_P1_TSSPEED STV090x_Px_TSSPEED(1) | ||
2162 | #define STV090x_P2_TSSPEED STV090x_Px_TSSPEED(2) | ||
2163 | #define STV090x_OFFST_Px_TSFIFO_OUTSPEED_FIELD 0 | ||
2164 | #define STV090x_WIDTH_Px_TSFIFO_OUTSPEED_FIELD 8 | ||
2165 | |||
2166 | #define STV090x_Px_TSSTATUS(__x) (0xF581 - (__x - 1) * 0x200) | ||
2167 | #define STV090x_P1_TSSTATUS STV090x_Px_TSSTATUS(1) | ||
2168 | #define STV090x_P2_TSSTATUS STV090x_Px_TSSTATUS(2) | ||
2169 | #define STV090x_OFFST_Px_TSFIFO_LINEOK_FIELD 7 | ||
2170 | #define STV090x_WIDTH_Px_TSFIFO_LINEOK_FIELD 1 | ||
2171 | #define STV090x_OFFST_Px_TSFIFO_ERROR_FIELD 6 | ||
2172 | #define STV090x_WIDTH_Px_TSFIFO_ERROR_FIELD 1 | ||
2173 | |||
2174 | #define STV090x_Px_TSSTATUS2(__x) (0xF582 - (__x - 1) * 0x200) | ||
2175 | #define STV090x_P1_TSSTATUS2 STV090x_Px_TSSTATUS2(1) | ||
2176 | #define STV090x_P2_TSSTATUS2 STV090x_Px_TSSTATUS2(2) | ||
2177 | #define STV090x_OFFST_Px_TSFIFO_DEMODSEL_FIELD 7 | ||
2178 | #define STV090x_WIDTH_Px_TSFIFO_DEMODSEL_FIELD 1 | ||
2179 | #define STV090x_OFFST_Px_TSFIFOSPEED_STORE_FIELD 6 | ||
2180 | #define STV090x_WIDTH_Px_TSFIFOSPEED_STORE_FIELD 1 | ||
2181 | #define STV090x_OFFST_Px_DILXX_RESET_FIELD 5 | ||
2182 | #define STV090x_WIDTH_Px_DILXX_RESET_FIELD 1 | ||
2183 | #define STV090x_OFFST_Px_TSSERIAL_IMPOS_FIELD 5 | ||
2184 | #define STV090x_WIDTH_Px_TSSERIAL_IMPOS_FIELD 1 | ||
2185 | #define STV090x_OFFST_Px_SCRAMBDETECT_FIELD 1 | ||
2186 | #define STV090x_WIDTH_Px_SCRAMBDETECT_FIELD 1 | ||
2187 | |||
2188 | #define STV090x_Px_TSBITRATEy(__x, __y) (0xF584 - (__x - 1) * 0x200 - __y * 0x1) | ||
2189 | #define STV090x_P1_TSBITRATE0 STV090x_Px_TSBITRATEy(1, 0) | ||
2190 | #define STV090x_P1_TSBITRATE1 STV090x_Px_TSBITRATEy(1, 1) | ||
2191 | #define STV090x_P2_TSBITRATE0 STV090x_Px_TSBITRATEy(2, 0) | ||
2192 | #define STV090x_P2_TSBITRATE1 STV090x_Px_TSBITRATEy(2, 1) | ||
2193 | #define STV090x_OFFST_Px_TSFIFO_BITRATE_FIELD 7 | ||
2194 | #define STV090x_WIDTH_Px_TSFIFO_BITRATE_FIELD 8 | ||
2195 | |||
2196 | #define STV090x_Px_ERRCTRL1(__x) (0xF598 - (__x - 1) * 0x200) | ||
2197 | #define STV090x_P1_ERRCTRL1 STV090x_Px_ERRCTRL1(1) | ||
2198 | #define STV090x_P2_ERRCTRL1 STV090x_Px_ERRCTRL1(2) | ||
2199 | #define STV090x_OFFST_Px_ERR_SOURCE_FIELD 4 | ||
2200 | #define STV090x_WIDTH_Px_ERR_SOURCE_FIELD 4 | ||
2201 | #define STV090x_OFFST_Px_NUM_EVENT_FIELD 0 | ||
2202 | #define STV090x_WIDTH_Px_NUM_EVENT_FIELD 3 | ||
2203 | |||
2204 | #define STV090x_Px_ERRCNT12(__x) (0xF599 - (__x - 1) * 0x200) | ||
2205 | #define STV090x_P1_ERRCNT12 STV090x_Px_ERRCNT12(1) | ||
2206 | #define STV090x_P2_ERRCNT12 STV090x_Px_ERRCNT12(2) | ||
2207 | #define STV090x_OFFST_Px_ERRCNT1_OLDVALUE_FIELD 7 | ||
2208 | #define STV090x_WIDTH_Px_ERRCNT1_OLDVALUE_FIELD 1 | ||
2209 | #define STV090x_OFFST_Px_ERR_CNT12_FIELD 0 | ||
2210 | #define STV090x_WIDTH_Px_ERR_CNT12_FIELD 7 | ||
2211 | |||
2212 | #define STV090x_Px_ERRCNT11(__x) (0xF59A - (__x - 1) * 0x200) | ||
2213 | #define STV090x_P1_ERRCNT11 STV090x_Px_ERRCNT11(1) | ||
2214 | #define STV090x_P2_ERRCNT11 STV090x_Px_ERRCNT11(2) | ||
2215 | #define STV090x_OFFST_Px_ERR_CNT11_FIELD 0 | ||
2216 | #define STV090x_WIDTH_Px_ERR_CNT11_FIELD 8 | ||
2217 | |||
2218 | #define STV090x_Px_ERRCNT10(__x) (0xF59B - (__x - 1) * 0x200) | ||
2219 | #define STV090x_P1_ERRCNT10 STV090x_Px_ERRCNT10(1) | ||
2220 | #define STV090x_P2_ERRCNT10 STV090x_Px_ERRCNT10(2) | ||
2221 | #define STV090x_OFFST_Px_ERR_CNT10_FIELD 0 | ||
2222 | #define STV090x_WIDTH_Px_ERR_CNT10_FIELD 8 | ||
2223 | |||
2224 | #define STV090x_Px_ERRCTRL2(__x) (0xF59C - (__x - 1) * 0x200) | ||
2225 | #define STV090x_P1_ERRCTRL2 STV090x_Px_ERRCTRL2(1) | ||
2226 | #define STV090x_P2_ERRCTRL2 STV090x_Px_ERRCTRL2(2) | ||
2227 | #define STV090x_OFFST_Px_ERR_SOURCE2_FIELD 4 | ||
2228 | #define STV090x_WIDTH_Px_ERR_SOURCE2_FIELD 4 | ||
2229 | #define STV090x_OFFST_Px_NUM_EVENT2_FIELD 0 | ||
2230 | #define STV090x_WIDTH_Px_NUM_EVENT2_FIELD 3 | ||
2231 | |||
2232 | #define STV090x_Px_ERRCNT22(__x) (0xF59D - (__x - 1) * 0x200) | ||
2233 | #define STV090x_P1_ERRCNT22 STV090x_Px_ERRCNT22(1) | ||
2234 | #define STV090x_P2_ERRCNT22 STV090x_Px_ERRCNT22(2) | ||
2235 | #define STV090x_OFFST_Px_ERRCNT2_OLDVALUE_FIELD 7 | ||
2236 | #define STV090x_WIDTH_Px_ERRCNT2_OLDVALUE_FIELD 1 | ||
2237 | #define STV090x_OFFST_Px_ERR_CNT2_FIELD 0 | ||
2238 | #define STV090x_WIDTH_Px_ERR_CNT2_FIELD 7 | ||
2239 | |||
2240 | #define STV090x_Px_ERRCNT21(__x) (0xF59E - (__x - 1) * 0x200) | ||
2241 | #define STV090x_P1_ERRCNT21 STV090x_Px_ERRCNT21(1) | ||
2242 | #define STV090x_P2_ERRCNT21 STV090x_Px_ERRCNT21(2) | ||
2243 | #define STV090x_OFFST_Px_ERR_CNT21_FIELD 0 | ||
2244 | #define STV090x_WIDTH_Px_ERR_CNT21_FIELD 8 | ||
2245 | |||
2246 | #define STV090x_Px_ERRCNT20(__x) (0xF59F - (__x - 1) * 0x200) | ||
2247 | #define STV090x_P1_ERRCNT20 STV090x_Px_ERRCNT20(1) | ||
2248 | #define STV090x_P2_ERRCNT20 STV090x_Px_ERRCNT20(2) | ||
2249 | #define STV090x_OFFST_Px_ERR_CNT20_FIELD 0 | ||
2250 | #define STV090x_WIDTH_Px_ERR_CNT20_FIELD 8 | ||
2251 | |||
2252 | #define STV090x_Px_FECSPY(__x) (0xF5A0 - (__x - 1) * 0x200) | ||
2253 | #define STV090x_P1_FECSPY STV090x_Px_FECSPY(1) | ||
2254 | #define STV090x_P2_FECSPY STV090x_Px_FECSPY(2) | ||
2255 | #define STV090x_OFFST_Px_SPY_ENABLE_FIELD 7 | ||
2256 | #define STV090x_WIDTH_Px_SPY_ENABLE_FIELD 1 | ||
2257 | #define STV090x_OFFST_Px_BERMETER_DATAMAODE_FIELD 2 | ||
2258 | #define STV090x_WIDTH_Px_BERMETER_DATAMAODE_FIELD 2 | ||
2259 | |||
2260 | #define STV090x_Px_FSPYCFG(__x) (0xF5A1 - (__x - 1) * 0x200) | ||
2261 | #define STV090x_P1_FSPYCFG STV090x_Px_FSPYCFG(1) | ||
2262 | #define STV090x_P2_FSPYCFG STV090x_Px_FSPYCFG(2) | ||
2263 | #define STV090x_OFFST_Px_RST_ON_ERROR_FIELD 5 | ||
2264 | #define STV090x_WIDTH_Px_RST_ON_ERROR_FIELD 1 | ||
2265 | #define STV090x_OFFST_Px_ONE_SHOT_FIELD 4 | ||
2266 | #define STV090x_WIDTH_Px_ONE_SHOT_FIELD 1 | ||
2267 | #define STV090x_OFFST_Px_I2C_MODE_FIELD 2 | ||
2268 | #define STV090x_WIDTH_Px_I2C_MODE_FIELD 2 | ||
2269 | |||
2270 | #define STV090x_Px_FSPYDATA(__x) (0xF5A2 - (__x - 1) * 0x200) | ||
2271 | #define STV090x_P1_FSPYDATA STV090x_Px_FSPYDATA(1) | ||
2272 | #define STV090x_P2_FSPYDATA STV090x_Px_FSPYDATA(2) | ||
2273 | #define STV090x_OFFST_Px_SPY_STUFFING_FIELD 7 | ||
2274 | #define STV090x_WIDTH_Px_SPY_STUFFING_FIELD 1 | ||
2275 | #define STV090x_OFFST_Px_SPY_CNULLPKT_FIELD 5 | ||
2276 | #define STV090x_WIDTH_Px_SPY_CNULLPKT_FIELD 1 | ||
2277 | #define STV090x_OFFST_Px_SPY_OUTDATA_MODE_FIELD 0 | ||
2278 | #define STV090x_WIDTH_Px_SPY_OUTDATA_MODE_FIELD 5 | ||
2279 | |||
2280 | #define STV090x_Px_FSPYOUT(__x) (0xF5A3 - (__x - 1) * 0x200) | ||
2281 | #define STV090x_P1_FSPYOUT STV090x_Px_FSPYOUT(1) | ||
2282 | #define STV090x_P2_FSPYOUT STV090x_Px_FSPYOUT(2) | ||
2283 | #define STV090x_OFFST_Px_FSPY_DIRECT_FIELD 7 | ||
2284 | #define STV090x_WIDTH_Px_FSPY_DIRECT_FIELD 1 | ||
2285 | #define STV090x_OFFST_Px_STUFF_MODE_FIELD 0 | ||
2286 | #define STV090x_WIDTH_Px_STUFF_MODE_FIELD 3 | ||
2287 | |||
2288 | #define STV090x_Px_FSTATUS(__x) (0xF5A4 - (__x - 1) * 0x200) | ||
2289 | #define STV090x_P1_FSTATUS STV090x_Px_FSTATUS(1) | ||
2290 | #define STV090x_P2_FSTATUS STV090x_Px_FSTATUS(2) | ||
2291 | #define STV090x_OFFST_Px_SPY_ENDSIM_FIELD 7 | ||
2292 | #define STV090x_WIDTH_Px_SPY_ENDSIM_FIELD 1 | ||
2293 | #define STV090x_OFFST_Px_VALID_SIM_FIELD 6 | ||
2294 | #define STV090x_WIDTH_Px_VALID_SIM_FIELD 1 | ||
2295 | #define STV090x_OFFST_Px_FOUND_SIGNAL_FIELD 5 | ||
2296 | #define STV090x_WIDTH_Px_FOUND_SIGNAL_FIELD 1 | ||
2297 | #define STV090x_OFFST_Px_DSS_SYNCBYTE_FIELD 4 | ||
2298 | #define STV090x_WIDTH_Px_DSS_SYNCBYTE_FIELD 1 | ||
2299 | #define STV090x_OFFST_Px_RESULT_STATE_FIELD 0 | ||
2300 | #define STV090x_WIDTH_Px_RESULT_STATE_FIELD 4 | ||
2301 | |||
2302 | #define STV090x_Px_FBERCPT4(__x) (0xF5A8 - (__x - 1) * 0x200) | ||
2303 | #define STV090x_P1_FBERCPT4 STV090x_Px_FBERCPT4(1) | ||
2304 | #define STV090x_P2_FBERCPT4 STV090x_Px_FBERCPT4(2) | ||
2305 | #define STV090x_OFFST_Px_FBERMETER_CPT_FIELD 0 | ||
2306 | #define STV090x_WIDTH_Px_FBERMETER_CPT_FIELD 8 | ||
2307 | |||
2308 | #define STV090x_Px_FBERCPT3(__x) (0xF5A9 - (__x - 1) * 0x200) | ||
2309 | #define STV090x_P1_FBERCPT3 STV090x_Px_FBERCPT3(1) | ||
2310 | #define STV090x_P2_FBERCPT3 STV090x_Px_FBERCPT3(2) | ||
2311 | #define STV090x_OFFST_Px_FBERMETER_CPT_FIELD 0 | ||
2312 | #define STV090x_WIDTH_Px_FBERMETER_CPT_FIELD 8 | ||
2313 | |||
2314 | #define STV090x_Px_FBERCPT2(__x) (0xF5AA - (__x - 1) * 0x200) | ||
2315 | #define STV090x_P1_FBERCPT2 STV090x_Px_FBERCPT2(1) | ||
2316 | #define STV090x_P2_FBERCPT2 STV090x_Px_FBERCPT2(2) | ||
2317 | #define STV090x_OFFST_Px_FBERMETER_CPT_FIELD 0 | ||
2318 | #define STV090x_WIDTH_Px_FBERMETER_CPT_FIELD 8 | ||
2319 | |||
2320 | #define STV090x_Px_FBERCPT1(__x) (0xF5AB - (__x - 1) * 0x200) | ||
2321 | #define STV090x_P1_FBERCPT1 STV090x_Px_FBERCPT1(1) | ||
2322 | #define STV090x_P2_FBERCPT1 STV090x_Px_FBERCPT1(2) | ||
2323 | #define STV090x_OFFST_Px_FBERMETER_CPT_FIELD 0 | ||
2324 | #define STV090x_WIDTH_Px_FBERMETER_CPT_FIELD 8 | ||
2325 | |||
2326 | #define STV090x_Px_FBERCPT0(__x) (0xF5AC - (__x - 1) * 0x200) | ||
2327 | #define STV090x_P1_FBERCPT0 STV090x_Px_FBERCPT0(1) | ||
2328 | #define STV090x_P2_FBERCPT0 STV090x_Px_FBERCPT0(2) | ||
2329 | #define STV090x_OFFST_Px_FBERMETER_CPT_FIELD 0 | ||
2330 | #define STV090x_WIDTH_Px_FBERMETER_CPT_FIELD 8 | ||
2331 | |||
2332 | #define STV090x_Px_FBERERRy(__x, __y) (0xF5AF - (__x - 1) * 0x200 - __y * 0x1) | ||
2333 | #define STV090x_P1_FBERERR0 STV090x_Px_FBERERRy(1, 0) | ||
2334 | #define STV090x_P1_FBERERR1 STV090x_Px_FBERERRy(1, 1) | ||
2335 | #define STV090x_P1_FBERERR2 STV090x_Px_FBERERRy(1, 2) | ||
2336 | #define STV090x_P2_FBERERR0 STV090x_Px_FBERERRy(2, 0) | ||
2337 | #define STV090x_P2_FBERERR1 STV090x_Px_FBERERRy(2, 1) | ||
2338 | #define STV090x_P2_FBERERR2 STV090x_Px_FBERERRy(2, 2) | ||
2339 | #define STV090x_OFFST_Px_FBERMETER_CPT_ERR_FIELD 0 | ||
2340 | #define STV090x_WIDTH_Px_FBERMETER_CPT_ERR_FIELD 8 | ||
2341 | |||
2342 | #define STV090x_Px_FSPYBER(__x) (0xF5B2 - (__x - 1) * 0x200) | ||
2343 | #define STV090x_P1_FSPYBER STV090x_Px_FSPYBER(1) | ||
2344 | #define STV090x_P2_FSPYBER STV090x_Px_FSPYBER(2) | ||
2345 | #define STV090x_OFFST_Px_FSPYBER_SYNCBYTE_FIELD 4 | ||
2346 | #define STV090x_WIDTH_Px_FSPYBER_SYNCBYTE_FIELD 1 | ||
2347 | #define STV090x_OFFST_Px_FSPYBER_UNSYNC_FIELD 3 | ||
2348 | #define STV090x_WIDTH_Px_FSPYBER_UNSYNC_FIELD 1 | ||
2349 | #define STV090x_OFFST_Px_FSPYBER_CTIME_FIELD 0 | ||
2350 | #define STV090x_WIDTH_Px_FSPYBER_CTIME_FIELD 3 | ||
2351 | |||
2352 | #define STV090x_RCCFGH 0xf600 | ||
2353 | |||
2354 | #define STV090x_TSGENERAL 0xF630 | ||
2355 | #define STV090x_OFFST_Px_MUXSTREAM_OUT_FIELD 3 | ||
2356 | #define STV090x_WIDTH_Px_MUXSTREAM_OUT_FIELD 1 | ||
2357 | #define STV090x_OFFST_Px_TSFIFO_PERMPARAL_FIELD 1 | ||
2358 | #define STV090x_WIDTH_Px_TSFIFO_PERMPARAL_FIELD 2 | ||
2359 | |||
2360 | #define STV090x_TSGENERAL1X 0xf670 | ||
2361 | #define STV090x_CFGEXT 0xfa80 | ||
2362 | |||
2363 | #define STV090x_TSTRES0 0xFF11 | ||
2364 | #define STV090x_OFFST_FRESFEC_FIELD 7 | ||
2365 | #define STV090x_WIDTH_FRESFEC_FIELD 1 | ||
2366 | |||
2367 | #define STV090x_Px_TSTDISRX(__x) (0xFF67 - (__x - 1) * 0x2) | ||
2368 | #define STV090x_P1_TSTDISRX STV090x_Px_TSTDISRX(1) | ||
2369 | #define STV090x_P2_TSTDISRX STV090x_Px_TSTDISRX(2) | ||
2370 | #define STV090x_OFFST_Px_TSTDISRX_SELECT_FIELD 3 | ||
2371 | #define STV090x_WIDTH_Px_TSTDISRX_SELECT_FIELD 1 | ||
2372 | |||
2373 | #endif /* __STV090x_REG_H */ | ||
diff --git a/drivers/media/dvb/frontends/stv6110x.c b/drivers/media/dvb/frontends/stv6110x.c new file mode 100644 index 000000000000..3d8a2e01c9c4 --- /dev/null +++ b/drivers/media/dvb/frontends/stv6110x.c | |||
@@ -0,0 +1,373 @@ | |||
1 | /* | ||
2 | STV6110(A) Silicon tuner driver | ||
3 | |||
4 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
5 | |||
6 | Copyright (C) ST Microelectronics | ||
7 | |||
8 | This program is free software; you can redistribute it and/or modify | ||
9 | it under the terms of the GNU General Public License as published by | ||
10 | the Free Software Foundation; either version 2 of the License, or | ||
11 | (at your option) any later version. | ||
12 | |||
13 | This program is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | GNU General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | ||
22 | |||
23 | #include <linux/init.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/string.h> | ||
27 | |||
28 | #include "dvb_frontend.h" | ||
29 | |||
30 | #include "stv6110x_reg.h" | ||
31 | #include "stv6110x.h" | ||
32 | #include "stv6110x_priv.h" | ||
33 | |||
34 | static unsigned int verbose; | ||
35 | module_param(verbose, int, 0644); | ||
36 | MODULE_PARM_DESC(verbose, "Set Verbosity level"); | ||
37 | |||
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) | ||
41 | { | ||
42 | int ret; | ||
43 | const struct stv6110x_config *config = stv6110x->config; | ||
44 | u8 b0[] = { reg }; | ||
45 | u8 b1[] = { 0 }; | ||
46 | struct i2c_msg msg[] = { | ||
47 | { .addr = config->addr, .flags = 0, .buf = b0, .len = 1 }, | ||
48 | { .addr = config->addr, .flags = I2C_M_RD, .buf = b1, .len = 1 } | ||
49 | }; | ||
50 | |||
51 | ret = i2c_transfer(stv6110x->i2c, msg, 2); | ||
52 | if (ret != 2) { | ||
53 | dprintk(FE_ERROR, 1, "I/O Error"); | ||
54 | return -EREMOTEIO; | ||
55 | } | ||
56 | *data = b1[0]; | ||
57 | |||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static int stv6110x_write_reg(struct stv6110x_state *stv6110x, u8 reg, u8 data) | ||
62 | { | ||
63 | int ret; | ||
64 | const struct stv6110x_config *config = stv6110x->config; | ||
65 | u8 buf[] = { reg, data }; | ||
66 | struct i2c_msg msg = { .addr = config->addr, .flags = 0, . buf = buf, .len = 2 }; | ||
67 | |||
68 | ret = i2c_transfer(stv6110x->i2c, &msg, 1); | ||
69 | if (ret != 1) { | ||
70 | dprintk(FE_ERROR, 1, "I/O Error"); | ||
71 | return -EREMOTEIO; | ||
72 | } | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static int stv6110x_init(struct dvb_frontend *fe) | ||
78 | { | ||
79 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
80 | int ret; | ||
81 | u8 i; | ||
82 | |||
83 | for (i = 0; i < ARRAY_SIZE(stv6110x_regs); i++) { | ||
84 | ret = stv6110x_write_reg(stv6110x, i, stv6110x_regs[i]); | ||
85 | if (ret < 0) { | ||
86 | dprintk(FE_ERROR, 1, "Initialization failed"); | ||
87 | return -1; | ||
88 | } | ||
89 | } | ||
90 | |||
91 | return 0; | ||
92 | } | ||
93 | |||
94 | static int stv6110x_set_frequency(struct dvb_frontend *fe, u32 frequency) | ||
95 | { | ||
96 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
97 | u32 rDiv, divider; | ||
98 | s32 pVal, pCalc, rDivOpt = 0; | ||
99 | u8 i; | ||
100 | |||
101 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_K, (REFCLOCK_MHz - 16)); | ||
102 | |||
103 | if (frequency <= 1023000) { | ||
104 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); | ||
105 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); | ||
106 | pVal = 40; | ||
107 | } else if (frequency <= 1300000) { | ||
108 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); | ||
109 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); | ||
110 | pVal = 40; | ||
111 | } else if (frequency <= 2046000) { | ||
112 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); | ||
113 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); | ||
114 | pVal = 20; | ||
115 | } else { | ||
116 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); | ||
117 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); | ||
118 | pVal = 20; | ||
119 | } | ||
120 | |||
121 | for (rDiv = 0; rDiv <= 3; rDiv++) { | ||
122 | pCalc = (REFCLOCK_kHz / 100) / R_DIV(rDiv); | ||
123 | |||
124 | if ((abs((s32)(pCalc - pVal))) < (abs((s32)(1000 - pVal)))) | ||
125 | rDivOpt = rDiv; | ||
126 | } | ||
127 | |||
128 | divider = (frequency * R_DIV(rDivOpt) * pVal) / REFCLOCK_kHz; | ||
129 | divider = (divider + 5) / 10; | ||
130 | |||
131 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_R_DIV, rDivOpt); | ||
132 | 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)); | ||
134 | |||
135 | /* VCO Auto calibration */ | ||
136 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_STAT1], STAT1_CALVCO_STRT, 1); | ||
137 | |||
138 | stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x_regs[STV6110x_CTRL1]); | ||
139 | stv6110x_write_reg(stv6110x, STV6110x_TNG1, stv6110x_regs[STV6110x_TNG1]); | ||
140 | stv6110x_write_reg(stv6110x, STV6110x_TNG0, stv6110x_regs[STV6110x_TNG0]); | ||
141 | stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x_regs[STV6110x_STAT1]); | ||
142 | |||
143 | for (i = 0; i < TRIALS; i++) { | ||
144 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); | ||
145 | if (!STV6110x_GETFIELD(STAT1_CALVCO_STRT, stv6110x_regs[STV6110x_STAT1])) | ||
146 | break; | ||
147 | msleep(1); | ||
148 | } | ||
149 | |||
150 | return 0; | ||
151 | } | ||
152 | |||
153 | static int stv6110x_get_frequency(struct dvb_frontend *fe, u32 *frequency) | ||
154 | { | ||
155 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
156 | |||
157 | stv6110x_read_reg(stv6110x, STV6110x_TNG1, &stv6110x_regs[STV6110x_TNG1]); | ||
158 | stv6110x_read_reg(stv6110x, STV6110x_TNG0, &stv6110x_regs[STV6110x_TNG0]); | ||
159 | |||
160 | *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; | ||
162 | |||
163 | *frequency /= (1 << (STV6110x_GETFIELD(TNG1_R_DIV, stv6110x_regs[STV6110x_TNG1]) + | ||
164 | STV6110x_GETFIELD(TNG1_DIV4SEL, stv6110x_regs[STV6110x_TNG1]))); | ||
165 | |||
166 | *frequency >>= 2; | ||
167 | |||
168 | return 0; | ||
169 | } | ||
170 | |||
171 | static int stv6110x_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth) | ||
172 | { | ||
173 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
174 | u32 halfbw; | ||
175 | u8 i; | ||
176 | |||
177 | halfbw = bandwidth >> 1; | ||
178 | |||
179 | if (halfbw > 36000000) | ||
180 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, 31); /* LPF */ | ||
181 | else if (halfbw < 5000000) | ||
182 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, 0); /* LPF */ | ||
183 | else | ||
184 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, ((halfbw / 1000000) - 5)); /* LPF */ | ||
185 | |||
186 | |||
187 | 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 */ | ||
189 | |||
190 | stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x_regs[STV6110x_CTRL3]); | ||
191 | stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x_regs[STV6110x_STAT1]); | ||
192 | |||
193 | for (i = 0; i < TRIALS; i++) { | ||
194 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); | ||
195 | if (!STV6110x_GETFIELD(STAT1_CALRC_STRT, stv6110x_regs[STV6110x_STAT1])) | ||
196 | break; | ||
197 | msleep(1); | ||
198 | } | ||
199 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x1); /* cal. done */ | ||
200 | stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x_regs[STV6110x_CTRL3]); | ||
201 | |||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | static int stv6110x_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) | ||
206 | { | ||
207 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
208 | |||
209 | stv6110x_read_reg(stv6110x, STV6110x_CTRL3, &stv6110x_regs[STV6110x_CTRL3]); | ||
210 | *bandwidth = (STV6110x_GETFIELD(CTRL3_CF, stv6110x_regs[STV6110x_CTRL3]) + 5) * 2000000; | ||
211 | |||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | static int stv6110x_set_refclock(struct dvb_frontend *fe, u32 refclock) | ||
216 | { | ||
217 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
218 | |||
219 | /* setup divider */ | ||
220 | switch (refclock) { | ||
221 | default: | ||
222 | case 1: | ||
223 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0); | ||
224 | break; | ||
225 | case 2: | ||
226 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1); | ||
227 | break; | ||
228 | case 4: | ||
229 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2); | ||
230 | break; | ||
231 | case 8: | ||
232 | case 0: | ||
233 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3); | ||
234 | break; | ||
235 | } | ||
236 | stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x_regs[STV6110x_CTRL2]); | ||
237 | |||
238 | return 0; | ||
239 | } | ||
240 | |||
241 | static int stv6110x_get_bbgain(struct dvb_frontend *fe, u32 *gain) | ||
242 | { | ||
243 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
244 | |||
245 | stv6110x_read_reg(stv6110x, STV6110x_CTRL2, &stv6110x_regs[STV6110x_CTRL2]); | ||
246 | *gain = 2 * STV6110x_GETFIELD(CTRL2_BBGAIN, stv6110x_regs[STV6110x_CTRL2]); | ||
247 | |||
248 | return 0; | ||
249 | } | ||
250 | |||
251 | static int stv6110x_set_bbgain(struct dvb_frontend *fe, u32 gain) | ||
252 | { | ||
253 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
254 | |||
255 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_BBGAIN, gain / 2); | ||
256 | stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x_regs[STV6110x_CTRL2]); | ||
257 | |||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | static int stv6110x_set_mode(struct dvb_frontend *fe, enum tuner_mode mode) | ||
262 | { | ||
263 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
264 | int ret; | ||
265 | |||
266 | switch (mode) { | ||
267 | case TUNER_SLEEP: | ||
268 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_SYN, 0); | ||
269 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_RX, 0); | ||
270 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_LPT, 0); | ||
271 | break; | ||
272 | |||
273 | case TUNER_WAKE: | ||
274 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_SYN, 1); | ||
275 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_RX, 1); | ||
276 | STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_LPT, 1); | ||
277 | break; | ||
278 | } | ||
279 | |||
280 | ret = stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x_regs[STV6110x_CTRL1]); | ||
281 | if (ret < 0) { | ||
282 | dprintk(FE_ERROR, 1, "I/O Error"); | ||
283 | return -EIO; | ||
284 | } | ||
285 | |||
286 | return 0; | ||
287 | } | ||
288 | |||
289 | static int stv6110x_sleep(struct dvb_frontend *fe) | ||
290 | { | ||
291 | return stv6110x_set_mode(fe, TUNER_SLEEP); | ||
292 | } | ||
293 | |||
294 | static int stv6110x_get_status(struct dvb_frontend *fe, u32 *status) | ||
295 | { | ||
296 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
297 | |||
298 | stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); | ||
299 | |||
300 | if (STV6110x_GETFIELD(STAT1_LOCK, stv6110x_regs[STV6110x_STAT1])) | ||
301 | *status = TUNER_PHASELOCKED; | ||
302 | else | ||
303 | *status = 0; | ||
304 | |||
305 | return 0; | ||
306 | } | ||
307 | |||
308 | |||
309 | static int stv6110x_release(struct dvb_frontend *fe) | ||
310 | { | ||
311 | struct stv6110x_state *stv6110x = fe->tuner_priv; | ||
312 | |||
313 | fe->tuner_priv = NULL; | ||
314 | kfree(stv6110x); | ||
315 | |||
316 | return 0; | ||
317 | } | ||
318 | |||
319 | static struct dvb_tuner_ops stv6110x_ops = { | ||
320 | .info = { | ||
321 | .name = "STV6110(A) Silicon Tuner", | ||
322 | .frequency_min = 950000, | ||
323 | .frequency_max = 2150000, | ||
324 | .frequency_step = 0, | ||
325 | }, | ||
326 | |||
327 | .init = stv6110x_init, | ||
328 | .sleep = stv6110x_sleep, | ||
329 | .release = stv6110x_release | ||
330 | }; | ||
331 | |||
332 | static struct stv6110x_devctl stv6110x_ctl = { | ||
333 | .tuner_init = stv6110x_init, | ||
334 | .tuner_set_mode = stv6110x_set_mode, | ||
335 | .tuner_set_frequency = stv6110x_set_frequency, | ||
336 | .tuner_get_frequency = stv6110x_get_frequency, | ||
337 | .tuner_set_bandwidth = stv6110x_set_bandwidth, | ||
338 | .tuner_get_bandwidth = stv6110x_get_bandwidth, | ||
339 | .tuner_set_bbgain = stv6110x_set_bbgain, | ||
340 | .tuner_get_bbgain = stv6110x_get_bbgain, | ||
341 | .tuner_set_refclk = stv6110x_set_refclock, | ||
342 | .tuner_get_status = stv6110x_get_status, | ||
343 | }; | ||
344 | |||
345 | struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe, | ||
346 | const struct stv6110x_config *config, | ||
347 | struct i2c_adapter *i2c) | ||
348 | { | ||
349 | struct stv6110x_state *stv6110x; | ||
350 | |||
351 | stv6110x = kzalloc(sizeof (struct stv6110x_state), GFP_KERNEL); | ||
352 | if (stv6110x == NULL) | ||
353 | goto error; | ||
354 | |||
355 | stv6110x->i2c = i2c; | ||
356 | stv6110x->config = config; | ||
357 | stv6110x->devctl = &stv6110x_ctl; | ||
358 | |||
359 | fe->tuner_priv = stv6110x; | ||
360 | fe->ops.tuner_ops = stv6110x_ops; | ||
361 | |||
362 | printk("%s: Attaching STV6110x \n", __func__); | ||
363 | return stv6110x->devctl; | ||
364 | |||
365 | error: | ||
366 | kfree(stv6110x); | ||
367 | return NULL; | ||
368 | } | ||
369 | EXPORT_SYMBOL(stv6110x_attach); | ||
370 | |||
371 | MODULE_AUTHOR("Manu Abraham"); | ||
372 | MODULE_DESCRIPTION("STV6110x Silicon tuner"); | ||
373 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/stv6110x.h b/drivers/media/dvb/frontends/stv6110x.h new file mode 100644 index 000000000000..a38257080e01 --- /dev/null +++ b/drivers/media/dvb/frontends/stv6110x.h | |||
@@ -0,0 +1,71 @@ | |||
1 | /* | ||
2 | STV6110(A) Silicon tuner driver | ||
3 | |||
4 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
5 | |||
6 | Copyright (C) ST Microelectronics | ||
7 | |||
8 | This program is free software; you can redistribute it and/or modify | ||
9 | it under the terms of the GNU General Public License as published by | ||
10 | the Free Software Foundation; either version 2 of the License, or | ||
11 | (at your option) any later version. | ||
12 | |||
13 | This program is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | GNU General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | ||
22 | |||
23 | #ifndef __STV6110x_H | ||
24 | #define __STV6110x_H | ||
25 | |||
26 | struct stv6110x_config { | ||
27 | u8 addr; | ||
28 | u32 refclk; | ||
29 | }; | ||
30 | |||
31 | enum tuner_mode { | ||
32 | TUNER_SLEEP = 1, | ||
33 | TUNER_WAKE, | ||
34 | }; | ||
35 | |||
36 | enum tuner_status { | ||
37 | TUNER_PHASELOCKED = 1, | ||
38 | }; | ||
39 | |||
40 | struct stv6110x_devctl { | ||
41 | int (*tuner_init) (struct dvb_frontend *fe); | ||
42 | int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); | ||
43 | int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); | ||
44 | int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency); | ||
45 | int (*tuner_set_bandwidth) (struct dvb_frontend *fe, u32 bandwidth); | ||
46 | int (*tuner_get_bandwidth) (struct dvb_frontend *fe, u32 *bandwidth); | ||
47 | int (*tuner_set_bbgain) (struct dvb_frontend *fe, u32 gain); | ||
48 | int (*tuner_get_bbgain) (struct dvb_frontend *fe, u32 *gain); | ||
49 | int (*tuner_set_refclk) (struct dvb_frontend *fe, u32 refclk); | ||
50 | int (*tuner_get_status) (struct dvb_frontend *fe, u32 *status); | ||
51 | }; | ||
52 | |||
53 | |||
54 | #if defined(CONFIG_DVB_STV6110x) || (defined(CONFIG_DVB_STV6110x_MODULE) && defined(MODULE)) | ||
55 | |||
56 | extern struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe, | ||
57 | const struct stv6110x_config *config, | ||
58 | struct i2c_adapter *i2c); | ||
59 | |||
60 | #else | ||
61 | static inline struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe, | ||
62 | const struct stv6110x_config *config, | ||
63 | struct i2c_adapter *i2c) | ||
64 | { | ||
65 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
66 | return NULL; | ||
67 | } | ||
68 | |||
69 | #endif /* CONFIG_DVB_STV6110x */ | ||
70 | |||
71 | #endif /* __STV6110x_H */ | ||
diff --git a/drivers/media/dvb/frontends/stv6110x_priv.h b/drivers/media/dvb/frontends/stv6110x_priv.h new file mode 100644 index 000000000000..7260da633d49 --- /dev/null +++ b/drivers/media/dvb/frontends/stv6110x_priv.h | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | STV6110(A) Silicon tuner driver | ||
3 | |||
4 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
5 | |||
6 | Copyright (C) ST Microelectronics | ||
7 | |||
8 | This program is free software; you can redistribute it and/or modify | ||
9 | it under the terms of the GNU General Public License as published by | ||
10 | the Free Software Foundation; either version 2 of the License, or | ||
11 | (at your option) any later version. | ||
12 | |||
13 | This program is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | GNU General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | ||
22 | |||
23 | #ifndef __STV6110x_PRIV_H | ||
24 | #define __STV6110x_PRIV_H | ||
25 | |||
26 | #define FE_ERROR 0 | ||
27 | #define FE_NOTICE 1 | ||
28 | #define FE_INFO 2 | ||
29 | #define FE_DEBUG 3 | ||
30 | #define FE_DEBUGREG 4 | ||
31 | |||
32 | #define dprintk(__y, __z, format, arg...) do { \ | ||
33 | if (__z) { \ | ||
34 | if ((verbose > FE_ERROR) && (verbose > __y)) \ | ||
35 | printk(KERN_ERR "%s: " format "\n", __func__ , ##arg); \ | ||
36 | else if ((verbose > FE_NOTICE) && (verbose > __y)) \ | ||
37 | printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg); \ | ||
38 | else if ((verbose > FE_INFO) && (verbose > __y)) \ | ||
39 | printk(KERN_INFO "%s: " format "\n", __func__ , ##arg); \ | ||
40 | else if ((verbose > FE_DEBUG) && (verbose > __y)) \ | ||
41 | printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg); \ | ||
42 | } else { \ | ||
43 | if (verbose > __y) \ | ||
44 | printk(format, ##arg); \ | ||
45 | } \ | ||
46 | } while (0) | ||
47 | |||
48 | |||
49 | #define STV6110x_SETFIELD(mask, bitf, val) \ | ||
50 | (mask = (mask & (~(((1 << STV6110x_WIDTH_##bitf) - 1) << \ | ||
51 | STV6110x_OFFST_##bitf))) | \ | ||
52 | (val << STV6110x_OFFST_##bitf)) | ||
53 | |||
54 | #define STV6110x_GETFIELD(bitf, val) \ | ||
55 | ((val >> STV6110x_OFFST_##bitf) & \ | ||
56 | ((1 << STV6110x_WIDTH_##bitf) - 1)) | ||
57 | |||
58 | #define MAKEWORD16(a, b) (((a) << 8) | (b)) | ||
59 | |||
60 | #define LSB(x) ((x & 0xff)) | ||
61 | #define MSB(y) ((y >> 8) & 0xff) | ||
62 | |||
63 | #define TRIALS 10 | ||
64 | #define R_DIV(__div) (1 << (__div + 1)) | ||
65 | #define REFCLOCK_kHz (stv6110x->config->refclk / 1000) | ||
66 | #define REFCLOCK_MHz (stv6110x->config->refclk / 1000000) | ||
67 | |||
68 | struct stv6110x_state { | ||
69 | struct i2c_adapter *i2c; | ||
70 | const struct stv6110x_config *config; | ||
71 | |||
72 | struct stv6110x_devctl *devctl; | ||
73 | }; | ||
74 | |||
75 | #endif /* __STV6110x_PRIV_H */ | ||
diff --git a/drivers/media/dvb/frontends/stv6110x_reg.h b/drivers/media/dvb/frontends/stv6110x_reg.h new file mode 100644 index 000000000000..93e5c70e5fd8 --- /dev/null +++ b/drivers/media/dvb/frontends/stv6110x_reg.h | |||
@@ -0,0 +1,82 @@ | |||
1 | /* | ||
2 | STV6110(A) Silicon tuner driver | ||
3 | |||
4 | Copyright (C) Manu Abraham <abraham.manu@gmail.com> | ||
5 | |||
6 | Copyright (C) ST Microelectronics | ||
7 | |||
8 | This program is free software; you can redistribute it and/or modify | ||
9 | it under the terms of the GNU General Public License as published by | ||
10 | the Free Software Foundation; either version 2 of the License, or | ||
11 | (at your option) any later version. | ||
12 | |||
13 | This program is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | GNU General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | ||
22 | |||
23 | #ifndef __STV6110x_REG_H | ||
24 | #define __STV6110x_REG_H | ||
25 | |||
26 | #define STV6110x_CTRL1 0x00 | ||
27 | #define STV6110x_OFFST_CTRL1_K 3 | ||
28 | #define STV6110x_WIDTH_CTRL1_K 5 | ||
29 | #define STV6110x_OFFST_CTRL1_LPT 2 | ||
30 | #define STV6110x_WIDTH_CTRL1_LPT 1 | ||
31 | #define STV6110x_OFFST_CTRL1_RX 1 | ||
32 | #define STV6110x_WIDTH_CTRL1_RX 1 | ||
33 | #define STV6110x_OFFST_CTRL1_SYN 0 | ||
34 | #define STV6110x_WIDTH_CTRL1_SYN 1 | ||
35 | |||
36 | #define STV6110x_CTRL2 0x01 | ||
37 | #define STV6110x_OFFST_CTRL2_CO_DIV 6 | ||
38 | #define STV6110x_WIDTH_CTRL2_CO_DIV 2 | ||
39 | #define STV6110x_OFFST_CTRL2_RSVD 5 | ||
40 | #define STV6110x_WIDTH_CTRL2_RSVD 1 | ||
41 | #define STV6110x_OFFST_CTRL2_REFOUT_SEL 4 | ||
42 | #define STV6110x_WIDTH_CTRL2_REFOUT_SEL 1 | ||
43 | #define STV6110x_OFFST_CTRL2_BBGAIN 0 | ||
44 | #define STV6110x_WIDTH_CTRL2_BBGAIN 4 | ||
45 | |||
46 | #define STV6110x_TNG0 0x02 | ||
47 | #define STV6110x_OFFST_TNG0_N_DIV_7_0 0 | ||
48 | #define STV6110x_WIDTH_TNG0_N_DIV_7_0 8 | ||
49 | |||
50 | #define STV6110x_TNG1 0x03 | ||
51 | #define STV6110x_OFFST_TNG1_R_DIV 6 | ||
52 | #define STV6110x_WIDTH_TNG1_R_DIV 2 | ||
53 | #define STV6110x_OFFST_TNG1_PRESC32_ON 5 | ||
54 | #define STV6110x_WIDTH_TNG1_PRESC32_ON 1 | ||
55 | #define STV6110x_OFFST_TNG1_DIV4SEL 4 | ||
56 | #define STV6110x_WIDTH_TNG1_DIV4SEL 1 | ||
57 | #define STV6110x_OFFST_TNG1_N_DIV_11_8 0 | ||
58 | #define STV6110x_WIDTH_TNG1_N_DIV_11_8 4 | ||
59 | |||
60 | |||
61 | #define STV6110x_CTRL3 0x04 | ||
62 | #define STV6110x_OFFST_CTRL3_DCLOOP_OFF 7 | ||
63 | #define STV6110x_WIDTH_CTRL3_DCLOOP_OFF 1 | ||
64 | #define STV6110x_OFFST_CTRL3_RCCLK_OFF 6 | ||
65 | #define STV6110x_WIDTH_CTRL3_RCCLK_OFF 1 | ||
66 | #define STV6110x_OFFST_CTRL3_ICP 5 | ||
67 | #define STV6110x_WIDTH_CTRL3_ICP 1 | ||
68 | #define STV6110x_OFFST_CTRL3_CF 0 | ||
69 | #define STV6110x_WIDTH_CTRL3_CF 5 | ||
70 | |||
71 | #define STV6110x_STAT1 0x05 | ||
72 | #define STV6110x_OFFST_STAT1_CALVCO_STRT 2 | ||
73 | #define STV6110x_WIDTH_STAT1_CALVCO_STRT 1 | ||
74 | #define STV6110x_OFFST_STAT1_CALRC_STRT 1 | ||
75 | #define STV6110x_WIDTH_STAT1_CALRC_STRT 1 | ||
76 | #define STV6110x_OFFST_STAT1_LOCK 0 | ||
77 | #define STV6110x_WIDTH_STAT1_LOCK 1 | ||
78 | |||
79 | #define STV6110x_STAT2 0x06 | ||
80 | #define STV6110x_STAT3 0x07 | ||
81 | |||
82 | #endif /* __STV6110x_REG_H */ | ||
diff --git a/drivers/media/dvb/frontends/tda10048.c b/drivers/media/dvb/frontends/tda10048.c index 2a8bbcd44cd0..4302c563a6b8 100644 --- a/drivers/media/dvb/frontends/tda10048.c +++ b/drivers/media/dvb/frontends/tda10048.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | NXP TDA10048HN DVB OFDM demodulator driver | 2 | NXP TDA10048HN DVB OFDM demodulator driver |
3 | 3 | ||
4 | Copyright (C) 2008 Steven Toth <stoth@linuxtv.org> | 4 | Copyright (C) 2009 Steven Toth <stoth@kernellabs.com> |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 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 | 7 | it under the terms of the GNU General Public License as published by |
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/string.h> | 25 | #include <linux/string.h> |
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <asm/div64.h> | ||
28 | #include "dvb_frontend.h" | 29 | #include "dvb_frontend.h" |
29 | #include "dvb_math.h" | 30 | #include "dvb_math.h" |
30 | #include "tda10048.h" | 31 | #include "tda10048.h" |
@@ -138,11 +139,20 @@ struct tda10048_state { | |||
138 | 139 | ||
139 | struct i2c_adapter *i2c; | 140 | struct i2c_adapter *i2c; |
140 | 141 | ||
141 | /* configuration settings */ | 142 | /* We'll cache and update the attach config settings */ |
142 | const struct tda10048_config *config; | 143 | struct tda10048_config config; |
143 | struct dvb_frontend frontend; | 144 | struct dvb_frontend frontend; |
144 | 145 | ||
145 | int fwloaded; | 146 | int fwloaded; |
147 | |||
148 | u32 freq_if_hz; | ||
149 | u32 xtal_hz; | ||
150 | u32 pll_mfactor; | ||
151 | u32 pll_nfactor; | ||
152 | u32 pll_pfactor; | ||
153 | u32 sample_freq; | ||
154 | |||
155 | enum fe_bandwidth bandwidth; | ||
146 | }; | 156 | }; |
147 | 157 | ||
148 | static struct init_tab { | 158 | static struct init_tab { |
@@ -192,12 +202,26 @@ static struct init_tab { | |||
192 | { TDA10048_CONF_C4_2, 0x04 }, | 202 | { TDA10048_CONF_C4_2, 0x04 }, |
193 | }; | 203 | }; |
194 | 204 | ||
205 | static struct pll_tab { | ||
206 | u32 clk_freq_khz; | ||
207 | u32 if_freq_khz; | ||
208 | u8 m, n, p; | ||
209 | } pll_tab[] = { | ||
210 | { TDA10048_CLK_4000, TDA10048_IF_36130, 10, 0, 0 }, | ||
211 | { TDA10048_CLK_16000, TDA10048_IF_3300, 10, 3, 0 }, | ||
212 | { TDA10048_CLK_16000, TDA10048_IF_3500, 10, 3, 0 }, | ||
213 | { TDA10048_CLK_16000, TDA10048_IF_4000, 10, 3, 0 }, | ||
214 | { TDA10048_CLK_16000, TDA10048_IF_4300, 10, 3, 0 }, | ||
215 | { TDA10048_CLK_16000, TDA10048_IF_36130, 10, 3, 0 }, | ||
216 | }; | ||
217 | |||
195 | static int tda10048_writereg(struct tda10048_state *state, u8 reg, u8 data) | 218 | static int tda10048_writereg(struct tda10048_state *state, u8 reg, u8 data) |
196 | { | 219 | { |
220 | struct tda10048_config *config = &state->config; | ||
197 | int ret; | 221 | int ret; |
198 | u8 buf[] = { reg, data }; | 222 | u8 buf[] = { reg, data }; |
199 | struct i2c_msg msg = { | 223 | struct i2c_msg msg = { |
200 | .addr = state->config->demod_address, | 224 | .addr = config->demod_address, |
201 | .flags = 0, .buf = buf, .len = 2 }; | 225 | .flags = 0, .buf = buf, .len = 2 }; |
202 | 226 | ||
203 | dprintk(2, "%s(reg = 0x%02x, data = 0x%02x)\n", __func__, reg, data); | 227 | dprintk(2, "%s(reg = 0x%02x, data = 0x%02x)\n", __func__, reg, data); |
@@ -212,13 +236,14 @@ static int tda10048_writereg(struct tda10048_state *state, u8 reg, u8 data) | |||
212 | 236 | ||
213 | static u8 tda10048_readreg(struct tda10048_state *state, u8 reg) | 237 | static u8 tda10048_readreg(struct tda10048_state *state, u8 reg) |
214 | { | 238 | { |
239 | struct tda10048_config *config = &state->config; | ||
215 | int ret; | 240 | int ret; |
216 | u8 b0[] = { reg }; | 241 | u8 b0[] = { reg }; |
217 | u8 b1[] = { 0 }; | 242 | u8 b1[] = { 0 }; |
218 | struct i2c_msg msg[] = { | 243 | struct i2c_msg msg[] = { |
219 | { .addr = state->config->demod_address, | 244 | { .addr = config->demod_address, |
220 | .flags = 0, .buf = b0, .len = 1 }, | 245 | .flags = 0, .buf = b0, .len = 1 }, |
221 | { .addr = state->config->demod_address, | 246 | { .addr = config->demod_address, |
222 | .flags = I2C_M_RD, .buf = b1, .len = 1 } }; | 247 | .flags = I2C_M_RD, .buf = b1, .len = 1 } }; |
223 | 248 | ||
224 | dprintk(2, "%s(reg = 0x%02x)\n", __func__, reg); | 249 | dprintk(2, "%s(reg = 0x%02x)\n", __func__, reg); |
@@ -235,6 +260,7 @@ static u8 tda10048_readreg(struct tda10048_state *state, u8 reg) | |||
235 | static int tda10048_writeregbulk(struct tda10048_state *state, u8 reg, | 260 | static int tda10048_writeregbulk(struct tda10048_state *state, u8 reg, |
236 | const u8 *data, u16 len) | 261 | const u8 *data, u16 len) |
237 | { | 262 | { |
263 | struct tda10048_config *config = &state->config; | ||
238 | int ret = -EREMOTEIO; | 264 | int ret = -EREMOTEIO; |
239 | struct i2c_msg msg; | 265 | struct i2c_msg msg; |
240 | u8 *buf; | 266 | u8 *buf; |
@@ -250,7 +276,7 @@ static int tda10048_writeregbulk(struct tda10048_state *state, u8 reg, | |||
250 | *buf = reg; | 276 | *buf = reg; |
251 | memcpy(buf + 1, data, len); | 277 | memcpy(buf + 1, data, len); |
252 | 278 | ||
253 | msg.addr = state->config->demod_address; | 279 | msg.addr = config->demod_address; |
254 | msg.flags = 0; | 280 | msg.flags = 0; |
255 | msg.buf = buf; | 281 | msg.buf = buf; |
256 | msg.len = len + 1; | 282 | msg.len = len + 1; |
@@ -271,14 +297,206 @@ error: | |||
271 | return ret; | 297 | return ret; |
272 | } | 298 | } |
273 | 299 | ||
300 | static int tda10048_set_phy2(struct dvb_frontend *fe, u32 sample_freq_hz, | ||
301 | u32 if_hz) | ||
302 | { | ||
303 | struct tda10048_state *state = fe->demodulator_priv; | ||
304 | u64 t; | ||
305 | |||
306 | dprintk(1, "%s()\n", __func__); | ||
307 | |||
308 | if (sample_freq_hz == 0) | ||
309 | return -EINVAL; | ||
310 | |||
311 | if (if_hz < (sample_freq_hz / 2)) { | ||
312 | /* PHY2 = (if2/fs) * 2^15 */ | ||
313 | t = if_hz; | ||
314 | t *= 10; | ||
315 | t *= 32768; | ||
316 | do_div(t, sample_freq_hz); | ||
317 | t += 5; | ||
318 | do_div(t, 10); | ||
319 | } else { | ||
320 | /* PHY2 = ((IF1-fs)/fs) * 2^15 */ | ||
321 | t = sample_freq_hz - if_hz; | ||
322 | t *= 10; | ||
323 | t *= 32768; | ||
324 | do_div(t, sample_freq_hz); | ||
325 | t += 5; | ||
326 | do_div(t, 10); | ||
327 | t = ~t + 1; | ||
328 | } | ||
329 | |||
330 | tda10048_writereg(state, TDA10048_FREQ_PHY2_LSB, (u8)t); | ||
331 | tda10048_writereg(state, TDA10048_FREQ_PHY2_MSB, (u8)(t >> 8)); | ||
332 | |||
333 | return 0; | ||
334 | } | ||
335 | |||
336 | static int tda10048_set_wref(struct dvb_frontend *fe, u32 sample_freq_hz, | ||
337 | u32 bw) | ||
338 | { | ||
339 | struct tda10048_state *state = fe->demodulator_priv; | ||
340 | u64 t, z; | ||
341 | u32 b = 8000000; | ||
342 | |||
343 | dprintk(1, "%s()\n", __func__); | ||
344 | |||
345 | if (sample_freq_hz == 0) | ||
346 | return -EINVAL; | ||
347 | |||
348 | if (bw == BANDWIDTH_6_MHZ) | ||
349 | b = 6000000; | ||
350 | else | ||
351 | if (bw == BANDWIDTH_7_MHZ) | ||
352 | b = 7000000; | ||
353 | |||
354 | /* WREF = (B / (7 * fs)) * 2^31 */ | ||
355 | t = b * 10; | ||
356 | /* avoid warning: this decimal constant is unsigned only in ISO C90 */ | ||
357 | /* t *= 2147483648 on 32bit platforms */ | ||
358 | t *= (2048 * 1024); | ||
359 | t *= 1024; | ||
360 | z = 7 * sample_freq_hz; | ||
361 | do_div(t, z); | ||
362 | t += 5; | ||
363 | do_div(t, 10); | ||
364 | |||
365 | tda10048_writereg(state, TDA10048_TIME_WREF_LSB, (u8)t); | ||
366 | tda10048_writereg(state, TDA10048_TIME_WREF_MID1, (u8)(t >> 8)); | ||
367 | tda10048_writereg(state, TDA10048_TIME_WREF_MID2, (u8)(t >> 16)); | ||
368 | tda10048_writereg(state, TDA10048_TIME_WREF_MSB, (u8)(t >> 24)); | ||
369 | |||
370 | return 0; | ||
371 | } | ||
372 | |||
373 | static int tda10048_set_invwref(struct dvb_frontend *fe, u32 sample_freq_hz, | ||
374 | u32 bw) | ||
375 | { | ||
376 | struct tda10048_state *state = fe->demodulator_priv; | ||
377 | u64 t; | ||
378 | u32 b = 8000000; | ||
379 | |||
380 | dprintk(1, "%s()\n", __func__); | ||
381 | |||
382 | if (sample_freq_hz == 0) | ||
383 | return -EINVAL; | ||
384 | |||
385 | if (bw == BANDWIDTH_6_MHZ) | ||
386 | b = 6000000; | ||
387 | else | ||
388 | if (bw == BANDWIDTH_7_MHZ) | ||
389 | b = 7000000; | ||
390 | |||
391 | /* INVWREF = ((7 * fs) / B) * 2^5 */ | ||
392 | t = sample_freq_hz; | ||
393 | t *= 7; | ||
394 | t *= 32; | ||
395 | t *= 10; | ||
396 | do_div(t, b); | ||
397 | t += 5; | ||
398 | do_div(t, 10); | ||
399 | |||
400 | tda10048_writereg(state, TDA10048_TIME_INVWREF_LSB, (u8)t); | ||
401 | tda10048_writereg(state, TDA10048_TIME_INVWREF_MSB, (u8)(t >> 8)); | ||
402 | |||
403 | return 0; | ||
404 | } | ||
405 | |||
406 | static int tda10048_set_bandwidth(struct dvb_frontend *fe, | ||
407 | enum fe_bandwidth bw) | ||
408 | { | ||
409 | struct tda10048_state *state = fe->demodulator_priv; | ||
410 | dprintk(1, "%s(bw=%d)\n", __func__, bw); | ||
411 | |||
412 | /* Bandwidth setting may need to be adjusted */ | ||
413 | switch (bw) { | ||
414 | case BANDWIDTH_6_MHZ: | ||
415 | case BANDWIDTH_7_MHZ: | ||
416 | case BANDWIDTH_8_MHZ: | ||
417 | tda10048_set_wref(fe, state->sample_freq, bw); | ||
418 | tda10048_set_invwref(fe, state->sample_freq, bw); | ||
419 | break; | ||
420 | default: | ||
421 | printk(KERN_ERR "%s() invalid bandwidth\n", __func__); | ||
422 | return -EINVAL; | ||
423 | } | ||
424 | |||
425 | state->bandwidth = bw; | ||
426 | |||
427 | return 0; | ||
428 | } | ||
429 | |||
430 | static int tda10048_set_if(struct dvb_frontend *fe, enum fe_bandwidth bw) | ||
431 | { | ||
432 | struct tda10048_state *state = fe->demodulator_priv; | ||
433 | struct tda10048_config *config = &state->config; | ||
434 | int i; | ||
435 | u32 if_freq_khz; | ||
436 | |||
437 | dprintk(1, "%s(bw = %d)\n", __func__, bw); | ||
438 | |||
439 | /* based on target bandwidth and clk we calculate pll factors */ | ||
440 | switch (bw) { | ||
441 | case BANDWIDTH_6_MHZ: | ||
442 | if_freq_khz = config->dtv6_if_freq_khz; | ||
443 | break; | ||
444 | case BANDWIDTH_7_MHZ: | ||
445 | if_freq_khz = config->dtv7_if_freq_khz; | ||
446 | break; | ||
447 | case BANDWIDTH_8_MHZ: | ||
448 | if_freq_khz = config->dtv8_if_freq_khz; | ||
449 | break; | ||
450 | default: | ||
451 | printk(KERN_ERR "%s() no default\n", __func__); | ||
452 | return -EINVAL; | ||
453 | } | ||
454 | |||
455 | for (i = 0; i < ARRAY_SIZE(pll_tab); i++) { | ||
456 | if ((pll_tab[i].clk_freq_khz == config->clk_freq_khz) && | ||
457 | (pll_tab[i].if_freq_khz == if_freq_khz)) { | ||
458 | |||
459 | state->freq_if_hz = pll_tab[i].if_freq_khz * 1000; | ||
460 | state->xtal_hz = pll_tab[i].clk_freq_khz * 1000; | ||
461 | state->pll_mfactor = pll_tab[i].m; | ||
462 | state->pll_nfactor = pll_tab[i].n; | ||
463 | state->pll_pfactor = pll_tab[i].p; | ||
464 | break; | ||
465 | } | ||
466 | } | ||
467 | if (i == ARRAY_SIZE(pll_tab)) { | ||
468 | printk(KERN_ERR "%s() Incorrect attach settings\n", | ||
469 | __func__); | ||
470 | return -EINVAL; | ||
471 | } | ||
472 | |||
473 | dprintk(1, "- freq_if_hz = %d\n", state->freq_if_hz); | ||
474 | dprintk(1, "- xtal_hz = %d\n", state->xtal_hz); | ||
475 | dprintk(1, "- pll_mfactor = %d\n", state->pll_mfactor); | ||
476 | dprintk(1, "- pll_nfactor = %d\n", state->pll_nfactor); | ||
477 | dprintk(1, "- pll_pfactor = %d\n", state->pll_pfactor); | ||
478 | |||
479 | /* Calculate the sample frequency */ | ||
480 | state->sample_freq = state->xtal_hz * (state->pll_mfactor + 45); | ||
481 | state->sample_freq /= (state->pll_nfactor + 1); | ||
482 | state->sample_freq /= (state->pll_pfactor + 4); | ||
483 | dprintk(1, "- sample_freq = %d\n", state->sample_freq); | ||
484 | |||
485 | /* Update the I/F */ | ||
486 | tda10048_set_phy2(fe, state->sample_freq, state->freq_if_hz); | ||
487 | |||
488 | return 0; | ||
489 | } | ||
490 | |||
274 | static int tda10048_firmware_upload(struct dvb_frontend *fe) | 491 | static int tda10048_firmware_upload(struct dvb_frontend *fe) |
275 | { | 492 | { |
276 | struct tda10048_state *state = fe->demodulator_priv; | 493 | struct tda10048_state *state = fe->demodulator_priv; |
494 | struct tda10048_config *config = &state->config; | ||
277 | const struct firmware *fw; | 495 | const struct firmware *fw; |
278 | int ret; | 496 | int ret; |
279 | int pos = 0; | 497 | int pos = 0; |
280 | int cnt; | 498 | int cnt; |
281 | u8 wlen = state->config->fwbulkwritelen; | 499 | u8 wlen = config->fwbulkwritelen; |
282 | 500 | ||
283 | if ((wlen != TDA10048_BULKWRITE_200) && (wlen != TDA10048_BULKWRITE_50)) | 501 | if ((wlen != TDA10048_BULKWRITE_200) && (wlen != TDA10048_BULKWRITE_50)) |
284 | wlen = TDA10048_BULKWRITE_200; | 502 | wlen = TDA10048_BULKWRITE_200; |
@@ -289,7 +507,7 @@ static int tda10048_firmware_upload(struct dvb_frontend *fe) | |||
289 | TDA10048_DEFAULT_FIRMWARE); | 507 | TDA10048_DEFAULT_FIRMWARE); |
290 | 508 | ||
291 | ret = request_firmware(&fw, TDA10048_DEFAULT_FIRMWARE, | 509 | ret = request_firmware(&fw, TDA10048_DEFAULT_FIRMWARE, |
292 | &state->i2c->dev); | 510 | state->i2c->dev.parent); |
293 | if (ret) { | 511 | if (ret) { |
294 | printk(KERN_ERR "%s: Upload failed. (file not found?)\n", | 512 | printk(KERN_ERR "%s: Upload failed. (file not found?)\n", |
295 | __func__); | 513 | __func__); |
@@ -484,8 +702,12 @@ static int tda10048_get_tps(struct tda10048_state *state, | |||
484 | static int tda10048_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | 702 | static int tda10048_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) |
485 | { | 703 | { |
486 | struct tda10048_state *state = fe->demodulator_priv; | 704 | struct tda10048_state *state = fe->demodulator_priv; |
705 | struct tda10048_config *config = &state->config; | ||
487 | dprintk(1, "%s(%d)\n", __func__, enable); | 706 | dprintk(1, "%s(%d)\n", __func__, enable); |
488 | 707 | ||
708 | if (config->disable_gate_access) | ||
709 | return 0; | ||
710 | |||
489 | if (enable) | 711 | if (enable) |
490 | return tda10048_writereg(state, TDA10048_CONF_C4_1, | 712 | return tda10048_writereg(state, TDA10048_CONF_C4_1, |
491 | tda10048_readreg(state, TDA10048_CONF_C4_1) | 0x02); | 713 | tda10048_readreg(state, TDA10048_CONF_C4_1) | 0x02); |
@@ -523,6 +745,12 @@ static int tda10048_set_frontend(struct dvb_frontend *fe, | |||
523 | 745 | ||
524 | dprintk(1, "%s(frequency=%d)\n", __func__, p->frequency); | 746 | dprintk(1, "%s(frequency=%d)\n", __func__, p->frequency); |
525 | 747 | ||
748 | /* Update the I/F pll's if the bandwidth changes */ | ||
749 | if (p->u.ofdm.bandwidth != state->bandwidth) { | ||
750 | tda10048_set_if(fe, p->u.ofdm.bandwidth); | ||
751 | tda10048_set_bandwidth(fe, p->u.ofdm.bandwidth); | ||
752 | } | ||
753 | |||
526 | if (fe->ops.tuner_ops.set_params) { | 754 | if (fe->ops.tuner_ops.set_params) { |
527 | 755 | ||
528 | if (fe->ops.i2c_gate_ctrl) | 756 | if (fe->ops.i2c_gate_ctrl) |
@@ -544,6 +772,7 @@ static int tda10048_set_frontend(struct dvb_frontend *fe, | |||
544 | static int tda10048_init(struct dvb_frontend *fe) | 772 | static int tda10048_init(struct dvb_frontend *fe) |
545 | { | 773 | { |
546 | struct tda10048_state *state = fe->demodulator_priv; | 774 | struct tda10048_state *state = fe->demodulator_priv; |
775 | struct tda10048_config *config = &state->config; | ||
547 | int ret = 0, i; | 776 | int ret = 0, i; |
548 | 777 | ||
549 | dprintk(1, "%s()\n", __func__); | 778 | dprintk(1, "%s()\n", __func__); |
@@ -556,10 +785,14 @@ static int tda10048_init(struct dvb_frontend *fe) | |||
556 | ret = tda10048_firmware_upload(fe); | 785 | ret = tda10048_firmware_upload(fe); |
557 | 786 | ||
558 | /* Set either serial or parallel */ | 787 | /* Set either serial or parallel */ |
559 | tda10048_output_mode(fe, state->config->output_mode); | 788 | tda10048_output_mode(fe, config->output_mode); |
789 | |||
790 | /* Set inversion */ | ||
791 | tda10048_set_inversion(fe, config->inversion); | ||
560 | 792 | ||
561 | /* set inversion */ | 793 | /* Establish default RF values */ |
562 | tda10048_set_inversion(fe, state->config->inversion); | 794 | tda10048_set_if(fe, BANDWIDTH_8_MHZ); |
795 | tda10048_set_bandwidth(fe, BANDWIDTH_8_MHZ); | ||
563 | 796 | ||
564 | /* Ensure we leave the gate closed */ | 797 | /* Ensure we leave the gate closed */ |
565 | tda10048_i2c_gate_ctrl(fe, 0); | 798 | tda10048_i2c_gate_ctrl(fe, 0); |
@@ -812,6 +1045,45 @@ static void tda10048_release(struct dvb_frontend *fe) | |||
812 | kfree(state); | 1045 | kfree(state); |
813 | } | 1046 | } |
814 | 1047 | ||
1048 | static void tda10048_establish_defaults(struct dvb_frontend *fe) | ||
1049 | { | ||
1050 | struct tda10048_state *state = fe->demodulator_priv; | ||
1051 | struct tda10048_config *config = &state->config; | ||
1052 | |||
1053 | /* Validate/default the config */ | ||
1054 | if (config->dtv6_if_freq_khz == 0) { | ||
1055 | config->dtv6_if_freq_khz = TDA10048_IF_4300; | ||
1056 | printk(KERN_WARNING "%s() tda10048_config.dtv6_if_freq_khz " | ||
1057 | "is not set (defaulting to %d)\n", | ||
1058 | __func__, | ||
1059 | config->dtv6_if_freq_khz); | ||
1060 | } | ||
1061 | |||
1062 | if (config->dtv7_if_freq_khz == 0) { | ||
1063 | config->dtv7_if_freq_khz = TDA10048_IF_4300; | ||
1064 | printk(KERN_WARNING "%s() tda10048_config.dtv7_if_freq_khz " | ||
1065 | "is not set (defaulting to %d)\n", | ||
1066 | __func__, | ||
1067 | config->dtv7_if_freq_khz); | ||
1068 | } | ||
1069 | |||
1070 | if (config->dtv8_if_freq_khz == 0) { | ||
1071 | config->dtv8_if_freq_khz = TDA10048_IF_4300; | ||
1072 | printk(KERN_WARNING "%s() tda10048_config.dtv8_if_freq_khz " | ||
1073 | "is not set (defaulting to %d)\n", | ||
1074 | __func__, | ||
1075 | config->dtv8_if_freq_khz); | ||
1076 | } | ||
1077 | |||
1078 | if (config->clk_freq_khz == 0) { | ||
1079 | config->clk_freq_khz = TDA10048_CLK_16000; | ||
1080 | printk(KERN_WARNING "%s() tda10048_config.clk_freq_khz " | ||
1081 | "is not set (defaulting to %d)\n", | ||
1082 | __func__, | ||
1083 | config->clk_freq_khz); | ||
1084 | } | ||
1085 | } | ||
1086 | |||
815 | static struct dvb_frontend_ops tda10048_ops; | 1087 | static struct dvb_frontend_ops tda10048_ops; |
816 | 1088 | ||
817 | struct dvb_frontend *tda10048_attach(const struct tda10048_config *config, | 1089 | struct dvb_frontend *tda10048_attach(const struct tda10048_config *config, |
@@ -826,10 +1098,11 @@ struct dvb_frontend *tda10048_attach(const struct tda10048_config *config, | |||
826 | if (state == NULL) | 1098 | if (state == NULL) |
827 | goto error; | 1099 | goto error; |
828 | 1100 | ||
829 | /* setup the state */ | 1101 | /* setup the state and clone the config */ |
830 | state->config = config; | 1102 | memcpy(&state->config, config, sizeof(*config)); |
831 | state->i2c = i2c; | 1103 | state->i2c = i2c; |
832 | state->fwloaded = 0; | 1104 | state->fwloaded = 0; |
1105 | state->bandwidth = BANDWIDTH_8_MHZ; | ||
833 | 1106 | ||
834 | /* check if the demod is present */ | 1107 | /* check if the demod is present */ |
835 | if (tda10048_readreg(state, TDA10048_IDENTITY) != 0x048) | 1108 | if (tda10048_readreg(state, TDA10048_IDENTITY) != 0x048) |
@@ -840,6 +1113,17 @@ struct dvb_frontend *tda10048_attach(const struct tda10048_config *config, | |||
840 | sizeof(struct dvb_frontend_ops)); | 1113 | sizeof(struct dvb_frontend_ops)); |
841 | state->frontend.demodulator_priv = state; | 1114 | state->frontend.demodulator_priv = state; |
842 | 1115 | ||
1116 | /* Establish any defaults the the user didn't pass */ | ||
1117 | tda10048_establish_defaults(&state->frontend); | ||
1118 | |||
1119 | /* Set the xtal and freq defaults */ | ||
1120 | if (tda10048_set_if(&state->frontend, BANDWIDTH_8_MHZ) != 0) | ||
1121 | goto error; | ||
1122 | |||
1123 | /* Default bandwidth */ | ||
1124 | if (tda10048_set_bandwidth(&state->frontend, BANDWIDTH_8_MHZ) != 0) | ||
1125 | goto error; | ||
1126 | |||
843 | /* Leave the gate closed */ | 1127 | /* Leave the gate closed */ |
844 | tda10048_i2c_gate_ctrl(&state->frontend, 0); | 1128 | tda10048_i2c_gate_ctrl(&state->frontend, 0); |
845 | 1129 | ||
diff --git a/drivers/media/dvb/frontends/tda10048.h b/drivers/media/dvb/frontends/tda10048.h index 0457b24601fa..8828ceaf74bb 100644 --- a/drivers/media/dvb/frontends/tda10048.h +++ b/drivers/media/dvb/frontends/tda10048.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | NXP TDA10048HN DVB OFDM demodulator driver | 2 | NXP TDA10048HN DVB OFDM demodulator driver |
3 | 3 | ||
4 | Copyright (C) 2008 Steven Toth <stoth@linuxtv.org> | 4 | Copyright (C) 2009 Steven Toth <stoth@kernellabs.com> |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 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 | 7 | it under the terms of the GNU General Public License as published by |
@@ -43,6 +43,25 @@ struct tda10048_config { | |||
43 | #define TDA10048_INVERSION_OFF 0 | 43 | #define TDA10048_INVERSION_OFF 0 |
44 | #define TDA10048_INVERSION_ON 1 | 44 | #define TDA10048_INVERSION_ON 1 |
45 | u8 inversion; | 45 | u8 inversion; |
46 | |||
47 | #define TDA10048_IF_3300 3300 | ||
48 | #define TDA10048_IF_3500 3500 | ||
49 | #define TDA10048_IF_3800 3800 | ||
50 | #define TDA10048_IF_4000 4000 | ||
51 | #define TDA10048_IF_4300 4300 | ||
52 | #define TDA10048_IF_4500 4500 | ||
53 | #define TDA10048_IF_4750 4750 | ||
54 | #define TDA10048_IF_36130 36130 | ||
55 | u16 dtv6_if_freq_khz; | ||
56 | u16 dtv7_if_freq_khz; | ||
57 | u16 dtv8_if_freq_khz; | ||
58 | |||
59 | #define TDA10048_CLK_4000 4000 | ||
60 | #define TDA10048_CLK_16000 16000 | ||
61 | u16 clk_freq_khz; | ||
62 | |||
63 | /* Disable I2C gate access */ | ||
64 | u8 disable_gate_access; | ||
46 | }; | 65 | }; |
47 | 66 | ||
48 | #if defined(CONFIG_DVB_TDA10048) || \ | 67 | #if defined(CONFIG_DVB_TDA10048) || \ |
diff --git a/drivers/media/dvb/siano/Makefile b/drivers/media/dvb/siano/Makefile index bcf93f4828b2..c6644d909433 100644 --- a/drivers/media/dvb/siano/Makefile +++ b/drivers/media/dvb/siano/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | sms1xxx-objs := smscoreapi.o sms-cards.o | 1 | sms1xxx-objs := smscoreapi.o sms-cards.o smsendian.o smsir.o |
2 | 2 | ||
3 | obj-$(CONFIG_DVB_SIANO_SMS1XXX) += sms1xxx.o | 3 | obj-$(CONFIG_DVB_SIANO_SMS1XXX) += sms1xxx.o |
4 | obj-$(CONFIG_DVB_SIANO_SMS1XXX) += smsusb.o | 4 | obj-$(CONFIG_DVB_SIANO_SMS1XXX) += smsusb.o |
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c index 63e4d0ec6583..d8b15d583bde 100644 --- a/drivers/media/dvb/siano/sms-cards.c +++ b/drivers/media/dvb/siano/sms-cards.c | |||
@@ -18,6 +18,7 @@ | |||
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include "sms-cards.h" | 20 | #include "sms-cards.h" |
21 | #include "smsir.h" | ||
21 | 22 | ||
22 | static int sms_dbg; | 23 | static int sms_dbg; |
23 | module_param_named(cards_dbg, sms_dbg, int, 0644); | 24 | module_param_named(cards_dbg, sms_dbg, int, 0644); |
@@ -30,17 +31,14 @@ static struct sms_board sms_boards[] = { | |||
30 | [SMS1XXX_BOARD_SIANO_STELLAR] = { | 31 | [SMS1XXX_BOARD_SIANO_STELLAR] = { |
31 | .name = "Siano Stellar Digital Receiver", | 32 | .name = "Siano Stellar Digital Receiver", |
32 | .type = SMS_STELLAR, | 33 | .type = SMS_STELLAR, |
33 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-stellar-dvbt-01.fw", | ||
34 | }, | 34 | }, |
35 | [SMS1XXX_BOARD_SIANO_NOVA_A] = { | 35 | [SMS1XXX_BOARD_SIANO_NOVA_A] = { |
36 | .name = "Siano Nova A Digital Receiver", | 36 | .name = "Siano Nova A Digital Receiver", |
37 | .type = SMS_NOVA_A0, | 37 | .type = SMS_NOVA_A0, |
38 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-a-dvbt-01.fw", | ||
39 | }, | 38 | }, |
40 | [SMS1XXX_BOARD_SIANO_NOVA_B] = { | 39 | [SMS1XXX_BOARD_SIANO_NOVA_B] = { |
41 | .name = "Siano Nova B Digital Receiver", | 40 | .name = "Siano Nova B Digital Receiver", |
42 | .type = SMS_NOVA_B0, | 41 | .type = SMS_NOVA_B0, |
43 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw", | ||
44 | }, | 42 | }, |
45 | [SMS1XXX_BOARD_SIANO_VEGA] = { | 43 | [SMS1XXX_BOARD_SIANO_VEGA] = { |
46 | .name = "Siano Vega Digital Receiver", | 44 | .name = "Siano Vega Digital Receiver", |
@@ -65,6 +63,9 @@ static struct sms_board sms_boards[] = { | |||
65 | .name = "Hauppauge WinTV MiniStick", | 63 | .name = "Hauppauge WinTV MiniStick", |
66 | .type = SMS_NOVA_B0, | 64 | .type = SMS_NOVA_B0, |
67 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", | 65 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", |
66 | .board_cfg.leds_power = 26, | ||
67 | .board_cfg.led0 = 27, | ||
68 | .board_cfg.led1 = 28, | ||
68 | .led_power = 26, | 69 | .led_power = 26, |
69 | .led_lo = 27, | 70 | .led_lo = 27, |
70 | .led_hi = 28, | 71 | .led_hi = 28, |
@@ -74,7 +75,9 @@ static struct sms_board sms_boards[] = { | |||
74 | .type = SMS_NOVA_B0, | 75 | .type = SMS_NOVA_B0, |
75 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", | 76 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", |
76 | .lna_ctrl = 29, | 77 | .lna_ctrl = 29, |
78 | .board_cfg.foreign_lna0_ctrl = 29, | ||
77 | .rf_switch = 17, | 79 | .rf_switch = 17, |
80 | .board_cfg.rf_switch_uhf = 17, | ||
78 | }, | 81 | }, |
79 | [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = { | 82 | [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = { |
80 | .name = "Hauppauge WinTV MiniCard", | 83 | .name = "Hauppauge WinTV MiniCard", |
@@ -82,6 +85,16 @@ static struct sms_board sms_boards[] = { | |||
82 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", | 85 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", |
83 | .lna_ctrl = -1, | 86 | .lna_ctrl = -1, |
84 | }, | 87 | }, |
88 | [SMS1XXX_BOARD_SIANO_NICE] = { | ||
89 | /* 11 */ | ||
90 | .name = "Siano Nice Digital Receiver", | ||
91 | .type = SMS_NOVA_B0, | ||
92 | }, | ||
93 | [SMS1XXX_BOARD_SIANO_VENICE] = { | ||
94 | /* 12 */ | ||
95 | .name = "Siano Venice Digital Receiver", | ||
96 | .type = SMS_VEGA, | ||
97 | }, | ||
85 | }; | 98 | }; |
86 | 99 | ||
87 | struct sms_board *sms_get_board(int id) | 100 | struct sms_board *sms_get_board(int id) |
@@ -91,12 +104,179 @@ struct sms_board *sms_get_board(int id) | |||
91 | return &sms_boards[id]; | 104 | return &sms_boards[id]; |
92 | } | 105 | } |
93 | EXPORT_SYMBOL_GPL(sms_get_board); | 106 | EXPORT_SYMBOL_GPL(sms_get_board); |
107 | static inline void sms_gpio_assign_11xx_default_led_config( | ||
108 | struct smscore_gpio_config *pGpioConfig) { | ||
109 | pGpioConfig->Direction = SMS_GPIO_DIRECTION_OUTPUT; | ||
110 | pGpioConfig->InputCharacteristics = | ||
111 | SMS_GPIO_INPUT_CHARACTERISTICS_NORMAL; | ||
112 | pGpioConfig->OutputDriving = SMS_GPIO_OUTPUT_DRIVING_4mA; | ||
113 | pGpioConfig->OutputSlewRate = SMS_GPIO_OUTPUT_SLEW_RATE_0_45_V_NS; | ||
114 | pGpioConfig->PullUpDown = SMS_GPIO_PULL_UP_DOWN_NONE; | ||
115 | } | ||
116 | |||
117 | int sms_board_event(struct smscore_device_t *coredev, | ||
118 | enum SMS_BOARD_EVENTS gevent) { | ||
119 | int board_id = smscore_get_board_id(coredev); | ||
120 | struct sms_board *board = sms_get_board(board_id); | ||
121 | struct smscore_gpio_config MyGpioConfig; | ||
122 | |||
123 | sms_gpio_assign_11xx_default_led_config(&MyGpioConfig); | ||
124 | |||
125 | switch (gevent) { | ||
126 | case BOARD_EVENT_POWER_INIT: /* including hotplug */ | ||
127 | switch (board_id) { | ||
128 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
129 | /* set I/O and turn off all LEDs */ | ||
130 | smscore_gpio_configure(coredev, | ||
131 | board->board_cfg.leds_power, | ||
132 | &MyGpioConfig); | ||
133 | smscore_gpio_set_level(coredev, | ||
134 | board->board_cfg.leds_power, 0); | ||
135 | smscore_gpio_configure(coredev, board->board_cfg.led0, | ||
136 | &MyGpioConfig); | ||
137 | smscore_gpio_set_level(coredev, | ||
138 | board->board_cfg.led0, 0); | ||
139 | smscore_gpio_configure(coredev, board->board_cfg.led1, | ||
140 | &MyGpioConfig); | ||
141 | smscore_gpio_set_level(coredev, | ||
142 | board->board_cfg.led1, 0); | ||
143 | break; | ||
144 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
145 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
146 | /* set I/O and turn off LNA */ | ||
147 | smscore_gpio_configure(coredev, | ||
148 | board->board_cfg.foreign_lna0_ctrl, | ||
149 | &MyGpioConfig); | ||
150 | smscore_gpio_set_level(coredev, | ||
151 | board->board_cfg.foreign_lna0_ctrl, | ||
152 | 0); | ||
153 | break; | ||
154 | } | ||
155 | break; /* BOARD_EVENT_BIND */ | ||
156 | |||
157 | case BOARD_EVENT_POWER_SUSPEND: | ||
158 | switch (board_id) { | ||
159 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
160 | smscore_gpio_set_level(coredev, | ||
161 | board->board_cfg.leds_power, 0); | ||
162 | smscore_gpio_set_level(coredev, | ||
163 | board->board_cfg.led0, 0); | ||
164 | smscore_gpio_set_level(coredev, | ||
165 | board->board_cfg.led1, 0); | ||
166 | break; | ||
167 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
168 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
169 | smscore_gpio_set_level(coredev, | ||
170 | board->board_cfg.foreign_lna0_ctrl, | ||
171 | 0); | ||
172 | break; | ||
173 | } | ||
174 | break; /* BOARD_EVENT_POWER_SUSPEND */ | ||
175 | |||
176 | case BOARD_EVENT_POWER_RESUME: | ||
177 | switch (board_id) { | ||
178 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
179 | smscore_gpio_set_level(coredev, | ||
180 | board->board_cfg.leds_power, 1); | ||
181 | smscore_gpio_set_level(coredev, | ||
182 | board->board_cfg.led0, 1); | ||
183 | smscore_gpio_set_level(coredev, | ||
184 | board->board_cfg.led1, 0); | ||
185 | break; | ||
186 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
187 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
188 | smscore_gpio_set_level(coredev, | ||
189 | board->board_cfg.foreign_lna0_ctrl, | ||
190 | 1); | ||
191 | break; | ||
192 | } | ||
193 | break; /* BOARD_EVENT_POWER_RESUME */ | ||
194 | |||
195 | case BOARD_EVENT_BIND: | ||
196 | switch (board_id) { | ||
197 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
198 | smscore_gpio_set_level(coredev, | ||
199 | board->board_cfg.leds_power, 1); | ||
200 | smscore_gpio_set_level(coredev, | ||
201 | board->board_cfg.led0, 1); | ||
202 | smscore_gpio_set_level(coredev, | ||
203 | board->board_cfg.led1, 0); | ||
204 | break; | ||
205 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
206 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
207 | smscore_gpio_set_level(coredev, | ||
208 | board->board_cfg.foreign_lna0_ctrl, | ||
209 | 1); | ||
210 | break; | ||
211 | } | ||
212 | break; /* BOARD_EVENT_BIND */ | ||
213 | |||
214 | case BOARD_EVENT_SCAN_PROG: | ||
215 | break; /* BOARD_EVENT_SCAN_PROG */ | ||
216 | case BOARD_EVENT_SCAN_COMP: | ||
217 | break; /* BOARD_EVENT_SCAN_COMP */ | ||
218 | case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL: | ||
219 | break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */ | ||
220 | case BOARD_EVENT_FE_LOCK: | ||
221 | switch (board_id) { | ||
222 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
223 | smscore_gpio_set_level(coredev, | ||
224 | board->board_cfg.led1, 1); | ||
225 | break; | ||
226 | } | ||
227 | break; /* BOARD_EVENT_FE_LOCK */ | ||
228 | case BOARD_EVENT_FE_UNLOCK: | ||
229 | switch (board_id) { | ||
230 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
231 | smscore_gpio_set_level(coredev, | ||
232 | board->board_cfg.led1, 0); | ||
233 | break; | ||
234 | } | ||
235 | break; /* BOARD_EVENT_FE_UNLOCK */ | ||
236 | case BOARD_EVENT_DEMOD_LOCK: | ||
237 | break; /* BOARD_EVENT_DEMOD_LOCK */ | ||
238 | case BOARD_EVENT_DEMOD_UNLOCK: | ||
239 | break; /* BOARD_EVENT_DEMOD_UNLOCK */ | ||
240 | case BOARD_EVENT_RECEPTION_MAX_4: | ||
241 | break; /* BOARD_EVENT_RECEPTION_MAX_4 */ | ||
242 | case BOARD_EVENT_RECEPTION_3: | ||
243 | break; /* BOARD_EVENT_RECEPTION_3 */ | ||
244 | case BOARD_EVENT_RECEPTION_2: | ||
245 | break; /* BOARD_EVENT_RECEPTION_2 */ | ||
246 | case BOARD_EVENT_RECEPTION_1: | ||
247 | break; /* BOARD_EVENT_RECEPTION_1 */ | ||
248 | case BOARD_EVENT_RECEPTION_LOST_0: | ||
249 | break; /* BOARD_EVENT_RECEPTION_LOST_0 */ | ||
250 | case BOARD_EVENT_MULTIPLEX_OK: | ||
251 | switch (board_id) { | ||
252 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
253 | smscore_gpio_set_level(coredev, | ||
254 | board->board_cfg.led1, 1); | ||
255 | break; | ||
256 | } | ||
257 | break; /* BOARD_EVENT_MULTIPLEX_OK */ | ||
258 | case BOARD_EVENT_MULTIPLEX_ERRORS: | ||
259 | switch (board_id) { | ||
260 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
261 | smscore_gpio_set_level(coredev, | ||
262 | board->board_cfg.led1, 0); | ||
263 | break; | ||
264 | } | ||
265 | break; /* BOARD_EVENT_MULTIPLEX_ERRORS */ | ||
266 | |||
267 | default: | ||
268 | sms_err("Unknown SMS board event"); | ||
269 | break; | ||
270 | } | ||
271 | return 0; | ||
272 | } | ||
273 | EXPORT_SYMBOL_GPL(sms_board_event); | ||
94 | 274 | ||
95 | static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable) | 275 | static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable) |
96 | { | 276 | { |
97 | int lvl, ret; | 277 | int lvl, ret; |
98 | u32 gpio; | 278 | u32 gpio; |
99 | struct smscore_gpio_config gpioconfig = { | 279 | struct smscore_config_gpio gpioconfig = { |
100 | .direction = SMS_GPIO_DIRECTION_OUTPUT, | 280 | .direction = SMS_GPIO_DIRECTION_OUTPUT, |
101 | .pullupdown = SMS_GPIO_PULLUPDOWN_NONE, | 281 | .pullupdown = SMS_GPIO_PULLUPDOWN_NONE, |
102 | .inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL, | 282 | .inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL, |
diff --git a/drivers/media/dvb/siano/sms-cards.h b/drivers/media/dvb/siano/sms-cards.h index 64d74c59c33f..38f062f6ad68 100644 --- a/drivers/media/dvb/siano/sms-cards.h +++ b/drivers/media/dvb/siano/sms-cards.h | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
24 | #include "smscoreapi.h" | 24 | #include "smscoreapi.h" |
25 | #include "smsir.h" | ||
25 | 26 | ||
26 | #define SMS_BOARD_UNKNOWN 0 | 27 | #define SMS_BOARD_UNKNOWN 0 |
27 | #define SMS1XXX_BOARD_SIANO_STELLAR 1 | 28 | #define SMS1XXX_BOARD_SIANO_STELLAR 1 |
@@ -34,10 +35,47 @@ | |||
34 | #define SMS1XXX_BOARD_HAUPPAUGE_WINDHAM 8 | 35 | #define SMS1XXX_BOARD_HAUPPAUGE_WINDHAM 8 |
35 | #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD 9 | 36 | #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD 9 |
36 | #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 10 | 37 | #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 10 |
38 | #define SMS1XXX_BOARD_SIANO_NICE 11 | ||
39 | #define SMS1XXX_BOARD_SIANO_VENICE 12 | ||
40 | |||
41 | struct sms_board_gpio_cfg { | ||
42 | int lna_vhf_exist; | ||
43 | int lna_vhf_ctrl; | ||
44 | int lna_uhf_exist; | ||
45 | int lna_uhf_ctrl; | ||
46 | int lna_uhf_d_ctrl; | ||
47 | int lna_sband_exist; | ||
48 | int lna_sband_ctrl; | ||
49 | int lna_sband_d_ctrl; | ||
50 | int foreign_lna0_ctrl; | ||
51 | int foreign_lna1_ctrl; | ||
52 | int foreign_lna2_ctrl; | ||
53 | int rf_switch_vhf; | ||
54 | int rf_switch_uhf; | ||
55 | int rf_switch_sband; | ||
56 | int leds_power; | ||
57 | int led0; | ||
58 | int led1; | ||
59 | int led2; | ||
60 | int led3; | ||
61 | int led4; | ||
62 | int ir; | ||
63 | int eeprom_wp; | ||
64 | int mrc_sense; | ||
65 | int mrc_pdn_resetn; | ||
66 | int mrc_gp0; /* mrcs spi int */ | ||
67 | int mrc_gp1; | ||
68 | int mrc_gp2; | ||
69 | int mrc_gp3; | ||
70 | int mrc_gp4; | ||
71 | int host_spi_gsp_ts_int; | ||
72 | }; | ||
37 | 73 | ||
38 | struct sms_board { | 74 | struct sms_board { |
39 | enum sms_device_type_st type; | 75 | enum sms_device_type_st type; |
40 | char *name, *fw[DEVICE_MODE_MAX]; | 76 | char *name, *fw[DEVICE_MODE_MAX]; |
77 | struct sms_board_gpio_cfg board_cfg; | ||
78 | enum ir_kb_type ir_kb_type; | ||
41 | 79 | ||
42 | /* gpios */ | 80 | /* gpios */ |
43 | int led_power, led_hi, led_lo, lna_ctrl, rf_switch; | 81 | int led_power, led_hi, led_lo, lna_ctrl, rf_switch; |
@@ -45,6 +83,32 @@ struct sms_board { | |||
45 | 83 | ||
46 | struct sms_board *sms_get_board(int id); | 84 | struct sms_board *sms_get_board(int id); |
47 | 85 | ||
86 | extern struct smscore_device_t *coredev; | ||
87 | |||
88 | enum SMS_BOARD_EVENTS { | ||
89 | BOARD_EVENT_POWER_INIT, | ||
90 | BOARD_EVENT_POWER_SUSPEND, | ||
91 | BOARD_EVENT_POWER_RESUME, | ||
92 | BOARD_EVENT_BIND, | ||
93 | BOARD_EVENT_SCAN_PROG, | ||
94 | BOARD_EVENT_SCAN_COMP, | ||
95 | BOARD_EVENT_EMERGENCY_WARNING_SIGNAL, | ||
96 | BOARD_EVENT_FE_LOCK, | ||
97 | BOARD_EVENT_FE_UNLOCK, | ||
98 | BOARD_EVENT_DEMOD_LOCK, | ||
99 | BOARD_EVENT_DEMOD_UNLOCK, | ||
100 | BOARD_EVENT_RECEPTION_MAX_4, | ||
101 | BOARD_EVENT_RECEPTION_3, | ||
102 | BOARD_EVENT_RECEPTION_2, | ||
103 | BOARD_EVENT_RECEPTION_1, | ||
104 | BOARD_EVENT_RECEPTION_LOST_0, | ||
105 | BOARD_EVENT_MULTIPLEX_OK, | ||
106 | BOARD_EVENT_MULTIPLEX_ERRORS | ||
107 | }; | ||
108 | |||
109 | int sms_board_event(struct smscore_device_t *coredev, | ||
110 | enum SMS_BOARD_EVENTS gevent); | ||
111 | |||
48 | int sms_board_setup(struct smscore_device_t *coredev); | 112 | int sms_board_setup(struct smscore_device_t *coredev); |
49 | 113 | ||
50 | #define SMS_LED_OFF 0 | 114 | #define SMS_LED_OFF 0 |
diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c index 7bd4d1dee2b3..32be382f0e97 100644 --- a/drivers/media/dvb/siano/smscoreapi.c +++ b/drivers/media/dvb/siano/smscoreapi.c | |||
@@ -30,9 +30,13 @@ | |||
30 | #include <linux/io.h> | 30 | #include <linux/io.h> |
31 | 31 | ||
32 | #include <linux/firmware.h> | 32 | #include <linux/firmware.h> |
33 | #include <linux/wait.h> | ||
34 | #include <asm/byteorder.h> | ||
33 | 35 | ||
34 | #include "smscoreapi.h" | 36 | #include "smscoreapi.h" |
35 | #include "sms-cards.h" | 37 | #include "sms-cards.h" |
38 | #include "smsir.h" | ||
39 | #include "smsendian.h" | ||
36 | 40 | ||
37 | static int sms_dbg; | 41 | static int sms_dbg; |
38 | module_param_named(debug, sms_dbg, int, 0644); | 42 | module_param_named(debug, sms_dbg, int, 0644); |
@@ -58,42 +62,6 @@ struct smscore_client_t { | |||
58 | onremove_t onremove_handler; | 62 | onremove_t onremove_handler; |
59 | }; | 63 | }; |
60 | 64 | ||
61 | struct smscore_device_t { | ||
62 | struct list_head entry; | ||
63 | |||
64 | struct list_head clients; | ||
65 | struct list_head subclients; | ||
66 | spinlock_t clientslock; | ||
67 | |||
68 | struct list_head buffers; | ||
69 | spinlock_t bufferslock; | ||
70 | int num_buffers; | ||
71 | |||
72 | void *common_buffer; | ||
73 | int common_buffer_size; | ||
74 | dma_addr_t common_buffer_phys; | ||
75 | |||
76 | void *context; | ||
77 | struct device *device; | ||
78 | |||
79 | char devpath[32]; | ||
80 | unsigned long device_flags; | ||
81 | |||
82 | setmode_t setmode_handler; | ||
83 | detectmode_t detectmode_handler; | ||
84 | sendrequest_t sendrequest_handler; | ||
85 | preload_t preload_handler; | ||
86 | postload_t postload_handler; | ||
87 | |||
88 | int mode, modes_supported; | ||
89 | |||
90 | struct completion version_ex_done, data_download_done, trigger_done; | ||
91 | struct completion init_device_done, reload_start_done, resume_done; | ||
92 | |||
93 | int board_id; | ||
94 | int led_state; | ||
95 | }; | ||
96 | |||
97 | void smscore_set_board_id(struct smscore_device_t *core, int id) | 65 | void smscore_set_board_id(struct smscore_device_t *core, int id) |
98 | { | 66 | { |
99 | core->board_id = id; | 67 | core->board_id = id; |
@@ -384,6 +352,13 @@ int smscore_register_device(struct smsdevice_params_t *params, | |||
384 | init_completion(&dev->init_device_done); | 352 | init_completion(&dev->init_device_done); |
385 | init_completion(&dev->reload_start_done); | 353 | init_completion(&dev->reload_start_done); |
386 | init_completion(&dev->resume_done); | 354 | init_completion(&dev->resume_done); |
355 | init_completion(&dev->gpio_configuration_done); | ||
356 | init_completion(&dev->gpio_set_level_done); | ||
357 | init_completion(&dev->gpio_get_level_done); | ||
358 | init_completion(&dev->ir_init_done); | ||
359 | |||
360 | /* Buffer management */ | ||
361 | init_waitqueue_head(&dev->buffer_mng_waitq); | ||
387 | 362 | ||
388 | /* alloc common buffer */ | 363 | /* alloc common buffer */ |
389 | dev->common_buffer_size = params->buffer_size * params->num_buffers; | 364 | dev->common_buffer_size = params->buffer_size * params->num_buffers; |
@@ -439,6 +414,71 @@ int smscore_register_device(struct smsdevice_params_t *params, | |||
439 | } | 414 | } |
440 | EXPORT_SYMBOL_GPL(smscore_register_device); | 415 | EXPORT_SYMBOL_GPL(smscore_register_device); |
441 | 416 | ||
417 | |||
418 | static int smscore_sendrequest_and_wait(struct smscore_device_t *coredev, | ||
419 | void *buffer, size_t size, struct completion *completion) { | ||
420 | int rc = coredev->sendrequest_handler(coredev->context, buffer, size); | ||
421 | if (rc < 0) { | ||
422 | sms_info("sendrequest returned error %d", rc); | ||
423 | return rc; | ||
424 | } | ||
425 | |||
426 | return wait_for_completion_timeout(completion, | ||
427 | msecs_to_jiffies(SMS_PROTOCOL_MAX_RAOUNDTRIP_MS)) ? | ||
428 | 0 : -ETIME; | ||
429 | } | ||
430 | |||
431 | /** | ||
432 | * Starts & enables IR operations | ||
433 | * | ||
434 | * @return 0 on success, < 0 on error. | ||
435 | */ | ||
436 | static int smscore_init_ir(struct smscore_device_t *coredev) | ||
437 | { | ||
438 | int ir_io; | ||
439 | int rc; | ||
440 | void *buffer; | ||
441 | |||
442 | coredev->ir.input_dev = NULL; | ||
443 | ir_io = sms_get_board(smscore_get_board_id(coredev))->board_cfg.ir; | ||
444 | if (ir_io) {/* only if IR port exist we use IR sub-module */ | ||
445 | sms_info("IR loading"); | ||
446 | rc = sms_ir_init(coredev); | ||
447 | |||
448 | if (rc != 0) | ||
449 | sms_err("Error initialization DTV IR sub-module"); | ||
450 | else { | ||
451 | buffer = kmalloc(sizeof(struct SmsMsgData_ST2) + | ||
452 | SMS_DMA_ALIGNMENT, | ||
453 | GFP_KERNEL | GFP_DMA); | ||
454 | if (buffer) { | ||
455 | struct SmsMsgData_ST2 *msg = | ||
456 | (struct SmsMsgData_ST2 *) | ||
457 | SMS_ALIGN_ADDRESS(buffer); | ||
458 | |||
459 | SMS_INIT_MSG(&msg->xMsgHeader, | ||
460 | MSG_SMS_START_IR_REQ, | ||
461 | sizeof(struct SmsMsgData_ST2)); | ||
462 | msg->msgData[0] = coredev->ir.controller; | ||
463 | msg->msgData[1] = coredev->ir.timeout; | ||
464 | |||
465 | smsendian_handle_tx_message( | ||
466 | (struct SmsMsgHdr_ST2 *)msg); | ||
467 | rc = smscore_sendrequest_and_wait(coredev, msg, | ||
468 | msg->xMsgHeader. msgLength, | ||
469 | &coredev->ir_init_done); | ||
470 | |||
471 | kfree(buffer); | ||
472 | } else | ||
473 | sms_err | ||
474 | ("Sending IR initialization message failed"); | ||
475 | } | ||
476 | } else | ||
477 | sms_info("IR port has not been detected"); | ||
478 | |||
479 | return 0; | ||
480 | } | ||
481 | |||
442 | /** | 482 | /** |
443 | * sets initial device mode and notifies client hotplugs that device is ready | 483 | * sets initial device mode and notifies client hotplugs that device is ready |
444 | * | 484 | * |
@@ -459,6 +499,7 @@ int smscore_start_device(struct smscore_device_t *coredev) | |||
459 | kmutex_lock(&g_smscore_deviceslock); | 499 | kmutex_lock(&g_smscore_deviceslock); |
460 | 500 | ||
461 | rc = smscore_notify_callbacks(coredev, coredev->device, 1); | 501 | rc = smscore_notify_callbacks(coredev, coredev->device, 1); |
502 | smscore_init_ir(coredev); | ||
462 | 503 | ||
463 | sms_info("device %p started, rc %d", coredev, rc); | 504 | sms_info("device %p started, rc %d", coredev, rc); |
464 | 505 | ||
@@ -468,29 +509,19 @@ int smscore_start_device(struct smscore_device_t *coredev) | |||
468 | } | 509 | } |
469 | EXPORT_SYMBOL_GPL(smscore_start_device); | 510 | EXPORT_SYMBOL_GPL(smscore_start_device); |
470 | 511 | ||
471 | static int smscore_sendrequest_and_wait(struct smscore_device_t *coredev, | ||
472 | void *buffer, size_t size, | ||
473 | struct completion *completion) | ||
474 | { | ||
475 | int rc = coredev->sendrequest_handler(coredev->context, buffer, size); | ||
476 | if (rc < 0) { | ||
477 | sms_info("sendrequest returned error %d", rc); | ||
478 | return rc; | ||
479 | } | ||
480 | |||
481 | return wait_for_completion_timeout(completion, | ||
482 | msecs_to_jiffies(10000)) ? | ||
483 | 0 : -ETIME; | ||
484 | } | ||
485 | 512 | ||
486 | static int smscore_load_firmware_family2(struct smscore_device_t *coredev, | 513 | static int smscore_load_firmware_family2(struct smscore_device_t *coredev, |
487 | void *buffer, size_t size) | 514 | void *buffer, size_t size) |
488 | { | 515 | { |
489 | struct SmsFirmware_ST *firmware = (struct SmsFirmware_ST *) buffer; | 516 | struct SmsFirmware_ST *firmware = (struct SmsFirmware_ST *) buffer; |
490 | struct SmsMsgHdr_ST *msg; | 517 | struct SmsMsgHdr_ST *msg; |
491 | u32 mem_address = firmware->StartAddress; | 518 | u32 mem_address; |
492 | u8 *payload = firmware->Payload; | 519 | u8 *payload = firmware->Payload; |
493 | int rc = 0; | 520 | int rc = 0; |
521 | firmware->StartAddress = le32_to_cpu(firmware->StartAddress); | ||
522 | firmware->Length = le32_to_cpu(firmware->Length); | ||
523 | |||
524 | mem_address = firmware->StartAddress; | ||
494 | 525 | ||
495 | sms_info("loading FW to addr 0x%x size %d", | 526 | sms_info("loading FW to addr 0x%x size %d", |
496 | mem_address, firmware->Length); | 527 | mem_address, firmware->Length); |
@@ -657,6 +688,9 @@ void smscore_unregister_device(struct smscore_device_t *coredev) | |||
657 | 688 | ||
658 | kmutex_lock(&g_smscore_deviceslock); | 689 | kmutex_lock(&g_smscore_deviceslock); |
659 | 690 | ||
691 | /* Release input device (IR) resources */ | ||
692 | sms_ir_exit(coredev); | ||
693 | |||
660 | smscore_notify_clients(coredev); | 694 | smscore_notify_clients(coredev); |
661 | smscore_notify_callbacks(coredev, NULL, 0); | 695 | smscore_notify_callbacks(coredev, NULL, 0); |
662 | 696 | ||
@@ -664,7 +698,9 @@ void smscore_unregister_device(struct smscore_device_t *coredev) | |||
664 | * onresponse must no longer be called */ | 698 | * onresponse must no longer be called */ |
665 | 699 | ||
666 | while (1) { | 700 | while (1) { |
667 | while ((cb = smscore_getbuffer(coredev))) { | 701 | while (!list_empty(&coredev->buffers)) { |
702 | cb = (struct smscore_buffer_t *) coredev->buffers.next; | ||
703 | list_del(&cb->entry); | ||
668 | kfree(cb); | 704 | kfree(cb); |
669 | num_buffers++; | 705 | num_buffers++; |
670 | } | 706 | } |
@@ -685,8 +721,10 @@ void smscore_unregister_device(struct smscore_device_t *coredev) | |||
685 | 721 | ||
686 | if (coredev->common_buffer) | 722 | if (coredev->common_buffer) |
687 | dma_free_coherent(NULL, coredev->common_buffer_size, | 723 | dma_free_coherent(NULL, coredev->common_buffer_size, |
688 | coredev->common_buffer, | 724 | coredev->common_buffer, coredev->common_buffer_phys); |
689 | coredev->common_buffer_phys); | 725 | |
726 | if (coredev->fw_buf != NULL) | ||
727 | kfree(coredev->fw_buf); | ||
690 | 728 | ||
691 | list_del(&coredev->entry); | 729 | list_del(&coredev->entry); |
692 | kfree(coredev); | 730 | kfree(coredev); |
@@ -746,7 +784,7 @@ static char *smscore_fw_lkup[][SMS_NUM_OF_DEVICE_TYPES] = { | |||
746 | /*BDA*/ | 784 | /*BDA*/ |
747 | {"none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none"}, | 785 | {"none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none"}, |
748 | /*ISDBT*/ | 786 | /*ISDBT*/ |
749 | {"none", "isdbt_nova_12mhz.inp", "dvb_nova_12mhz.inp", "none"}, | 787 | {"none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none"}, |
750 | /*ISDBTBDA*/ | 788 | /*ISDBTBDA*/ |
751 | {"none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none"}, | 789 | {"none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none"}, |
752 | /*CMMB*/ | 790 | /*CMMB*/ |
@@ -870,7 +908,7 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode) | |||
870 | coredev->device_flags &= ~SMS_DEVICE_NOT_READY; | 908 | coredev->device_flags &= ~SMS_DEVICE_NOT_READY; |
871 | } | 909 | } |
872 | 910 | ||
873 | if (rc != 0) | 911 | if (rc < 0) |
874 | sms_err("return error code %d.", rc); | 912 | sms_err("return error code %d.", rc); |
875 | return rc; | 913 | return rc; |
876 | } | 914 | } |
@@ -940,14 +978,11 @@ smscore_client_t *smscore_find_client(struct smscore_device_t *coredev, | |||
940 | * | 978 | * |
941 | */ | 979 | */ |
942 | void smscore_onresponse(struct smscore_device_t *coredev, | 980 | void smscore_onresponse(struct smscore_device_t *coredev, |
943 | struct smscore_buffer_t *cb) | 981 | struct smscore_buffer_t *cb) { |
944 | { | 982 | struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) ((u8 *) cb->p |
945 | struct SmsMsgHdr_ST *phdr = | 983 | + cb->offset); |
946 | (struct SmsMsgHdr_ST *)((u8 *) cb->p + cb->offset); | 984 | struct smscore_client_t *client; |
947 | struct smscore_client_t *client = | ||
948 | smscore_find_client(coredev, phdr->msgType, phdr->msgDstId); | ||
949 | int rc = -EBUSY; | 985 | int rc = -EBUSY; |
950 | |||
951 | static unsigned long last_sample_time; /* = 0; */ | 986 | static unsigned long last_sample_time; /* = 0; */ |
952 | static int data_total; /* = 0; */ | 987 | static int data_total; /* = 0; */ |
953 | unsigned long time_now = jiffies_to_msecs(jiffies); | 988 | unsigned long time_now = jiffies_to_msecs(jiffies); |
@@ -965,6 +1000,16 @@ void smscore_onresponse(struct smscore_device_t *coredev, | |||
965 | } | 1000 | } |
966 | 1001 | ||
967 | data_total += cb->size; | 1002 | data_total += cb->size; |
1003 | /* Do we need to re-route? */ | ||
1004 | if ((phdr->msgType == MSG_SMS_HO_PER_SLICES_IND) || | ||
1005 | (phdr->msgType == MSG_SMS_TRANSMISSION_IND)) { | ||
1006 | if (coredev->mode == DEVICE_MODE_DVBT_BDA) | ||
1007 | phdr->msgDstId = DVBT_BDA_CONTROL_MSG_ID; | ||
1008 | } | ||
1009 | |||
1010 | |||
1011 | client = smscore_find_client(coredev, phdr->msgType, phdr->msgDstId); | ||
1012 | |||
968 | /* If no client registered for type & id, | 1013 | /* If no client registered for type & id, |
969 | * check for control client where type is not registered */ | 1014 | * check for control client where type is not registered */ |
970 | if (client) | 1015 | if (client) |
@@ -1009,6 +1054,35 @@ void smscore_onresponse(struct smscore_device_t *coredev, | |||
1009 | case MSG_SMS_SLEEP_RESUME_COMP_IND: | 1054 | case MSG_SMS_SLEEP_RESUME_COMP_IND: |
1010 | complete(&coredev->resume_done); | 1055 | complete(&coredev->resume_done); |
1011 | break; | 1056 | break; |
1057 | case MSG_SMS_GPIO_CONFIG_EX_RES: | ||
1058 | sms_debug("MSG_SMS_GPIO_CONFIG_EX_RES"); | ||
1059 | complete(&coredev->gpio_configuration_done); | ||
1060 | break; | ||
1061 | case MSG_SMS_GPIO_SET_LEVEL_RES: | ||
1062 | sms_debug("MSG_SMS_GPIO_SET_LEVEL_RES"); | ||
1063 | complete(&coredev->gpio_set_level_done); | ||
1064 | break; | ||
1065 | case MSG_SMS_GPIO_GET_LEVEL_RES: | ||
1066 | { | ||
1067 | u32 *msgdata = (u32 *) phdr; | ||
1068 | coredev->gpio_get_res = msgdata[1]; | ||
1069 | sms_debug("MSG_SMS_GPIO_GET_LEVEL_RES gpio level %d", | ||
1070 | coredev->gpio_get_res); | ||
1071 | complete(&coredev->gpio_get_level_done); | ||
1072 | break; | ||
1073 | } | ||
1074 | case MSG_SMS_START_IR_RES: | ||
1075 | complete(&coredev->ir_init_done); | ||
1076 | break; | ||
1077 | case MSG_SMS_IR_SAMPLES_IND: | ||
1078 | sms_ir_event(coredev, | ||
1079 | (const char *) | ||
1080 | ((char *)phdr | ||
1081 | + sizeof(struct SmsMsgHdr_ST)), | ||
1082 | (int)phdr->msgLength | ||
1083 | - sizeof(struct SmsMsgHdr_ST)); | ||
1084 | break; | ||
1085 | |||
1012 | default: | 1086 | default: |
1013 | break; | 1087 | break; |
1014 | } | 1088 | } |
@@ -1030,12 +1104,24 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) | |||
1030 | struct smscore_buffer_t *cb = NULL; | 1104 | struct smscore_buffer_t *cb = NULL; |
1031 | unsigned long flags; | 1105 | unsigned long flags; |
1032 | 1106 | ||
1107 | DEFINE_WAIT(wait); | ||
1108 | |||
1033 | spin_lock_irqsave(&coredev->bufferslock, flags); | 1109 | spin_lock_irqsave(&coredev->bufferslock, flags); |
1034 | 1110 | ||
1035 | if (!list_empty(&coredev->buffers)) { | 1111 | /* This function must return a valid buffer, since the buffer list is |
1036 | cb = (struct smscore_buffer_t *) coredev->buffers.next; | 1112 | * finite, we check that there is an available buffer, if not, we wait |
1037 | list_del(&cb->entry); | 1113 | * until such buffer become available. |
1038 | } | 1114 | */ |
1115 | |||
1116 | prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE); | ||
1117 | |||
1118 | if (list_empty(&coredev->buffers)) | ||
1119 | schedule(); | ||
1120 | |||
1121 | finish_wait(&coredev->buffer_mng_waitq, &wait); | ||
1122 | |||
1123 | cb = (struct smscore_buffer_t *) coredev->buffers.next; | ||
1124 | list_del(&cb->entry); | ||
1039 | 1125 | ||
1040 | spin_unlock_irqrestore(&coredev->bufferslock, flags); | 1126 | spin_unlock_irqrestore(&coredev->bufferslock, flags); |
1041 | 1127 | ||
@@ -1052,8 +1138,8 @@ EXPORT_SYMBOL_GPL(smscore_getbuffer); | |||
1052 | * | 1138 | * |
1053 | */ | 1139 | */ |
1054 | void smscore_putbuffer(struct smscore_device_t *coredev, | 1140 | void smscore_putbuffer(struct smscore_device_t *coredev, |
1055 | struct smscore_buffer_t *cb) | 1141 | struct smscore_buffer_t *cb) { |
1056 | { | 1142 | wake_up_interruptible(&coredev->buffer_mng_waitq); |
1057 | list_add_locked(&cb->entry, &coredev->buffers, &coredev->bufferslock); | 1143 | list_add_locked(&cb->entry, &coredev->buffers, &coredev->bufferslock); |
1058 | } | 1144 | } |
1059 | EXPORT_SYMBOL_GPL(smscore_putbuffer); | 1145 | EXPORT_SYMBOL_GPL(smscore_putbuffer); |
@@ -1210,8 +1296,9 @@ int smsclient_sendrequest(struct smscore_client_t *client, | |||
1210 | EXPORT_SYMBOL_GPL(smsclient_sendrequest); | 1296 | EXPORT_SYMBOL_GPL(smsclient_sendrequest); |
1211 | 1297 | ||
1212 | 1298 | ||
1299 | /* old GPIO managments implementation */ | ||
1213 | int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin, | 1300 | int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin, |
1214 | struct smscore_gpio_config *pinconfig) | 1301 | struct smscore_config_gpio *pinconfig) |
1215 | { | 1302 | { |
1216 | struct { | 1303 | struct { |
1217 | struct SmsMsgHdr_ST hdr; | 1304 | struct SmsMsgHdr_ST hdr; |
@@ -1280,35 +1367,254 @@ int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level) | |||
1280 | &msg, sizeof(msg)); | 1367 | &msg, sizeof(msg)); |
1281 | } | 1368 | } |
1282 | 1369 | ||
1283 | static int __init smscore_module_init(void) | 1370 | /* new GPIO managment implementation */ |
1284 | { | 1371 | static int GetGpioPinParams(u32 PinNum, u32 *pTranslatedPinNum, |
1285 | int rc = 0; | 1372 | u32 *pGroupNum, u32 *pGroupCfg) { |
1373 | |||
1374 | *pGroupCfg = 1; | ||
1375 | |||
1376 | if (PinNum >= 0 && PinNum <= 1) { | ||
1377 | *pTranslatedPinNum = 0; | ||
1378 | *pGroupNum = 9; | ||
1379 | *pGroupCfg = 2; | ||
1380 | } else if (PinNum >= 2 && PinNum <= 6) { | ||
1381 | *pTranslatedPinNum = 2; | ||
1382 | *pGroupNum = 0; | ||
1383 | *pGroupCfg = 2; | ||
1384 | } else if (PinNum >= 7 && PinNum <= 11) { | ||
1385 | *pTranslatedPinNum = 7; | ||
1386 | *pGroupNum = 1; | ||
1387 | } else if (PinNum >= 12 && PinNum <= 15) { | ||
1388 | *pTranslatedPinNum = 12; | ||
1389 | *pGroupNum = 2; | ||
1390 | *pGroupCfg = 3; | ||
1391 | } else if (PinNum == 16) { | ||
1392 | *pTranslatedPinNum = 16; | ||
1393 | *pGroupNum = 23; | ||
1394 | } else if (PinNum >= 17 && PinNum <= 24) { | ||
1395 | *pTranslatedPinNum = 17; | ||
1396 | *pGroupNum = 3; | ||
1397 | } else if (PinNum == 25) { | ||
1398 | *pTranslatedPinNum = 25; | ||
1399 | *pGroupNum = 6; | ||
1400 | } else if (PinNum >= 26 && PinNum <= 28) { | ||
1401 | *pTranslatedPinNum = 26; | ||
1402 | *pGroupNum = 4; | ||
1403 | } else if (PinNum == 29) { | ||
1404 | *pTranslatedPinNum = 29; | ||
1405 | *pGroupNum = 5; | ||
1406 | *pGroupCfg = 2; | ||
1407 | } else if (PinNum == 30) { | ||
1408 | *pTranslatedPinNum = 30; | ||
1409 | *pGroupNum = 8; | ||
1410 | } else if (PinNum == 31) { | ||
1411 | *pTranslatedPinNum = 31; | ||
1412 | *pGroupNum = 17; | ||
1413 | } else | ||
1414 | return -1; | ||
1286 | 1415 | ||
1287 | INIT_LIST_HEAD(&g_smscore_notifyees); | 1416 | *pGroupCfg <<= 24; |
1288 | INIT_LIST_HEAD(&g_smscore_devices); | ||
1289 | kmutex_init(&g_smscore_deviceslock); | ||
1290 | 1417 | ||
1291 | INIT_LIST_HEAD(&g_smscore_registry); | 1418 | return 0; |
1292 | kmutex_init(&g_smscore_registrylock); | 1419 | } |
1420 | |||
1421 | int smscore_gpio_configure(struct smscore_device_t *coredev, u8 PinNum, | ||
1422 | struct smscore_gpio_config *pGpioConfig) { | ||
1423 | |||
1424 | u32 totalLen; | ||
1425 | u32 TranslatedPinNum; | ||
1426 | u32 GroupNum; | ||
1427 | u32 ElectricChar; | ||
1428 | u32 groupCfg; | ||
1429 | void *buffer; | ||
1430 | int rc; | ||
1431 | |||
1432 | struct SetGpioMsg { | ||
1433 | struct SmsMsgHdr_ST xMsgHeader; | ||
1434 | u32 msgData[6]; | ||
1435 | } *pMsg; | ||
1436 | |||
1437 | |||
1438 | if (PinNum > MAX_GPIO_PIN_NUMBER) | ||
1439 | return -EINVAL; | ||
1440 | |||
1441 | if (pGpioConfig == NULL) | ||
1442 | return -EINVAL; | ||
1443 | |||
1444 | totalLen = sizeof(struct SmsMsgHdr_ST) + (sizeof(u32) * 6); | ||
1445 | |||
1446 | buffer = kmalloc(totalLen + SMS_DMA_ALIGNMENT, | ||
1447 | GFP_KERNEL | GFP_DMA); | ||
1448 | if (!buffer) | ||
1449 | return -ENOMEM; | ||
1450 | |||
1451 | pMsg = (struct SetGpioMsg *) SMS_ALIGN_ADDRESS(buffer); | ||
1452 | |||
1453 | pMsg->xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; | ||
1454 | pMsg->xMsgHeader.msgDstId = HIF_TASK; | ||
1455 | pMsg->xMsgHeader.msgFlags = 0; | ||
1456 | pMsg->xMsgHeader.msgLength = (u16) totalLen; | ||
1457 | pMsg->msgData[0] = PinNum; | ||
1458 | |||
1459 | if (!(coredev->device_flags & SMS_DEVICE_FAMILY2)) { | ||
1460 | pMsg->xMsgHeader.msgType = MSG_SMS_GPIO_CONFIG_REQ; | ||
1461 | if (GetGpioPinParams(PinNum, &TranslatedPinNum, &GroupNum, | ||
1462 | &groupCfg) != 0) | ||
1463 | return -EINVAL; | ||
1464 | |||
1465 | pMsg->msgData[1] = TranslatedPinNum; | ||
1466 | pMsg->msgData[2] = GroupNum; | ||
1467 | ElectricChar = (pGpioConfig->PullUpDown) | ||
1468 | | (pGpioConfig->InputCharacteristics << 2) | ||
1469 | | (pGpioConfig->OutputSlewRate << 3) | ||
1470 | | (pGpioConfig->OutputDriving << 4); | ||
1471 | pMsg->msgData[3] = ElectricChar; | ||
1472 | pMsg->msgData[4] = pGpioConfig->Direction; | ||
1473 | pMsg->msgData[5] = groupCfg; | ||
1474 | } else { | ||
1475 | pMsg->xMsgHeader.msgType = MSG_SMS_GPIO_CONFIG_EX_REQ; | ||
1476 | pMsg->msgData[1] = pGpioConfig->PullUpDown; | ||
1477 | pMsg->msgData[2] = pGpioConfig->OutputSlewRate; | ||
1478 | pMsg->msgData[3] = pGpioConfig->OutputDriving; | ||
1479 | pMsg->msgData[4] = pGpioConfig->Direction; | ||
1480 | pMsg->msgData[5] = 0; | ||
1481 | } | ||
1482 | |||
1483 | smsendian_handle_tx_message((struct SmsMsgHdr_ST *)pMsg); | ||
1484 | rc = smscore_sendrequest_and_wait(coredev, pMsg, totalLen, | ||
1485 | &coredev->gpio_configuration_done); | ||
1486 | |||
1487 | if (rc != 0) { | ||
1488 | if (rc == -ETIME) | ||
1489 | sms_err("smscore_gpio_configure timeout"); | ||
1490 | else | ||
1491 | sms_err("smscore_gpio_configure error"); | ||
1492 | } | ||
1493 | kfree(buffer); | ||
1494 | |||
1495 | return rc; | ||
1496 | } | ||
1497 | |||
1498 | int smscore_gpio_set_level(struct smscore_device_t *coredev, u8 PinNum, | ||
1499 | u8 NewLevel) { | ||
1500 | |||
1501 | u32 totalLen; | ||
1502 | int rc; | ||
1503 | void *buffer; | ||
1504 | |||
1505 | struct SetGpioMsg { | ||
1506 | struct SmsMsgHdr_ST xMsgHeader; | ||
1507 | u32 msgData[3]; /* keep it 3 ! */ | ||
1508 | } *pMsg; | ||
1509 | |||
1510 | if ((NewLevel > 1) || (PinNum > MAX_GPIO_PIN_NUMBER) || | ||
1511 | (PinNum > MAX_GPIO_PIN_NUMBER)) | ||
1512 | return -EINVAL; | ||
1293 | 1513 | ||
1514 | totalLen = sizeof(struct SmsMsgHdr_ST) + | ||
1515 | (3 * sizeof(u32)); /* keep it 3 ! */ | ||
1294 | 1516 | ||
1517 | buffer = kmalloc(totalLen + SMS_DMA_ALIGNMENT, | ||
1518 | GFP_KERNEL | GFP_DMA); | ||
1519 | if (!buffer) | ||
1520 | return -ENOMEM; | ||
1295 | 1521 | ||
1522 | pMsg = (struct SetGpioMsg *) SMS_ALIGN_ADDRESS(buffer); | ||
1296 | 1523 | ||
1524 | pMsg->xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; | ||
1525 | pMsg->xMsgHeader.msgDstId = HIF_TASK; | ||
1526 | pMsg->xMsgHeader.msgFlags = 0; | ||
1527 | pMsg->xMsgHeader.msgType = MSG_SMS_GPIO_SET_LEVEL_REQ; | ||
1528 | pMsg->xMsgHeader.msgLength = (u16) totalLen; | ||
1529 | pMsg->msgData[0] = PinNum; | ||
1530 | pMsg->msgData[1] = NewLevel; | ||
1297 | 1531 | ||
1532 | /* Send message to SMS */ | ||
1533 | smsendian_handle_tx_message((struct SmsMsgHdr_ST *)pMsg); | ||
1534 | rc = smscore_sendrequest_and_wait(coredev, pMsg, totalLen, | ||
1535 | &coredev->gpio_set_level_done); | ||
1536 | |||
1537 | if (rc != 0) { | ||
1538 | if (rc == -ETIME) | ||
1539 | sms_err("smscore_gpio_set_level timeout"); | ||
1540 | else | ||
1541 | sms_err("smscore_gpio_set_level error"); | ||
1542 | } | ||
1543 | kfree(buffer); | ||
1298 | 1544 | ||
1299 | return rc; | 1545 | return rc; |
1300 | sms_debug("rc %d", rc); | 1546 | } |
1547 | |||
1548 | int smscore_gpio_get_level(struct smscore_device_t *coredev, u8 PinNum, | ||
1549 | u8 *level) { | ||
1550 | |||
1551 | u32 totalLen; | ||
1552 | int rc; | ||
1553 | void *buffer; | ||
1554 | |||
1555 | struct SetGpioMsg { | ||
1556 | struct SmsMsgHdr_ST xMsgHeader; | ||
1557 | u32 msgData[2]; | ||
1558 | } *pMsg; | ||
1559 | |||
1560 | |||
1561 | if (PinNum > MAX_GPIO_PIN_NUMBER) | ||
1562 | return -EINVAL; | ||
1563 | |||
1564 | totalLen = sizeof(struct SmsMsgHdr_ST) + (2 * sizeof(u32)); | ||
1565 | |||
1566 | buffer = kmalloc(totalLen + SMS_DMA_ALIGNMENT, | ||
1567 | GFP_KERNEL | GFP_DMA); | ||
1568 | if (!buffer) | ||
1569 | return -ENOMEM; | ||
1570 | |||
1571 | pMsg = (struct SetGpioMsg *) SMS_ALIGN_ADDRESS(buffer); | ||
1572 | |||
1573 | pMsg->xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; | ||
1574 | pMsg->xMsgHeader.msgDstId = HIF_TASK; | ||
1575 | pMsg->xMsgHeader.msgFlags = 0; | ||
1576 | pMsg->xMsgHeader.msgType = MSG_SMS_GPIO_GET_LEVEL_REQ; | ||
1577 | pMsg->xMsgHeader.msgLength = (u16) totalLen; | ||
1578 | pMsg->msgData[0] = PinNum; | ||
1579 | pMsg->msgData[1] = 0; | ||
1580 | |||
1581 | /* Send message to SMS */ | ||
1582 | smsendian_handle_tx_message((struct SmsMsgHdr_ST *)pMsg); | ||
1583 | rc = smscore_sendrequest_and_wait(coredev, pMsg, totalLen, | ||
1584 | &coredev->gpio_get_level_done); | ||
1585 | |||
1586 | if (rc != 0) { | ||
1587 | if (rc == -ETIME) | ||
1588 | sms_err("smscore_gpio_get_level timeout"); | ||
1589 | else | ||
1590 | sms_err("smscore_gpio_get_level error"); | ||
1591 | } | ||
1592 | kfree(buffer); | ||
1593 | |||
1594 | /* Its a race between other gpio_get_level() and the copy of the single | ||
1595 | * global 'coredev->gpio_get_res' to the function's variable 'level' | ||
1596 | */ | ||
1597 | *level = coredev->gpio_get_res; | ||
1301 | 1598 | ||
1302 | return rc; | 1599 | return rc; |
1303 | } | 1600 | } |
1304 | 1601 | ||
1305 | static void __exit smscore_module_exit(void) | 1602 | static int __init smscore_module_init(void) |
1306 | { | 1603 | { |
1604 | int rc = 0; | ||
1307 | 1605 | ||
1606 | INIT_LIST_HEAD(&g_smscore_notifyees); | ||
1607 | INIT_LIST_HEAD(&g_smscore_devices); | ||
1608 | kmutex_init(&g_smscore_deviceslock); | ||
1308 | 1609 | ||
1610 | INIT_LIST_HEAD(&g_smscore_registry); | ||
1611 | kmutex_init(&g_smscore_registrylock); | ||
1309 | 1612 | ||
1613 | return rc; | ||
1614 | } | ||
1310 | 1615 | ||
1311 | 1616 | static void __exit smscore_module_exit(void) | |
1617 | { | ||
1312 | kmutex_lock(&g_smscore_deviceslock); | 1618 | kmutex_lock(&g_smscore_deviceslock); |
1313 | while (!list_empty(&g_smscore_notifyees)) { | 1619 | while (!list_empty(&g_smscore_notifyees)) { |
1314 | struct smscore_device_notifyee_t *notifyee = | 1620 | struct smscore_device_notifyee_t *notifyee = |
diff --git a/drivers/media/dvb/siano/smscoreapi.h b/drivers/media/dvb/siano/smscoreapi.h index 548de9056e8b..f1108c64e895 100644 --- a/drivers/media/dvb/siano/smscoreapi.h +++ b/drivers/media/dvb/siano/smscoreapi.h | |||
@@ -1,26 +1,26 @@ | |||
1 | /* | 1 | /**************************************************************** |
2 | * Driver for the Siano SMS1xxx USB dongle | 2 | |
3 | * | 3 | Siano Mobile Silicon, Inc. |
4 | * author: Anatoly Greenblat | 4 | MDTV receiver kernel modules. |
5 | * | 5 | Copyright (C) 2006-2008, Uri Shkolnik, Anatoly Greenblat |
6 | * Copyright (c), 2005-2008 Siano Mobile Silicon, Inc. | 6 | |
7 | * | 7 | This program is free software: you can redistribute it and/or modify |
8 | * 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 | * it under the terms of the GNU General Public License version 2 as | 9 | the Free Software Foundation, either version 2 of the License, or |
10 | * published by the Free Software Foundation; | 10 | (at your option) any later version. |
11 | * | 11 | |
12 | * Software distributed under the License is distributed on an "AS IS" | 12 | This program is distributed in the hope that it will be useful, |
13 | * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * See the GNU General Public License for more details. | 15 | GNU General Public License for more details. |
16 | * | 16 | |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | |
20 | */ | 20 | ****************************************************************/ |
21 | 21 | ||
22 | #ifndef __smscoreapi_h__ | 22 | #ifndef __SMS_CORE_API_H__ |
23 | #define __smscoreapi_h__ | 23 | #define __SMS_CORE_API_H__ |
24 | 24 | ||
25 | #include <linux/version.h> | 25 | #include <linux/version.h> |
26 | #include <linux/device.h> | 26 | #include <linux/device.h> |
@@ -28,14 +28,13 @@ | |||
28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
29 | #include <linux/scatterlist.h> | 29 | #include <linux/scatterlist.h> |
30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | #include <asm/page.h> | ||
32 | #include <linux/mutex.h> | 31 | #include <linux/mutex.h> |
32 | #include <linux/wait.h> | ||
33 | #include <linux/timer.h> | ||
33 | 34 | ||
34 | #include "dmxdev.h" | 35 | #include <asm/page.h> |
35 | #include "dvbdev.h" | ||
36 | #include "dvb_demux.h" | ||
37 | #include "dvb_frontend.h" | ||
38 | 36 | ||
37 | #include "smsir.h" | ||
39 | 38 | ||
40 | #define kmutex_init(_p_) mutex_init(_p_) | 39 | #define kmutex_init(_p_) mutex_init(_p_) |
41 | #define kmutex_lock(_p_) mutex_lock(_p_) | 40 | #define kmutex_lock(_p_) mutex_lock(_p_) |
@@ -46,13 +45,14 @@ | |||
46 | #define min(a, b) (((a) < (b)) ? (a) : (b)) | 45 | #define min(a, b) (((a) < (b)) ? (a) : (b)) |
47 | #endif | 46 | #endif |
48 | 47 | ||
49 | #define SMS_ALLOC_ALIGNMENT 128 | 48 | #define SMS_PROTOCOL_MAX_RAOUNDTRIP_MS (10000) |
50 | #define SMS_DMA_ALIGNMENT 16 | 49 | #define SMS_ALLOC_ALIGNMENT 128 |
50 | #define SMS_DMA_ALIGNMENT 16 | ||
51 | #define SMS_ALIGN_ADDRESS(addr) \ | 51 | #define SMS_ALIGN_ADDRESS(addr) \ |
52 | ((((uintptr_t)(addr)) + (SMS_DMA_ALIGNMENT-1)) & ~(SMS_DMA_ALIGNMENT-1)) | 52 | ((((uintptr_t)(addr)) + (SMS_DMA_ALIGNMENT-1)) & ~(SMS_DMA_ALIGNMENT-1)) |
53 | 53 | ||
54 | #define SMS_DEVICE_FAMILY2 1 | 54 | #define SMS_DEVICE_FAMILY2 1 |
55 | #define SMS_ROM_NO_RESPONSE 2 | 55 | #define SMS_ROM_NO_RESPONSE 2 |
56 | #define SMS_DEVICE_NOT_READY 0x8000000 | 56 | #define SMS_DEVICE_NOT_READY 0x8000000 |
57 | 57 | ||
58 | enum sms_device_type_st { | 58 | enum sms_device_type_st { |
@@ -83,13 +83,13 @@ typedef void (*onremove_t)(void *context); | |||
83 | struct smscore_buffer_t { | 83 | struct smscore_buffer_t { |
84 | /* public members, once passed to clients can be changed freely */ | 84 | /* public members, once passed to clients can be changed freely */ |
85 | struct list_head entry; | 85 | struct list_head entry; |
86 | int size; | 86 | int size; |
87 | int offset; | 87 | int offset; |
88 | 88 | ||
89 | /* private members, read-only for clients */ | 89 | /* private members, read-only for clients */ |
90 | void *p; | 90 | void *p; |
91 | dma_addr_t phys; | 91 | dma_addr_t phys; |
92 | unsigned long offset_in_common; | 92 | unsigned long offset_in_common; |
93 | }; | 93 | }; |
94 | 94 | ||
95 | struct smsdevice_params_t { | 95 | struct smsdevice_params_t { |
@@ -116,10 +116,63 @@ struct smsclient_params_t { | |||
116 | int data_type; | 116 | int data_type; |
117 | onresponse_t onresponse_handler; | 117 | onresponse_t onresponse_handler; |
118 | onremove_t onremove_handler; | 118 | onremove_t onremove_handler; |
119 | |||
120 | void *context; | 119 | void *context; |
121 | }; | 120 | }; |
122 | 121 | ||
122 | struct smscore_device_t { | ||
123 | struct list_head entry; | ||
124 | |||
125 | struct list_head clients; | ||
126 | struct list_head subclients; | ||
127 | spinlock_t clientslock; | ||
128 | |||
129 | struct list_head buffers; | ||
130 | spinlock_t bufferslock; | ||
131 | int num_buffers; | ||
132 | |||
133 | void *common_buffer; | ||
134 | int common_buffer_size; | ||
135 | dma_addr_t common_buffer_phys; | ||
136 | |||
137 | void *context; | ||
138 | struct device *device; | ||
139 | |||
140 | char devpath[32]; | ||
141 | unsigned long device_flags; | ||
142 | |||
143 | setmode_t setmode_handler; | ||
144 | detectmode_t detectmode_handler; | ||
145 | sendrequest_t sendrequest_handler; | ||
146 | preload_t preload_handler; | ||
147 | postload_t postload_handler; | ||
148 | |||
149 | int mode, modes_supported; | ||
150 | |||
151 | /* host <--> device messages */ | ||
152 | struct completion version_ex_done, data_download_done, trigger_done; | ||
153 | struct completion init_device_done, reload_start_done, resume_done; | ||
154 | struct completion gpio_configuration_done, gpio_set_level_done; | ||
155 | struct completion gpio_get_level_done, ir_init_done; | ||
156 | |||
157 | /* Buffer management */ | ||
158 | wait_queue_head_t buffer_mng_waitq; | ||
159 | |||
160 | /* GPIO */ | ||
161 | int gpio_get_res; | ||
162 | |||
163 | /* Target hardware board */ | ||
164 | int board_id; | ||
165 | |||
166 | /* Firmware */ | ||
167 | u8 *fw_buf; | ||
168 | u32 fw_buf_size; | ||
169 | |||
170 | /* Infrared (IR) */ | ||
171 | struct ir_t ir; | ||
172 | |||
173 | int led_state; | ||
174 | }; | ||
175 | |||
123 | /* GPIO definitions for antenna frequency domain control (SMS8021) */ | 176 | /* GPIO definitions for antenna frequency domain control (SMS8021) */ |
124 | #define SMS_ANTENNA_GPIO_0 1 | 177 | #define SMS_ANTENNA_GPIO_0 1 |
125 | #define SMS_ANTENNA_GPIO_1 0 | 178 | #define SMS_ANTENNA_GPIO_1 0 |
@@ -154,18 +207,15 @@ struct smsclient_params_t { | |||
154 | #define MSG_SMS_INIT_DEVICE_RES 579 | 207 | #define MSG_SMS_INIT_DEVICE_RES 579 |
155 | #define MSG_SMS_ADD_PID_FILTER_REQ 601 | 208 | #define MSG_SMS_ADD_PID_FILTER_REQ 601 |
156 | #define MSG_SMS_ADD_PID_FILTER_RES 602 | 209 | #define MSG_SMS_ADD_PID_FILTER_RES 602 |
157 | #define MSG_SMS_REMOVE_PID_FILTER_REQ 603 | 210 | #define MSG_SMS_REMOVE_PID_FILTER_REQ 603 |
158 | #define MSG_SMS_REMOVE_PID_FILTER_RES 604 | 211 | #define MSG_SMS_REMOVE_PID_FILTER_RES 604 |
159 | #define MSG_SMS_DAB_CHANNEL 607 | 212 | #define MSG_SMS_DAB_CHANNEL 607 |
160 | #define MSG_SMS_GET_PID_FILTER_LIST_REQ 608 | 213 | #define MSG_SMS_GET_PID_FILTER_LIST_REQ 608 |
161 | #define MSG_SMS_GET_PID_FILTER_LIST_RES 609 | 214 | #define MSG_SMS_GET_PID_FILTER_LIST_RES 609 |
162 | #define MSG_SMS_GET_STATISTICS_REQ 615 | 215 | #define MSG_SMS_HO_PER_SLICES_IND 630 |
163 | #define MSG_SMS_GET_STATISTICS_RES 616 | 216 | #define MSG_SMS_SET_ANTENNA_CONFIG_REQ 651 |
164 | #define MSG_SMS_SET_ANTENNA_CONFIG_REQ 651 | 217 | #define MSG_SMS_SET_ANTENNA_CONFIG_RES 652 |
165 | #define MSG_SMS_SET_ANTENNA_CONFIG_RES 652 | 218 | #define MSG_SMS_SLEEP_RESUME_COMP_IND 655 |
166 | #define MSG_SMS_GET_STATISTICS_EX_REQ 653 | ||
167 | #define MSG_SMS_GET_STATISTICS_EX_RES 654 | ||
168 | #define MSG_SMS_SLEEP_RESUME_COMP_IND 655 | ||
169 | #define MSG_SMS_DATA_DOWNLOAD_REQ 660 | 219 | #define MSG_SMS_DATA_DOWNLOAD_REQ 660 |
170 | #define MSG_SMS_DATA_DOWNLOAD_RES 661 | 220 | #define MSG_SMS_DATA_DOWNLOAD_RES 661 |
171 | #define MSG_SMS_SWDOWNLOAD_TRIGGER_REQ 664 | 221 | #define MSG_SMS_SWDOWNLOAD_TRIGGER_REQ 664 |
@@ -190,14 +240,31 @@ struct smsclient_params_t { | |||
190 | #define MSG_SMS_GPIO_CONFIG_EX_RES 713 | 240 | #define MSG_SMS_GPIO_CONFIG_EX_RES 713 |
191 | #define MSG_SMS_ISDBT_TUNE_REQ 776 | 241 | #define MSG_SMS_ISDBT_TUNE_REQ 776 |
192 | #define MSG_SMS_ISDBT_TUNE_RES 777 | 242 | #define MSG_SMS_ISDBT_TUNE_RES 777 |
243 | #define MSG_SMS_TRANSMISSION_IND 782 | ||
244 | #define MSG_SMS_START_IR_REQ 800 | ||
245 | #define MSG_SMS_START_IR_RES 801 | ||
246 | #define MSG_SMS_IR_SAMPLES_IND 802 | ||
247 | #define MSG_SMS_SIGNAL_DETECTED_IND 827 | ||
248 | #define MSG_SMS_NO_SIGNAL_IND 828 | ||
193 | 249 | ||
194 | #define SMS_INIT_MSG_EX(ptr, type, src, dst, len) do { \ | 250 | #define SMS_INIT_MSG_EX(ptr, type, src, dst, len) do { \ |
195 | (ptr)->msgType = type; (ptr)->msgSrcId = src; (ptr)->msgDstId = dst; \ | 251 | (ptr)->msgType = type; (ptr)->msgSrcId = src; (ptr)->msgDstId = dst; \ |
196 | (ptr)->msgLength = len; (ptr)->msgFlags = 0; \ | 252 | (ptr)->msgLength = len; (ptr)->msgFlags = 0; \ |
197 | } while (0) | 253 | } while (0) |
254 | |||
198 | #define SMS_INIT_MSG(ptr, type, len) \ | 255 | #define SMS_INIT_MSG(ptr, type, len) \ |
199 | SMS_INIT_MSG_EX(ptr, type, 0, HIF_TASK, len) | 256 | SMS_INIT_MSG_EX(ptr, type, 0, HIF_TASK, len) |
200 | 257 | ||
258 | enum SMS_DVB3_EVENTS { | ||
259 | DVB3_EVENT_INIT = 0, | ||
260 | DVB3_EVENT_SLEEP, | ||
261 | DVB3_EVENT_HOTPLUG, | ||
262 | DVB3_EVENT_FE_LOCK, | ||
263 | DVB3_EVENT_FE_UNLOCK, | ||
264 | DVB3_EVENT_UNC_OK, | ||
265 | DVB3_EVENT_UNC_ERR | ||
266 | }; | ||
267 | |||
201 | enum SMS_DEVICE_MODE { | 268 | enum SMS_DEVICE_MODE { |
202 | DEVICE_MODE_NONE = -1, | 269 | DEVICE_MODE_NONE = -1, |
203 | DEVICE_MODE_DVBT = 0, | 270 | DEVICE_MODE_DVBT = 0, |
@@ -221,8 +288,13 @@ struct SmsMsgHdr_ST { | |||
221 | }; | 288 | }; |
222 | 289 | ||
223 | struct SmsMsgData_ST { | 290 | struct SmsMsgData_ST { |
224 | struct SmsMsgHdr_ST xMsgHeader; | 291 | struct SmsMsgHdr_ST xMsgHeader; |
225 | u32 msgData[1]; | 292 | u32 msgData[1]; |
293 | }; | ||
294 | |||
295 | struct SmsMsgData_ST2 { | ||
296 | struct SmsMsgHdr_ST xMsgHeader; | ||
297 | u32 msgData[2]; | ||
226 | }; | 298 | }; |
227 | 299 | ||
228 | struct SmsDataDownload_ST { | 300 | struct SmsDataDownload_ST { |
@@ -238,11 +310,12 @@ struct SmsVersionRes_ST { | |||
238 | u8 Step; /* 0 - Step A */ | 310 | u8 Step; /* 0 - Step A */ |
239 | u8 MetalFix; /* 0 - Metal 0 */ | 311 | u8 MetalFix; /* 0 - Metal 0 */ |
240 | 312 | ||
241 | u8 FirmwareId; /* 0xFF � ROM, otherwise the | 313 | /* FirmwareId 0xFF if ROM, otherwise the |
242 | * value indicated by | 314 | * value indicated by SMSHOSTLIB_DEVICE_MODES_E */ |
243 | * SMSHOSTLIB_DEVICE_MODES_E */ | 315 | u8 FirmwareId; |
244 | u8 SupportedProtocols; /* Bitwise OR combination of | 316 | /* SupportedProtocols Bitwise OR combination of |
245 | * supported protocols */ | 317 | * supported protocols */ |
318 | u8 SupportedProtocols; | ||
246 | 319 | ||
247 | u8 VersionMajor; | 320 | u8 VersionMajor; |
248 | u8 VersionMinor; | 321 | u8 VersionMinor; |
@@ -264,86 +337,219 @@ struct SmsFirmware_ST { | |||
264 | u8 Payload[1]; | 337 | u8 Payload[1]; |
265 | }; | 338 | }; |
266 | 339 | ||
267 | struct SMSHOSTLIB_STATISTICS_ST { | 340 | /* Statistics information returned as response for |
268 | u32 Reserved; /* Reserved */ | 341 | * SmsHostApiGetStatistics_Req */ |
342 | struct SMSHOSTLIB_STATISTICS_S { | ||
343 | u32 Reserved; /* Reserved */ | ||
269 | 344 | ||
270 | /* Common parameters */ | 345 | /* Common parameters */ |
271 | u32 IsRfLocked; /* 0 - not locked, 1 - locked */ | 346 | u32 IsRfLocked; /* 0 - not locked, 1 - locked */ |
272 | u32 IsDemodLocked; /* 0 - not locked, 1 - locked */ | 347 | u32 IsDemodLocked; /* 0 - not locked, 1 - locked */ |
273 | u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */ | 348 | u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */ |
274 | 349 | ||
275 | /* Reception quality */ | 350 | /* Reception quality */ |
276 | s32 SNR; /* dB */ | 351 | s32 SNR; /* dB */ |
277 | u32 BER; /* Post Viterbi BER [1E-5] */ | 352 | u32 BER; /* Post Viterbi BER [1E-5] */ |
278 | u32 FIB_CRC; /* CRC errors percentage, valid only for DAB */ | 353 | u32 FIB_CRC; /* CRC errors percentage, valid only for DAB */ |
279 | u32 TS_PER; /* Transport stream PER, 0xFFFFFFFF indicate N/A, | 354 | u32 TS_PER; /* Transport stream PER, |
280 | * valid only for DVB-T/H */ | 355 | 0xFFFFFFFF indicate N/A, valid only for DVB-T/H */ |
281 | u32 MFER; /* DVB-H frame error rate in percentage, | 356 | u32 MFER; /* DVB-H frame error rate in percentage, |
282 | * 0xFFFFFFFF indicate N/A, valid only for DVB-H */ | 357 | 0xFFFFFFFF indicate N/A, valid only for DVB-H */ |
283 | s32 RSSI; /* dBm */ | 358 | s32 RSSI; /* dBm */ |
284 | s32 InBandPwr; /* In band power in dBM */ | 359 | s32 InBandPwr; /* In band power in dBM */ |
285 | s32 CarrierOffset; /* Carrier Offset in bin/1024 */ | 360 | s32 CarrierOffset; /* Carrier Offset in bin/1024 */ |
286 | 361 | ||
287 | /* Transmission parameters, valid only for DVB-T/H */ | 362 | /* Transmission parameters */ |
288 | u32 Frequency; /* Frequency in Hz */ | 363 | u32 Frequency; /* Frequency in Hz */ |
289 | u32 Bandwidth; /* Bandwidth in MHz */ | 364 | u32 Bandwidth; /* Bandwidth in MHz, valid only for DVB-T/H */ |
290 | u32 TransmissionMode; /* Transmission Mode, for DAB modes 1-4, | 365 | u32 TransmissionMode; /* Transmission Mode, for DAB modes 1-4, |
291 | * for DVB-T/H FFT mode carriers in Kilos */ | 366 | for DVB-T/H FFT mode carriers in Kilos */ |
292 | u32 ModemState; /* from SMS_DvbModemState_ET */ | 367 | u32 ModemState; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET, |
293 | u32 GuardInterval; /* Guard Interval, 1 divided by value */ | 368 | valid only for DVB-T/H */ |
294 | u32 CodeRate; /* Code Rate from SMS_DvbModemState_ET */ | 369 | u32 GuardInterval; /* Guard Interval from |
295 | u32 LPCodeRate; /* Low Priority Code Rate from SMS_DvbModemState_ET */ | 370 | SMSHOSTLIB_GUARD_INTERVALS_ET, valid only for DVB-T/H */ |
296 | u32 Hierarchy; /* Hierarchy from SMS_Hierarchy_ET */ | 371 | u32 CodeRate; /* Code Rate from SMSHOSTLIB_CODE_RATE_ET, |
297 | u32 Constellation; /* Constellation from SMS_Constellation_ET */ | 372 | valid only for DVB-T/H */ |
373 | u32 LPCodeRate; /* Low Priority Code Rate from | ||
374 | SMSHOSTLIB_CODE_RATE_ET, valid only for DVB-T/H */ | ||
375 | u32 Hierarchy; /* Hierarchy from SMSHOSTLIB_HIERARCHY_ET, | ||
376 | valid only for DVB-T/H */ | ||
377 | u32 Constellation; /* Constellation from | ||
378 | SMSHOSTLIB_CONSTELLATION_ET, valid only for DVB-T/H */ | ||
298 | 379 | ||
299 | /* Burst parameters, valid only for DVB-H */ | 380 | /* Burst parameters, valid only for DVB-H */ |
300 | u32 BurstSize; /* Current burst size in bytes */ | 381 | u32 BurstSize; /* Current burst size in bytes, |
301 | u32 BurstDuration; /* Current burst duration in mSec */ | 382 | valid only for DVB-H */ |
302 | u32 BurstCycleTime; /* Current burst cycle time in mSec */ | 383 | u32 BurstDuration; /* Current burst duration in mSec, |
303 | u32 CalculatedBurstCycleTime; /* Current burst cycle time in mSec, | 384 | valid only for DVB-H */ |
304 | * as calculated by demodulator */ | 385 | u32 BurstCycleTime; /* Current burst cycle time in mSec, |
305 | u32 NumOfRows; /* Number of rows in MPE table */ | 386 | valid only for DVB-H */ |
306 | u32 NumOfPaddCols; /* Number of padding columns in MPE table */ | 387 | u32 CalculatedBurstCycleTime;/* Current burst cycle time in mSec, |
307 | u32 NumOfPunctCols; /* Number of puncturing columns in MPE table */ | 388 | as calculated by demodulator, valid only for DVB-H */ |
308 | /* Burst parameters */ | 389 | u32 NumOfRows; /* Number of rows in MPE table, |
309 | u32 ErrorTSPackets; /* Number of erroneous transport-stream packets */ | 390 | valid only for DVB-H */ |
310 | u32 TotalTSPackets; /* Total number of transport-stream packets */ | 391 | u32 NumOfPaddCols; /* Number of padding columns in MPE table, |
311 | u32 NumOfValidMpeTlbs; /* Number of MPE tables which do not include | 392 | valid only for DVB-H */ |
312 | * errors after MPE RS decoding */ | 393 | u32 NumOfPunctCols; /* Number of puncturing columns in MPE table, |
313 | u32 NumOfInvalidMpeTlbs; /* Number of MPE tables which include errors | 394 | valid only for DVB-H */ |
314 | * after MPE RS decoding */ | 395 | u32 ErrorTSPackets; /* Number of erroneous |
315 | u32 NumOfCorrectedMpeTlbs; /* Number of MPE tables which were corrected | 396 | transport-stream packets */ |
316 | * by MPE RS decoding */ | 397 | u32 TotalTSPackets; /* Total number of transport-stream packets */ |
317 | 398 | u32 NumOfValidMpeTlbs; /* Number of MPE tables which do not include | |
399 | errors after MPE RS decoding */ | ||
400 | u32 NumOfInvalidMpeTlbs;/* Number of MPE tables which include errors | ||
401 | after MPE RS decoding */ | ||
402 | u32 NumOfCorrectedMpeTlbs;/* Number of MPE tables which were | ||
403 | corrected by MPE RS decoding */ | ||
318 | /* Common params */ | 404 | /* Common params */ |
319 | u32 BERErrorCount; /* Number of errornous SYNC bits. */ | 405 | u32 BERErrorCount; /* Number of errornous SYNC bits. */ |
320 | u32 BERBitCount; /* Total number of SYNC bits. */ | 406 | u32 BERBitCount; /* Total number of SYNC bits. */ |
321 | 407 | ||
322 | /* Interface information */ | 408 | /* Interface information */ |
323 | u32 SmsToHostTxErrors; /* Total number of transmission errors. */ | 409 | u32 SmsToHostTxErrors; /* Total number of transmission errors. */ |
324 | 410 | ||
325 | /* DAB/T-DMB */ | 411 | /* DAB/T-DMB */ |
326 | u32 PreBER; /* DAB/T-DMB only: Pre Viterbi BER [1E-5] */ | 412 | u32 PreBER; /* DAB/T-DMB only: Pre Viterbi BER [1E-5] */ |
327 | 413 | ||
328 | /* DVB-H TPS parameters */ | 414 | /* DVB-H TPS parameters */ |
329 | u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero; | 415 | u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero; |
330 | * if set to 0xFFFFFFFF cell_id not yet recovered */ | 416 | if set to 0xFFFFFFFF cell_id not yet recovered */ |
417 | u32 DvbhSrvIndHP; /* DVB-H service indication info, bit 1 - | ||
418 | Time Slicing indicator, bit 0 - MPE-FEC indicator */ | ||
419 | u32 DvbhSrvIndLP; /* DVB-H service indication info, bit 1 - | ||
420 | Time Slicing indicator, bit 0 - MPE-FEC indicator */ | ||
331 | 421 | ||
422 | u32 NumMPEReceived; /* DVB-H, Num MPE section received */ | ||
423 | |||
424 | u32 ReservedFields[10]; /* Reserved */ | ||
332 | }; | 425 | }; |
333 | 426 | ||
334 | struct SmsMsgStatisticsInfo_ST { | 427 | struct PID_STATISTICS_DATA_S { |
335 | u32 RequestResult; | 428 | struct PID_BURST_S { |
429 | u32 size; | ||
430 | u32 padding_cols; | ||
431 | u32 punct_cols; | ||
432 | u32 duration; | ||
433 | u32 cycle; | ||
434 | u32 calc_cycle; | ||
435 | } burst; | ||
436 | |||
437 | u32 tot_tbl_cnt; | ||
438 | u32 invalid_tbl_cnt; | ||
439 | u32 tot_cor_tbl; | ||
440 | }; | ||
336 | 441 | ||
337 | struct SMSHOSTLIB_STATISTICS_ST Stat; | 442 | struct PID_DATA_S { |
443 | u32 pid; | ||
444 | u32 num_rows; | ||
445 | struct PID_STATISTICS_DATA_S pid_statistics; | ||
446 | }; | ||
338 | 447 | ||
339 | /* Split the calc of the SNR in DAB */ | 448 | #define CORRECT_STAT_RSSI(_stat) ((_stat).RSSI *= -1) |
340 | u32 Signal; /* dB */ | 449 | #define CORRECT_STAT_BANDWIDTH(_stat) (_stat.Bandwidth = 8 - _stat.Bandwidth) |
341 | u32 Noise; /* dB */ | 450 | #define CORRECT_STAT_TRANSMISSON_MODE(_stat) \ |
451 | if (_stat.TransmissionMode == 0) \ | ||
452 | _stat.TransmissionMode = 2; \ | ||
453 | else if (_stat.TransmissionMode == 1) \ | ||
454 | _stat.TransmissionMode = 8; \ | ||
455 | else \ | ||
456 | _stat.TransmissionMode = 4; | ||
457 | |||
458 | struct TRANSMISSION_STATISTICS_S { | ||
459 | u32 Frequency; /* Frequency in Hz */ | ||
460 | u32 Bandwidth; /* Bandwidth in MHz */ | ||
461 | u32 TransmissionMode; /* FFT mode carriers in Kilos */ | ||
462 | u32 GuardInterval; /* Guard Interval from | ||
463 | SMSHOSTLIB_GUARD_INTERVALS_ET */ | ||
464 | u32 CodeRate; /* Code Rate from SMSHOSTLIB_CODE_RATE_ET */ | ||
465 | u32 LPCodeRate; /* Low Priority Code Rate from | ||
466 | SMSHOSTLIB_CODE_RATE_ET */ | ||
467 | u32 Hierarchy; /* Hierarchy from SMSHOSTLIB_HIERARCHY_ET */ | ||
468 | u32 Constellation; /* Constellation from | ||
469 | SMSHOSTLIB_CONSTELLATION_ET */ | ||
342 | 470 | ||
471 | /* DVB-H TPS parameters */ | ||
472 | u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero; | ||
473 | if set to 0xFFFFFFFF cell_id not yet recovered */ | ||
474 | u32 DvbhSrvIndHP; /* DVB-H service indication info, bit 1 - | ||
475 | Time Slicing indicator, bit 0 - MPE-FEC indicator */ | ||
476 | u32 DvbhSrvIndLP; /* DVB-H service indication info, bit 1 - | ||
477 | Time Slicing indicator, bit 0 - MPE-FEC indicator */ | ||
478 | u32 IsDemodLocked; /* 0 - not locked, 1 - locked */ | ||
343 | }; | 479 | }; |
344 | 480 | ||
481 | struct RECEPTION_STATISTICS_S { | ||
482 | u32 IsRfLocked; /* 0 - not locked, 1 - locked */ | ||
483 | u32 IsDemodLocked; /* 0 - not locked, 1 - locked */ | ||
484 | u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */ | ||
485 | |||
486 | u32 ModemState; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */ | ||
487 | s32 SNR; /* dB */ | ||
488 | u32 BER; /* Post Viterbi BER [1E-5] */ | ||
489 | u32 BERErrorCount; /* Number of erronous SYNC bits. */ | ||
490 | u32 BERBitCount; /* Total number of SYNC bits. */ | ||
491 | u32 TS_PER; /* Transport stream PER, | ||
492 | 0xFFFFFFFF indicate N/A */ | ||
493 | u32 MFER; /* DVB-H frame error rate in percentage, | ||
494 | 0xFFFFFFFF indicate N/A, valid only for DVB-H */ | ||
495 | s32 RSSI; /* dBm */ | ||
496 | s32 InBandPwr; /* In band power in dBM */ | ||
497 | s32 CarrierOffset; /* Carrier Offset in bin/1024 */ | ||
498 | u32 ErrorTSPackets; /* Number of erroneous | ||
499 | transport-stream packets */ | ||
500 | u32 TotalTSPackets; /* Total number of transport-stream packets */ | ||
501 | |||
502 | s32 MRC_SNR; /* dB */ | ||
503 | s32 MRC_RSSI; /* dBm */ | ||
504 | s32 MRC_InBandPwr; /* In band power in dBM */ | ||
505 | }; | ||
345 | 506 | ||
346 | struct smscore_gpio_config { | 507 | |
508 | /* Statistics information returned as response for | ||
509 | * SmsHostApiGetStatisticsEx_Req for DVB applications, SMS1100 and up */ | ||
510 | struct SMSHOSTLIB_STATISTICS_DVB_S { | ||
511 | /* Reception */ | ||
512 | struct RECEPTION_STATISTICS_S ReceptionData; | ||
513 | |||
514 | /* Transmission parameters */ | ||
515 | struct TRANSMISSION_STATISTICS_S TransmissionData; | ||
516 | |||
517 | /* Burst parameters, valid only for DVB-H */ | ||
518 | #define SRVM_MAX_PID_FILTERS 8 | ||
519 | struct PID_DATA_S PidData[SRVM_MAX_PID_FILTERS]; | ||
520 | }; | ||
521 | |||
522 | struct SRVM_SIGNAL_STATUS_S { | ||
523 | u32 result; | ||
524 | u32 snr; | ||
525 | u32 tsPackets; | ||
526 | u32 etsPackets; | ||
527 | u32 constellation; | ||
528 | u32 hpCode; | ||
529 | u32 tpsSrvIndLP; | ||
530 | u32 tpsSrvIndHP; | ||
531 | u32 cellId; | ||
532 | u32 reason; | ||
533 | |||
534 | s32 inBandPower; | ||
535 | u32 requestId; | ||
536 | }; | ||
537 | |||
538 | struct SMSHOSTLIB_I2C_REQ_ST { | ||
539 | u32 DeviceAddress; /* I2c device address */ | ||
540 | u32 WriteCount; /* number of bytes to write */ | ||
541 | u32 ReadCount; /* number of bytes to read */ | ||
542 | u8 Data[1]; | ||
543 | }; | ||
544 | |||
545 | struct SMSHOSTLIB_I2C_RES_ST { | ||
546 | u32 Status; /* non-zero value in case of failure */ | ||
547 | u32 ReadCount; /* number of bytes read */ | ||
548 | u8 Data[1]; | ||
549 | }; | ||
550 | |||
551 | |||
552 | struct smscore_config_gpio { | ||
347 | #define SMS_GPIO_DIRECTION_INPUT 0 | 553 | #define SMS_GPIO_DIRECTION_INPUT 0 |
348 | #define SMS_GPIO_DIRECTION_OUTPUT 1 | 554 | #define SMS_GPIO_DIRECTION_OUTPUT 1 |
349 | u8 direction; | 555 | u8 direction; |
@@ -369,6 +575,47 @@ struct smscore_gpio_config { | |||
369 | u8 outputdriving; | 575 | u8 outputdriving; |
370 | }; | 576 | }; |
371 | 577 | ||
578 | struct smscore_gpio_config { | ||
579 | #define SMS_GPIO_DIRECTION_INPUT 0 | ||
580 | #define SMS_GPIO_DIRECTION_OUTPUT 1 | ||
581 | u8 Direction; | ||
582 | |||
583 | #define SMS_GPIO_PULL_UP_DOWN_NONE 0 | ||
584 | #define SMS_GPIO_PULL_UP_DOWN_PULLDOWN 1 | ||
585 | #define SMS_GPIO_PULL_UP_DOWN_PULLUP 2 | ||
586 | #define SMS_GPIO_PULL_UP_DOWN_KEEPER 3 | ||
587 | u8 PullUpDown; | ||
588 | |||
589 | #define SMS_GPIO_INPUT_CHARACTERISTICS_NORMAL 0 | ||
590 | #define SMS_GPIO_INPUT_CHARACTERISTICS_SCHMITT 1 | ||
591 | u8 InputCharacteristics; | ||
592 | |||
593 | #define SMS_GPIO_OUTPUT_SLEW_RATE_SLOW 1 /* 10xx */ | ||
594 | #define SMS_GPIO_OUTPUT_SLEW_RATE_FAST 0 /* 10xx */ | ||
595 | |||
596 | |||
597 | #define SMS_GPIO_OUTPUT_SLEW_RATE_0_45_V_NS 0 /* 11xx */ | ||
598 | #define SMS_GPIO_OUTPUT_SLEW_RATE_0_9_V_NS 1 /* 11xx */ | ||
599 | #define SMS_GPIO_OUTPUT_SLEW_RATE_1_7_V_NS 2 /* 11xx */ | ||
600 | #define SMS_GPIO_OUTPUT_SLEW_RATE_3_3_V_NS 3 /* 11xx */ | ||
601 | u8 OutputSlewRate; | ||
602 | |||
603 | #define SMS_GPIO_OUTPUT_DRIVING_S_4mA 0 /* 10xx */ | ||
604 | #define SMS_GPIO_OUTPUT_DRIVING_S_8mA 1 /* 10xx */ | ||
605 | #define SMS_GPIO_OUTPUT_DRIVING_S_12mA 2 /* 10xx */ | ||
606 | #define SMS_GPIO_OUTPUT_DRIVING_S_16mA 3 /* 10xx */ | ||
607 | |||
608 | #define SMS_GPIO_OUTPUT_DRIVING_1_5mA 0 /* 11xx */ | ||
609 | #define SMS_GPIO_OUTPUT_DRIVING_2_8mA 1 /* 11xx */ | ||
610 | #define SMS_GPIO_OUTPUT_DRIVING_4mA 2 /* 11xx */ | ||
611 | #define SMS_GPIO_OUTPUT_DRIVING_7mA 3 /* 11xx */ | ||
612 | #define SMS_GPIO_OUTPUT_DRIVING_10mA 4 /* 11xx */ | ||
613 | #define SMS_GPIO_OUTPUT_DRIVING_11mA 5 /* 11xx */ | ||
614 | #define SMS_GPIO_OUTPUT_DRIVING_14mA 6 /* 11xx */ | ||
615 | #define SMS_GPIO_OUTPUT_DRIVING_16mA 7 /* 11xx */ | ||
616 | u8 OutputDriving; | ||
617 | }; | ||
618 | |||
372 | extern void smscore_registry_setmode(char *devpath, int mode); | 619 | extern void smscore_registry_setmode(char *devpath, int mode); |
373 | extern int smscore_registry_getmode(char *devpath); | 620 | extern int smscore_registry_getmode(char *devpath); |
374 | 621 | ||
@@ -410,10 +657,19 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev); | |||
410 | extern void smscore_putbuffer(struct smscore_device_t *coredev, | 657 | extern void smscore_putbuffer(struct smscore_device_t *coredev, |
411 | struct smscore_buffer_t *cb); | 658 | struct smscore_buffer_t *cb); |
412 | 659 | ||
660 | /* old GPIO managment */ | ||
413 | int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin, | 661 | int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin, |
414 | struct smscore_gpio_config *pinconfig); | 662 | struct smscore_config_gpio *pinconfig); |
415 | int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level); | 663 | int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level); |
416 | 664 | ||
665 | /* new GPIO managment */ | ||
666 | extern int smscore_gpio_configure(struct smscore_device_t *coredev, u8 PinNum, | ||
667 | struct smscore_gpio_config *pGpioConfig); | ||
668 | extern int smscore_gpio_set_level(struct smscore_device_t *coredev, u8 PinNum, | ||
669 | u8 NewLevel); | ||
670 | extern int smscore_gpio_get_level(struct smscore_device_t *coredev, u8 PinNum, | ||
671 | u8 *level); | ||
672 | |||
417 | void smscore_set_board_id(struct smscore_device_t *core, int id); | 673 | void smscore_set_board_id(struct smscore_device_t *core, int id); |
418 | int smscore_get_board_id(struct smscore_device_t *core); | 674 | int smscore_get_board_id(struct smscore_device_t *core); |
419 | 675 | ||
@@ -442,4 +698,4 @@ int smscore_led_state(struct smscore_device_t *core, int led); | |||
442 | dprintk(KERN_DEBUG, DBG_ADV, fmt, ##arg) | 698 | dprintk(KERN_DEBUG, DBG_ADV, fmt, ##arg) |
443 | 699 | ||
444 | 700 | ||
445 | #endif /* __smscoreapi_h__ */ | 701 | #endif /* __SMS_CORE_API_H__ */ |
diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c index ba080b95befb..3ee1c3902c56 100644 --- a/drivers/media/dvb/siano/smsdvb.c +++ b/drivers/media/dvb/siano/smsdvb.c | |||
@@ -1,28 +1,34 @@ | |||
1 | /* | 1 | /**************************************************************** |
2 | * Driver for the Siano SMS1xxx USB dongle | 2 | |
3 | * | 3 | Siano Mobile Silicon, Inc. |
4 | * Author: Uri Shkolni | 4 | MDTV receiver kernel modules. |
5 | * | 5 | Copyright (C) 2006-2008, Uri Shkolnik |
6 | * Copyright (c), 2005-2008 Siano Mobile Silicon, Inc. | 6 | |
7 | * | 7 | This program is free software: you can redistribute it and/or modify |
8 | * 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 | * it under the terms of the GNU General Public License version 2 as | 9 | the Free Software Foundation, either version 2 of the License, or |
10 | * published by the Free Software Foundation; | 10 | (at your option) any later version. |
11 | * | 11 | |
12 | * Software distributed under the License is distributed on an "AS IS" | 12 | This program is distributed in the hope that it will be useful, |
13 | * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * See the GNU General Public License for more details. | 15 | GNU General Public License for more details. |
16 | * | 16 | |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | |
20 | */ | 20 | ****************************************************************/ |
21 | 21 | ||
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | 24 | ||
25 | #include "dmxdev.h" | ||
26 | #include "dvbdev.h" | ||
27 | #include "dvb_demux.h" | ||
28 | #include "dvb_frontend.h" | ||
29 | |||
25 | #include "smscoreapi.h" | 30 | #include "smscoreapi.h" |
31 | #include "smsendian.h" | ||
26 | #include "sms-cards.h" | 32 | #include "sms-cards.h" |
27 | 33 | ||
28 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 34 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
@@ -39,12 +45,15 @@ struct smsdvb_client_t { | |||
39 | struct dvb_frontend frontend; | 45 | struct dvb_frontend frontend; |
40 | 46 | ||
41 | fe_status_t fe_status; | 47 | fe_status_t fe_status; |
42 | int fe_ber, fe_snr, fe_unc, fe_signal_strength; | ||
43 | 48 | ||
44 | struct completion tune_done, stat_done; | 49 | struct completion tune_done; |
45 | 50 | ||
46 | /* todo: save freq/band instead whole struct */ | 51 | /* todo: save freq/band instead whole struct */ |
47 | struct dvb_frontend_parameters fe_params; | 52 | struct dvb_frontend_parameters fe_params; |
53 | |||
54 | struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb; | ||
55 | int event_fe_state; | ||
56 | int event_unc_state; | ||
48 | }; | 57 | }; |
49 | 58 | ||
50 | static struct list_head g_smsdvb_clients; | 59 | static struct list_head g_smsdvb_clients; |
@@ -54,11 +63,69 @@ static int sms_dbg; | |||
54 | module_param_named(debug, sms_dbg, int, 0644); | 63 | module_param_named(debug, sms_dbg, int, 0644); |
55 | MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))"); | 64 | MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))"); |
56 | 65 | ||
66 | /* Events that may come from DVB v3 adapter */ | ||
67 | static void sms_board_dvb3_event(struct smsdvb_client_t *client, | ||
68 | enum SMS_DVB3_EVENTS event) { | ||
69 | |||
70 | struct smscore_device_t *coredev = client->coredev; | ||
71 | switch (event) { | ||
72 | case DVB3_EVENT_INIT: | ||
73 | sms_debug("DVB3_EVENT_INIT"); | ||
74 | sms_board_event(coredev, BOARD_EVENT_BIND); | ||
75 | break; | ||
76 | case DVB3_EVENT_SLEEP: | ||
77 | sms_debug("DVB3_EVENT_SLEEP"); | ||
78 | sms_board_event(coredev, BOARD_EVENT_POWER_SUSPEND); | ||
79 | break; | ||
80 | case DVB3_EVENT_HOTPLUG: | ||
81 | sms_debug("DVB3_EVENT_HOTPLUG"); | ||
82 | sms_board_event(coredev, BOARD_EVENT_POWER_INIT); | ||
83 | break; | ||
84 | case DVB3_EVENT_FE_LOCK: | ||
85 | if (client->event_fe_state != DVB3_EVENT_FE_LOCK) { | ||
86 | client->event_fe_state = DVB3_EVENT_FE_LOCK; | ||
87 | sms_debug("DVB3_EVENT_FE_LOCK"); | ||
88 | sms_board_event(coredev, BOARD_EVENT_FE_LOCK); | ||
89 | } | ||
90 | break; | ||
91 | case DVB3_EVENT_FE_UNLOCK: | ||
92 | if (client->event_fe_state != DVB3_EVENT_FE_UNLOCK) { | ||
93 | client->event_fe_state = DVB3_EVENT_FE_UNLOCK; | ||
94 | sms_debug("DVB3_EVENT_FE_UNLOCK"); | ||
95 | sms_board_event(coredev, BOARD_EVENT_FE_UNLOCK); | ||
96 | } | ||
97 | break; | ||
98 | case DVB3_EVENT_UNC_OK: | ||
99 | if (client->event_unc_state != DVB3_EVENT_UNC_OK) { | ||
100 | client->event_unc_state = DVB3_EVENT_UNC_OK; | ||
101 | sms_debug("DVB3_EVENT_UNC_OK"); | ||
102 | sms_board_event(coredev, BOARD_EVENT_MULTIPLEX_OK); | ||
103 | } | ||
104 | break; | ||
105 | case DVB3_EVENT_UNC_ERR: | ||
106 | if (client->event_unc_state != DVB3_EVENT_UNC_ERR) { | ||
107 | client->event_unc_state = DVB3_EVENT_UNC_ERR; | ||
108 | sms_debug("DVB3_EVENT_UNC_ERR"); | ||
109 | sms_board_event(coredev, BOARD_EVENT_MULTIPLEX_ERRORS); | ||
110 | } | ||
111 | break; | ||
112 | |||
113 | default: | ||
114 | sms_err("Unknown dvb3 api event"); | ||
115 | break; | ||
116 | } | ||
117 | } | ||
118 | |||
57 | static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) | 119 | static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) |
58 | { | 120 | { |
59 | struct smsdvb_client_t *client = (struct smsdvb_client_t *) context; | 121 | struct smsdvb_client_t *client = (struct smsdvb_client_t *) context; |
60 | struct SmsMsgHdr_ST *phdr = | 122 | struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) (((u8 *) cb->p) |
61 | (struct SmsMsgHdr_ST *)(((u8 *) cb->p) + cb->offset); | 123 | + cb->offset); |
124 | u32 *pMsgData = (u32 *) phdr + 1; | ||
125 | /*u32 MsgDataLen = phdr->msgLength - sizeof(struct SmsMsgHdr_ST);*/ | ||
126 | bool is_status_update = false; | ||
127 | |||
128 | smsendian_handle_rx_message((struct SmsMsgData_ST *) phdr); | ||
62 | 129 | ||
63 | switch (phdr->msgType) { | 130 | switch (phdr->msgType) { |
64 | case MSG_SMS_DVBT_BDA_DATA: | 131 | case MSG_SMS_DVBT_BDA_DATA: |
@@ -70,43 +137,110 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) | |||
70 | complete(&client->tune_done); | 137 | complete(&client->tune_done); |
71 | break; | 138 | break; |
72 | 139 | ||
73 | case MSG_SMS_GET_STATISTICS_RES: | 140 | case MSG_SMS_SIGNAL_DETECTED_IND: |
74 | { | 141 | sms_info("MSG_SMS_SIGNAL_DETECTED_IND"); |
75 | struct SmsMsgStatisticsInfo_ST *p = | 142 | client->sms_stat_dvb.TransmissionData.IsDemodLocked = true; |
76 | (struct SmsMsgStatisticsInfo_ST *)(phdr + 1); | 143 | is_status_update = true; |
77 | 144 | break; | |
78 | if (p->Stat.IsDemodLocked) { | 145 | |
79 | client->fe_status = FE_HAS_SIGNAL | | 146 | case MSG_SMS_NO_SIGNAL_IND: |
80 | FE_HAS_CARRIER | | 147 | sms_info("MSG_SMS_NO_SIGNAL_IND"); |
81 | FE_HAS_VITERBI | | 148 | client->sms_stat_dvb.TransmissionData.IsDemodLocked = false; |
82 | FE_HAS_SYNC | | 149 | is_status_update = true; |
83 | FE_HAS_LOCK; | 150 | break; |
84 | 151 | ||
85 | client->fe_snr = p->Stat.SNR; | 152 | case MSG_SMS_TRANSMISSION_IND: { |
86 | client->fe_ber = p->Stat.BER; | 153 | sms_info("MSG_SMS_TRANSMISSION_IND"); |
87 | client->fe_unc = p->Stat.BERErrorCount; | 154 | |
88 | 155 | pMsgData++; | |
89 | if (p->Stat.InBandPwr < -95) | 156 | memcpy(&client->sms_stat_dvb.TransmissionData, pMsgData, |
90 | client->fe_signal_strength = 0; | 157 | sizeof(struct TRANSMISSION_STATISTICS_S)); |
91 | else if (p->Stat.InBandPwr > -29) | 158 | |
92 | client->fe_signal_strength = 100; | 159 | /* Mo need to correct guard interval |
93 | else | 160 | * (as opposed to old statistics message). |
94 | client->fe_signal_strength = | 161 | */ |
95 | (p->Stat.InBandPwr + 95) * 3 / 2; | 162 | CORRECT_STAT_BANDWIDTH(client->sms_stat_dvb.TransmissionData); |
163 | CORRECT_STAT_TRANSMISSON_MODE( | ||
164 | client->sms_stat_dvb.TransmissionData); | ||
165 | is_status_update = true; | ||
166 | break; | ||
167 | } | ||
168 | case MSG_SMS_HO_PER_SLICES_IND: { | ||
169 | struct RECEPTION_STATISTICS_S *pReceptionData = | ||
170 | &client->sms_stat_dvb.ReceptionData; | ||
171 | struct SRVM_SIGNAL_STATUS_S SignalStatusData; | ||
172 | |||
173 | /*sms_info("MSG_SMS_HO_PER_SLICES_IND");*/ | ||
174 | pMsgData++; | ||
175 | SignalStatusData.result = pMsgData[0]; | ||
176 | SignalStatusData.snr = pMsgData[1]; | ||
177 | SignalStatusData.inBandPower = (s32) pMsgData[2]; | ||
178 | SignalStatusData.tsPackets = pMsgData[3]; | ||
179 | SignalStatusData.etsPackets = pMsgData[4]; | ||
180 | SignalStatusData.constellation = pMsgData[5]; | ||
181 | SignalStatusData.hpCode = pMsgData[6]; | ||
182 | SignalStatusData.tpsSrvIndLP = pMsgData[7] & 0x03; | ||
183 | SignalStatusData.tpsSrvIndHP = pMsgData[8] & 0x03; | ||
184 | SignalStatusData.cellId = pMsgData[9] & 0xFFFF; | ||
185 | SignalStatusData.reason = pMsgData[10]; | ||
186 | SignalStatusData.requestId = pMsgData[11]; | ||
187 | pReceptionData->IsRfLocked = pMsgData[16]; | ||
188 | pReceptionData->IsDemodLocked = pMsgData[17]; | ||
189 | pReceptionData->ModemState = pMsgData[12]; | ||
190 | pReceptionData->SNR = pMsgData[1]; | ||
191 | pReceptionData->BER = pMsgData[13]; | ||
192 | pReceptionData->RSSI = pMsgData[14]; | ||
193 | CORRECT_STAT_RSSI(client->sms_stat_dvb.ReceptionData); | ||
194 | |||
195 | pReceptionData->InBandPwr = (s32) pMsgData[2]; | ||
196 | pReceptionData->CarrierOffset = (s32) pMsgData[15]; | ||
197 | pReceptionData->TotalTSPackets = pMsgData[3]; | ||
198 | pReceptionData->ErrorTSPackets = pMsgData[4]; | ||
199 | |||
200 | /* TS PER */ | ||
201 | if ((SignalStatusData.tsPackets + SignalStatusData.etsPackets) | ||
202 | > 0) { | ||
203 | pReceptionData->TS_PER = (SignalStatusData.etsPackets | ||
204 | * 100) / (SignalStatusData.tsPackets | ||
205 | + SignalStatusData.etsPackets); | ||
96 | } else { | 206 | } else { |
97 | client->fe_status = 0; | 207 | pReceptionData->TS_PER = 0; |
98 | client->fe_snr = | ||
99 | client->fe_ber = | ||
100 | client->fe_unc = | ||
101 | client->fe_signal_strength = 0; | ||
102 | } | 208 | } |
103 | 209 | ||
104 | complete(&client->stat_done); | 210 | pReceptionData->BERBitCount = pMsgData[18]; |
105 | break; | 211 | pReceptionData->BERErrorCount = pMsgData[19]; |
106 | } } | ||
107 | 212 | ||
213 | pReceptionData->MRC_SNR = pMsgData[20]; | ||
214 | pReceptionData->MRC_InBandPwr = pMsgData[21]; | ||
215 | pReceptionData->MRC_RSSI = pMsgData[22]; | ||
216 | |||
217 | is_status_update = true; | ||
218 | break; | ||
219 | } | ||
220 | } | ||
108 | smscore_putbuffer(client->coredev, cb); | 221 | smscore_putbuffer(client->coredev, cb); |
109 | 222 | ||
223 | if (is_status_update) { | ||
224 | if (client->sms_stat_dvb.ReceptionData.IsDemodLocked) { | ||
225 | client->fe_status = FE_HAS_SIGNAL | FE_HAS_CARRIER | ||
226 | | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; | ||
227 | sms_board_dvb3_event(client, DVB3_EVENT_FE_LOCK); | ||
228 | if (client->sms_stat_dvb.ReceptionData.ErrorTSPackets | ||
229 | == 0) | ||
230 | sms_board_dvb3_event(client, DVB3_EVENT_UNC_OK); | ||
231 | else | ||
232 | sms_board_dvb3_event(client, | ||
233 | DVB3_EVENT_UNC_ERR); | ||
234 | |||
235 | } else { | ||
236 | /*client->fe_status = | ||
237 | (phdr->msgType == MSG_SMS_NO_SIGNAL_IND) ? | ||
238 | 0 : FE_HAS_SIGNAL;*/ | ||
239 | client->fe_status = 0; | ||
240 | sms_board_dvb3_event(client, DVB3_EVENT_FE_UNLOCK); | ||
241 | } | ||
242 | } | ||
243 | |||
110 | return 0; | 244 | return 0; |
111 | } | 245 | } |
112 | 246 | ||
@@ -149,6 +283,7 @@ static int smsdvb_start_feed(struct dvb_demux_feed *feed) | |||
149 | PidMsg.xMsgHeader.msgLength = sizeof(PidMsg); | 283 | PidMsg.xMsgHeader.msgLength = sizeof(PidMsg); |
150 | PidMsg.msgData[0] = feed->pid; | 284 | PidMsg.msgData[0] = feed->pid; |
151 | 285 | ||
286 | smsendian_handle_tx_message((struct SmsMsgHdr_ST *)&PidMsg); | ||
152 | return smsclient_sendrequest(client->smsclient, | 287 | return smsclient_sendrequest(client->smsclient, |
153 | &PidMsg, sizeof(PidMsg)); | 288 | &PidMsg, sizeof(PidMsg)); |
154 | } | 289 | } |
@@ -169,6 +304,7 @@ static int smsdvb_stop_feed(struct dvb_demux_feed *feed) | |||
169 | PidMsg.xMsgHeader.msgLength = sizeof(PidMsg); | 304 | PidMsg.xMsgHeader.msgLength = sizeof(PidMsg); |
170 | PidMsg.msgData[0] = feed->pid; | 305 | PidMsg.msgData[0] = feed->pid; |
171 | 306 | ||
307 | smsendian_handle_tx_message((struct SmsMsgHdr_ST *)&PidMsg); | ||
172 | return smsclient_sendrequest(client->smsclient, | 308 | return smsclient_sendrequest(client->smsclient, |
173 | &PidMsg, sizeof(PidMsg)); | 309 | &PidMsg, sizeof(PidMsg)); |
174 | } | 310 | } |
@@ -177,7 +313,10 @@ static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client, | |||
177 | void *buffer, size_t size, | 313 | void *buffer, size_t size, |
178 | struct completion *completion) | 314 | struct completion *completion) |
179 | { | 315 | { |
180 | int rc = smsclient_sendrequest(client->smsclient, buffer, size); | 316 | int rc; |
317 | |||
318 | smsendian_handle_tx_message((struct SmsMsgHdr_ST *)buffer); | ||
319 | rc = smsclient_sendrequest(client->smsclient, buffer, size); | ||
181 | if (rc < 0) | 320 | if (rc < 0) |
182 | return rc; | 321 | return rc; |
183 | 322 | ||
@@ -186,83 +325,61 @@ static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client, | |||
186 | 0 : -ETIME; | 325 | 0 : -ETIME; |
187 | } | 326 | } |
188 | 327 | ||
189 | static int smsdvb_send_statistics_request(struct smsdvb_client_t *client) | ||
190 | { | ||
191 | struct SmsMsgHdr_ST Msg = { MSG_SMS_GET_STATISTICS_REQ, | ||
192 | DVBT_BDA_CONTROL_MSG_ID, | ||
193 | HIF_TASK, sizeof(struct SmsMsgHdr_ST), 0 }; | ||
194 | int ret = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), | ||
195 | &client->stat_done); | ||
196 | if (ret < 0) | ||
197 | return ret; | ||
198 | |||
199 | if (client->fe_status & FE_HAS_LOCK) | ||
200 | sms_board_led_feedback(client->coredev, | ||
201 | (client->fe_unc == 0) ? | ||
202 | SMS_LED_HI : SMS_LED_LO); | ||
203 | else | ||
204 | sms_board_led_feedback(client->coredev, SMS_LED_OFF); | ||
205 | return ret; | ||
206 | } | ||
207 | |||
208 | static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat) | 328 | static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat) |
209 | { | 329 | { |
210 | struct smsdvb_client_t *client = | 330 | struct smsdvb_client_t *client; |
211 | container_of(fe, struct smsdvb_client_t, frontend); | 331 | client = container_of(fe, struct smsdvb_client_t, frontend); |
212 | int rc = smsdvb_send_statistics_request(client); | ||
213 | 332 | ||
214 | if (!rc) | 333 | *stat = client->fe_status; |
215 | *stat = client->fe_status; | ||
216 | 334 | ||
217 | return rc; | 335 | return 0; |
218 | } | 336 | } |
219 | 337 | ||
220 | static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber) | 338 | static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber) |
221 | { | 339 | { |
222 | struct smsdvb_client_t *client = | 340 | struct smsdvb_client_t *client; |
223 | container_of(fe, struct smsdvb_client_t, frontend); | 341 | client = container_of(fe, struct smsdvb_client_t, frontend); |
224 | int rc = smsdvb_send_statistics_request(client); | ||
225 | 342 | ||
226 | if (!rc) | 343 | *ber = client->sms_stat_dvb.ReceptionData.BER; |
227 | *ber = client->fe_ber; | ||
228 | 344 | ||
229 | return rc; | 345 | return 0; |
230 | } | 346 | } |
231 | 347 | ||
232 | static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | 348 | static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength) |
233 | { | 349 | { |
234 | struct smsdvb_client_t *client = | 350 | struct smsdvb_client_t *client; |
235 | container_of(fe, struct smsdvb_client_t, frontend); | 351 | client = container_of(fe, struct smsdvb_client_t, frontend); |
236 | int rc = smsdvb_send_statistics_request(client); | ||
237 | 352 | ||
238 | if (!rc) | 353 | if (client->sms_stat_dvb.ReceptionData.InBandPwr < -95) |
239 | *strength = client->fe_signal_strength; | 354 | *strength = 0; |
355 | else if (client->sms_stat_dvb.ReceptionData.InBandPwr > -29) | ||
356 | *strength = 100; | ||
357 | else | ||
358 | *strength = | ||
359 | (client->sms_stat_dvb.ReceptionData.InBandPwr | ||
360 | + 95) * 3 / 2; | ||
240 | 361 | ||
241 | return rc; | 362 | return 0; |
242 | } | 363 | } |
243 | 364 | ||
244 | static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr) | 365 | static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr) |
245 | { | 366 | { |
246 | struct smsdvb_client_t *client = | 367 | struct smsdvb_client_t *client; |
247 | container_of(fe, struct smsdvb_client_t, frontend); | 368 | client = container_of(fe, struct smsdvb_client_t, frontend); |
248 | int rc = smsdvb_send_statistics_request(client); | ||
249 | 369 | ||
250 | if (!rc) | 370 | *snr = client->sms_stat_dvb.ReceptionData.SNR; |
251 | *snr = client->fe_snr; | ||
252 | 371 | ||
253 | return rc; | 372 | return 0; |
254 | } | 373 | } |
255 | 374 | ||
256 | static int smsdvb_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | 375 | static int smsdvb_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) |
257 | { | 376 | { |
258 | struct smsdvb_client_t *client = | 377 | struct smsdvb_client_t *client; |
259 | container_of(fe, struct smsdvb_client_t, frontend); | 378 | client = container_of(fe, struct smsdvb_client_t, frontend); |
260 | int rc = smsdvb_send_statistics_request(client); | ||
261 | 379 | ||
262 | if (!rc) | 380 | *ucblocks = client->sms_stat_dvb.ReceptionData.ErrorTSPackets; |
263 | *ucblocks = client->fe_unc; | ||
264 | 381 | ||
265 | return rc; | 382 | return 0; |
266 | } | 383 | } |
267 | 384 | ||
268 | static int smsdvb_get_tune_settings(struct dvb_frontend *fe, | 385 | static int smsdvb_get_tune_settings(struct dvb_frontend *fe, |
@@ -286,12 +403,15 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe, | |||
286 | struct SmsMsgHdr_ST Msg; | 403 | struct SmsMsgHdr_ST Msg; |
287 | u32 Data[3]; | 404 | u32 Data[3]; |
288 | } Msg; | 405 | } Msg; |
289 | int ret; | ||
290 | 406 | ||
291 | Msg.Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; | 407 | client->fe_status = FE_HAS_SIGNAL; |
292 | Msg.Msg.msgDstId = HIF_TASK; | 408 | client->event_fe_state = -1; |
293 | Msg.Msg.msgFlags = 0; | 409 | client->event_unc_state = -1; |
294 | Msg.Msg.msgType = MSG_SMS_RF_TUNE_REQ; | 410 | |
411 | Msg.Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; | ||
412 | Msg.Msg.msgDstId = HIF_TASK; | ||
413 | Msg.Msg.msgFlags = 0; | ||
414 | Msg.Msg.msgType = MSG_SMS_RF_TUNE_REQ; | ||
295 | Msg.Msg.msgLength = sizeof(Msg); | 415 | Msg.Msg.msgLength = sizeof(Msg); |
296 | Msg.Data[0] = fep->frequency; | 416 | Msg.Data[0] = fep->frequency; |
297 | Msg.Data[2] = 12000000; | 417 | Msg.Data[2] = 12000000; |
@@ -307,24 +427,6 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe, | |||
307 | default: return -EINVAL; | 427 | default: return -EINVAL; |
308 | } | 428 | } |
309 | 429 | ||
310 | /* Disable LNA, if any. An error is returned if no LNA is present */ | ||
311 | ret = sms_board_lna_control(client->coredev, 0); | ||
312 | if (ret == 0) { | ||
313 | fe_status_t status; | ||
314 | |||
315 | /* tune with LNA off at first */ | ||
316 | ret = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), | ||
317 | &client->tune_done); | ||
318 | |||
319 | smsdvb_read_status(fe, &status); | ||
320 | |||
321 | if (status & FE_HAS_LOCK) | ||
322 | return ret; | ||
323 | |||
324 | /* previous tune didnt lock - enable LNA and tune again */ | ||
325 | sms_board_lna_control(client->coredev, 1); | ||
326 | } | ||
327 | |||
328 | return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), | 430 | return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), |
329 | &client->tune_done); | 431 | &client->tune_done); |
330 | } | 432 | } |
@@ -349,8 +451,7 @@ static int smsdvb_init(struct dvb_frontend *fe) | |||
349 | struct smsdvb_client_t *client = | 451 | struct smsdvb_client_t *client = |
350 | container_of(fe, struct smsdvb_client_t, frontend); | 452 | container_of(fe, struct smsdvb_client_t, frontend); |
351 | 453 | ||
352 | sms_board_power(client->coredev, 1); | 454 | sms_board_dvb3_event(client, DVB3_EVENT_INIT); |
353 | |||
354 | return 0; | 455 | return 0; |
355 | } | 456 | } |
356 | 457 | ||
@@ -359,8 +460,7 @@ static int smsdvb_sleep(struct dvb_frontend *fe) | |||
359 | struct smsdvb_client_t *client = | 460 | struct smsdvb_client_t *client = |
360 | container_of(fe, struct smsdvb_client_t, frontend); | 461 | container_of(fe, struct smsdvb_client_t, frontend); |
361 | 462 | ||
362 | sms_board_led_feedback(client->coredev, SMS_LED_OFF); | 463 | sms_board_dvb3_event(client, DVB3_EVENT_SLEEP); |
363 | sms_board_power(client->coredev, 0); | ||
364 | 464 | ||
365 | return 0; | 465 | return 0; |
366 | } | 466 | } |
@@ -485,7 +585,6 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev, | |||
485 | client->coredev = coredev; | 585 | client->coredev = coredev; |
486 | 586 | ||
487 | init_completion(&client->tune_done); | 587 | init_completion(&client->tune_done); |
488 | init_completion(&client->stat_done); | ||
489 | 588 | ||
490 | kmutex_lock(&g_smsdvb_clientslock); | 589 | kmutex_lock(&g_smsdvb_clientslock); |
491 | 590 | ||
@@ -493,8 +592,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev, | |||
493 | 592 | ||
494 | kmutex_unlock(&g_smsdvb_clientslock); | 593 | kmutex_unlock(&g_smsdvb_clientslock); |
495 | 594 | ||
496 | sms_info("success"); | 595 | client->event_fe_state = -1; |
596 | client->event_unc_state = -1; | ||
597 | sms_board_dvb3_event(client, DVB3_EVENT_HOTPLUG); | ||
497 | 598 | ||
599 | sms_info("success"); | ||
498 | sms_board_setup(coredev); | 600 | sms_board_setup(coredev); |
499 | 601 | ||
500 | return 0; | 602 | return 0; |
@@ -547,5 +649,5 @@ module_init(smsdvb_module_init); | |||
547 | module_exit(smsdvb_module_exit); | 649 | module_exit(smsdvb_module_exit); |
548 | 650 | ||
549 | MODULE_DESCRIPTION("SMS DVB subsystem adaptation module"); | 651 | MODULE_DESCRIPTION("SMS DVB subsystem adaptation module"); |
550 | MODULE_AUTHOR("Siano Mobile Silicon, INC. (uris@siano-ms.com)"); | 652 | MODULE_AUTHOR("Siano Mobile Silicon, Inc. (uris@siano-ms.com)"); |
551 | MODULE_LICENSE("GPL"); | 653 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb/siano/smsendian.c b/drivers/media/dvb/siano/smsendian.c new file mode 100644 index 000000000000..457b6d02ef85 --- /dev/null +++ b/drivers/media/dvb/siano/smsendian.c | |||
@@ -0,0 +1,102 @@ | |||
1 | /**************************************************************** | ||
2 | |||
3 | Siano Mobile Silicon, Inc. | ||
4 | MDTV receiver kernel modules. | ||
5 | Copyright (C) 2006-2009, Uri Shkolnik | ||
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, see <http://www.gnu.org/licenses/>. | ||
19 | |||
20 | ****************************************************************/ | ||
21 | |||
22 | #include <asm/byteorder.h> | ||
23 | |||
24 | #include "smsendian.h" | ||
25 | #include "smscoreapi.h" | ||
26 | |||
27 | void smsendian_handle_tx_message(void *buffer) | ||
28 | { | ||
29 | #ifdef __BIG_ENDIAN | ||
30 | struct SmsMsgData_ST *msg = (struct SmsMsgData_ST *)buffer; | ||
31 | int i; | ||
32 | int msgWords; | ||
33 | |||
34 | switch (msg->xMsgHeader.msgType) { | ||
35 | case MSG_SMS_DATA_DOWNLOAD_REQ: | ||
36 | { | ||
37 | msg->msgData[0] = le32_to_cpu(msg->msgData[0]); | ||
38 | break; | ||
39 | } | ||
40 | |||
41 | default: | ||
42 | msgWords = (msg->xMsgHeader.msgLength - | ||
43 | sizeof(struct SmsMsgHdr_ST))/4; | ||
44 | |||
45 | for (i = 0; i < msgWords; i++) | ||
46 | msg->msgData[i] = le32_to_cpu(msg->msgData[i]); | ||
47 | |||
48 | break; | ||
49 | } | ||
50 | #endif /* __BIG_ENDIAN */ | ||
51 | } | ||
52 | EXPORT_SYMBOL_GPL(smsendian_handle_tx_message); | ||
53 | |||
54 | void smsendian_handle_rx_message(void *buffer) | ||
55 | { | ||
56 | #ifdef __BIG_ENDIAN | ||
57 | struct SmsMsgData_ST *msg = (struct SmsMsgData_ST *)buffer; | ||
58 | int i; | ||
59 | int msgWords; | ||
60 | |||
61 | switch (msg->xMsgHeader.msgType) { | ||
62 | case MSG_SMS_GET_VERSION_EX_RES: | ||
63 | { | ||
64 | struct SmsVersionRes_ST *ver = | ||
65 | (struct SmsVersionRes_ST *) msg; | ||
66 | ver->ChipModel = le16_to_cpu(ver->ChipModel); | ||
67 | break; | ||
68 | } | ||
69 | |||
70 | case MSG_SMS_DVBT_BDA_DATA: | ||
71 | case MSG_SMS_DAB_CHANNEL: | ||
72 | case MSG_SMS_DATA_MSG: | ||
73 | { | ||
74 | break; | ||
75 | } | ||
76 | |||
77 | default: | ||
78 | { | ||
79 | msgWords = (msg->xMsgHeader.msgLength - | ||
80 | sizeof(struct SmsMsgHdr_ST))/4; | ||
81 | |||
82 | for (i = 0; i < msgWords; i++) | ||
83 | msg->msgData[i] = le32_to_cpu(msg->msgData[i]); | ||
84 | |||
85 | break; | ||
86 | } | ||
87 | } | ||
88 | #endif /* __BIG_ENDIAN */ | ||
89 | } | ||
90 | EXPORT_SYMBOL_GPL(smsendian_handle_rx_message); | ||
91 | |||
92 | void smsendian_handle_message_header(void *msg) | ||
93 | { | ||
94 | #ifdef __BIG_ENDIAN | ||
95 | struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *)msg; | ||
96 | |||
97 | phdr->msgType = le16_to_cpu(phdr->msgType); | ||
98 | phdr->msgLength = le16_to_cpu(phdr->msgLength); | ||
99 | phdr->msgFlags = le16_to_cpu(phdr->msgFlags); | ||
100 | #endif /* __BIG_ENDIAN */ | ||
101 | } | ||
102 | EXPORT_SYMBOL_GPL(smsendian_handle_message_header); | ||
diff --git a/drivers/media/dvb/siano/smsendian.h b/drivers/media/dvb/siano/smsendian.h new file mode 100644 index 000000000000..1624d6fd367b --- /dev/null +++ b/drivers/media/dvb/siano/smsendian.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /**************************************************************** | ||
2 | |||
3 | Siano Mobile Silicon, Inc. | ||
4 | MDTV receiver kernel modules. | ||
5 | Copyright (C) 2006-2009, Uri Shkolnik | ||
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, see <http://www.gnu.org/licenses/>. | ||
19 | |||
20 | ****************************************************************/ | ||
21 | |||
22 | #ifndef __SMS_ENDIAN_H__ | ||
23 | #define __SMS_ENDIAN_H__ | ||
24 | |||
25 | #include <asm/byteorder.h> | ||
26 | |||
27 | extern void smsendian_handle_tx_message(void *buffer); | ||
28 | extern void smsendian_handle_rx_message(void *buffer); | ||
29 | extern void smsendian_handle_message_header(void *msg); | ||
30 | |||
31 | #endif /* __SMS_ENDIAN_H__ */ | ||
32 | |||
diff --git a/drivers/media/dvb/siano/smsir.c b/drivers/media/dvb/siano/smsir.c new file mode 100644 index 000000000000..e3d776feeaca --- /dev/null +++ b/drivers/media/dvb/siano/smsir.c | |||
@@ -0,0 +1,301 @@ | |||
1 | /**************************************************************** | ||
2 | |||
3 | Siano Mobile Silicon, Inc. | ||
4 | MDTV receiver kernel modules. | ||
5 | Copyright (C) 2006-2009, Uri Shkolnik | ||
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, see <http://www.gnu.org/licenses/>. | ||
19 | |||
20 | ****************************************************************/ | ||
21 | |||
22 | |||
23 | #include <linux/types.h> | ||
24 | #include <linux/input.h> | ||
25 | |||
26 | #include "smscoreapi.h" | ||
27 | #include "smsir.h" | ||
28 | #include "sms-cards.h" | ||
29 | |||
30 | /* In order to add new IR remote control - | ||
31 | * 1) Add it to the <enum ir_kb_type> @ smsir,h, | ||
32 | * 2) Add its map to keyboard_layout_maps below | ||
33 | * 3) Set your board (sms-cards sub-module) to use it | ||
34 | */ | ||
35 | |||
36 | static struct keyboard_layout_map_t keyboard_layout_maps[] = { | ||
37 | [SMS_IR_KB_DEFAULT_TV] = { | ||
38 | .ir_protocol = IR_RC5, | ||
39 | .rc5_kbd_address = KEYBOARD_ADDRESS_TV1, | ||
40 | .keyboard_layout_map = { | ||
41 | KEY_0, KEY_1, KEY_2, | ||
42 | KEY_3, KEY_4, KEY_5, | ||
43 | KEY_6, KEY_7, KEY_8, | ||
44 | KEY_9, 0, 0, KEY_POWER, | ||
45 | KEY_MUTE, 0, 0, | ||
46 | KEY_VOLUMEUP, KEY_VOLUMEDOWN, | ||
47 | KEY_BRIGHTNESSUP, | ||
48 | KEY_BRIGHTNESSDOWN, KEY_CHANNELUP, | ||
49 | KEY_CHANNELDOWN, | ||
50 | 0, 0, 0, 0, 0, 0, 0, 0, | ||
51 | 0, 0, 0, 0, 0, 0, 0, 0, | ||
52 | 0, 0, 0, 0, 0, 0, 0, 0, | ||
53 | 0, 0, 0, 0, 0, 0, 0, 0, | ||
54 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
55 | } | ||
56 | }, | ||
57 | [SMS_IR_KB_HCW_SILVER] = { | ||
58 | .ir_protocol = IR_RC5, | ||
59 | .rc5_kbd_address = KEYBOARD_ADDRESS_LIGHTING1, | ||
60 | .keyboard_layout_map = { | ||
61 | KEY_0, KEY_1, KEY_2, | ||
62 | KEY_3, KEY_4, KEY_5, | ||
63 | KEY_6, KEY_7, KEY_8, | ||
64 | KEY_9, KEY_TEXT, KEY_RED, | ||
65 | KEY_RADIO, KEY_MENU, | ||
66 | KEY_SUBTITLE, | ||
67 | KEY_MUTE, KEY_VOLUMEUP, | ||
68 | KEY_VOLUMEDOWN, KEY_PREVIOUS, 0, | ||
69 | KEY_UP, KEY_DOWN, KEY_LEFT, | ||
70 | KEY_RIGHT, KEY_VIDEO, KEY_AUDIO, | ||
71 | KEY_MHP, KEY_EPG, KEY_TV, | ||
72 | 0, KEY_NEXTSONG, KEY_EXIT, | ||
73 | KEY_CHANNELUP, KEY_CHANNELDOWN, | ||
74 | KEY_CHANNEL, 0, | ||
75 | KEY_PREVIOUSSONG, KEY_ENTER, | ||
76 | KEY_SLEEP, 0, 0, KEY_BLUE, | ||
77 | 0, 0, 0, 0, KEY_GREEN, 0, | ||
78 | KEY_PAUSE, 0, KEY_REWIND, | ||
79 | 0, KEY_FASTFORWARD, KEY_PLAY, | ||
80 | KEY_STOP, KEY_RECORD, | ||
81 | KEY_YELLOW, 0, 0, KEY_SELECT, | ||
82 | KEY_ZOOM, KEY_POWER, 0, 0 | ||
83 | } | ||
84 | }, | ||
85 | { } /* Terminating entry */ | ||
86 | }; | ||
87 | |||
88 | u32 ir_pos; | ||
89 | u32 ir_word; | ||
90 | u32 ir_toggle; | ||
91 | |||
92 | #define RC5_PUSH_BIT(dst, bit, pos) \ | ||
93 | { dst <<= 1; dst |= bit; pos++; } | ||
94 | |||
95 | |||
96 | static void sms_ir_rc5_event(struct smscore_device_t *coredev, | ||
97 | u32 toggle, u32 addr, u32 cmd) | ||
98 | { | ||
99 | bool toggle_changed; | ||
100 | u16 keycode; | ||
101 | |||
102 | sms_log("IR RC5 word: address %d, command %d, toggle %d", | ||
103 | addr, cmd, toggle); | ||
104 | |||
105 | toggle_changed = ir_toggle != toggle; | ||
106 | /* keep toggle */ | ||
107 | ir_toggle = toggle; | ||
108 | |||
109 | if (addr != | ||
110 | keyboard_layout_maps[coredev->ir.ir_kb_type].rc5_kbd_address) | ||
111 | return; /* Check for valid address */ | ||
112 | |||
113 | keycode = | ||
114 | keyboard_layout_maps | ||
115 | [coredev->ir.ir_kb_type].keyboard_layout_map[cmd]; | ||
116 | |||
117 | if (!toggle_changed && | ||
118 | (keycode != KEY_VOLUMEUP && keycode != KEY_VOLUMEDOWN)) | ||
119 | return; /* accept only repeated volume, reject other keys */ | ||
120 | |||
121 | sms_log("kernel input keycode (from ir) %d", keycode); | ||
122 | input_report_key(coredev->ir.input_dev, keycode, 1); | ||
123 | input_sync(coredev->ir.input_dev); | ||
124 | |||
125 | } | ||
126 | |||
127 | /* decode raw bit pattern to RC5 code */ | ||
128 | /* taken from ir-functions.c */ | ||
129 | static u32 ir_rc5_decode(unsigned int code) | ||
130 | { | ||
131 | /* unsigned int org_code = code;*/ | ||
132 | unsigned int pair; | ||
133 | unsigned int rc5 = 0; | ||
134 | int i; | ||
135 | |||
136 | for (i = 0; i < 14; ++i) { | ||
137 | pair = code & 0x3; | ||
138 | code >>= 2; | ||
139 | |||
140 | rc5 <<= 1; | ||
141 | switch (pair) { | ||
142 | case 0: | ||
143 | case 2: | ||
144 | break; | ||
145 | case 1: | ||
146 | rc5 |= 1; | ||
147 | break; | ||
148 | case 3: | ||
149 | /* dprintk(1, "ir-common: ir_rc5_decode(%x) bad code\n", org_code);*/ | ||
150 | sms_log("bad code"); | ||
151 | return 0; | ||
152 | } | ||
153 | } | ||
154 | /* | ||
155 | dprintk(1, "ir-common: code=%x, rc5=%x, start=%x, | ||
156 | toggle=%x, address=%x, " | ||
157 | "instr=%x\n", rc5, org_code, RC5_START(rc5), | ||
158 | RC5_TOGGLE(rc5), RC5_ADDR(rc5), RC5_INSTR(rc5)); | ||
159 | */ | ||
160 | return rc5; | ||
161 | } | ||
162 | |||
163 | static void sms_rc5_parse_word(struct smscore_device_t *coredev) | ||
164 | { | ||
165 | #define RC5_START(x) (((x)>>12)&3) | ||
166 | #define RC5_TOGGLE(x) (((x)>>11)&1) | ||
167 | #define RC5_ADDR(x) (((x)>>6)&0x1F) | ||
168 | #define RC5_INSTR(x) ((x)&0x3F) | ||
169 | |||
170 | int i, j; | ||
171 | u32 rc5_word = 0; | ||
172 | |||
173 | /* Reverse the IR word direction */ | ||
174 | for (i = 0 ; i < 28 ; i++) | ||
175 | RC5_PUSH_BIT(rc5_word, (ir_word>>i)&1, j) | ||
176 | |||
177 | rc5_word = ir_rc5_decode(rc5_word); | ||
178 | /* sms_log("temp = 0x%x, rc5_code = 0x%x", ir_word, rc5_word); */ | ||
179 | |||
180 | sms_ir_rc5_event(coredev, | ||
181 | RC5_TOGGLE(rc5_word), | ||
182 | RC5_ADDR(rc5_word), | ||
183 | RC5_INSTR(rc5_word)); | ||
184 | } | ||
185 | |||
186 | |||
187 | static void sms_rc5_accumulate_bits(struct smscore_device_t *coredev, | ||
188 | s32 ir_sample) | ||
189 | { | ||
190 | #define RC5_TIME_GRANULARITY 200 | ||
191 | #define RC5_DEF_BIT_TIME 889 | ||
192 | #define RC5_MAX_SAME_BIT_CONT 4 | ||
193 | #define RC5_WORD_LEN 27 /* 28 bit */ | ||
194 | |||
195 | u32 i, j; | ||
196 | s32 delta_time; | ||
197 | u32 time = (ir_sample > 0) ? ir_sample : (0-ir_sample); | ||
198 | u32 level = (ir_sample < 0) ? 0 : 1; | ||
199 | |||
200 | for (i = RC5_MAX_SAME_BIT_CONT; i > 0; i--) { | ||
201 | delta_time = time - (i*RC5_DEF_BIT_TIME) + RC5_TIME_GRANULARITY; | ||
202 | if (delta_time < 0) | ||
203 | continue; /* not so many consecutive bits */ | ||
204 | if (delta_time > (2 * RC5_TIME_GRANULARITY)) { | ||
205 | /* timeout */ | ||
206 | if (ir_pos == (RC5_WORD_LEN-1)) | ||
207 | /* complete last bit */ | ||
208 | RC5_PUSH_BIT(ir_word, level, ir_pos) | ||
209 | |||
210 | if (ir_pos == RC5_WORD_LEN) | ||
211 | sms_rc5_parse_word(coredev); | ||
212 | else if (ir_pos) /* timeout within a word */ | ||
213 | sms_log("IR error parsing a word"); | ||
214 | |||
215 | ir_pos = 0; | ||
216 | ir_word = 0; | ||
217 | /* sms_log("timeout %d", time); */ | ||
218 | break; | ||
219 | } | ||
220 | /* The time is within the range of this number of bits */ | ||
221 | for (j = 0 ; j < i ; j++) | ||
222 | RC5_PUSH_BIT(ir_word, level, ir_pos) | ||
223 | |||
224 | break; | ||
225 | } | ||
226 | } | ||
227 | |||
228 | void sms_ir_event(struct smscore_device_t *coredev, const char *buf, int len) | ||
229 | { | ||
230 | #define IR_DATA_RECEIVE_MAX_LEN 520 /* 128*4 + 4 + 4 */ | ||
231 | u32 i; | ||
232 | enum ir_protocol ir_protocol = | ||
233 | keyboard_layout_maps[coredev->ir.ir_kb_type] | ||
234 | .ir_protocol; | ||
235 | s32 *samples; | ||
236 | int count = len>>2; | ||
237 | |||
238 | samples = (s32 *)buf; | ||
239 | /* sms_log("IR buffer received, length = %d", count);*/ | ||
240 | |||
241 | for (i = 0; i < count; i++) | ||
242 | if (ir_protocol == IR_RC5) | ||
243 | sms_rc5_accumulate_bits(coredev, samples[i]); | ||
244 | /* IR_RCMM not implemented */ | ||
245 | } | ||
246 | |||
247 | int sms_ir_init(struct smscore_device_t *coredev) | ||
248 | { | ||
249 | struct input_dev *input_dev; | ||
250 | |||
251 | sms_log("Allocating input device"); | ||
252 | input_dev = input_allocate_device(); | ||
253 | if (!input_dev) { | ||
254 | sms_err("Not enough memory"); | ||
255 | return -ENOMEM; | ||
256 | } | ||
257 | |||
258 | coredev->ir.input_dev = input_dev; | ||
259 | coredev->ir.ir_kb_type = | ||
260 | sms_get_board(smscore_get_board_id(coredev))->ir_kb_type; | ||
261 | coredev->ir.keyboard_layout_map = | ||
262 | keyboard_layout_maps[coredev->ir.ir_kb_type]. | ||
263 | keyboard_layout_map; | ||
264 | sms_log("IR remote keyboard type is %d", coredev->ir.ir_kb_type); | ||
265 | |||
266 | coredev->ir.controller = 0; /* Todo: vega/nova SPI number */ | ||
267 | coredev->ir.timeout = IR_DEFAULT_TIMEOUT; | ||
268 | sms_log("IR port %d, timeout %d ms", | ||
269 | coredev->ir.controller, coredev->ir.timeout); | ||
270 | |||
271 | snprintf(coredev->ir.name, | ||
272 | IR_DEV_NAME_MAX_LEN, | ||
273 | "SMS IR w/kbd type %d", | ||
274 | coredev->ir.ir_kb_type); | ||
275 | input_dev->name = coredev->ir.name; | ||
276 | input_dev->phys = coredev->ir.name; | ||
277 | input_dev->dev.parent = coredev->device; | ||
278 | |||
279 | /* Key press events only */ | ||
280 | input_dev->evbit[0] = BIT_MASK(EV_KEY); | ||
281 | input_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); | ||
282 | |||
283 | sms_log("Input device (IR) %s is set for key events", input_dev->name); | ||
284 | |||
285 | if (input_register_device(input_dev)) { | ||
286 | sms_err("Failed to register device"); | ||
287 | input_free_device(input_dev); | ||
288 | return -EACCES; | ||
289 | } | ||
290 | |||
291 | return 0; | ||
292 | } | ||
293 | |||
294 | void sms_ir_exit(struct smscore_device_t *coredev) | ||
295 | { | ||
296 | if (coredev->ir.input_dev) | ||
297 | input_unregister_device(coredev->ir.input_dev); | ||
298 | |||
299 | sms_log(""); | ||
300 | } | ||
301 | |||
diff --git a/drivers/media/dvb/siano/smsir.h b/drivers/media/dvb/siano/smsir.h new file mode 100644 index 000000000000..b7d703e2d338 --- /dev/null +++ b/drivers/media/dvb/siano/smsir.h | |||
@@ -0,0 +1,93 @@ | |||
1 | /**************************************************************** | ||
2 | |||
3 | Siano Mobile Silicon, Inc. | ||
4 | MDTV receiver kernel modules. | ||
5 | Copyright (C) 2006-2009, Uri Shkolnik | ||
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, see <http://www.gnu.org/licenses/>. | ||
19 | |||
20 | ****************************************************************/ | ||
21 | |||
22 | #ifndef __SMS_IR_H__ | ||
23 | #define __SMS_IR_H__ | ||
24 | |||
25 | #include <linux/input.h> | ||
26 | |||
27 | #define IR_DEV_NAME_MAX_LEN 23 /* "SMS IR kbd type nn\0" */ | ||
28 | #define IR_KEYBOARD_LAYOUT_SIZE 64 | ||
29 | #define IR_DEFAULT_TIMEOUT 100 | ||
30 | |||
31 | enum ir_kb_type { | ||
32 | SMS_IR_KB_DEFAULT_TV, | ||
33 | SMS_IR_KB_HCW_SILVER | ||
34 | }; | ||
35 | |||
36 | enum rc5_keyboard_address { | ||
37 | KEYBOARD_ADDRESS_TV1 = 0, | ||
38 | KEYBOARD_ADDRESS_TV2 = 1, | ||
39 | KEYBOARD_ADDRESS_TELETEXT = 2, | ||
40 | KEYBOARD_ADDRESS_VIDEO = 3, | ||
41 | KEYBOARD_ADDRESS_LV1 = 4, | ||
42 | KEYBOARD_ADDRESS_VCR1 = 5, | ||
43 | KEYBOARD_ADDRESS_VCR2 = 6, | ||
44 | KEYBOARD_ADDRESS_EXPERIMENTAL = 7, | ||
45 | KEYBOARD_ADDRESS_SAT1 = 8, | ||
46 | KEYBOARD_ADDRESS_CAMERA = 9, | ||
47 | KEYBOARD_ADDRESS_SAT2 = 10, | ||
48 | KEYBOARD_ADDRESS_CDV = 12, | ||
49 | KEYBOARD_ADDRESS_CAMCORDER = 13, | ||
50 | KEYBOARD_ADDRESS_PRE_AMP = 16, | ||
51 | KEYBOARD_ADDRESS_TUNER = 17, | ||
52 | KEYBOARD_ADDRESS_RECORDER1 = 18, | ||
53 | KEYBOARD_ADDRESS_PRE_AMP1 = 19, | ||
54 | KEYBOARD_ADDRESS_CD_PLAYER = 20, | ||
55 | KEYBOARD_ADDRESS_PHONO = 21, | ||
56 | KEYBOARD_ADDRESS_SATA = 22, | ||
57 | KEYBOARD_ADDRESS_RECORDER2 = 23, | ||
58 | KEYBOARD_ADDRESS_CDR = 26, | ||
59 | KEYBOARD_ADDRESS_LIGHTING = 29, | ||
60 | KEYBOARD_ADDRESS_LIGHTING1 = 30, /* KEYBOARD_ADDRESS_HCW_SILVER */ | ||
61 | KEYBOARD_ADDRESS_PHONE = 31, | ||
62 | KEYBOARD_ADDRESS_NOT_RC5 = 0xFFFF | ||
63 | }; | ||
64 | |||
65 | enum ir_protocol { | ||
66 | IR_RC5, | ||
67 | IR_RCMM | ||
68 | }; | ||
69 | |||
70 | struct keyboard_layout_map_t { | ||
71 | enum ir_protocol ir_protocol; | ||
72 | enum rc5_keyboard_address rc5_kbd_address; | ||
73 | u16 keyboard_layout_map[IR_KEYBOARD_LAYOUT_SIZE]; | ||
74 | }; | ||
75 | |||
76 | struct smscore_device_t; | ||
77 | |||
78 | struct ir_t { | ||
79 | struct input_dev *input_dev; | ||
80 | enum ir_kb_type ir_kb_type; | ||
81 | char name[IR_DEV_NAME_MAX_LEN+1]; | ||
82 | u16 *keyboard_layout_map; | ||
83 | u32 timeout; | ||
84 | u32 controller; | ||
85 | }; | ||
86 | |||
87 | int sms_ir_init(struct smscore_device_t *coredev); | ||
88 | void sms_ir_exit(struct smscore_device_t *coredev); | ||
89 | void sms_ir_event(struct smscore_device_t *coredev, | ||
90 | const char *buf, int len); | ||
91 | |||
92 | #endif /* __SMS_IR_H__ */ | ||
93 | |||
diff --git a/drivers/media/dvb/siano/smssdio.c b/drivers/media/dvb/siano/smssdio.c new file mode 100644 index 000000000000..dfaa49a53f32 --- /dev/null +++ b/drivers/media/dvb/siano/smssdio.c | |||
@@ -0,0 +1,357 @@ | |||
1 | /* | ||
2 | * smssdio.c - Siano 1xxx SDIO interface driver | ||
3 | * | ||
4 | * Copyright 2008 Pierre Ossman | ||
5 | * | ||
6 | * Based on code by Siano Mobile Silicon, Inc., | ||
7 | * Copyright (C) 2006-2008, Uri Shkolnik | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or (at | ||
12 | * your option) any later version. | ||
13 | * | ||
14 | * | ||
15 | * This hardware is a bit odd in that all transfers should be done | ||
16 | * to/from the SMSSDIO_DATA register, yet the "increase address" bit | ||
17 | * always needs to be set. | ||
18 | * | ||
19 | * Also, buffers from the card are always aligned to 128 byte | ||
20 | * boundaries. | ||
21 | */ | ||
22 | |||
23 | /* | ||
24 | * General cleanup notes: | ||
25 | * | ||
26 | * - only typedefs should be name *_t | ||
27 | * | ||
28 | * - use ERR_PTR and friends for smscore_register_device() | ||
29 | * | ||
30 | * - smscore_getbuffer should zero fields | ||
31 | * | ||
32 | * Fix stop command | ||
33 | */ | ||
34 | |||
35 | #include <linux/moduleparam.h> | ||
36 | #include <linux/firmware.h> | ||
37 | #include <linux/delay.h> | ||
38 | #include <linux/mmc/card.h> | ||
39 | #include <linux/mmc/sdio_func.h> | ||
40 | #include <linux/mmc/sdio_ids.h> | ||
41 | |||
42 | #include "smscoreapi.h" | ||
43 | #include "sms-cards.h" | ||
44 | |||
45 | /* Registers */ | ||
46 | |||
47 | #define SMSSDIO_DATA 0x00 | ||
48 | #define SMSSDIO_INT 0x04 | ||
49 | |||
50 | static const struct sdio_device_id smssdio_ids[] = { | ||
51 | {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_STELLAR), | ||
52 | .driver_data = SMS1XXX_BOARD_SIANO_STELLAR}, | ||
53 | {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_NOVA_A0), | ||
54 | .driver_data = SMS1XXX_BOARD_SIANO_NOVA_A}, | ||
55 | {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_NOVA_B0), | ||
56 | .driver_data = SMS1XXX_BOARD_SIANO_NOVA_B}, | ||
57 | {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_VEGA_A0), | ||
58 | .driver_data = SMS1XXX_BOARD_SIANO_VEGA}, | ||
59 | {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_VENICE), | ||
60 | .driver_data = SMS1XXX_BOARD_SIANO_VEGA}, | ||
61 | { /* end: all zeroes */ }, | ||
62 | }; | ||
63 | |||
64 | MODULE_DEVICE_TABLE(sdio, smssdio_ids); | ||
65 | |||
66 | struct smssdio_device { | ||
67 | struct sdio_func *func; | ||
68 | |||
69 | struct smscore_device_t *coredev; | ||
70 | |||
71 | struct smscore_buffer_t *split_cb; | ||
72 | }; | ||
73 | |||
74 | /*******************************************************************/ | ||
75 | /* Siano core callbacks */ | ||
76 | /*******************************************************************/ | ||
77 | |||
78 | static int smssdio_sendrequest(void *context, void *buffer, size_t size) | ||
79 | { | ||
80 | int ret; | ||
81 | struct smssdio_device *smsdev; | ||
82 | |||
83 | smsdev = context; | ||
84 | |||
85 | sdio_claim_host(smsdev->func); | ||
86 | |||
87 | while (size >= smsdev->func->cur_blksize) { | ||
88 | ret = sdio_write_blocks(smsdev->func, SMSSDIO_DATA, buffer, 1); | ||
89 | if (ret) | ||
90 | goto out; | ||
91 | |||
92 | buffer += smsdev->func->cur_blksize; | ||
93 | size -= smsdev->func->cur_blksize; | ||
94 | } | ||
95 | |||
96 | if (size) { | ||
97 | ret = sdio_write_bytes(smsdev->func, SMSSDIO_DATA, | ||
98 | buffer, size); | ||
99 | } | ||
100 | |||
101 | out: | ||
102 | sdio_release_host(smsdev->func); | ||
103 | |||
104 | return ret; | ||
105 | } | ||
106 | |||
107 | /*******************************************************************/ | ||
108 | /* SDIO callbacks */ | ||
109 | /*******************************************************************/ | ||
110 | |||
111 | static void smssdio_interrupt(struct sdio_func *func) | ||
112 | { | ||
113 | int ret, isr; | ||
114 | |||
115 | struct smssdio_device *smsdev; | ||
116 | struct smscore_buffer_t *cb; | ||
117 | struct SmsMsgHdr_ST *hdr; | ||
118 | size_t size; | ||
119 | |||
120 | smsdev = sdio_get_drvdata(func); | ||
121 | |||
122 | /* | ||
123 | * The interrupt register has no defined meaning. It is just | ||
124 | * a way of turning of the level triggered interrupt. | ||
125 | */ | ||
126 | isr = sdio_readb(func, SMSSDIO_INT, &ret); | ||
127 | if (ret) { | ||
128 | dev_err(&smsdev->func->dev, | ||
129 | "Unable to read interrupt register!\n"); | ||
130 | return; | ||
131 | } | ||
132 | |||
133 | if (smsdev->split_cb == NULL) { | ||
134 | cb = smscore_getbuffer(smsdev->coredev); | ||
135 | if (!cb) { | ||
136 | dev_err(&smsdev->func->dev, | ||
137 | "Unable to allocate data buffer!\n"); | ||
138 | return; | ||
139 | } | ||
140 | |||
141 | ret = sdio_read_blocks(smsdev->func, cb->p, SMSSDIO_DATA, 1); | ||
142 | if (ret) { | ||
143 | dev_err(&smsdev->func->dev, | ||
144 | "Error %d reading initial block!\n", ret); | ||
145 | return; | ||
146 | } | ||
147 | |||
148 | hdr = cb->p; | ||
149 | |||
150 | if (hdr->msgFlags & MSG_HDR_FLAG_SPLIT_MSG) { | ||
151 | smsdev->split_cb = cb; | ||
152 | return; | ||
153 | } | ||
154 | |||
155 | size = hdr->msgLength - smsdev->func->cur_blksize; | ||
156 | } else { | ||
157 | cb = smsdev->split_cb; | ||
158 | hdr = cb->p; | ||
159 | |||
160 | size = hdr->msgLength - sizeof(struct SmsMsgHdr_ST); | ||
161 | |||
162 | smsdev->split_cb = NULL; | ||
163 | } | ||
164 | |||
165 | if (hdr->msgLength > smsdev->func->cur_blksize) { | ||
166 | void *buffer; | ||
167 | |||
168 | size = ALIGN(size, 128); | ||
169 | buffer = cb->p + hdr->msgLength; | ||
170 | |||
171 | BUG_ON(smsdev->func->cur_blksize != 128); | ||
172 | |||
173 | /* | ||
174 | * First attempt to transfer all of it in one go... | ||
175 | */ | ||
176 | ret = sdio_read_blocks(smsdev->func, buffer, | ||
177 | SMSSDIO_DATA, size / 128); | ||
178 | if (ret && ret != -EINVAL) { | ||
179 | smscore_putbuffer(smsdev->coredev, cb); | ||
180 | dev_err(&smsdev->func->dev, | ||
181 | "Error %d reading data from card!\n", ret); | ||
182 | return; | ||
183 | } | ||
184 | |||
185 | /* | ||
186 | * ..then fall back to one block at a time if that is | ||
187 | * not possible... | ||
188 | * | ||
189 | * (we have to do this manually because of the | ||
190 | * problem with the "increase address" bit) | ||
191 | */ | ||
192 | if (ret == -EINVAL) { | ||
193 | while (size) { | ||
194 | ret = sdio_read_blocks(smsdev->func, | ||
195 | buffer, SMSSDIO_DATA, 1); | ||
196 | if (ret) { | ||
197 | smscore_putbuffer(smsdev->coredev, cb); | ||
198 | dev_err(&smsdev->func->dev, | ||
199 | "Error %d reading " | ||
200 | "data from card!\n", ret); | ||
201 | return; | ||
202 | } | ||
203 | |||
204 | buffer += smsdev->func->cur_blksize; | ||
205 | if (size > smsdev->func->cur_blksize) | ||
206 | size -= smsdev->func->cur_blksize; | ||
207 | else | ||
208 | size = 0; | ||
209 | } | ||
210 | } | ||
211 | } | ||
212 | |||
213 | cb->size = hdr->msgLength; | ||
214 | cb->offset = 0; | ||
215 | |||
216 | smscore_onresponse(smsdev->coredev, cb); | ||
217 | } | ||
218 | |||
219 | static int smssdio_probe(struct sdio_func *func, | ||
220 | const struct sdio_device_id *id) | ||
221 | { | ||
222 | int ret; | ||
223 | |||
224 | int board_id; | ||
225 | struct smssdio_device *smsdev; | ||
226 | struct smsdevice_params_t params; | ||
227 | |||
228 | board_id = id->driver_data; | ||
229 | |||
230 | smsdev = kzalloc(sizeof(struct smssdio_device), GFP_KERNEL); | ||
231 | if (!smsdev) | ||
232 | return -ENOMEM; | ||
233 | |||
234 | smsdev->func = func; | ||
235 | |||
236 | memset(¶ms, 0, sizeof(struct smsdevice_params_t)); | ||
237 | |||
238 | params.device = &func->dev; | ||
239 | params.buffer_size = 0x5000; /* ?? */ | ||
240 | params.num_buffers = 22; /* ?? */ | ||
241 | params.context = smsdev; | ||
242 | |||
243 | snprintf(params.devpath, sizeof(params.devpath), | ||
244 | "sdio\\%s", sdio_func_id(func)); | ||
245 | |||
246 | params.sendrequest_handler = smssdio_sendrequest; | ||
247 | |||
248 | params.device_type = sms_get_board(board_id)->type; | ||
249 | |||
250 | if (params.device_type != SMS_STELLAR) | ||
251 | params.flags |= SMS_DEVICE_FAMILY2; | ||
252 | else { | ||
253 | /* | ||
254 | * FIXME: Stellar needs special handling... | ||
255 | */ | ||
256 | ret = -ENODEV; | ||
257 | goto free; | ||
258 | } | ||
259 | |||
260 | ret = smscore_register_device(¶ms, &smsdev->coredev); | ||
261 | if (ret < 0) | ||
262 | goto free; | ||
263 | |||
264 | smscore_set_board_id(smsdev->coredev, board_id); | ||
265 | |||
266 | sdio_claim_host(func); | ||
267 | |||
268 | ret = sdio_enable_func(func); | ||
269 | if (ret) | ||
270 | goto release; | ||
271 | |||
272 | ret = sdio_set_block_size(func, 128); | ||
273 | if (ret) | ||
274 | goto disable; | ||
275 | |||
276 | ret = sdio_claim_irq(func, smssdio_interrupt); | ||
277 | if (ret) | ||
278 | goto disable; | ||
279 | |||
280 | sdio_set_drvdata(func, smsdev); | ||
281 | |||
282 | sdio_release_host(func); | ||
283 | |||
284 | ret = smscore_start_device(smsdev->coredev); | ||
285 | if (ret < 0) | ||
286 | goto reclaim; | ||
287 | |||
288 | return 0; | ||
289 | |||
290 | reclaim: | ||
291 | sdio_claim_host(func); | ||
292 | sdio_release_irq(func); | ||
293 | disable: | ||
294 | sdio_disable_func(func); | ||
295 | release: | ||
296 | sdio_release_host(func); | ||
297 | smscore_unregister_device(smsdev->coredev); | ||
298 | free: | ||
299 | kfree(smsdev); | ||
300 | |||
301 | return ret; | ||
302 | } | ||
303 | |||
304 | static void smssdio_remove(struct sdio_func *func) | ||
305 | { | ||
306 | struct smssdio_device *smsdev; | ||
307 | |||
308 | smsdev = sdio_get_drvdata(func); | ||
309 | |||
310 | /* FIXME: racy! */ | ||
311 | if (smsdev->split_cb) | ||
312 | smscore_putbuffer(smsdev->coredev, smsdev->split_cb); | ||
313 | |||
314 | smscore_unregister_device(smsdev->coredev); | ||
315 | |||
316 | sdio_claim_host(func); | ||
317 | sdio_release_irq(func); | ||
318 | sdio_disable_func(func); | ||
319 | sdio_release_host(func); | ||
320 | |||
321 | kfree(smsdev); | ||
322 | } | ||
323 | |||
324 | static struct sdio_driver smssdio_driver = { | ||
325 | .name = "smssdio", | ||
326 | .id_table = smssdio_ids, | ||
327 | .probe = smssdio_probe, | ||
328 | .remove = smssdio_remove, | ||
329 | }; | ||
330 | |||
331 | /*******************************************************************/ | ||
332 | /* Module functions */ | ||
333 | /*******************************************************************/ | ||
334 | |||
335 | int smssdio_module_init(void) | ||
336 | { | ||
337 | int ret = 0; | ||
338 | |||
339 | printk(KERN_INFO "smssdio: Siano SMS1xxx SDIO driver\n"); | ||
340 | printk(KERN_INFO "smssdio: Copyright Pierre Ossman\n"); | ||
341 | |||
342 | ret = sdio_register_driver(&smssdio_driver); | ||
343 | |||
344 | return ret; | ||
345 | } | ||
346 | |||
347 | void smssdio_module_exit(void) | ||
348 | { | ||
349 | sdio_unregister_driver(&smssdio_driver); | ||
350 | } | ||
351 | |||
352 | module_init(smssdio_module_init); | ||
353 | module_exit(smssdio_module_exit); | ||
354 | |||
355 | MODULE_DESCRIPTION("Siano SMS1xxx SDIO driver"); | ||
356 | MODULE_AUTHOR("Pierre Ossman"); | ||
357 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c index 71c65f544c07..cb8a358b7310 100644 --- a/drivers/media/dvb/siano/smsusb.c +++ b/drivers/media/dvb/siano/smsusb.c | |||
@@ -1,23 +1,23 @@ | |||
1 | /* | 1 | /**************************************************************** |
2 | * Driver for the Siano SMS1xxx USB dongle | 2 | |
3 | * | 3 | Siano Mobile Silicon, Inc. |
4 | * author: Anatoly Greenblat | 4 | MDTV receiver kernel modules. |
5 | * | 5 | Copyright (C) 2005-2009, Uri Shkolnik, Anatoly Greenblat |
6 | * Copyright (c), 2005-2008 Siano Mobile Silicon, Inc. | 6 | |
7 | * | 7 | This program is free software: you can redistribute it and/or modify |
8 | * 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 | * it under the terms of the GNU General Public License version 2 as | 9 | the Free Software Foundation, either version 2 of the License, or |
10 | * published by the Free Software Foundation; | 10 | (at your option) any later version. |
11 | * | 11 | |
12 | * Software distributed under the License is distributed on an "AS IS" | 12 | This program is distributed in the hope that it will be useful, |
13 | * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * See the GNU General Public License for more details. | 15 | GNU General Public License for more details. |
16 | * | 16 | |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | |
20 | */ | 20 | ****************************************************************/ |
21 | 21 | ||
22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | #include "smscoreapi.h" | 27 | #include "smscoreapi.h" |
28 | #include "sms-cards.h" | 28 | #include "sms-cards.h" |
29 | #include "smsendian.h" | ||
29 | 30 | ||
30 | static int sms_dbg; | 31 | static int sms_dbg; |
31 | module_param_named(debug, sms_dbg, int, 0644); | 32 | module_param_named(debug, sms_dbg, int, 0644); |
@@ -64,15 +65,16 @@ static void smsusb_onresponse(struct urb *urb) | |||
64 | struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context; | 65 | struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context; |
65 | struct smsusb_device_t *dev = surb->dev; | 66 | struct smsusb_device_t *dev = surb->dev; |
66 | 67 | ||
67 | if (urb->status < 0) { | 68 | if (urb->status == -ESHUTDOWN) { |
68 | sms_err("error, urb status %d, %d bytes", | 69 | sms_err("error, urb status %d (-ESHUTDOWN), %d bytes", |
69 | urb->status, urb->actual_length); | 70 | urb->status, urb->actual_length); |
70 | return; | 71 | return; |
71 | } | 72 | } |
72 | 73 | ||
73 | if (urb->actual_length > 0) { | 74 | if ((urb->actual_length > 0) && (urb->status == 0)) { |
74 | struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) surb->cb->p; | 75 | struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *)surb->cb->p; |
75 | 76 | ||
77 | smsendian_handle_message_header(phdr); | ||
76 | if (urb->actual_length >= phdr->msgLength) { | 78 | if (urb->actual_length >= phdr->msgLength) { |
77 | surb->cb->size = phdr->msgLength; | 79 | surb->cb->size = phdr->msgLength; |
78 | 80 | ||
@@ -109,7 +111,10 @@ static void smsusb_onresponse(struct urb *urb) | |||
109 | "msglen %d actual %d", | 111 | "msglen %d actual %d", |
110 | phdr->msgLength, urb->actual_length); | 112 | phdr->msgLength, urb->actual_length); |
111 | } | 113 | } |
112 | } | 114 | } else |
115 | sms_err("error, urb status %d, %d bytes", | ||
116 | urb->status, urb->actual_length); | ||
117 | |||
113 | 118 | ||
114 | exit_and_resubmit: | 119 | exit_and_resubmit: |
115 | smsusb_submit_urb(dev, surb); | 120 | smsusb_submit_urb(dev, surb); |
@@ -176,6 +181,7 @@ static int smsusb_sendrequest(void *context, void *buffer, size_t size) | |||
176 | struct smsusb_device_t *dev = (struct smsusb_device_t *) context; | 181 | struct smsusb_device_t *dev = (struct smsusb_device_t *) context; |
177 | int dummy; | 182 | int dummy; |
178 | 183 | ||
184 | smsendian_handle_message_header((struct SmsMsgHdr_ST *)buffer); | ||
179 | return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2), | 185 | return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2), |
180 | buffer, size, &dummy, 1000); | 186 | buffer, size, &dummy, 1000); |
181 | } | 187 | } |
@@ -333,8 +339,8 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id) | |||
333 | case SMS_VEGA: | 339 | case SMS_VEGA: |
334 | dev->buffer_size = USB2_BUFFER_SIZE; | 340 | dev->buffer_size = USB2_BUFFER_SIZE; |
335 | dev->response_alignment = | 341 | dev->response_alignment = |
336 | dev->udev->ep_in[1]->desc.wMaxPacketSize - | 342 | le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) - |
337 | sizeof(struct SmsMsgHdr_ST); | 343 | sizeof(struct SmsMsgHdr_ST); |
338 | 344 | ||
339 | params.flags |= SMS_DEVICE_FAMILY2; | 345 | params.flags |= SMS_DEVICE_FAMILY2; |
340 | break; | 346 | break; |
@@ -479,7 +485,6 @@ static int smsusb_resume(struct usb_interface *intf) | |||
479 | } | 485 | } |
480 | 486 | ||
481 | struct usb_device_id smsusb_id_table[] = { | 487 | struct usb_device_id smsusb_id_table[] = { |
482 | #ifdef CONFIG_DVB_SIANO_SMS1XXX_SMS_IDS | ||
483 | { USB_DEVICE(0x187f, 0x0010), | 488 | { USB_DEVICE(0x187f, 0x0010), |
484 | .driver_info = SMS1XXX_BOARD_SIANO_STELLAR }, | 489 | .driver_info = SMS1XXX_BOARD_SIANO_STELLAR }, |
485 | { USB_DEVICE(0x187f, 0x0100), | 490 | { USB_DEVICE(0x187f, 0x0100), |
@@ -490,7 +495,6 @@ struct usb_device_id smsusb_id_table[] = { | |||
490 | .driver_info = SMS1XXX_BOARD_SIANO_NOVA_B }, | 495 | .driver_info = SMS1XXX_BOARD_SIANO_NOVA_B }, |
491 | { USB_DEVICE(0x187f, 0x0300), | 496 | { USB_DEVICE(0x187f, 0x0300), |
492 | .driver_info = SMS1XXX_BOARD_SIANO_VEGA }, | 497 | .driver_info = SMS1XXX_BOARD_SIANO_VEGA }, |
493 | #endif | ||
494 | { USB_DEVICE(0x2040, 0x1700), | 498 | { USB_DEVICE(0x2040, 0x1700), |
495 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT }, | 499 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT }, |
496 | { USB_DEVICE(0x2040, 0x1800), | 500 | { USB_DEVICE(0x2040, 0x1800), |
@@ -521,8 +525,13 @@ struct usb_device_id smsusb_id_table[] = { | |||
521 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | 525 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, |
522 | { USB_DEVICE(0x2040, 0x5590), | 526 | { USB_DEVICE(0x2040, 0x5590), |
523 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | 527 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, |
524 | { } /* Terminating entry */ | 528 | { USB_DEVICE(0x187f, 0x0202), |
525 | }; | 529 | .driver_info = SMS1XXX_BOARD_SIANO_NICE }, |
530 | { USB_DEVICE(0x187f, 0x0301), | ||
531 | .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, | ||
532 | { } /* Terminating entry */ | ||
533 | }; | ||
534 | |||
526 | MODULE_DEVICE_TABLE(usb, smsusb_id_table); | 535 | MODULE_DEVICE_TABLE(usb, smsusb_id_table); |
527 | 536 | ||
528 | static struct usb_driver smsusb_driver = { | 537 | static struct usb_driver smsusb_driver = { |
@@ -548,14 +557,14 @@ int smsusb_module_init(void) | |||
548 | 557 | ||
549 | void smsusb_module_exit(void) | 558 | void smsusb_module_exit(void) |
550 | { | 559 | { |
551 | sms_debug(""); | ||
552 | /* Regular USB Cleanup */ | 560 | /* Regular USB Cleanup */ |
553 | usb_deregister(&smsusb_driver); | 561 | usb_deregister(&smsusb_driver); |
562 | sms_info("end"); | ||
554 | } | 563 | } |
555 | 564 | ||
556 | module_init(smsusb_module_init); | 565 | module_init(smsusb_module_init); |
557 | module_exit(smsusb_module_exit); | 566 | module_exit(smsusb_module_exit); |
558 | 567 | ||
559 | MODULE_DESCRIPTION("Driver for the Siano SMS1XXX USB dongle"); | 568 | MODULE_DESCRIPTION("Driver for the Siano SMS1xxx USB dongle"); |
560 | MODULE_AUTHOR("Siano Mobile Silicon, INC. (uris@siano-ms.com)"); | 569 | MODULE_AUTHOR("Siano Mobile Silicon, INC. (uris@siano-ms.com)"); |
561 | MODULE_LICENSE("GPL"); | 570 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb/ttpci/av7110_av.c b/drivers/media/dvb/ttpci/av7110_av.c index e4d0900d5121..53884814161c 100644 --- a/drivers/media/dvb/ttpci/av7110_av.c +++ b/drivers/media/dvb/ttpci/av7110_av.c | |||
@@ -89,6 +89,7 @@ | |||
89 | 89 | ||
90 | static void p_to_t(u8 const *buf, long int length, u16 pid, | 90 | static void p_to_t(u8 const *buf, long int length, u16 pid, |
91 | u8 *counter, struct dvb_demux_feed *feed); | 91 | u8 *counter, struct dvb_demux_feed *feed); |
92 | static int write_ts_to_decoder(struct av7110 *av7110, int type, const u8 *buf, size_t len); | ||
92 | 93 | ||
93 | 94 | ||
94 | int av7110_record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len) | 95 | int av7110_record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len) |
@@ -192,8 +193,6 @@ int av7110_av_start_play(struct av7110 *av7110, int av) | |||
192 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); | 193 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); |
193 | break; | 194 | break; |
194 | } | 195 | } |
195 | if (!ret) | ||
196 | ret = av7110->playing; | ||
197 | return ret; | 196 | return ret; |
198 | } | 197 | } |
199 | 198 | ||
@@ -437,6 +436,45 @@ static void play_audio_cb(u8 *buf, int count, void *priv) | |||
437 | aux_ring_buffer_write(&av7110->aout, buf, count); | 436 | aux_ring_buffer_write(&av7110->aout, buf, count); |
438 | } | 437 | } |
439 | 438 | ||
439 | |||
440 | #define FREE_COND_TS (dvb_ringbuffer_free(rb) >= 4096) | ||
441 | |||
442 | static ssize_t ts_play(struct av7110 *av7110, const char __user *buf, | ||
443 | unsigned long count, int nonblock, int type) | ||
444 | { | ||
445 | struct dvb_ringbuffer *rb; | ||
446 | u8 *kb; | ||
447 | unsigned long todo = count; | ||
448 | |||
449 | dprintk(2, "%s: type %d cnt %lu\n", __func__, type, count); | ||
450 | |||
451 | rb = (type) ? &av7110->avout : &av7110->aout; | ||
452 | kb = av7110->kbuf[type]; | ||
453 | |||
454 | if (!kb) | ||
455 | return -ENOBUFS; | ||
456 | |||
457 | if (nonblock && !FREE_COND_TS) | ||
458 | return -EWOULDBLOCK; | ||
459 | |||
460 | while (todo >= TS_SIZE) { | ||
461 | if (!FREE_COND_TS) { | ||
462 | if (nonblock) | ||
463 | return count - todo; | ||
464 | if (wait_event_interruptible(rb->queue, FREE_COND_TS)) | ||
465 | return count - todo; | ||
466 | } | ||
467 | if (copy_from_user(kb, buf, TS_SIZE)) | ||
468 | return -EFAULT; | ||
469 | write_ts_to_decoder(av7110, type, kb, TS_SIZE); | ||
470 | todo -= TS_SIZE; | ||
471 | buf += TS_SIZE; | ||
472 | } | ||
473 | |||
474 | return count - todo; | ||
475 | } | ||
476 | |||
477 | |||
440 | #define FREE_COND (dvb_ringbuffer_free(&av7110->avout) >= 20 * 1024 && \ | 478 | #define FREE_COND (dvb_ringbuffer_free(&av7110->avout) >= 20 * 1024 && \ |
441 | dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024) | 479 | dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024) |
442 | 480 | ||
@@ -780,11 +818,37 @@ static void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, | |||
780 | } | 818 | } |
781 | 819 | ||
782 | 820 | ||
821 | static int write_ts_to_decoder(struct av7110 *av7110, int type, const u8 *buf, size_t len) | ||
822 | { | ||
823 | struct ipack *ipack = &av7110->ipack[type]; | ||
824 | |||
825 | if (buf[1] & TRANS_ERROR) { | ||
826 | av7110_ipack_reset(ipack); | ||
827 | return -1; | ||
828 | } | ||
829 | |||
830 | if (!(buf[3] & PAYLOAD)) | ||
831 | return -1; | ||
832 | |||
833 | if (buf[1] & PAY_START) | ||
834 | av7110_ipack_flush(ipack); | ||
835 | |||
836 | if (buf[3] & ADAPT_FIELD) { | ||
837 | len -= buf[4] + 1; | ||
838 | buf += buf[4] + 1; | ||
839 | if (!len) | ||
840 | return 0; | ||
841 | } | ||
842 | |||
843 | av7110_ipack_instant_repack(buf + 4, len - 4, ipack); | ||
844 | return 0; | ||
845 | } | ||
846 | |||
847 | |||
783 | int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len) | 848 | int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len) |
784 | { | 849 | { |
785 | struct dvb_demux *demux = feed->demux; | 850 | struct dvb_demux *demux = feed->demux; |
786 | struct av7110 *av7110 = (struct av7110 *) demux->priv; | 851 | struct av7110 *av7110 = (struct av7110 *) demux->priv; |
787 | struct ipack *ipack = &av7110->ipack[feed->pes_type]; | ||
788 | 852 | ||
789 | dprintk(2, "av7110:%p, \n", av7110); | 853 | dprintk(2, "av7110:%p, \n", av7110); |
790 | 854 | ||
@@ -804,20 +868,7 @@ int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t l | |||
804 | return -1; | 868 | return -1; |
805 | } | 869 | } |
806 | 870 | ||
807 | if (!(buf[3] & 0x10)) /* no payload? */ | 871 | return write_ts_to_decoder(av7110, feed->pes_type, buf, len); |
808 | return -1; | ||
809 | if (buf[1] & 0x40) | ||
810 | av7110_ipack_flush(ipack); | ||
811 | |||
812 | if (buf[3] & 0x20) { /* adaptation field? */ | ||
813 | len -= buf[4] + 1; | ||
814 | buf += buf[4] + 1; | ||
815 | if (!len) | ||
816 | return 0; | ||
817 | } | ||
818 | |||
819 | av7110_ipack_instant_repack(buf + 4, len - 4, &av7110->ipack[feed->pes_type]); | ||
820 | return 0; | ||
821 | } | 872 | } |
822 | 873 | ||
823 | 874 | ||
@@ -916,6 +967,7 @@ static ssize_t dvb_video_write(struct file *file, const char __user *buf, | |||
916 | { | 967 | { |
917 | struct dvb_device *dvbdev = file->private_data; | 968 | struct dvb_device *dvbdev = file->private_data; |
918 | struct av7110 *av7110 = dvbdev->priv; | 969 | struct av7110 *av7110 = dvbdev->priv; |
970 | unsigned char c; | ||
919 | 971 | ||
920 | dprintk(2, "av7110:%p, \n", av7110); | 972 | dprintk(2, "av7110:%p, \n", av7110); |
921 | 973 | ||
@@ -925,7 +977,12 @@ static ssize_t dvb_video_write(struct file *file, const char __user *buf, | |||
925 | if (av7110->videostate.stream_source != VIDEO_SOURCE_MEMORY) | 977 | if (av7110->videostate.stream_source != VIDEO_SOURCE_MEMORY) |
926 | return -EPERM; | 978 | return -EPERM; |
927 | 979 | ||
928 | return dvb_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 1); | 980 | if (get_user(c, buf)) |
981 | return -EFAULT; | ||
982 | if (c == 0x47 && count % TS_SIZE == 0) | ||
983 | return ts_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 1); | ||
984 | else | ||
985 | return dvb_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 1); | ||
929 | } | 986 | } |
930 | 987 | ||
931 | static unsigned int dvb_audio_poll(struct file *file, poll_table *wait) | 988 | static unsigned int dvb_audio_poll(struct file *file, poll_table *wait) |
@@ -952,6 +1009,7 @@ static ssize_t dvb_audio_write(struct file *file, const char __user *buf, | |||
952 | { | 1009 | { |
953 | struct dvb_device *dvbdev = file->private_data; | 1010 | struct dvb_device *dvbdev = file->private_data; |
954 | struct av7110 *av7110 = dvbdev->priv; | 1011 | struct av7110 *av7110 = dvbdev->priv; |
1012 | unsigned char c; | ||
955 | 1013 | ||
956 | dprintk(2, "av7110:%p, \n", av7110); | 1014 | dprintk(2, "av7110:%p, \n", av7110); |
957 | 1015 | ||
@@ -959,7 +1017,13 @@ static ssize_t dvb_audio_write(struct file *file, const char __user *buf, | |||
959 | printk(KERN_ERR "not audio source memory\n"); | 1017 | printk(KERN_ERR "not audio source memory\n"); |
960 | return -EPERM; | 1018 | return -EPERM; |
961 | } | 1019 | } |
962 | return dvb_aplay(av7110, buf, count, file->f_flags & O_NONBLOCK, 0); | 1020 | |
1021 | if (get_user(c, buf)) | ||
1022 | return -EFAULT; | ||
1023 | if (c == 0x47 && count % TS_SIZE == 0) | ||
1024 | return ts_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 0); | ||
1025 | else | ||
1026 | return dvb_aplay(av7110, buf, count, file->f_flags & O_NONBLOCK, 0); | ||
963 | } | 1027 | } |
964 | 1028 | ||
965 | static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 }; | 1029 | static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 }; |
@@ -1062,7 +1126,6 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1062 | if (ret) | 1126 | if (ret) |
1063 | break; | 1127 | break; |
1064 | } | 1128 | } |
1065 | |||
1066 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) { | 1129 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) { |
1067 | if (av7110->playing == RP_AV) { | 1130 | if (av7110->playing == RP_AV) { |
1068 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); | 1131 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); |
@@ -1122,20 +1185,16 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1122 | case VIDEO_SET_DISPLAY_FORMAT: | 1185 | case VIDEO_SET_DISPLAY_FORMAT: |
1123 | { | 1186 | { |
1124 | video_displayformat_t format = (video_displayformat_t) arg; | 1187 | video_displayformat_t format = (video_displayformat_t) arg; |
1125 | |||
1126 | switch (format) { | 1188 | switch (format) { |
1127 | case VIDEO_PAN_SCAN: | 1189 | case VIDEO_PAN_SCAN: |
1128 | av7110->display_panscan = VID_PAN_SCAN_PREF; | 1190 | av7110->display_panscan = VID_PAN_SCAN_PREF; |
1129 | break; | 1191 | break; |
1130 | |||
1131 | case VIDEO_LETTER_BOX: | 1192 | case VIDEO_LETTER_BOX: |
1132 | av7110->display_panscan = VID_VC_AND_PS_PREF; | 1193 | av7110->display_panscan = VID_VC_AND_PS_PREF; |
1133 | break; | 1194 | break; |
1134 | |||
1135 | case VIDEO_CENTER_CUT_OUT: | 1195 | case VIDEO_CENTER_CUT_OUT: |
1136 | av7110->display_panscan = VID_CENTRE_CUT_PREF; | 1196 | av7110->display_panscan = VID_CENTRE_CUT_PREF; |
1137 | break; | 1197 | break; |
1138 | |||
1139 | default: | 1198 | default: |
1140 | ret = -EINVAL; | 1199 | ret = -EINVAL; |
1141 | } | 1200 | } |
@@ -1183,7 +1242,8 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1183 | 1242 | ||
1184 | case VIDEO_SLOWMOTION: | 1243 | case VIDEO_SLOWMOTION: |
1185 | if (av7110->playing&RP_VIDEO) { | 1244 | if (av7110->playing&RP_VIDEO) { |
1186 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); | 1245 | if (av7110->trickmode != TRICK_SLOW) |
1246 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); | ||
1187 | if (!ret) | 1247 | if (!ret) |
1188 | ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); | 1248 | ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); |
1189 | } else { | 1249 | } else { |
@@ -1207,7 +1267,6 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1207 | case VIDEO_CLEAR_BUFFER: | 1267 | case VIDEO_CLEAR_BUFFER: |
1208 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); | 1268 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); |
1209 | av7110_ipack_reset(&av7110->ipack[1]); | 1269 | av7110_ipack_reset(&av7110->ipack[1]); |
1210 | |||
1211 | if (av7110->playing == RP_AV) { | 1270 | if (av7110->playing == RP_AV) { |
1212 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1271 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1213 | __Play, 2, AV_PES, 0); | 1272 | __Play, 2, AV_PES, 0); |
@@ -1228,13 +1287,13 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1228 | break; | 1287 | break; |
1229 | 1288 | ||
1230 | case VIDEO_SET_STREAMTYPE: | 1289 | case VIDEO_SET_STREAMTYPE: |
1231 | |||
1232 | break; | 1290 | break; |
1233 | 1291 | ||
1234 | default: | 1292 | default: |
1235 | ret = -ENOIOCTLCMD; | 1293 | ret = -ENOIOCTLCMD; |
1236 | break; | 1294 | break; |
1237 | } | 1295 | } |
1296 | |||
1238 | return ret; | 1297 | return ret; |
1239 | } | 1298 | } |
1240 | 1299 | ||
@@ -1309,7 +1368,6 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1309 | 1368 | ||
1310 | case AUDIO_CHANNEL_SELECT: | 1369 | case AUDIO_CHANNEL_SELECT: |
1311 | av7110->audiostate.channel_select = (audio_channel_select_t) arg; | 1370 | av7110->audiostate.channel_select = (audio_channel_select_t) arg; |
1312 | |||
1313 | switch(av7110->audiostate.channel_select) { | 1371 | switch(av7110->audiostate.channel_select) { |
1314 | case AUDIO_STEREO: | 1372 | case AUDIO_STEREO: |
1315 | ret = audcom(av7110, AUDIO_CMD_STEREO); | 1373 | ret = audcom(av7110, AUDIO_CMD_STEREO); |
@@ -1320,7 +1378,6 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1320 | msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); | 1378 | msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); |
1321 | } | 1379 | } |
1322 | break; | 1380 | break; |
1323 | |||
1324 | case AUDIO_MONO_LEFT: | 1381 | case AUDIO_MONO_LEFT: |
1325 | ret = audcom(av7110, AUDIO_CMD_MONO_L); | 1382 | ret = audcom(av7110, AUDIO_CMD_MONO_L); |
1326 | if (!ret) { | 1383 | if (!ret) { |
@@ -1330,7 +1387,6 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1330 | msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0200); | 1387 | msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0200); |
1331 | } | 1388 | } |
1332 | break; | 1389 | break; |
1333 | |||
1334 | case AUDIO_MONO_RIGHT: | 1390 | case AUDIO_MONO_RIGHT: |
1335 | ret = audcom(av7110, AUDIO_CMD_MONO_R); | 1391 | ret = audcom(av7110, AUDIO_CMD_MONO_R); |
1336 | if (!ret) { | 1392 | if (!ret) { |
@@ -1340,7 +1396,6 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1340 | msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0210); | 1396 | msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0210); |
1341 | } | 1397 | } |
1342 | break; | 1398 | break; |
1343 | |||
1344 | default: | 1399 | default: |
1345 | ret = -EINVAL; | 1400 | ret = -EINVAL; |
1346 | break; | 1401 | break; |
@@ -1366,21 +1421,24 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1366 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1421 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1367 | __Play, 2, AV_PES, 0); | 1422 | __Play, 2, AV_PES, 0); |
1368 | break; | 1423 | break; |
1369 | case AUDIO_SET_ID: | ||
1370 | 1424 | ||
1425 | case AUDIO_SET_ID: | ||
1371 | break; | 1426 | break; |
1427 | |||
1372 | case AUDIO_SET_MIXER: | 1428 | case AUDIO_SET_MIXER: |
1373 | { | 1429 | { |
1374 | struct audio_mixer *amix = (struct audio_mixer *)parg; | 1430 | struct audio_mixer *amix = (struct audio_mixer *)parg; |
1375 | |||
1376 | ret = av7110_set_volume(av7110, amix->volume_left, amix->volume_right); | 1431 | ret = av7110_set_volume(av7110, amix->volume_left, amix->volume_right); |
1377 | break; | 1432 | break; |
1378 | } | 1433 | } |
1434 | |||
1379 | case AUDIO_SET_STREAMTYPE: | 1435 | case AUDIO_SET_STREAMTYPE: |
1380 | break; | 1436 | break; |
1437 | |||
1381 | default: | 1438 | default: |
1382 | ret = -ENOIOCTLCMD; | 1439 | ret = -ENOIOCTLCMD; |
1383 | } | 1440 | } |
1441 | |||
1384 | return ret; | 1442 | return ret; |
1385 | } | 1443 | } |
1386 | 1444 | ||
diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c index 5e3f88911a1d..e162691b515d 100644 --- a/drivers/media/dvb/ttpci/av7110_hw.c +++ b/drivers/media/dvb/ttpci/av7110_hw.c | |||
@@ -1089,7 +1089,7 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc) | |||
1089 | else { | 1089 | else { |
1090 | int i, len = dc->x0-dc->color+1; | 1090 | int i, len = dc->x0-dc->color+1; |
1091 | u8 __user *colors = (u8 __user *)dc->data; | 1091 | u8 __user *colors = (u8 __user *)dc->data; |
1092 | u8 r, g, b, blend; | 1092 | u8 r, g = 0, b = 0, blend = 0; |
1093 | ret = 0; | 1093 | ret = 0; |
1094 | for (i = 0; i<len; i++) { | 1094 | for (i = 0; i<len; i++) { |
1095 | if (get_user(r, colors + i * 4) || | 1095 | if (get_user(r, colors + i * 4) || |
diff --git a/drivers/media/dvb/ttpci/av7110_v4l.c b/drivers/media/dvb/ttpci/av7110_v4l.c index 2210cff738e6..ce64c6214cc4 100644 --- a/drivers/media/dvb/ttpci/av7110_v4l.c +++ b/drivers/media/dvb/ttpci/av7110_v4l.c | |||
@@ -458,7 +458,7 @@ static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i) | |||
458 | dprintk(2, "VIDIOC_ENUMINPUT: %d\n", i->index); | 458 | dprintk(2, "VIDIOC_ENUMINPUT: %d\n", i->index); |
459 | 459 | ||
460 | if (av7110->analog_tuner_flags) { | 460 | if (av7110->analog_tuner_flags) { |
461 | if (i->index < 0 || i->index >= 4) | 461 | if (i->index >= 4) |
462 | return -EINVAL; | 462 | return -EINVAL; |
463 | } else { | 463 | } else { |
464 | if (i->index != 0) | 464 | if (i->index != 0) |
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c index 855fe74b640b..8ea915227674 100644 --- a/drivers/media/dvb/ttpci/budget-av.c +++ b/drivers/media/dvb/ttpci/budget-av.c | |||
@@ -1413,7 +1413,7 @@ static struct v4l2_input knc1_inputs[KNC1_INPUTS] = { | |||
1413 | static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i) | 1413 | static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i) |
1414 | { | 1414 | { |
1415 | dprintk(1, "VIDIOC_ENUMINPUT %d.\n", i->index); | 1415 | dprintk(1, "VIDIOC_ENUMINPUT %d.\n", i->index); |
1416 | if (i->index < 0 || i->index >= KNC1_INPUTS) | 1416 | if (i->index >= KNC1_INPUTS) |
1417 | return -EINVAL; | 1417 | return -EINVAL; |
1418 | memcpy(i, &knc1_inputs[i->index], sizeof(struct v4l2_input)); | 1418 | memcpy(i, &knc1_inputs[i->index], sizeof(struct v4l2_input)); |
1419 | return 0; | 1419 | return 0; |
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index 83e9e7750c8c..e48380c48990 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
@@ -47,6 +47,9 @@ | |||
47 | #include "bsru6.h" | 47 | #include "bsru6.h" |
48 | #include "bsbe1.h" | 48 | #include "bsbe1.h" |
49 | #include "tdhd1.h" | 49 | #include "tdhd1.h" |
50 | #include "stv6110x.h" | ||
51 | #include "stv090x.h" | ||
52 | #include "isl6423.h" | ||
50 | 53 | ||
51 | static int diseqc_method; | 54 | static int diseqc_method; |
52 | module_param(diseqc_method, int, 0444); | 55 | module_param(diseqc_method, int, 0444); |
@@ -425,6 +428,44 @@ static u8 read_pwm(struct budget* budget) | |||
425 | return pwm; | 428 | return pwm; |
426 | } | 429 | } |
427 | 430 | ||
431 | static struct stv090x_config tt1600_stv090x_config = { | ||
432 | .device = STV0903, | ||
433 | .demod_mode = STV090x_SINGLE, | ||
434 | .clk_mode = STV090x_CLK_EXT, | ||
435 | |||
436 | .xtal = 27000000, | ||
437 | .address = 0x68, | ||
438 | .ref_clk = 27000000, | ||
439 | |||
440 | .ts1_mode = STV090x_TSMODE_DVBCI, | ||
441 | .ts2_mode = STV090x_TSMODE_SERIAL_CONTINUOUS, | ||
442 | |||
443 | .repeater_level = STV090x_RPTLEVEL_16, | ||
444 | |||
445 | .tuner_init = NULL, | ||
446 | .tuner_set_mode = NULL, | ||
447 | .tuner_set_frequency = NULL, | ||
448 | .tuner_get_frequency = NULL, | ||
449 | .tuner_set_bandwidth = NULL, | ||
450 | .tuner_get_bandwidth = NULL, | ||
451 | .tuner_set_bbgain = NULL, | ||
452 | .tuner_get_bbgain = NULL, | ||
453 | .tuner_set_refclk = NULL, | ||
454 | .tuner_get_status = NULL, | ||
455 | }; | ||
456 | |||
457 | static struct stv6110x_config tt1600_stv6110x_config = { | ||
458 | .addr = 0x60, | ||
459 | .refclk = 27000000, | ||
460 | }; | ||
461 | |||
462 | static struct isl6423_config tt1600_isl6423_config = { | ||
463 | .current_max = SEC_CURRENT_515m, | ||
464 | .curlim = SEC_CURRENT_LIM_ON, | ||
465 | .mod_extern = 1, | ||
466 | .addr = 0x08, | ||
467 | }; | ||
468 | |||
428 | static void frontend_init(struct budget *budget) | 469 | static void frontend_init(struct budget *budget) |
429 | { | 470 | { |
430 | (void)alps_bsbe1_config; /* avoid warning */ | 471 | (void)alps_bsbe1_config; /* avoid warning */ |
@@ -566,6 +607,48 @@ static void frontend_init(struct budget *budget) | |||
566 | } | 607 | } |
567 | break; | 608 | break; |
568 | } | 609 | } |
610 | |||
611 | case 0x101c: { /* TT S2-1600 */ | ||
612 | struct stv6110x_devctl *ctl; | ||
613 | saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); | ||
614 | msleep(50); | ||
615 | saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); | ||
616 | msleep(250); | ||
617 | |||
618 | budget->dvb_frontend = dvb_attach(stv090x_attach, | ||
619 | &tt1600_stv090x_config, | ||
620 | &budget->i2c_adap, | ||
621 | STV090x_DEMODULATOR_0); | ||
622 | |||
623 | if (budget->dvb_frontend) { | ||
624 | |||
625 | ctl = dvb_attach(stv6110x_attach, | ||
626 | budget->dvb_frontend, | ||
627 | &tt1600_stv6110x_config, | ||
628 | &budget->i2c_adap); | ||
629 | |||
630 | tt1600_stv090x_config.tuner_init = ctl->tuner_init; | ||
631 | tt1600_stv090x_config.tuner_set_mode = ctl->tuner_set_mode; | ||
632 | tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency; | ||
633 | tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency; | ||
634 | tt1600_stv090x_config.tuner_set_bandwidth = ctl->tuner_set_bandwidth; | ||
635 | tt1600_stv090x_config.tuner_get_bandwidth = ctl->tuner_get_bandwidth; | ||
636 | tt1600_stv090x_config.tuner_set_bbgain = ctl->tuner_set_bbgain; | ||
637 | tt1600_stv090x_config.tuner_get_bbgain = ctl->tuner_get_bbgain; | ||
638 | tt1600_stv090x_config.tuner_set_refclk = ctl->tuner_set_refclk; | ||
639 | tt1600_stv090x_config.tuner_get_status = ctl->tuner_get_status; | ||
640 | |||
641 | dvb_attach(isl6423_attach, | ||
642 | budget->dvb_frontend, | ||
643 | &budget->i2c_adap, | ||
644 | &tt1600_isl6423_config); | ||
645 | |||
646 | } else { | ||
647 | dvb_frontend_detach(budget->dvb_frontend); | ||
648 | budget->dvb_frontend = NULL; | ||
649 | } | ||
650 | } | ||
651 | break; | ||
569 | } | 652 | } |
570 | 653 | ||
571 | if (budget->dvb_frontend == NULL) { | 654 | if (budget->dvb_frontend == NULL) { |
@@ -641,6 +724,7 @@ MAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); | |||
641 | MAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); | 724 | MAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); |
642 | MAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); | 725 | MAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); |
643 | MAKE_BUDGET_INFO(ttbs1401, "TT-Budget-S-1401 PCI", BUDGET_TT); | 726 | MAKE_BUDGET_INFO(ttbs1401, "TT-Budget-S-1401 PCI", BUDGET_TT); |
727 | MAKE_BUDGET_INFO(tt1600, "TT-Budget S2-1600 PCI", BUDGET_TT); | ||
644 | MAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemens Activy Budget-S PCI (rev GR/grundig frontend)", BUDGET_FS_ACTIVY); | 728 | MAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemens Activy Budget-S PCI (rev GR/grundig frontend)", BUDGET_FS_ACTIVY); |
645 | MAKE_BUDGET_INFO(fsacs1, "Fujitsu Siemens Activy Budget-S PCI (rev AL/alps frontend)", BUDGET_FS_ACTIVY); | 729 | MAKE_BUDGET_INFO(fsacs1, "Fujitsu Siemens Activy Budget-S PCI (rev AL/alps frontend)", BUDGET_FS_ACTIVY); |
646 | MAKE_BUDGET_INFO(fsact, "Fujitsu Siemens Activy Budget-T PCI (rev GR/Grundig frontend)", BUDGET_FS_ACTIVY); | 730 | MAKE_BUDGET_INFO(fsact, "Fujitsu Siemens Activy Budget-T PCI (rev GR/Grundig frontend)", BUDGET_FS_ACTIVY); |
@@ -653,6 +737,7 @@ static struct pci_device_id pci_tbl[] = { | |||
653 | MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), | 737 | MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), |
654 | MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), | 738 | MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), |
655 | MAKE_EXTENSION_PCI(ttbs1401, 0x13c2, 0x1018), | 739 | MAKE_EXTENSION_PCI(ttbs1401, 0x13c2, 0x1018), |
740 | MAKE_EXTENSION_PCI(tt1600, 0x13c2, 0x101c), | ||
656 | MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), | 741 | MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), |
657 | MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), | 742 | MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), |
658 | MAKE_EXTENSION_PCI(fsact1, 0x1131, 0x5f60), | 743 | MAKE_EXTENSION_PCI(fsact1, 0x1131, 0x5f60), |