aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/cx88')
-rw-r--r--drivers/media/video/cx88/Kconfig2
-rw-r--r--drivers/media/video/cx88/cx88-cards.c19
-rw-r--r--drivers/media/video/cx88/cx88-dvb.c58
-rw-r--r--drivers/media/video/cx88/cx88-input.c47
-rw-r--r--drivers/media/video/cx88/cx88-video.c2
-rw-r--r--drivers/media/video/cx88/cx88.h1
6 files changed, 117 insertions, 12 deletions
diff --git a/drivers/media/video/cx88/Kconfig b/drivers/media/video/cx88/Kconfig
index 49952980dab3..c7e5851d3486 100644
--- a/drivers/media/video/cx88/Kconfig
+++ b/drivers/media/video/cx88/Kconfig
@@ -61,6 +61,8 @@ config VIDEO_CX88_DVB
61 select DVB_STV0299 if !DVB_FE_CUSTOMISE 61 select DVB_STV0299 if !DVB_FE_CUSTOMISE
62 select DVB_STV0288 if !DVB_FE_CUSTOMISE 62 select DVB_STV0288 if !DVB_FE_CUSTOMISE
63 select DVB_STB6000 if !DVB_FE_CUSTOMISE 63 select DVB_STB6000 if !DVB_FE_CUSTOMISE
64 select DVB_STV0900 if !DVB_FE_CUSTOMISE
65 select DVB_STB6100 if !DVB_FE_CUSTOMISE
64 select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMISE 66 select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMISE
65 ---help--- 67 ---help---
66 This adds support for DVB/ATSC cards based on the 68 This adds support for DVB/ATSC cards based on the
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c
index 33be6369871a..d844f2aaa01d 100644
--- a/drivers/media/video/cx88/cx88-cards.c
+++ b/drivers/media/video/cx88/cx88-cards.c
@@ -2075,6 +2075,18 @@ static const struct cx88_board cx88_boards[] = {
2075 }, 2075 },
2076 .mpeg = CX88_MPEG_DVB, 2076 .mpeg = CX88_MPEG_DVB,
2077 }, 2077 },
2078 [CX88_BOARD_PROF_7301] = {
2079 .name = "Prof 7301 DVB-S/S2",
2080 .tuner_type = UNSET,
2081 .radio_type = UNSET,
2082 .tuner_addr = ADDR_UNSET,
2083 .radio_addr = ADDR_UNSET,
2084 .input = { {
2085 .type = CX88_VMUX_DVB,
2086 .vmux = 0,
2087 } },
2088 .mpeg = CX88_MPEG_DVB,
2089 },
2078}; 2090};
2079 2091
2080/* ------------------------------------------------------------------ */ 2092/* ------------------------------------------------------------------ */
@@ -2535,6 +2547,10 @@ static const struct cx88_subid cx88_subids[] = {
2535 .subvendor = 0x107d, 2547 .subvendor = 0x107d,
2536 .subdevice = 0x6618, 2548 .subdevice = 0x6618,
2537 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 2549 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
2550 }, {
2551 .subvendor = 0xb034,
2552 .subdevice = 0x3034,
2553 .card = CX88_BOARD_PROF_7301,
2538 }, 2554 },
2539}; 2555};
2540 2556
@@ -3211,6 +3227,7 @@ static void cx88_card_setup(struct cx88_core *core)
3211 case CX88_BOARD_TBS_8920: 3227 case CX88_BOARD_TBS_8920:
3212 case CX88_BOARD_PROF_6200: 3228 case CX88_BOARD_PROF_6200:
3213 case CX88_BOARD_PROF_7300: 3229 case CX88_BOARD_PROF_7300:
3230 case CX88_BOARD_PROF_7301:
3214 case CX88_BOARD_SATTRADE_ST4200: 3231 case CX88_BOARD_SATTRADE_ST4200:
3215 cx_write(MO_GP0_IO, 0x8000); 3232 cx_write(MO_GP0_IO, 0x8000);
3216 msleep(100); 3233 msleep(100);
@@ -3267,7 +3284,7 @@ static void cx88_card_setup(struct cx88_core *core)
3267 ctl.fname); 3284 ctl.fname);
3268 call_all(core, tuner, s_config, &xc2028_cfg); 3285 call_all(core, tuner, s_config, &xc2028_cfg);
3269 } 3286 }
3270 call_all(core, tuner, s_standby); 3287 call_all(core, core, s_power, 0);
3271} 3288}
3272 3289
3273/* ------------------------------------------------------------------ */ 3290/* ------------------------------------------------------------------ */
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c
index 518bcfe18bcb..b14296923250 100644
--- a/drivers/media/video/cx88/cx88-dvb.c
+++ b/drivers/media/video/cx88/cx88-dvb.c
@@ -53,6 +53,9 @@
53#include "stv0288.h" 53#include "stv0288.h"
54#include "stb6000.h" 54#include "stb6000.h"
55#include "cx24116.h" 55#include "cx24116.h"
56#include "stv0900.h"
57#include "stb6100.h"
58#include "stb6100_proc.h"
56 59
57MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); 60MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
58MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); 61MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
@@ -573,6 +576,15 @@ static int cx24116_set_ts_param(struct dvb_frontend *fe,
573 return 0; 576 return 0;
574} 577}
575 578
579static int stv0900_set_ts_param(struct dvb_frontend *fe,
580 int is_punctured)
581{
582 struct cx8802_dev *dev = fe->dvb->priv;
583 dev->ts_gen_cntrl = 0;
584
585 return 0;
586}
587
576static int cx24116_reset_device(struct dvb_frontend *fe) 588static int cx24116_reset_device(struct dvb_frontend *fe)
577{ 589{
578 struct cx8802_dev *dev = fe->dvb->priv; 590 struct cx8802_dev *dev = fe->dvb->priv;
@@ -601,6 +613,23 @@ static struct cx24116_config tevii_s460_config = {
601 .reset_device = cx24116_reset_device, 613 .reset_device = cx24116_reset_device,
602}; 614};
603 615
616static struct stv0900_config prof_7301_stv0900_config = {
617 .demod_address = 0x6a,
618/* demod_mode = 0,*/
619 .xtal = 27000000,
620 .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
621 .diseqc_mode = 2,/* 2/3 PWM */
622 .tun1_maddress = 0,/* 0x60 */
623 .tun1_adc = 0,/* 2 Vpp */
624 .path1_mode = 3,
625 .set_ts_params = stv0900_set_ts_param,
626};
627
628static struct stb6100_config prof_7301_stb6100_config = {
629 .tuner_address = 0x60,
630 .refclock = 27000000,
631};
632
604static struct stv0299_config tevii_tuner_sharp_config = { 633static struct stv0299_config tevii_tuner_sharp_config = {
605 .demod_address = 0x68, 634 .demod_address = 0x68,
606 .inittab = sharp_z0194a_inittab, 635 .inittab = sharp_z0194a_inittab,
@@ -1149,6 +1178,31 @@ static int dvb_register(struct cx8802_dev *dev)
1149 goto frontend_detach; 1178 goto frontend_detach;
1150 } 1179 }
1151 break; 1180 break;
1181 case CX88_BOARD_PROF_7301:{
1182 struct dvb_tuner_ops *tuner_ops = NULL;
1183
1184 fe0->dvb.frontend = dvb_attach(stv0900_attach,
1185 &prof_7301_stv0900_config,
1186 &core->i2c_adap, 0);
1187 if (fe0->dvb.frontend != NULL) {
1188 if (!dvb_attach(stb6100_attach, fe0->dvb.frontend,
1189 &prof_7301_stb6100_config,
1190 &core->i2c_adap))
1191 goto frontend_detach;
1192
1193 tuner_ops = &fe0->dvb.frontend->ops.tuner_ops;
1194 tuner_ops->set_frequency = stb6100_set_freq;
1195 tuner_ops->get_frequency = stb6100_get_freq;
1196 tuner_ops->set_bandwidth = stb6100_set_bandw;
1197 tuner_ops->get_bandwidth = stb6100_get_bandw;
1198
1199 core->prev_set_voltage =
1200 fe0->dvb.frontend->ops.set_voltage;
1201 fe0->dvb.frontend->ops.set_voltage =
1202 tevii_dvbs_set_voltage;
1203 }
1204 break;
1205 }
1152 default: 1206 default:
1153 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n", 1207 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1154 core->name); 1208 core->name);
@@ -1170,11 +1224,11 @@ static int dvb_register(struct cx8802_dev *dev)
1170 fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl; 1224 fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1171 1225
1172 /* Put the analog decoder in standby to keep it quiet */ 1226 /* Put the analog decoder in standby to keep it quiet */
1173 call_all(core, tuner, s_standby); 1227 call_all(core, core, s_power, 0);
1174 1228
1175 /* register everything */ 1229 /* register everything */
1176 return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev, 1230 return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1177 &dev->pci->dev, adapter_nr, mfe_shared); 1231 &dev->pci->dev, adapter_nr, mfe_shared, NULL);
1178 1232
1179frontend_detach: 1233frontend_detach:
1180 core->gate_ctrl = NULL; 1234 core->gate_ctrl = NULL;
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
index 78b3635178af..92b8cdf9fb81 100644
--- a/drivers/media/video/cx88/cx88-input.c
+++ b/drivers/media/video/cx88/cx88-input.c
@@ -118,13 +118,13 @@ static void cx88_ir_handle_key(struct cx88_IR *ir)
118 118
119 data = (data << 4) | ((gpio_key & 0xf0) >> 4); 119 data = (data << 4) | ((gpio_key & 0xf0) >> 4);
120 120
121 ir_input_keydown(ir->input, &ir->ir, data, data); 121 ir_input_keydown(ir->input, &ir->ir, data);
122 ir_input_nokey(ir->input, &ir->ir); 122 ir_input_nokey(ir->input, &ir->ir);
123 123
124 } else if (ir->mask_keydown) { 124 } else if (ir->mask_keydown) {
125 /* bit set on keydown */ 125 /* bit set on keydown */
126 if (gpio & ir->mask_keydown) { 126 if (gpio & ir->mask_keydown) {
127 ir_input_keydown(ir->input, &ir->ir, data, data); 127 ir_input_keydown(ir->input, &ir->ir, data);
128 } else { 128 } else {
129 ir_input_nokey(ir->input, &ir->ir); 129 ir_input_nokey(ir->input, &ir->ir);
130 } 130 }
@@ -132,14 +132,14 @@ static void cx88_ir_handle_key(struct cx88_IR *ir)
132 } else if (ir->mask_keyup) { 132 } else if (ir->mask_keyup) {
133 /* bit cleared on keydown */ 133 /* bit cleared on keydown */
134 if (0 == (gpio & ir->mask_keyup)) { 134 if (0 == (gpio & ir->mask_keyup)) {
135 ir_input_keydown(ir->input, &ir->ir, data, data); 135 ir_input_keydown(ir->input, &ir->ir, data);
136 } else { 136 } else {
137 ir_input_nokey(ir->input, &ir->ir); 137 ir_input_nokey(ir->input, &ir->ir);
138 } 138 }
139 139
140 } else { 140 } else {
141 /* can't distinguish keydown/up :-/ */ 141 /* can't distinguish keydown/up :-/ */
142 ir_input_keydown(ir->input, &ir->ir, data, data); 142 ir_input_keydown(ir->input, &ir->ir, data);
143 ir_input_nokey(ir->input, &ir->ir); 143 ir_input_nokey(ir->input, &ir->ir);
144 } 144 }
145} 145}
@@ -303,6 +303,23 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
303 ir->mask_keydown = 0x02; 303 ir->mask_keydown = 0x02;
304 ir->polling = 50; /* ms */ 304 ir->polling = 50; /* ms */
305 break; 305 break;
306 case CX88_BOARD_OMICOM_SS4_PCI:
307 case CX88_BOARD_SATTRADE_ST4200:
308 case CX88_BOARD_TBS_8920:
309 case CX88_BOARD_TBS_8910:
310 case CX88_BOARD_PROF_7300:
311 case CX88_BOARD_PROF_7301:
312 case CX88_BOARD_PROF_6200:
313 ir_codes = &ir_codes_tbs_nec_table;
314 ir_type = IR_TYPE_PD;
315 ir->sampling = 0xff00; /* address */
316 break;
317 case CX88_BOARD_TEVII_S460:
318 case CX88_BOARD_TEVII_S420:
319 ir_codes = &ir_codes_tevii_nec_table;
320 ir_type = IR_TYPE_PD;
321 ir->sampling = 0xff00; /* address */
322 break;
306 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: 323 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
307 ir_codes = &ir_codes_dntv_live_dvbt_pro_table; 324 ir_codes = &ir_codes_dntv_live_dvbt_pro_table;
308 ir_type = IR_TYPE_PD; 325 ir_type = IR_TYPE_PD;
@@ -343,7 +360,10 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
343 snprintf(ir->name, sizeof(ir->name), "cx88 IR (%s)", core->board.name); 360 snprintf(ir->name, sizeof(ir->name), "cx88 IR (%s)", core->board.name);
344 snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(pci)); 361 snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(pci));
345 362
346 ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); 363 err = ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
364 if (err < 0)
365 goto err_out_free;
366
347 input_dev->name = ir->name; 367 input_dev->name = ir->name;
348 input_dev->phys = ir->phys; 368 input_dev->phys = ir->phys;
349 input_dev->id.bustype = BUS_PCI; 369 input_dev->id.bustype = BUS_PCI;
@@ -373,6 +393,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
373 cx88_ir_stop(core, ir); 393 cx88_ir_stop(core, ir);
374 core->ir = NULL; 394 core->ir = NULL;
375 err_out_free: 395 err_out_free:
396 ir_input_free(input_dev);
376 input_free_device(input_dev); 397 input_free_device(input_dev);
377 kfree(ir); 398 kfree(ir);
378 return err; 399 return err;
@@ -387,6 +408,7 @@ int cx88_ir_fini(struct cx88_core *core)
387 return 0; 408 return 0;
388 409
389 cx88_ir_stop(core, ir); 410 cx88_ir_stop(core, ir);
411 ir_input_free(ir->input);
390 input_unregister_device(ir->input); 412 input_unregister_device(ir->input);
391 kfree(ir); 413 kfree(ir);
392 414
@@ -432,8 +454,17 @@ void cx88_ir_irq(struct cx88_core *core)
432 454
433 /* decode it */ 455 /* decode it */
434 switch (core->boardnr) { 456 switch (core->boardnr) {
457 case CX88_BOARD_TEVII_S460:
458 case CX88_BOARD_TEVII_S420:
435 case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1: 459 case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
436 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: 460 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
461 case CX88_BOARD_OMICOM_SS4_PCI:
462 case CX88_BOARD_SATTRADE_ST4200:
463 case CX88_BOARD_TBS_8920:
464 case CX88_BOARD_TBS_8910:
465 case CX88_BOARD_PROF_7300:
466 case CX88_BOARD_PROF_7301:
467 case CX88_BOARD_PROF_6200:
437 ircode = ir_decode_pulsedistance(ir->samples, ir->scount, 1, 4); 468 ircode = ir_decode_pulsedistance(ir->samples, ir->scount, 1, 4);
438 469
439 if (ircode == 0xffffffff) { /* decoding error */ 470 if (ircode == 0xffffffff) { /* decoding error */
@@ -461,7 +492,7 @@ void cx88_ir_irq(struct cx88_core *core)
461 492
462 ir_dprintk("Key Code: %x\n", (ircode >> 16) & 0x7f); 493 ir_dprintk("Key Code: %x\n", (ircode >> 16) & 0x7f);
463 494
464 ir_input_keydown(ir->input, &ir->ir, (ircode >> 16) & 0x7f, (ircode >> 16) & 0xff); 495 ir_input_keydown(ir->input, &ir->ir, (ircode >> 16) & 0x7f);
465 ir->release = jiffies + msecs_to_jiffies(120); 496 ir->release = jiffies + msecs_to_jiffies(120);
466 break; 497 break;
467 case CX88_BOARD_HAUPPAUGE: 498 case CX88_BOARD_HAUPPAUGE:
@@ -498,7 +529,7 @@ void cx88_ir_irq(struct cx88_core *core)
498 if ( dev != 0x1e && dev != 0x1f ) 529 if ( dev != 0x1e && dev != 0x1f )
499 /* not a hauppauge remote */ 530 /* not a hauppauge remote */
500 break; 531 break;
501 ir_input_keydown(ir->input, &ir->ir, code, ircode); 532 ir_input_keydown(ir->input, &ir->ir, code);
502 ir->release = jiffies + msecs_to_jiffies(120); 533 ir->release = jiffies + msecs_to_jiffies(120);
503 break; 534 break;
504 case CX88_BOARD_PINNACLE_PCTV_HD_800i: 535 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
@@ -506,7 +537,7 @@ void cx88_ir_irq(struct cx88_core *core)
506 ir_dprintk("biphase decoded: %x\n", ircode); 537 ir_dprintk("biphase decoded: %x\n", ircode);
507 if ((ircode & 0xfffff000) != 0x3000) 538 if ((ircode & 0xfffff000) != 0x3000)
508 break; 539 break;
509 ir_input_keydown(ir->input, &ir->ir, ircode & 0x3f, ircode); 540 ir_input_keydown(ir->input, &ir->ir, ircode & 0x3f);
510 ir->release = jiffies + msecs_to_jiffies(120); 541 ir->release = jiffies + msecs_to_jiffies(120);
511 break; 542 break;
512 } 543 }
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c
index 57e6b1241090..d7e8fcee559c 100644
--- a/drivers/media/video/cx88/cx88-video.c
+++ b/drivers/media/video/cx88/cx88-video.c
@@ -935,7 +935,7 @@ static int video_release(struct file *file)
935 935
936 mutex_lock(&dev->core->lock); 936 mutex_lock(&dev->core->lock);
937 if(atomic_dec_and_test(&dev->core->users)) 937 if(atomic_dec_and_test(&dev->core->users))
938 call_all(dev->core, tuner, s_standby); 938 call_all(dev->core, core, s_power, 0);
939 mutex_unlock(&dev->core->lock); 939 mutex_unlock(&dev->core->lock);
940 940
941 return 0; 941 return 0;
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h
index d5cea41f4207..e1c521710103 100644
--- a/drivers/media/video/cx88/cx88.h
+++ b/drivers/media/video/cx88/cx88.h
@@ -238,6 +238,7 @@ extern struct sram_channel cx88_sram_channels[];
238#define CX88_BOARD_HAUPPAUGE_IRONLY 80 238#define CX88_BOARD_HAUPPAUGE_IRONLY 80
239#define CX88_BOARD_WINFAST_DTV1800H 81 239#define CX88_BOARD_WINFAST_DTV1800H 81
240#define CX88_BOARD_WINFAST_DTV2000H_J 82 240#define CX88_BOARD_WINFAST_DTV2000H_J 82
241#define CX88_BOARD_PROF_7301 83
241 242
242enum cx88_itype { 243enum cx88_itype {
243 CX88_VMUX_COMPOSITE1 = 1, 244 CX88_VMUX_COMPOSITE1 = 1,