aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/em28xx/em28xx-dvb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-dvb.c')
-rw-r--r--drivers/media/video/em28xx/em28xx-dvb.c190
1 files changed, 149 insertions, 41 deletions
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c
index cef7a2d409c..9449423098e 100644
--- a/drivers/media/video/em28xx/em28xx-dvb.c
+++ b/drivers/media/video/em28xx/em28xx-dvb.c
@@ -44,6 +44,7 @@
44#include "drxk.h" 44#include "drxk.h"
45#include "tda10071.h" 45#include "tda10071.h"
46#include "a8293.h" 46#include "a8293.h"
47#include "qt1010.h"
47 48
48MODULE_DESCRIPTION("driver for em28xx based DVB cards"); 49MODULE_DESCRIPTION("driver for em28xx based DVB cards");
49MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); 50MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
@@ -163,12 +164,12 @@ static int em28xx_start_streaming(struct em28xx_dvb *dvb)
163 struct em28xx *dev = dvb->adapter.priv; 164 struct em28xx *dev = dvb->adapter.priv;
164 int max_dvb_packet_size; 165 int max_dvb_packet_size;
165 166
166 usb_set_interface(dev->udev, 0, 1); 167 usb_set_interface(dev->udev, 0, dev->dvb_alt);
167 rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); 168 rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
168 if (rc < 0) 169 if (rc < 0)
169 return rc; 170 return rc;
170 171
171 max_dvb_packet_size = em28xx_isoc_dvb_max_packetsize(dev); 172 max_dvb_packet_size = dev->dvb_max_pkt_size;
172 if (max_dvb_packet_size < 0) 173 if (max_dvb_packet_size < 0)
173 return max_dvb_packet_size; 174 return max_dvb_packet_size;
174 dprintk(1, "Using %d buffers each with %d bytes\n", 175 dprintk(1, "Using %d buffers each with %d bytes\n",
@@ -302,10 +303,12 @@ static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = {
302}; 303};
303 304
304static struct drxd_config em28xx_drxd = { 305static struct drxd_config em28xx_drxd = {
305 .index = 0, .demod_address = 0x70, .demod_revision = 0xa2, 306 .demod_address = 0x70,
306 .demoda_address = 0x00, .pll_address = 0x00, 307 .demod_revision = 0xa2,
307 .pll_type = DRXD_PLL_NONE, .clock = 12000, .insert_rs_byte = 1, 308 .pll_type = DRXD_PLL_NONE,
308 .pll_set = NULL, .osc_deviation = NULL, .IF = 42800000, 309 .clock = 12000,
310 .insert_rs_byte = 1,
311 .IF = 42800000,
309 .disable_i2c_gate_ctrl = 1, 312 .disable_i2c_gate_ctrl = 1,
310}; 313};
311 314
@@ -316,6 +319,14 @@ struct drxk_config terratec_h5_drxk = {
316 .microcode_name = "dvb-usb-terratec-h5-drxk.fw", 319 .microcode_name = "dvb-usb-terratec-h5-drxk.fw",
317}; 320};
318 321
322struct drxk_config hauppauge_930c_drxk = {
323 .adr = 0x29,
324 .single_master = 1,
325 .no_i2c_bridge = 1,
326 .microcode_name = "dvb-usb-hauppauge-hvr930c-drxk.fw",
327 .chunk_size = 56,
328};
329
319static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) 330static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
320{ 331{
321 struct em28xx_dvb *dvb = fe->sec_priv; 332 struct em28xx_dvb *dvb = fe->sec_priv;
@@ -334,6 +345,73 @@ static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
334 return status; 345 return status;
335} 346}
336 347
348static void hauppauge_hvr930c_init(struct em28xx *dev)
349{
350 int i;
351
352 struct em28xx_reg_seq hauppauge_hvr930c_init[] = {
353 {EM2874_R80_GPIO, 0xff, 0xff, 0x65},
354 {EM2874_R80_GPIO, 0xfb, 0xff, 0x32},
355 {EM2874_R80_GPIO, 0xff, 0xff, 0xb8},
356 { -1, -1, -1, -1},
357 };
358 struct em28xx_reg_seq hauppauge_hvr930c_end[] = {
359 {EM2874_R80_GPIO, 0xef, 0xff, 0x01},
360 {EM2874_R80_GPIO, 0xaf, 0xff, 0x65},
361 {EM2874_R80_GPIO, 0xef, 0xff, 0x76},
362 {EM2874_R80_GPIO, 0xef, 0xff, 0x01},
363 {EM2874_R80_GPIO, 0xcf, 0xff, 0x0b},
364 {EM2874_R80_GPIO, 0xef, 0xff, 0x40},
365
366 {EM2874_R80_GPIO, 0xcf, 0xff, 0x65},
367 {EM2874_R80_GPIO, 0xef, 0xff, 0x65},
368 {EM2874_R80_GPIO, 0xcf, 0xff, 0x0b},
369 {EM2874_R80_GPIO, 0xef, 0xff, 0x65},
370
371 { -1, -1, -1, -1},
372 };
373
374 struct {
375 unsigned char r[4];
376 int len;
377 } regs[] = {
378 {{ 0x06, 0x02, 0x00, 0x31 }, 4},
379 {{ 0x01, 0x02 }, 2},
380 {{ 0x01, 0x02, 0x00, 0xc6 }, 4},
381 {{ 0x01, 0x00 }, 2},
382 {{ 0x01, 0x00, 0xff, 0xaf }, 4},
383 {{ 0x01, 0x00, 0x03, 0xa0 }, 4},
384 {{ 0x01, 0x00 }, 2},
385 {{ 0x01, 0x00, 0x73, 0xaf }, 4},
386 {{ 0x04, 0x00 }, 2},
387 {{ 0x00, 0x04 }, 2},
388 {{ 0x00, 0x04, 0x00, 0x0a }, 4},
389 {{ 0x04, 0x14 }, 2},
390 {{ 0x04, 0x14, 0x00, 0x00 }, 4},
391 };
392
393 em28xx_gpio_set(dev, hauppauge_hvr930c_init);
394 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
395 msleep(10);
396 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
397 msleep(10);
398
399 dev->i2c_client.addr = 0x82 >> 1;
400
401 for (i = 0; i < ARRAY_SIZE(regs); i++)
402 i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
403 em28xx_gpio_set(dev, hauppauge_hvr930c_end);
404
405 msleep(100);
406
407 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
408 msleep(30);
409
410 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x45);
411 msleep(10);
412
413}
414
337static void terratec_h5_init(struct em28xx *dev) 415static void terratec_h5_init(struct em28xx *dev)
338{ 416{
339 int i; 417 int i;
@@ -425,13 +503,6 @@ static struct tda10023_config em28xx_tda10023_config = {
425static struct cxd2820r_config em28xx_cxd2820r_config = { 503static struct cxd2820r_config em28xx_cxd2820r_config = {
426 .i2c_address = (0xd8 >> 1), 504 .i2c_address = (0xd8 >> 1),
427 .ts_mode = CXD2820R_TS_SERIAL, 505 .ts_mode = CXD2820R_TS_SERIAL,
428 .if_dvbt_6 = 3300,
429 .if_dvbt_7 = 3500,
430 .if_dvbt_8 = 4000,
431 .if_dvbt2_6 = 3300,
432 .if_dvbt2_7 = 3500,
433 .if_dvbt2_8 = 4000,
434 .if_dvbc = 5000,
435 506
436 /* enable LNA for DVB-T2 and DVB-C */ 507 /* enable LNA for DVB-T2 and DVB-C */
437 .gpio_dvbt2[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L, 508 .gpio_dvbt2[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L,
@@ -456,6 +527,17 @@ static const struct a8293_config em28xx_a8293_config = {
456 .i2c_addr = 0x08, /* (0x10 >> 1) */ 527 .i2c_addr = 0x08, /* (0x10 >> 1) */
457}; 528};
458 529
530static struct zl10353_config em28xx_zl10353_no_i2c_gate_dev = {
531 .demod_address = (0x1e >> 1),
532 .disable_i2c_gate_ctrl = 1,
533 .no_tuner = 1,
534 .parallel_ts = 1,
535};
536static struct qt1010_config em28xx_qt1010_config = {
537 .i2c_address = 0x62
538
539};
540
459/* ------------------------------------------------------------------ */ 541/* ------------------------------------------------------------------ */
460 542
461static int em28xx_attach_xc3028(u8 addr, struct em28xx *dev) 543static int em28xx_attach_xc3028(u8 addr, struct em28xx *dev)
@@ -708,6 +790,14 @@ static int em28xx_dvb_init(struct em28xx *dev)
708 goto out_free; 790 goto out_free;
709 } 791 }
710 break; 792 break;
793 case EM2870_BOARD_KWORLD_355U:
794 dvb->fe[0] = dvb_attach(zl10353_attach,
795 &em28xx_zl10353_no_i2c_gate_dev,
796 &dev->i2c_adap);
797 if (dvb->fe[0] != NULL)
798 dvb_attach(qt1010_attach, dvb->fe[0],
799 &dev->i2c_adap, &em28xx_qt1010_config);
800 break;
711 case EM2883_BOARD_KWORLD_HYBRID_330U: 801 case EM2883_BOARD_KWORLD_HYBRID_330U:
712 case EM2882_BOARD_EVGA_INDTUBE: 802 case EM2882_BOARD_EVGA_INDTUBE:
713 dvb->fe[0] = dvb_attach(s5h1409_attach, 803 dvb->fe[0] = dvb_attach(s5h1409_attach,
@@ -761,50 +851,72 @@ static int em28xx_dvb_init(struct em28xx *dev)
761 &dev->i2c_adap, &kworld_a340_config); 851 &dev->i2c_adap, &kworld_a340_config);
762 break; 852 break;
763 case EM28174_BOARD_PCTV_290E: 853 case EM28174_BOARD_PCTV_290E:
764 /* MFE
765 * FE 0 = DVB-T/T2 + FE 1 = DVB-C, both sharing same tuner. */
766 /* FE 0 */
767 dvb->fe[0] = dvb_attach(cxd2820r_attach, 854 dvb->fe[0] = dvb_attach(cxd2820r_attach,
768 &em28xx_cxd2820r_config, &dev->i2c_adap, NULL); 855 &em28xx_cxd2820r_config,
856 &dev->i2c_adap,
857 NULL);
769 if (dvb->fe[0]) { 858 if (dvb->fe[0]) {
770 /* FE 0 attach tuner */ 859 /* FE 0 attach tuner */
771 if (!dvb_attach(tda18271_attach, dvb->fe[0], 0x60, 860 if (!dvb_attach(tda18271_attach,
772 &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { 861 dvb->fe[0],
862 0x60,
863 &dev->i2c_adap,
864 &em28xx_cxd2820r_tda18271_config)) {
865
773 dvb_frontend_detach(dvb->fe[0]); 866 dvb_frontend_detach(dvb->fe[0]);
774 result = -EINVAL; 867 result = -EINVAL;
775 goto out_free; 868 goto out_free;
776 } 869 }
777 /* FE 1. This dvb_attach() cannot fail. */ 870 }
778 dvb->fe[1] = dvb_attach(cxd2820r_attach, NULL, NULL, 871 break;
779 dvb->fe[0]); 872 case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
780 dvb->fe[1]->id = 1; 873 {
781 /* FE 1 attach tuner */ 874 struct xc5000_config cfg;
782 if (!dvb_attach(tda18271_attach, dvb->fe[1], 0x60, 875 hauppauge_hvr930c_init(dev);
783 &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { 876
784 dvb_frontend_detach(dvb->fe[1]); 877 dvb->fe[0] = dvb_attach(drxk_attach,
785 /* leave FE 0 still active */ 878 &hauppauge_930c_drxk, &dev->i2c_adap);
786 } 879 if (!dvb->fe[0]) {
880 result = -EINVAL;
881 goto out_free;
882 }
883 /* FIXME: do we need a pll semaphore? */
884 dvb->fe[0]->sec_priv = dvb;
885 sema_init(&dvb->pll_mutex, 1);
886 dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl;
887 dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl;
787 888
788 mfe_shared = 1; 889 /* Attach xc5000 */
890 memset(&cfg, 0, sizeof(cfg));
891 cfg.i2c_address = 0x61;
892 cfg.if_khz = 4000;
893
894 if (dvb->fe[0]->ops.i2c_gate_ctrl)
895 dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 1);
896 if (!dvb_attach(xc5000_attach, dvb->fe[0], &dev->i2c_adap,
897 &cfg)) {
898 result = -EINVAL;
899 goto out_free;
789 } 900 }
901 if (dvb->fe[0]->ops.i2c_gate_ctrl)
902 dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0);
903
790 break; 904 break;
905 }
791 case EM2884_BOARD_TERRATEC_H5: 906 case EM2884_BOARD_TERRATEC_H5:
907 case EM2884_BOARD_CINERGY_HTC_STICK:
792 terratec_h5_init(dev); 908 terratec_h5_init(dev);
793 909
794 dvb->dont_attach_fe1 = 1; 910 dvb->fe[0] = dvb_attach(drxk_attach, &terratec_h5_drxk, &dev->i2c_adap);
795
796 dvb->fe[0] = dvb_attach(drxk_attach, &terratec_h5_drxk, &dev->i2c_adap, &dvb->fe[1]);
797 if (!dvb->fe[0]) { 911 if (!dvb->fe[0]) {
798 result = -EINVAL; 912 result = -EINVAL;
799 goto out_free; 913 goto out_free;
800 } 914 }
801
802 /* FIXME: do we need a pll semaphore? */ 915 /* FIXME: do we need a pll semaphore? */
803 dvb->fe[0]->sec_priv = dvb; 916 dvb->fe[0]->sec_priv = dvb;
804 sema_init(&dvb->pll_mutex, 1); 917 sema_init(&dvb->pll_mutex, 1);
805 dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl; 918 dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl;
806 dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl; 919 dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl;
807 dvb->fe[1]->id = 1;
808 920
809 /* Attach tda18271 to DVB-C frontend */ 921 /* Attach tda18271 to DVB-C frontend */
810 if (dvb->fe[0]->ops.i2c_gate_ctrl) 922 if (dvb->fe[0]->ops.i2c_gate_ctrl)
@@ -816,12 +928,6 @@ static int em28xx_dvb_init(struct em28xx *dev)
816 if (dvb->fe[0]->ops.i2c_gate_ctrl) 928 if (dvb->fe[0]->ops.i2c_gate_ctrl)
817 dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0); 929 dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0);
818 930
819 /* Hack - needed by drxk/tda18271c2dd */
820 dvb->fe[1]->tuner_priv = dvb->fe[0]->tuner_priv;
821 memcpy(&dvb->fe[1]->ops.tuner_ops,
822 &dvb->fe[0]->ops.tuner_ops,
823 sizeof(dvb->fe[0]->ops.tuner_ops));
824
825 break; 931 break;
826 case EM28174_BOARD_PCTV_460E: 932 case EM28174_BOARD_PCTV_460E:
827 /* attach demod */ 933 /* attach demod */
@@ -845,6 +951,8 @@ static int em28xx_dvb_init(struct em28xx *dev)
845 } 951 }
846 /* define general-purpose callback pointer */ 952 /* define general-purpose callback pointer */
847 dvb->fe[0]->callback = em28xx_tuner_callback; 953 dvb->fe[0]->callback = em28xx_tuner_callback;
954 if (dvb->fe[1])
955 dvb->fe[1]->callback = em28xx_tuner_callback;
848 956
849 /* register everything */ 957 /* register everything */
850 result = em28xx_register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev); 958 result = em28xx_register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);