diff options
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/dvb/bt8xx/dvb-bt8xx.c | 225 |
1 files changed, 114 insertions, 111 deletions
diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c index 6f857c6091f3..b29b0f558c70 100644 --- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c +++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c | |||
@@ -32,9 +32,7 @@ | |||
32 | #include "dvbdev.h" | 32 | #include "dvbdev.h" |
33 | #include "dvb_demux.h" | 33 | #include "dvb_demux.h" |
34 | #include "dvb_frontend.h" | 34 | #include "dvb_frontend.h" |
35 | |||
36 | #include "dvb-bt8xx.h" | 35 | #include "dvb-bt8xx.h" |
37 | |||
38 | #include "bt878.h" | 36 | #include "bt878.h" |
39 | 37 | ||
40 | static int debug; | 38 | static int debug; |
@@ -43,9 +41,9 @@ module_param(debug, int, 0644); | |||
43 | MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); | 41 | MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); |
44 | 42 | ||
45 | #define dprintk( args... ) \ | 43 | #define dprintk( args... ) \ |
46 | do { \ | 44 | do \ |
47 | if (debug) printk(KERN_DEBUG args); \ | 45 | if (debug) printk(KERN_DEBUG args); \ |
48 | } while (0) | 46 | while (0) |
49 | 47 | ||
50 | static void dvb_bt8xx_task(unsigned long data) | 48 | static void dvb_bt8xx_task(unsigned long data) |
51 | { | 49 | { |
@@ -119,14 +117,12 @@ static struct bt878 __init *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci | |||
119 | unsigned int card_nr; | 117 | unsigned int card_nr; |
120 | 118 | ||
121 | /* Hmm, n squared. Hope n is small */ | 119 | /* Hmm, n squared. Hope n is small */ |
122 | for (card_nr = 0; card_nr < bt878_num; card_nr++) { | 120 | for (card_nr = 0; card_nr < bt878_num; card_nr++) |
123 | if (is_pci_slot_eq(bt878[card_nr].dev, bttv_pci_dev)) | 121 | if (is_pci_slot_eq(bt878[card_nr].dev, bttv_pci_dev)) |
124 | return &bt878[card_nr]; | 122 | return &bt878[card_nr]; |
125 | } | ||
126 | return NULL; | 123 | return NULL; |
127 | } | 124 | } |
128 | 125 | ||
129 | |||
130 | static int thomson_dtt7579_demod_init(struct dvb_frontend* fe) | 126 | static int thomson_dtt7579_demod_init(struct dvb_frontend* fe) |
131 | { | 127 | { |
132 | static u8 mt352_clock_config [] = { 0x89, 0x38, 0x38 }; | 128 | static u8 mt352_clock_config [] = { 0x89, 0x38, 0x38 }; |
@@ -157,13 +153,19 @@ static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_ | |||
157 | #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ | 153 | #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ |
158 | div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; | 154 | div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; |
159 | 155 | ||
160 | if (params->frequency < 542000000) cp = 0xb4; | 156 | if (params->frequency < 542000000) |
161 | else if (params->frequency < 771000000) cp = 0xbc; | 157 | cp = 0xb4; |
162 | else cp = 0xf4; | 158 | else if (params->frequency < 771000000) |
159 | cp = 0xbc; | ||
160 | else | ||
161 | cp = 0xf4; | ||
163 | 162 | ||
164 | if (params->frequency == 0) bs = 0x03; | 163 | if (params->frequency == 0) |
165 | else if (params->frequency < 443250000) bs = 0x02; | 164 | bs = 0x03; |
166 | else bs = 0x08; | 165 | else if (params->frequency < 443250000) |
166 | bs = 0x02; | ||
167 | else | ||
168 | bs = 0x08; | ||
167 | 169 | ||
168 | pllbuf[0] = 0xc0; // Note: non-linux standard PLL i2c address | 170 | pllbuf[0] = 0xc0; // Note: non-linux standard PLL i2c address |
169 | pllbuf[1] = div >> 8; | 171 | pllbuf[1] = div >> 8; |
@@ -175,7 +177,6 @@ static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_ | |||
175 | } | 177 | } |
176 | 178 | ||
177 | static struct mt352_config thomson_dtt7579_config = { | 179 | static struct mt352_config thomson_dtt7579_config = { |
178 | |||
179 | .demod_address = 0x0f, | 180 | .demod_address = 0x0f, |
180 | .demod_init = thomson_dtt7579_demod_init, | 181 | .demod_init = thomson_dtt7579_demod_init, |
181 | .pll_set = thomson_dtt7579_pll_set, | 182 | .pll_set = thomson_dtt7579_pll_set, |
@@ -183,25 +184,26 @@ static struct mt352_config thomson_dtt7579_config = { | |||
183 | 184 | ||
184 | static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 185 | static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) |
185 | { | 186 | { |
186 | u32 freq = params->frequency; | 187 | u32 freq = params->frequency; |
187 | |||
188 | int i, a, n, pump; | ||
189 | u32 band, pll; | ||
190 | 188 | ||
189 | int i, a, n, pump; | ||
190 | u32 band, pll; | ||
191 | 191 | ||
192 | u32 osci[]={950000,1019000,1075000,1178000,1296000,1432000, | 192 | u32 osci[]={950000,1019000,1075000,1178000,1296000,1432000, |
193 | 1576000,1718000,1856000,2036000,2150000}; | 193 | 1576000,1718000,1856000,2036000,2150000}; |
194 | u32 bandsel[]={0,0x00020000,0x00040000,0x00100800,0x00101000, | 194 | u32 bandsel[]={0,0x00020000,0x00040000,0x00100800,0x00101000, |
195 | 0x00102000,0x00104000,0x00108000,0x00110000, | 195 | 0x00102000,0x00104000,0x00108000,0x00110000, |
196 | 0x00120000,0x00140000}; | 196 | 0x00120000,0x00140000}; |
197 | 197 | ||
198 | #define XTAL 1011100 /* Hz, really 1.0111 MHz and a /10 prescaler */ | 198 | #define XTAL 1011100 /* Hz, really 1.0111 MHz and a /10 prescaler */ |
199 | printk("cx24108 debug: entering SetTunerFreq, freq=%d\n",freq); | 199 | printk("cx24108 debug: entering SetTunerFreq, freq=%d\n",freq); |
200 | 200 | ||
201 | /* This is really the bit driving the tuner chip cx24108 */ | 201 | /* This is really the bit driving the tuner chip cx24108 */ |
202 | 202 | ||
203 | if(freq<950000) freq=950000; /* kHz */ | 203 | if (freq<950000) |
204 | if(freq>2150000) freq=2150000; /* satellite IF is 950..2150MHz */ | 204 | freq = 950000; /* kHz */ |
205 | else if (freq>2150000) | ||
206 | freq = 2150000; /* satellite IF is 950..2150MHz */ | ||
205 | 207 | ||
206 | /* decide which VCO to use for the input frequency */ | 208 | /* decide which VCO to use for the input frequency */ |
207 | for(i=1;(i<sizeof(osci)/sizeof(osci[0]))&&(osci[i]<freq);i++); | 209 | for(i=1;(i<sizeof(osci)/sizeof(osci[0]))&&(osci[i]<freq);i++); |
@@ -228,25 +230,22 @@ static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_paramete | |||
228 | cx24110_pll_write(fe,0x500c0000); | 230 | cx24110_pll_write(fe,0x500c0000); |
229 | cx24110_pll_write(fe,0x83f1f800); | 231 | cx24110_pll_write(fe,0x83f1f800); |
230 | cx24110_pll_write(fe,pll); | 232 | cx24110_pll_write(fe,pll); |
231 | /* writereg(client,0x56,0x7f);*/ | 233 | //writereg(client,0x56,0x7f); |
232 | 234 | ||
233 | return 0; | 235 | return 0; |
234 | } | 236 | } |
235 | 237 | ||
236 | static int pinnsat_pll_init(struct dvb_frontend* fe) | 238 | static int pinnsat_pll_init(struct dvb_frontend* fe) |
237 | { | 239 | { |
238 | return 0; | 240 | return 0; |
239 | } | 241 | } |
240 | 242 | ||
241 | |||
242 | static struct cx24110_config pctvsat_config = { | 243 | static struct cx24110_config pctvsat_config = { |
243 | |||
244 | .demod_address = 0x55, | 244 | .demod_address = 0x55, |
245 | .pll_init = pinnsat_pll_init, | 245 | .pll_init = pinnsat_pll_init, |
246 | .pll_set = cx24108_pll_set, | 246 | .pll_set = cx24108_pll_set, |
247 | }; | 247 | }; |
248 | 248 | ||
249 | |||
250 | static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 249 | static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) |
251 | { | 250 | { |
252 | struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; | 251 | struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; |
@@ -258,15 +257,23 @@ static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_front | |||
258 | div = (36000000 + params->frequency + 83333) / 166666; | 257 | div = (36000000 + params->frequency + 83333) / 166666; |
259 | cfg = 0x88; | 258 | cfg = 0x88; |
260 | 259 | ||
261 | if (params->frequency < 175000000) cpump = 2; | 260 | if (params->frequency < 175000000) |
262 | else if (params->frequency < 390000000) cpump = 1; | 261 | cpump = 2; |
263 | else if (params->frequency < 470000000) cpump = 2; | 262 | else if (params->frequency < 390000000) |
264 | else if (params->frequency < 750000000) cpump = 2; | 263 | cpump = 1; |
265 | else cpump = 3; | 264 | else if (params->frequency < 470000000) |
265 | cpump = 2; | ||
266 | else if (params->frequency < 750000000) | ||
267 | cpump = 2; | ||
268 | else | ||
269 | cpump = 3; | ||
266 | 270 | ||
267 | if (params->frequency < 175000000) band_select = 0x0e; | 271 | if (params->frequency < 175000000) |
268 | else if (params->frequency < 470000000) band_select = 0x05; | 272 | band_select = 0x0e; |
269 | else band_select = 0x03; | 273 | else if (params->frequency < 470000000) |
274 | band_select = 0x05; | ||
275 | else | ||
276 | band_select = 0x03; | ||
270 | 277 | ||
271 | data[0] = (div >> 8) & 0x7f; | 278 | data[0] = (div >> 8) & 0x7f; |
272 | data[1] = div & 0xff; | 279 | data[1] = div & 0xff; |
@@ -285,14 +292,11 @@ static int microtune_mt7202dtf_request_firmware(struct dvb_frontend* fe, const s | |||
285 | } | 292 | } |
286 | 293 | ||
287 | static struct sp887x_config microtune_mt7202dtf_config = { | 294 | static struct sp887x_config microtune_mt7202dtf_config = { |
288 | |||
289 | .demod_address = 0x70, | 295 | .demod_address = 0x70, |
290 | .pll_set = microtune_mt7202dtf_pll_set, | 296 | .pll_set = microtune_mt7202dtf_pll_set, |
291 | .request_firmware = microtune_mt7202dtf_request_firmware, | 297 | .request_firmware = microtune_mt7202dtf_request_firmware, |
292 | }; | 298 | }; |
293 | 299 | ||
294 | |||
295 | |||
296 | static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe) | 300 | static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe) |
297 | { | 301 | { |
298 | static u8 mt352_clock_config [] = { 0x89, 0x38, 0x2d }; | 302 | static u8 mt352_clock_config [] = { 0x89, 0x38, 0x2d }; |
@@ -303,7 +307,6 @@ static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe) | |||
303 | static u8 mt352_av771_extra[] = { 0xB5, 0x7A }; | 307 | static u8 mt352_av771_extra[] = { 0xB5, 0x7A }; |
304 | static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 }; | 308 | static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 }; |
305 | 309 | ||
306 | |||
307 | mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config)); | 310 | mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config)); |
308 | udelay(2000); | 311 | udelay(2000); |
309 | mt352_write(fe, mt352_reset, sizeof(mt352_reset)); | 312 | mt352_write(fe, mt352_reset, sizeof(mt352_reset)); |
@@ -326,25 +329,43 @@ static int advbt771_samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct | |||
326 | #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ | 329 | #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ |
327 | div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; | 330 | div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; |
328 | 331 | ||
329 | if (params->frequency < 150000000) cp = 0xB4; | 332 | if (params->frequency < 150000000) |
330 | else if (params->frequency < 173000000) cp = 0xBC; | 333 | cp = 0xB4; |
331 | else if (params->frequency < 250000000) cp = 0xB4; | 334 | else if (params->frequency < 173000000) |
332 | else if (params->frequency < 400000000) cp = 0xBC; | 335 | cp = 0xBC; |
333 | else if (params->frequency < 420000000) cp = 0xF4; | 336 | else if (params->frequency < 250000000) |
334 | else if (params->frequency < 470000000) cp = 0xFC; | 337 | cp = 0xB4; |
335 | else if (params->frequency < 600000000) cp = 0xBC; | 338 | else if (params->frequency < 400000000) |
336 | else if (params->frequency < 730000000) cp = 0xF4; | 339 | cp = 0xBC; |
337 | else cp = 0xFC; | 340 | else if (params->frequency < 420000000) |
338 | 341 | cp = 0xF4; | |
339 | if (params->frequency < 150000000) bs = 0x01; | 342 | else if (params->frequency < 470000000) |
340 | else if (params->frequency < 173000000) bs = 0x01; | 343 | cp = 0xFC; |
341 | else if (params->frequency < 250000000) bs = 0x02; | 344 | else if (params->frequency < 600000000) |
342 | else if (params->frequency < 400000000) bs = 0x02; | 345 | cp = 0xBC; |
343 | else if (params->frequency < 420000000) bs = 0x02; | 346 | else if (params->frequency < 730000000) |
344 | else if (params->frequency < 470000000) bs = 0x02; | 347 | cp = 0xF4; |
345 | else if (params->frequency < 600000000) bs = 0x08; | 348 | else |
346 | else if (params->frequency < 730000000) bs = 0x08; | 349 | cp = 0xFC; |
347 | else bs = 0x08; | 350 | |
351 | if (params->frequency < 150000000) | ||
352 | bs = 0x01; | ||
353 | else if (params->frequency < 173000000) | ||
354 | bs = 0x01; | ||
355 | else if (params->frequency < 250000000) | ||
356 | bs = 0x02; | ||
357 | else if (params->frequency < 400000000) | ||
358 | bs = 0x02; | ||
359 | else if (params->frequency < 420000000) | ||
360 | bs = 0x02; | ||
361 | else if (params->frequency < 470000000) | ||
362 | bs = 0x02; | ||
363 | else if (params->frequency < 600000000) | ||
364 | bs = 0x08; | ||
365 | else if (params->frequency < 730000000) | ||
366 | bs = 0x08; | ||
367 | else | ||
368 | bs = 0x08; | ||
348 | 369 | ||
349 | pllbuf[0] = 0xc2; // Note: non-linux standard PLL i2c address | 370 | pllbuf[0] = 0xc2; // Note: non-linux standard PLL i2c address |
350 | pllbuf[1] = div >> 8; | 371 | pllbuf[1] = div >> 8; |
@@ -356,19 +377,15 @@ static int advbt771_samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct | |||
356 | } | 377 | } |
357 | 378 | ||
358 | static struct mt352_config advbt771_samsung_tdtc9251dh0_config = { | 379 | static struct mt352_config advbt771_samsung_tdtc9251dh0_config = { |
359 | |||
360 | .demod_address = 0x0f, | 380 | .demod_address = 0x0f, |
361 | .demod_init = advbt771_samsung_tdtc9251dh0_demod_init, | 381 | .demod_init = advbt771_samsung_tdtc9251dh0_demod_init, |
362 | .pll_set = advbt771_samsung_tdtc9251dh0_pll_set, | 382 | .pll_set = advbt771_samsung_tdtc9251dh0_pll_set, |
363 | }; | 383 | }; |
364 | 384 | ||
365 | |||
366 | static struct dst_config dst_config = { | 385 | static struct dst_config dst_config = { |
367 | |||
368 | .demod_address = 0x55, | 386 | .demod_address = 0x55, |
369 | }; | 387 | }; |
370 | 388 | ||
371 | |||
372 | static int or51211_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name) | 389 | static int or51211_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name) |
373 | { | 390 | { |
374 | struct dvb_bt8xx_card* bt = (struct dvb_bt8xx_card*) fe->dvb->priv; | 391 | struct dvb_bt8xx_card* bt = (struct dvb_bt8xx_card*) fe->dvb->priv; |
@@ -398,10 +415,9 @@ static void or51211_reset(struct dvb_frontend * fe) | |||
398 | */ | 415 | */ |
399 | /* reset & PRM1,2&4 are outputs */ | 416 | /* reset & PRM1,2&4 are outputs */ |
400 | int ret = bttv_gpio_enable(bt->bttv_nr, 0x001F, 0x001F); | 417 | int ret = bttv_gpio_enable(bt->bttv_nr, 0x001F, 0x001F); |
401 | if (ret != 0) { | 418 | if (ret != 0) |
402 | printk(KERN_WARNING "or51211: Init Error - Can't Reset DVR " | 419 | printk(KERN_WARNING "or51211: Init Error - Can't Reset DVR " |
403 | "(%i)\n", ret); | 420 | "(%i)\n", ret); |
404 | } | ||
405 | bttv_write_gpio(bt->bttv_nr, 0x001F, 0x0000); /* Reset */ | 421 | bttv_write_gpio(bt->bttv_nr, 0x001F, 0x0000); /* Reset */ |
406 | msleep(20); | 422 | msleep(20); |
407 | /* Now set for normal operation */ | 423 | /* Now set for normal operation */ |
@@ -417,7 +433,6 @@ static void or51211_sleep(struct dvb_frontend * fe) | |||
417 | } | 433 | } |
418 | 434 | ||
419 | static struct or51211_config or51211_config = { | 435 | static struct or51211_config or51211_config = { |
420 | |||
421 | .demod_address = 0x15, | 436 | .demod_address = 0x15, |
422 | .request_firmware = or51211_request_firmware, | 437 | .request_firmware = or51211_request_firmware, |
423 | .setmode = or51211_setmode, | 438 | .setmode = or51211_setmode, |
@@ -425,7 +440,6 @@ static struct or51211_config or51211_config = { | |||
425 | .sleep = or51211_sleep, | 440 | .sleep = or51211_sleep, |
426 | }; | 441 | }; |
427 | 442 | ||
428 | |||
429 | static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 443 | static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) |
430 | { | 444 | { |
431 | struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; | 445 | struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; |
@@ -454,13 +468,11 @@ static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_fronten | |||
454 | } | 468 | } |
455 | 469 | ||
456 | static struct nxt6000_config vp3021_alps_tded4_config = { | 470 | static struct nxt6000_config vp3021_alps_tded4_config = { |
457 | |||
458 | .demod_address = 0x0a, | 471 | .demod_address = 0x0a, |
459 | .clock_inversion = 1, | 472 | .clock_inversion = 1, |
460 | .pll_set = vp3021_alps_tded4_pll_set, | 473 | .pll_set = vp3021_alps_tded4_pll_set, |
461 | }; | 474 | }; |
462 | 475 | ||
463 | |||
464 | static void frontend_init(struct dvb_bt8xx_card *card, u32 type) | 476 | static void frontend_init(struct dvb_bt8xx_card *card, u32 type) |
465 | { | 477 | { |
466 | int ret; | 478 | int ret; |
@@ -468,7 +480,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) | |||
468 | 480 | ||
469 | switch(type) { | 481 | switch(type) { |
470 | #ifdef BTTV_DVICO_DVBT_LITE | 482 | #ifdef BTTV_DVICO_DVBT_LITE |
471 | case BTTV_DVICO_DVBT_LITE: | 483 | case BTTV_DVICO_DVBT_LITE: |
472 | card->fe = mt352_attach(&thomson_dtt7579_config, card->i2c_adapter); | 484 | card->fe = mt352_attach(&thomson_dtt7579_config, card->i2c_adapter); |
473 | if (card->fe != NULL) { | 485 | if (card->fe != NULL) { |
474 | card->fe->ops->info.frequency_min = 174000000; | 486 | card->fe->ops->info.frequency_min = 174000000; |
@@ -479,24 +491,22 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) | |||
479 | #endif | 491 | #endif |
480 | 492 | ||
481 | #ifdef BTTV_TWINHAN_VP3021 | 493 | #ifdef BTTV_TWINHAN_VP3021 |
482 | case BTTV_TWINHAN_VP3021: | 494 | case BTTV_TWINHAN_VP3021: |
483 | #else | 495 | #else |
484 | case BTTV_NEBULA_DIGITV: | 496 | case BTTV_NEBULA_DIGITV: |
485 | #endif | 497 | #endif |
486 | card->fe = nxt6000_attach(&vp3021_alps_tded4_config, card->i2c_adapter); | 498 | card->fe = nxt6000_attach(&vp3021_alps_tded4_config, card->i2c_adapter); |
487 | if (card->fe != NULL) { | 499 | if (card->fe != NULL) |
488 | break; | 500 | break; |
489 | } | ||
490 | break; | 501 | break; |
491 | 502 | ||
492 | case BTTV_AVDVBT_761: | 503 | case BTTV_AVDVBT_761: |
493 | card->fe = sp887x_attach(µtune_mt7202dtf_config, card->i2c_adapter); | 504 | card->fe = sp887x_attach(µtune_mt7202dtf_config, card->i2c_adapter); |
494 | if (card->fe != NULL) { | 505 | if (card->fe != NULL) |
495 | break; | 506 | break; |
496 | } | ||
497 | break; | 507 | break; |
498 | 508 | ||
499 | case BTTV_AVDVBT_771: | 509 | case BTTV_AVDVBT_771: |
500 | card->fe = mt352_attach(&advbt771_samsung_tdtc9251dh0_config, card->i2c_adapter); | 510 | card->fe = mt352_attach(&advbt771_samsung_tdtc9251dh0_config, card->i2c_adapter); |
501 | if (card->fe != NULL) { | 511 | if (card->fe != NULL) { |
502 | card->fe->ops->info.frequency_min = 174000000; | 512 | card->fe->ops->info.frequency_min = 174000000; |
@@ -505,7 +515,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) | |||
505 | } | 515 | } |
506 | break; | 516 | break; |
507 | 517 | ||
508 | case BTTV_TWINHAN_DST: | 518 | case BTTV_TWINHAN_DST: |
509 | /* DST is not a frontend driver !!! */ | 519 | /* DST is not a frontend driver !!! */ |
510 | state = (struct dst_state *) kmalloc(sizeof (struct dst_state), GFP_KERNEL); | 520 | state = (struct dst_state *) kmalloc(sizeof (struct dst_state), GFP_KERNEL); |
511 | /* Setup the Card */ | 521 | /* Setup the Card */ |
@@ -522,54 +532,48 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) | |||
522 | 532 | ||
523 | /* Attach other DST peripherals if any */ | 533 | /* Attach other DST peripherals if any */ |
524 | /* Conditional Access device */ | 534 | /* Conditional Access device */ |
525 | if (state->dst_hw_cap & DST_TYPE_HAS_CA) { | 535 | if (state->dst_hw_cap & DST_TYPE_HAS_CA) |
526 | ret = dst_ca_attach(state, &card->dvb_adapter); | 536 | ret = dst_ca_attach(state, &card->dvb_adapter); |
527 | } | 537 | |
528 | if (card->fe != NULL) { | 538 | if (card->fe != NULL) |
529 | break; | 539 | break; |
530 | } | ||
531 | break; | 540 | break; |
532 | 541 | ||
533 | case BTTV_PINNACLESAT: | 542 | case BTTV_PINNACLESAT: |
534 | card->fe = cx24110_attach(&pctvsat_config, card->i2c_adapter); | 543 | card->fe = cx24110_attach(&pctvsat_config, card->i2c_adapter); |
535 | if (card->fe != NULL) { | 544 | if (card->fe != NULL) |
536 | break; | 545 | break; |
537 | } | ||
538 | break; | 546 | break; |
539 | 547 | ||
540 | case BTTV_PC_HDTV: | 548 | case BTTV_PC_HDTV: |
541 | card->fe = or51211_attach(&or51211_config, card->i2c_adapter); | 549 | card->fe = or51211_attach(&or51211_config, card->i2c_adapter); |
542 | if (card->fe != NULL) { | 550 | if (card->fe != NULL) |
543 | break; | 551 | break; |
544 | } | ||
545 | break; | 552 | break; |
546 | } | 553 | } |
547 | 554 | ||
548 | if (card->fe == NULL) { | 555 | if (card->fe == NULL) |
549 | printk("dvb-bt8xx: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n", | 556 | printk("dvb-bt8xx: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n", |
550 | card->bt->dev->vendor, | 557 | card->bt->dev->vendor, |
551 | card->bt->dev->device, | 558 | card->bt->dev->device, |
552 | card->bt->dev->subsystem_vendor, | 559 | card->bt->dev->subsystem_vendor, |
553 | card->bt->dev->subsystem_device); | 560 | card->bt->dev->subsystem_device); |
554 | } else { | 561 | else |
555 | if (dvb_register_frontend(&card->dvb_adapter, card->fe)) { | 562 | if (dvb_register_frontend(&card->dvb_adapter, card->fe)) { |
556 | printk("dvb-bt8xx: Frontend registration failed!\n"); | 563 | printk("dvb-bt8xx: Frontend registration failed!\n"); |
557 | if (card->fe->ops->release) | 564 | if (card->fe->ops->release) |
558 | card->fe->ops->release(card->fe); | 565 | card->fe->ops->release(card->fe); |
559 | card->fe = NULL; | 566 | card->fe = NULL; |
560 | } | 567 | } |
561 | } | ||
562 | } | 568 | } |
563 | 569 | ||
564 | static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type) | 570 | static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type) |
565 | { | 571 | { |
566 | int result; | 572 | int result; |
567 | 573 | ||
568 | if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, | 574 | if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, THIS_MODULE)) < 0) { |
569 | THIS_MODULE)) < 0) { | ||
570 | printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result); | 575 | printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result); |
571 | return result; | 576 | return result; |
572 | |||
573 | } | 577 | } |
574 | card->dvb_adapter.priv = card; | 578 | card->dvb_adapter.priv = card; |
575 | 579 | ||
@@ -664,9 +668,8 @@ static int dvb_bt8xx_probe(struct device *dev) | |||
664 | strncpy(card->card_name, sub->core->name, sizeof(sub->core->name)); | 668 | strncpy(card->card_name, sub->core->name, sizeof(sub->core->name)); |
665 | card->i2c_adapter = &sub->core->i2c_adap; | 669 | card->i2c_adapter = &sub->core->i2c_adap; |
666 | 670 | ||
667 | switch(sub->core->type) | 671 | switch(sub->core->type) { |
668 | { | 672 | case BTTV_PINNACLESAT: |
669 | case BTTV_PINNACLESAT: | ||
670 | card->gpio_mode = 0x0400c060; | 673 | card->gpio_mode = 0x0400c060; |
671 | /* should be: BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR, | 674 | /* should be: BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR, |
672 | BT878_DA_IOM=1,BT878_DA_APP to enable serial highspeed mode. */ | 675 | BT878_DA_IOM=1,BT878_DA_APP to enable serial highspeed mode. */ |
@@ -675,7 +678,7 @@ static int dvb_bt8xx_probe(struct device *dev) | |||
675 | break; | 678 | break; |
676 | 679 | ||
677 | #ifdef BTTV_DVICO_DVBT_LITE | 680 | #ifdef BTTV_DVICO_DVBT_LITE |
678 | case BTTV_DVICO_DVBT_LITE: | 681 | case BTTV_DVICO_DVBT_LITE: |
679 | #endif | 682 | #endif |
680 | card->gpio_mode = 0x0400C060; | 683 | card->gpio_mode = 0x0400C060; |
681 | card->op_sync_orin = 0; | 684 | card->op_sync_orin = 0; |
@@ -686,25 +689,25 @@ static int dvb_bt8xx_probe(struct device *dev) | |||
686 | break; | 689 | break; |
687 | 690 | ||
688 | #ifdef BTTV_TWINHAN_VP3021 | 691 | #ifdef BTTV_TWINHAN_VP3021 |
689 | case BTTV_TWINHAN_VP3021: | 692 | case BTTV_TWINHAN_VP3021: |
690 | #else | 693 | #else |
691 | case BTTV_NEBULA_DIGITV: | 694 | case BTTV_NEBULA_DIGITV: |
692 | #endif | 695 | #endif |
693 | case BTTV_AVDVBT_761: | 696 | case BTTV_AVDVBT_761: |
694 | card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5); | 697 | card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5); |
695 | card->op_sync_orin = 0; | 698 | card->op_sync_orin = 0; |
696 | card->irq_err_ignore = 0; | 699 | card->irq_err_ignore = 0; |
697 | /* A_PWRDN DA_SBR DA_APP (high speed serial) */ | 700 | /* A_PWRDN DA_SBR DA_APP (high speed serial) */ |
698 | break; | 701 | break; |
699 | 702 | ||
700 | case BTTV_AVDVBT_771: //case 0x07711461: | 703 | case BTTV_AVDVBT_771: //case 0x07711461: |
701 | card->gpio_mode = 0x0400402B; | 704 | card->gpio_mode = 0x0400402B; |
702 | card->op_sync_orin = BT878_RISC_SYNC_MASK; | 705 | card->op_sync_orin = BT878_RISC_SYNC_MASK; |
703 | card->irq_err_ignore = 0; | 706 | card->irq_err_ignore = 0; |
704 | /* A_PWRDN DA_SBR DA_APP[0] PKTP=10 RISC_ENABLE FIFO_ENABLE*/ | 707 | /* A_PWRDN DA_SBR DA_APP[0] PKTP=10 RISC_ENABLE FIFO_ENABLE*/ |
705 | break; | 708 | break; |
706 | 709 | ||
707 | case BTTV_TWINHAN_DST: | 710 | case BTTV_TWINHAN_DST: |
708 | card->gpio_mode = 0x2204f2c; | 711 | card->gpio_mode = 0x2204f2c; |
709 | card->op_sync_orin = BT878_RISC_SYNC_MASK; | 712 | card->op_sync_orin = BT878_RISC_SYNC_MASK; |
710 | card->irq_err_ignore = BT878_APABORT | BT878_ARIPERR | | 713 | card->irq_err_ignore = BT878_APABORT | BT878_ARIPERR | |
@@ -722,13 +725,13 @@ static int dvb_bt8xx_probe(struct device *dev) | |||
722 | * RISC+FIFO ENABLE */ | 725 | * RISC+FIFO ENABLE */ |
723 | break; | 726 | break; |
724 | 727 | ||
725 | case BTTV_PC_HDTV: | 728 | case BTTV_PC_HDTV: |
726 | card->gpio_mode = 0x0100EC7B; | 729 | card->gpio_mode = 0x0100EC7B; |
727 | card->op_sync_orin = 0; | 730 | card->op_sync_orin = 0; |
728 | card->irq_err_ignore = 0; | 731 | card->irq_err_ignore = 0; |
729 | break; | 732 | break; |
730 | 733 | ||
731 | default: | 734 | default: |
732 | printk(KERN_WARNING "dvb_bt8xx: Unknown bttv card type: %d.\n", | 735 | printk(KERN_WARNING "dvb_bt8xx: Unknown bttv card type: %d.\n", |
733 | sub->core->type); | 736 | sub->core->type); |
734 | kfree(card); | 737 | kfree(card); |
@@ -751,7 +754,6 @@ static int dvb_bt8xx_probe(struct device *dev) | |||
751 | 754 | ||
752 | kfree(card); | 755 | kfree(card); |
753 | return -EFAULT; | 756 | return -EFAULT; |
754 | |||
755 | } | 757 | } |
756 | 758 | ||
757 | init_MUTEX(&card->bt->gpio_lock); | 759 | init_MUTEX(&card->bt->gpio_lock); |
@@ -779,7 +781,8 @@ static int dvb_bt8xx_remove(struct device *dev) | |||
779 | card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw); | 781 | card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw); |
780 | dvb_dmxdev_release(&card->dmxdev); | 782 | dvb_dmxdev_release(&card->dmxdev); |
781 | dvb_dmx_release(&card->demux); | 783 | dvb_dmx_release(&card->demux); |
782 | if (card->fe) dvb_unregister_frontend(card->fe); | 784 | if (card->fe) |
785 | dvb_unregister_frontend(card->fe); | ||
783 | dvb_unregister_adapter(&card->dvb_adapter); | 786 | dvb_unregister_adapter(&card->dvb_adapter); |
784 | 787 | ||
785 | kfree(card); | 788 | kfree(card); |