diff options
author | Igor M. Liplianin <liplianin@netup.ru> | 2009-03-03 10:06:09 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-03-30 11:43:05 -0400 |
commit | 5a23b0762c9095e137ce9a559cc7c37b2f8fd083 (patch) | |
tree | 501d119b876a9051f2349fcf62fb9b4863fb577d /drivers | |
parent | ce45264eca4963e666ec170af1eeb0c4f5f8339e (diff) |
V4L/DVB (10805): Add support for NetUP Dual DVB-S2 CI card
Add support for NetUP Dual DVB-S2 CI card
The card based on cx23885 PCI-e bridge, CiMax SP2 Common Interface chips,
STM lnbh24 LNB power chip, stv6110 tuners and stv0900 demodulator.
http://www.linuxtv.org/wiki/index.php/NetUP_Dual_DVB_S2_CI
Signed-off-by: Igor M. Liplianin <liplianin@netup.ru>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/cx23885/Kconfig | 1 | ||||
-rw-r--r-- | drivers/media/video/cx23885/Makefile | 4 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-cards.c | 53 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-core.c | 20 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-dvb.c | 106 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-reg.h | 2 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885.h | 3 |
7 files changed, 186 insertions, 3 deletions
diff --git a/drivers/media/video/cx23885/Kconfig b/drivers/media/video/cx23885/Kconfig index 00f1e2e8889e..b62f16d507d8 100644 --- a/drivers/media/video/cx23885/Kconfig +++ b/drivers/media/video/cx23885/Kconfig | |||
@@ -16,6 +16,7 @@ config VIDEO_CX23885 | |||
16 | select DVB_LGDT330X if !DVB_FE_CUSTOMISE | 16 | select DVB_LGDT330X if !DVB_FE_CUSTOMISE |
17 | select DVB_ZL10353 if !DVB_FE_CUSTOMISE | 17 | select DVB_ZL10353 if !DVB_FE_CUSTOMISE |
18 | select DVB_TDA10048 if !DVB_FE_CUSTOMIZE | 18 | select DVB_TDA10048 if !DVB_FE_CUSTOMIZE |
19 | select DVB_LNBP21 if !DVB_FE_CUSTOMIZE | ||
19 | select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMIZE | 20 | select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMIZE |
20 | select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE | 21 | select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE |
21 | select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE | 22 | select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE |
diff --git a/drivers/media/video/cx23885/Makefile b/drivers/media/video/cx23885/Makefile index 29c23b44c13c..ab8ea35c9bfb 100644 --- a/drivers/media/video/cx23885/Makefile +++ b/drivers/media/video/cx23885/Makefile | |||
@@ -1,4 +1,6 @@ | |||
1 | cx23885-objs := cx23885-cards.o cx23885-video.o cx23885-vbi.o cx23885-core.o cx23885-i2c.o cx23885-dvb.o cx23885-417.o | 1 | cx23885-objs := cx23885-cards.o cx23885-video.o cx23885-vbi.o \ |
2 | cx23885-core.o cx23885-i2c.o cx23885-dvb.o cx23885-417.o \ | ||
3 | netup-init.o cimax2.o netup-eeprom.o | ||
2 | 4 | ||
3 | obj-$(CONFIG_VIDEO_CX23885) += cx23885.o | 5 | obj-$(CONFIG_VIDEO_CX23885) += cx23885.o |
4 | 6 | ||
diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c index 7ff339a2e3f2..08cd793cd151 100644 --- a/drivers/media/video/cx23885/cx23885-cards.c +++ b/drivers/media/video/cx23885/cx23885-cards.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include "cx23885.h" | 28 | #include "cx23885.h" |
29 | #include "tuner-xc2028.h" | 29 | #include "tuner-xc2028.h" |
30 | #include "netup-init.h" | ||
30 | 31 | ||
31 | /* ------------------------------------------------------------------ */ | 32 | /* ------------------------------------------------------------------ */ |
32 | /* board config info */ | 33 | /* board config info */ |
@@ -174,6 +175,12 @@ struct cx23885_board cx23885_boards[] = { | |||
174 | .name = "DVBWorld DVB-S2 2005", | 175 | .name = "DVBWorld DVB-S2 2005", |
175 | .portb = CX23885_MPEG_DVB, | 176 | .portb = CX23885_MPEG_DVB, |
176 | }, | 177 | }, |
178 | [CX23885_BOARD_NETUP_DUAL_DVBS2_CI] = { | ||
179 | .cimax = 1, | ||
180 | .name = "NetUP Dual DVB-S2 CI", | ||
181 | .portb = CX23885_MPEG_DVB, | ||
182 | .portc = CX23885_MPEG_DVB, | ||
183 | }, | ||
177 | }; | 184 | }; |
178 | const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards); | 185 | const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards); |
179 | 186 | ||
@@ -269,6 +276,10 @@ struct cx23885_subid cx23885_subids[] = { | |||
269 | .subvendor = 0x0001, | 276 | .subvendor = 0x0001, |
270 | .subdevice = 0x2005, | 277 | .subdevice = 0x2005, |
271 | .card = CX23885_BOARD_DVBWORLD_2005, | 278 | .card = CX23885_BOARD_DVBWORLD_2005, |
279 | }, { | ||
280 | .subvendor = 0x1b55, | ||
281 | .subdevice = 0x2a2c, | ||
282 | .card = CX23885_BOARD_NETUP_DUAL_DVBS2_CI, | ||
272 | }, | 283 | }, |
273 | }; | 284 | }; |
274 | const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids); | 285 | const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids); |
@@ -582,6 +593,32 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) | |||
582 | cx_write(MC417_OEN, 0x00001000); | 593 | cx_write(MC417_OEN, 0x00001000); |
583 | cx_write(MC417_RWD, 0x00001800); | 594 | cx_write(MC417_RWD, 0x00001800); |
584 | break; | 595 | break; |
596 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: | ||
597 | /* GPIO-0 INTA from CiMax1 | ||
598 | GPIO-1 INTB from CiMax2 | ||
599 | GPIO-2 reset chips | ||
600 | GPIO-3 to GPIO-10 data/addr for CA | ||
601 | GPIO-11 ~CS0 to CiMax1 | ||
602 | GPIO-12 ~CS1 to CiMax2 | ||
603 | GPIO-13 ADL0 load LSB addr | ||
604 | GPIO-14 ADL1 load MSB addr | ||
605 | GPIO-15 ~RDY from CiMax | ||
606 | GPIO-17 ~RD to CiMax | ||
607 | GPIO-18 ~WR to CiMax | ||
608 | */ | ||
609 | cx_set(GP0_IO, 0x00040000); /* GPIO as out */ | ||
610 | /* GPIO1 and GPIO2 as INTA and INTB from CiMaxes, reset low */ | ||
611 | cx_clear(GP0_IO, 0x00030004); | ||
612 | mdelay(100);/* reset delay */ | ||
613 | cx_set(GP0_IO, 0x00040004); /* GPIO as out, reset high */ | ||
614 | cx_write(MC417_CTL, 0x00000037);/* enable GPIO3-18 pins */ | ||
615 | /* GPIO-15 IN as ~ACK, rest as OUT */ | ||
616 | cx_write(MC417_OEN, 0x00001000); | ||
617 | /* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */ | ||
618 | cx_write(MC417_RWD, 0x0000c300); | ||
619 | /* enable irq */ | ||
620 | cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/ | ||
621 | break; | ||
585 | } | 622 | } |
586 | } | 623 | } |
587 | 624 | ||
@@ -669,6 +706,14 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
669 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | 706 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ |
670 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | 707 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; |
671 | break; | 708 | break; |
709 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: | ||
710 | ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */ | ||
711 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | ||
712 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | ||
713 | ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */ | ||
714 | ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | ||
715 | ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | ||
716 | break; | ||
672 | case CX23885_BOARD_HAUPPAUGE_HVR1250: | 717 | case CX23885_BOARD_HAUPPAUGE_HVR1250: |
673 | case CX23885_BOARD_HAUPPAUGE_HVR1500: | 718 | case CX23885_BOARD_HAUPPAUGE_HVR1500: |
674 | case CX23885_BOARD_HAUPPAUGE_HVR1500Q: | 719 | case CX23885_BOARD_HAUPPAUGE_HVR1500Q: |
@@ -693,9 +738,17 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
693 | case CX23885_BOARD_HAUPPAUGE_HVR1700: | 738 | case CX23885_BOARD_HAUPPAUGE_HVR1700: |
694 | case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H: | 739 | case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H: |
695 | case CX23885_BOARD_COMPRO_VIDEOMATE_E650F: | 740 | case CX23885_BOARD_COMPRO_VIDEOMATE_E650F: |
741 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: | ||
696 | request_module("cx25840"); | 742 | request_module("cx25840"); |
697 | break; | 743 | break; |
698 | } | 744 | } |
745 | |||
746 | /* AUX-PLL 27MHz CLK */ | ||
747 | switch (dev->board) { | ||
748 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: | ||
749 | netup_initialize(dev); | ||
750 | break; | ||
751 | } | ||
699 | } | 752 | } |
700 | 753 | ||
701 | /* ------------------------------------------------------------------ */ | 754 | /* ------------------------------------------------------------------ */ |
diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c index 8f6fb2add7de..1b401457d42e 100644 --- a/drivers/media/video/cx23885/cx23885-core.c +++ b/drivers/media/video/cx23885/cx23885-core.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/div64.h> | 31 | #include <asm/div64.h> |
32 | 32 | ||
33 | #include "cx23885.h" | 33 | #include "cx23885.h" |
34 | #include "cimax2.h" | ||
34 | 35 | ||
35 | MODULE_DESCRIPTION("Driver for cx23885 based TV cards"); | 36 | MODULE_DESCRIPTION("Driver for cx23885 based TV cards"); |
36 | MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>"); | 37 | MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>"); |
@@ -791,6 +792,8 @@ static int cx23885_dev_setup(struct cx23885_dev *dev) | |||
791 | dev->pci_bus = dev->pci->bus->number; | 792 | dev->pci_bus = dev->pci->bus->number; |
792 | dev->pci_slot = PCI_SLOT(dev->pci->devfn); | 793 | dev->pci_slot = PCI_SLOT(dev->pci->devfn); |
793 | dev->pci_irqmask = 0x001f00; | 794 | dev->pci_irqmask = 0x001f00; |
795 | if (cx23885_boards[dev->board].cimax > 0) | ||
796 | dev->pci_irqmask |= 0x01800000; /* for CiMaxes */ | ||
794 | 797 | ||
795 | /* External Master 1 Bus */ | 798 | /* External Master 1 Bus */ |
796 | dev->i2c_bus[0].nr = 0; | 799 | dev->i2c_bus[0].nr = 0; |
@@ -1643,7 +1646,9 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id) | |||
1643 | (pci_status & PCI_MSK_VID_B) || | 1646 | (pci_status & PCI_MSK_VID_B) || |
1644 | (pci_status & PCI_MSK_VID_A) || | 1647 | (pci_status & PCI_MSK_VID_A) || |
1645 | (pci_status & PCI_MSK_AUD_INT) || | 1648 | (pci_status & PCI_MSK_AUD_INT) || |
1646 | (pci_status & PCI_MSK_AUD_EXT)) { | 1649 | (pci_status & PCI_MSK_AUD_EXT) || |
1650 | (pci_status & PCI_MSK_GPIO0) || | ||
1651 | (pci_status & PCI_MSK_GPIO1)) { | ||
1647 | 1652 | ||
1648 | if (pci_status & PCI_MSK_RISC_RD) | 1653 | if (pci_status & PCI_MSK_RISC_RD) |
1649 | dprintk(7, " (PCI_MSK_RISC_RD 0x%08x)\n", | 1654 | dprintk(7, " (PCI_MSK_RISC_RD 0x%08x)\n", |
@@ -1685,8 +1690,19 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id) | |||
1685 | dprintk(7, " (PCI_MSK_AUD_EXT 0x%08x)\n", | 1690 | dprintk(7, " (PCI_MSK_AUD_EXT 0x%08x)\n", |
1686 | PCI_MSK_AUD_EXT); | 1691 | PCI_MSK_AUD_EXT); |
1687 | 1692 | ||
1693 | if (pci_status & PCI_MSK_GPIO0) | ||
1694 | dprintk(7, " (PCI_MSK_GPIO0 0x%08x)\n", | ||
1695 | PCI_MSK_GPIO0); | ||
1696 | |||
1697 | if (pci_status & PCI_MSK_GPIO1) | ||
1698 | dprintk(7, " (PCI_MSK_GPIO1 0x%08x)\n", | ||
1699 | PCI_MSK_GPIO1); | ||
1688 | } | 1700 | } |
1689 | 1701 | ||
1702 | if ((pci_status & PCI_MSK_GPIO0) || (pci_status & PCI_MSK_GPIO1)) | ||
1703 | /* handled += cx23885_irq_gpio(dev, pci_status); */ | ||
1704 | handled += netup_ci_slot_status(dev, pci_status); | ||
1705 | |||
1690 | if (ts1_status) { | 1706 | if (ts1_status) { |
1691 | if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) | 1707 | if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) |
1692 | handled += cx23885_irq_ts(ts1, ts1_status); | 1708 | handled += cx23885_irq_ts(ts1, ts1_status); |
@@ -1759,6 +1775,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev, | |||
1759 | } | 1775 | } |
1760 | 1776 | ||
1761 | pci_set_drvdata(pci_dev, dev); | 1777 | pci_set_drvdata(pci_dev, dev); |
1778 | cx_set(PCI_INT_MSK, 0x01800000); /* for NetUP */ | ||
1779 | |||
1762 | return 0; | 1780 | return 0; |
1763 | 1781 | ||
1764 | fail_irq: | 1782 | fail_irq: |
diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c index 14a6540b826c..9a0bc6e84a95 100644 --- a/drivers/media/video/cx23885/cx23885-dvb.c +++ b/drivers/media/video/cx23885/cx23885-dvb.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include "cx23885.h" | 30 | #include "cx23885.h" |
31 | #include <media/v4l2-common.h> | 31 | #include <media/v4l2-common.h> |
32 | 32 | ||
33 | #include "dvb_ca_en50221.h" | ||
33 | #include "s5h1409.h" | 34 | #include "s5h1409.h" |
34 | #include "s5h1411.h" | 35 | #include "s5h1411.h" |
35 | #include "mt2131.h" | 36 | #include "mt2131.h" |
@@ -43,7 +44,13 @@ | |||
43 | #include "dib7000p.h" | 44 | #include "dib7000p.h" |
44 | #include "dibx000_common.h" | 45 | #include "dibx000_common.h" |
45 | #include "zl10353.h" | 46 | #include "zl10353.h" |
47 | #include "stv0900.h" | ||
48 | #include "stv6110.h" | ||
49 | #include "lnbh24.h" | ||
46 | #include "cx24116.h" | 50 | #include "cx24116.h" |
51 | #include "cimax2.h" | ||
52 | #include "netup-eeprom.h" | ||
53 | #include "netup-init.h" | ||
47 | 54 | ||
48 | static unsigned int debug; | 55 | static unsigned int debug; |
49 | 56 | ||
@@ -309,6 +316,31 @@ static struct zl10353_config dvico_fusionhdtv_xc3028 = { | |||
309 | .no_tuner = 1, | 316 | .no_tuner = 1, |
310 | }; | 317 | }; |
311 | 318 | ||
319 | static struct stv0900_config netup_stv0900_config = { | ||
320 | .demod_address = 0x68, | ||
321 | .xtal = 27000000, | ||
322 | .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */ | ||
323 | .diseqc_mode = 2,/* 2/3 PWM */ | ||
324 | .path1_mode = 2,/*Serial continues clock */ | ||
325 | .path2_mode = 2,/*Serial continues clock */ | ||
326 | .tun1_maddress = 0,/* 0x60 */ | ||
327 | .tun2_maddress = 3,/* 0x63 */ | ||
328 | .tun1_adc = 1,/* 1 Vpp */ | ||
329 | .tun2_adc = 1,/* 1 Vpp */ | ||
330 | }; | ||
331 | |||
332 | static struct stv6110_config netup_stv6110_tunerconfig_a = { | ||
333 | .i2c_address = 0x60, | ||
334 | .mclk = 27000000, | ||
335 | .iq_wiring = 0, | ||
336 | }; | ||
337 | |||
338 | static struct stv6110_config netup_stv6110_tunerconfig_b = { | ||
339 | .i2c_address = 0x63, | ||
340 | .mclk = 27000000, | ||
341 | .iq_wiring = 1, | ||
342 | }; | ||
343 | |||
312 | static int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | 344 | static int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) |
313 | { | 345 | { |
314 | struct cx23885_tsport *port = fe->dvb->priv; | 346 | struct cx23885_tsport *port = fe->dvb->priv; |
@@ -340,6 +372,7 @@ static int dvb_register(struct cx23885_tsport *port) | |||
340 | struct cx23885_dev *dev = port->dev; | 372 | struct cx23885_dev *dev = port->dev; |
341 | struct cx23885_i2c *i2c_bus = NULL; | 373 | struct cx23885_i2c *i2c_bus = NULL; |
342 | struct videobuf_dvb_frontend *fe0; | 374 | struct videobuf_dvb_frontend *fe0; |
375 | int ret; | ||
343 | 376 | ||
344 | /* Get the first frontend */ | 377 | /* Get the first frontend */ |
345 | fe0 = videobuf_dvb_get_frontend(&port->frontends, 1); | 378 | fe0 = videobuf_dvb_get_frontend(&port->frontends, 1); |
@@ -580,6 +613,51 @@ static int dvb_register(struct cx23885_tsport *port) | |||
580 | &dvbworld_cx24116_config, | 613 | &dvbworld_cx24116_config, |
581 | &i2c_bus->i2c_adap); | 614 | &i2c_bus->i2c_adap); |
582 | break; | 615 | break; |
616 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: | ||
617 | i2c_bus = &dev->i2c_bus[0]; | ||
618 | switch (port->nr) { | ||
619 | /* port B */ | ||
620 | case 1: | ||
621 | fe0->dvb.frontend = dvb_attach(stv0900_attach, | ||
622 | &netup_stv0900_config, | ||
623 | &i2c_bus->i2c_adap, 0); | ||
624 | if (fe0->dvb.frontend != NULL) { | ||
625 | if (dvb_attach(stv6110_attach, | ||
626 | fe0->dvb.frontend, | ||
627 | &netup_stv6110_tunerconfig_a, | ||
628 | &i2c_bus->i2c_adap)) { | ||
629 | if (!dvb_attach(lnbh24_attach, | ||
630 | fe0->dvb.frontend, | ||
631 | &i2c_bus->i2c_adap, | ||
632 | LNBH24_PCL, 0, 0x09)) | ||
633 | printk(KERN_ERR | ||
634 | "No LNBH24 found!\n"); | ||
635 | |||
636 | } | ||
637 | } | ||
638 | break; | ||
639 | /* port C */ | ||
640 | case 2: | ||
641 | fe0->dvb.frontend = dvb_attach(stv0900_attach, | ||
642 | &netup_stv0900_config, | ||
643 | &i2c_bus->i2c_adap, 1); | ||
644 | if (fe0->dvb.frontend != NULL) { | ||
645 | if (dvb_attach(stv6110_attach, | ||
646 | fe0->dvb.frontend, | ||
647 | &netup_stv6110_tunerconfig_b, | ||
648 | &i2c_bus->i2c_adap)) { | ||
649 | if (!dvb_attach(lnbh24_attach, | ||
650 | fe0->dvb.frontend, | ||
651 | &i2c_bus->i2c_adap, | ||
652 | LNBH24_PCL, 0, 0x0a)) | ||
653 | printk(KERN_ERR | ||
654 | "No LNBH24 found!\n"); | ||
655 | |||
656 | } | ||
657 | } | ||
658 | break; | ||
659 | } | ||
660 | break; | ||
583 | default: | 661 | default: |
584 | printk(KERN_INFO "%s: The frontend of your DVB/ATSC card " | 662 | printk(KERN_INFO "%s: The frontend of your DVB/ATSC card " |
585 | " isn't supported yet\n", | 663 | " isn't supported yet\n", |
@@ -601,9 +679,33 @@ static int dvb_register(struct cx23885_tsport *port) | |||
601 | fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend); | 679 | fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend); |
602 | 680 | ||
603 | /* register everything */ | 681 | /* register everything */ |
604 | return videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port, | 682 | ret = videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port, |
605 | &dev->pci->dev, adapter_nr, 0); | 683 | &dev->pci->dev, adapter_nr, 0); |
606 | 684 | ||
685 | /* init CI & MAC */ | ||
686 | switch (dev->board) { | ||
687 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: { | ||
688 | static struct netup_card_info cinfo; | ||
689 | |||
690 | netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo); | ||
691 | memcpy(port->frontends.adapter.proposed_mac, | ||
692 | cinfo.port[port->nr - 1].mac, 6); | ||
693 | printk(KERN_INFO "NetUP Dual DVB-S2 CI card port%d MAC=" | ||
694 | "%02X:%02X:%02X:%02X:%02X:%02X\n", | ||
695 | port->nr, | ||
696 | port->frontends.adapter.proposed_mac[0], | ||
697 | port->frontends.adapter.proposed_mac[1], | ||
698 | port->frontends.adapter.proposed_mac[2], | ||
699 | port->frontends.adapter.proposed_mac[3], | ||
700 | port->frontends.adapter.proposed_mac[4], | ||
701 | port->frontends.adapter.proposed_mac[5]); | ||
702 | |||
703 | netup_ci_init(port); | ||
704 | break; | ||
705 | } | ||
706 | } | ||
707 | |||
708 | return ret; | ||
607 | } | 709 | } |
608 | 710 | ||
609 | int cx23885_dvb_register(struct cx23885_tsport *port) | 711 | int cx23885_dvb_register(struct cx23885_tsport *port) |
@@ -676,6 +778,8 @@ int cx23885_dvb_unregister(struct cx23885_tsport *port) | |||
676 | if (fe0->dvb.frontend) | 778 | if (fe0->dvb.frontend) |
677 | videobuf_dvb_unregister_bus(&port->frontends); | 779 | videobuf_dvb_unregister_bus(&port->frontends); |
678 | 780 | ||
781 | netup_ci_exit(port); | ||
782 | |||
679 | return 0; | 783 | return 0; |
680 | } | 784 | } |
681 | 785 | ||
diff --git a/drivers/media/video/cx23885/cx23885-reg.h b/drivers/media/video/cx23885/cx23885-reg.h index 20b68a236260..eafbe5226bae 100644 --- a/drivers/media/video/cx23885/cx23885-reg.h +++ b/drivers/media/video/cx23885/cx23885-reg.h | |||
@@ -212,6 +212,8 @@ Channel manager Data Structure entry = 20 DWORD | |||
212 | 212 | ||
213 | #define DEV_CNTRL2 0x00040000 | 213 | #define DEV_CNTRL2 0x00040000 |
214 | 214 | ||
215 | #define PCI_MSK_GPIO1 (1 << 24) | ||
216 | #define PCI_MSK_GPIO0 (1 << 23) | ||
215 | #define PCI_MSK_APB_DMA (1 << 12) | 217 | #define PCI_MSK_APB_DMA (1 << 12) |
216 | #define PCI_MSK_AL_WR (1 << 11) | 218 | #define PCI_MSK_AL_WR (1 << 11) |
217 | #define PCI_MSK_AL_RD (1 << 10) | 219 | #define PCI_MSK_AL_RD (1 << 10) |
diff --git a/drivers/media/video/cx23885/cx23885.h b/drivers/media/video/cx23885/cx23885.h index 37a88b1683c3..779fc35b18d6 100644 --- a/drivers/media/video/cx23885/cx23885.h +++ b/drivers/media/video/cx23885/cx23885.h | |||
@@ -70,6 +70,7 @@ | |||
70 | #define CX23885_BOARD_TBS_6920 14 | 70 | #define CX23885_BOARD_TBS_6920 14 |
71 | #define CX23885_BOARD_TEVII_S470 15 | 71 | #define CX23885_BOARD_TEVII_S470 15 |
72 | #define CX23885_BOARD_DVBWORLD_2005 16 | 72 | #define CX23885_BOARD_DVBWORLD_2005 16 |
73 | #define CX23885_BOARD_NETUP_DUAL_DVBS2_CI 17 | ||
73 | 74 | ||
74 | /* Currently unsupported by the driver: PAL/H, NTSC/Kr, SECAM B/G/H/LC */ | 75 | /* Currently unsupported by the driver: PAL/H, NTSC/Kr, SECAM B/G/H/LC */ |
75 | #define CX23885_NORMS (\ | 76 | #define CX23885_NORMS (\ |
@@ -187,6 +188,7 @@ struct cx23885_board { | |||
187 | */ | 188 | */ |
188 | u32 clk_freq; | 189 | u32 clk_freq; |
189 | struct cx23885_input input[MAX_CX23885_INPUT]; | 190 | struct cx23885_input input[MAX_CX23885_INPUT]; |
191 | int cimax; /* for NetUP */ | ||
190 | }; | 192 | }; |
191 | 193 | ||
192 | struct cx23885_subid { | 194 | struct cx23885_subid { |
@@ -269,6 +271,7 @@ struct cx23885_tsport { | |||
269 | 271 | ||
270 | /* Allow a single tsport to have multiple frontends */ | 272 | /* Allow a single tsport to have multiple frontends */ |
271 | u32 num_frontends; | 273 | u32 num_frontends; |
274 | void *port_priv; | ||
272 | }; | 275 | }; |
273 | 276 | ||
274 | struct cx23885_dev { | 277 | struct cx23885_dev { |