Commit 5a23b076 authored by Igor M. Liplianin's avatar Igor M. Liplianin Committed by Mauro Carvalho Chehab
Browse files

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: default avatarIgor M. Liplianin <liplianin@netup.ru>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent ce45264e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -15,3 +15,4 @@
 14 -> TurboSight TBS 6920                                 [6920:8888]
 15 -> TeVii S470                                          [d470:9022]
 16 -> DVBWorld DVB-S2 2005                                [0001:2005]
 17 -> NetUP Dual DVB-S2 CI                                [1b55:2a2c]
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ config VIDEO_CX23885
	select DVB_LGDT330X if !DVB_FE_CUSTOMISE
	select DVB_ZL10353 if !DVB_FE_CUSTOMISE
	select DVB_TDA10048 if !DVB_FE_CUSTOMIZE
	select DVB_LNBP21 if !DVB_FE_CUSTOMIZE
	select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMIZE
	select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE
	select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE
+3 −1
Original line number Diff line number Diff line
cx23885-objs	:= cx23885-cards.o cx23885-video.o cx23885-vbi.o cx23885-core.o cx23885-i2c.o cx23885-dvb.o cx23885-417.o
cx23885-objs	:= cx23885-cards.o cx23885-video.o cx23885-vbi.o \
		    cx23885-core.o cx23885-i2c.o cx23885-dvb.o cx23885-417.o \
		    netup-init.o cimax2.o netup-eeprom.o

obj-$(CONFIG_VIDEO_CX23885) += cx23885.o

+53 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@

#include "cx23885.h"
#include "tuner-xc2028.h"
#include "netup-init.h"

/* ------------------------------------------------------------------ */
/* board config info                                                  */
@@ -174,6 +175,12 @@ struct cx23885_board cx23885_boards[] = {
		.name		= "DVBWorld DVB-S2 2005",
		.portb		= CX23885_MPEG_DVB,
	},
	[CX23885_BOARD_NETUP_DUAL_DVBS2_CI] = {
		.cimax		= 1,
		.name		= "NetUP Dual DVB-S2 CI",
		.portb		= CX23885_MPEG_DVB,
		.portc		= CX23885_MPEG_DVB,
	},
};
const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);

@@ -269,6 +276,10 @@ struct cx23885_subid cx23885_subids[] = {
		.subvendor = 0x0001,
		.subdevice = 0x2005,
		.card      = CX23885_BOARD_DVBWORLD_2005,
	}, {
		.subvendor = 0x1b55,
		.subdevice = 0x2a2c,
		.card      = CX23885_BOARD_NETUP_DUAL_DVBS2_CI,
	},
};
const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
@@ -582,6 +593,32 @@ void cx23885_gpio_setup(struct cx23885_dev *dev)
		cx_write(MC417_OEN, 0x00001000);
		cx_write(MC417_RWD, 0x00001800);
		break;
	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
		/* GPIO-0 INTA from CiMax1
		   GPIO-1 INTB from CiMax2
		   GPIO-2 reset chips
		   GPIO-3 to GPIO-10 data/addr for CA
		   GPIO-11 ~CS0 to CiMax1
		   GPIO-12 ~CS1 to CiMax2
		   GPIO-13 ADL0 load LSB addr
		   GPIO-14 ADL1 load MSB addr
		   GPIO-15 ~RDY from CiMax
		   GPIO-17 ~RD to CiMax
		   GPIO-18 ~WR to CiMax
		 */
		cx_set(GP0_IO, 0x00040000); /* GPIO as out */
		/* GPIO1 and GPIO2 as INTA and INTB from CiMaxes, reset low */
		cx_clear(GP0_IO, 0x00030004);
		mdelay(100);/* reset delay */
		cx_set(GP0_IO, 0x00040004); /* GPIO as out, reset high */
		cx_write(MC417_CTL, 0x00000037);/* enable GPIO3-18 pins */
		/* GPIO-15 IN as ~ACK, rest as OUT */
		cx_write(MC417_OEN, 0x00001000);
		/* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
		cx_write(MC417_RWD, 0x0000c300);
		/* enable irq */
		cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
		break;
	}
}

@@ -669,6 +706,14 @@ void cx23885_card_setup(struct cx23885_dev *dev)
		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
		break;
	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
		break;
	case CX23885_BOARD_HAUPPAUGE_HVR1250:
	case CX23885_BOARD_HAUPPAUGE_HVR1500:
	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
@@ -693,9 +738,17 @@ void cx23885_card_setup(struct cx23885_dev *dev)
	case CX23885_BOARD_HAUPPAUGE_HVR1700:
	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
		request_module("cx25840");
		break;
	}

	/* AUX-PLL 27MHz CLK */
	switch (dev->board) {
	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
		netup_initialize(dev);
		break;
	}
}

/* ------------------------------------------------------------------ */
+19 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include <asm/div64.h>

#include "cx23885.h"
#include "cimax2.h"

MODULE_DESCRIPTION("Driver for cx23885 based TV cards");
MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
@@ -791,6 +792,8 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
	dev->pci_bus  = dev->pci->bus->number;
	dev->pci_slot = PCI_SLOT(dev->pci->devfn);
	dev->pci_irqmask = 0x001f00;
	if (cx23885_boards[dev->board].cimax > 0)
		dev->pci_irqmask |= 0x01800000; /* for CiMaxes */

	/* External Master 1 Bus */
	dev->i2c_bus[0].nr = 0;
@@ -1643,7 +1646,9 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id)
	    (pci_status & PCI_MSK_VID_B) ||
	    (pci_status & PCI_MSK_VID_A) ||
	    (pci_status & PCI_MSK_AUD_INT) ||
	    (pci_status & PCI_MSK_AUD_EXT)) {
	    (pci_status & PCI_MSK_AUD_EXT) ||
	    (pci_status & PCI_MSK_GPIO0) ||
	    (pci_status & PCI_MSK_GPIO1)) {

		if (pci_status & PCI_MSK_RISC_RD)
			dprintk(7, " (PCI_MSK_RISC_RD   0x%08x)\n",
@@ -1685,8 +1690,19 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id)
			dprintk(7, " (PCI_MSK_AUD_EXT   0x%08x)\n",
				PCI_MSK_AUD_EXT);

		if (pci_status & PCI_MSK_GPIO0)
			dprintk(7, " (PCI_MSK_GPIO0     0x%08x)\n",
				PCI_MSK_GPIO0);

		if (pci_status & PCI_MSK_GPIO1)
			dprintk(7, " (PCI_MSK_GPIO1     0x%08x)\n",
				PCI_MSK_GPIO1);
	}

	if ((pci_status & PCI_MSK_GPIO0) || (pci_status & PCI_MSK_GPIO1))
		/* handled += cx23885_irq_gpio(dev, pci_status); */
		handled += netup_ci_slot_status(dev, pci_status);

	if (ts1_status) {
		if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
			handled += cx23885_irq_ts(ts1, ts1_status);
@@ -1759,6 +1775,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
	}

	pci_set_drvdata(pci_dev, dev);
	cx_set(PCI_INT_MSK, 0x01800000); /* for NetUP */

	return 0;

fail_irq:
Loading