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

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_CISigned-off-by: default avatarIgor M. Liplianin <liplianin@netup.ru>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent ce45264e
...@@ -15,3 +15,4 @@ ...@@ -15,3 +15,4 @@
14 -> TurboSight TBS 6920 [6920:8888] 14 -> TurboSight TBS 6920 [6920:8888]
15 -> TeVii S470 [d470:9022] 15 -> TeVii S470 [d470:9022]
16 -> DVBWorld DVB-S2 2005 [0001:2005] 16 -> DVBWorld DVB-S2 2005 [0001:2005]
17 -> NetUP Dual DVB-S2 CI [1b55:2a2c]
...@@ -16,6 +16,7 @@ config VIDEO_CX23885 ...@@ -16,6 +16,7 @@ config VIDEO_CX23885
select DVB_LGDT330X if !DVB_FE_CUSTOMISE select DVB_LGDT330X if !DVB_FE_CUSTOMISE
select DVB_ZL10353 if !DVB_FE_CUSTOMISE select DVB_ZL10353 if !DVB_FE_CUSTOMISE
select DVB_TDA10048 if !DVB_FE_CUSTOMIZE 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_MT2131 if !MEDIA_TUNER_CUSTOMIZE
select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE
select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE
......
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 obj-$(CONFIG_VIDEO_CX23885) += cx23885.o
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "cx23885.h" #include "cx23885.h"
#include "tuner-xc2028.h" #include "tuner-xc2028.h"
#include "netup-init.h"
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
/* board config info */ /* board config info */
...@@ -174,6 +175,12 @@ struct cx23885_board cx23885_boards[] = { ...@@ -174,6 +175,12 @@ struct cx23885_board cx23885_boards[] = {
.name = "DVBWorld DVB-S2 2005", .name = "DVBWorld DVB-S2 2005",
.portb = CX23885_MPEG_DVB, .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); const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);
...@@ -269,6 +276,10 @@ struct cx23885_subid cx23885_subids[] = { ...@@ -269,6 +276,10 @@ struct cx23885_subid cx23885_subids[] = {
.subvendor = 0x0001, .subvendor = 0x0001,
.subdevice = 0x2005, .subdevice = 0x2005,
.card = CX23885_BOARD_DVBWORLD_2005, .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); const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
...@@ -582,6 +593,32 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) ...@@ -582,6 +593,32 @@ void cx23885_gpio_setup(struct cx23885_dev *dev)
cx_write(MC417_OEN, 0x00001000); cx_write(MC417_OEN, 0x00001000);
cx_write(MC417_RWD, 0x00001800); cx_write(MC417_RWD, 0x00001800);
break; 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) ...@@ -669,6 +706,14 @@ void cx23885_card_setup(struct cx23885_dev *dev)
ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
break; 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_HVR1250:
case CX23885_BOARD_HAUPPAUGE_HVR1500: case CX23885_BOARD_HAUPPAUGE_HVR1500:
case CX23885_BOARD_HAUPPAUGE_HVR1500Q: case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
...@@ -693,9 +738,17 @@ void cx23885_card_setup(struct cx23885_dev *dev) ...@@ -693,9 +738,17 @@ void cx23885_card_setup(struct cx23885_dev *dev)
case CX23885_BOARD_HAUPPAUGE_HVR1700: case CX23885_BOARD_HAUPPAUGE_HVR1700:
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H: case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
case CX23885_BOARD_COMPRO_VIDEOMATE_E650F: case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
request_module("cx25840"); request_module("cx25840");
break; break;
} }
/* AUX-PLL 27MHz CLK */
switch (dev->board) {
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
netup_initialize(dev);
break;
}
} }
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <asm/div64.h> #include <asm/div64.h>
#include "cx23885.h" #include "cx23885.h"
#include "cimax2.h"
MODULE_DESCRIPTION("Driver for cx23885 based TV cards"); MODULE_DESCRIPTION("Driver for cx23885 based TV cards");
MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>"); MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
...@@ -791,6 +792,8 @@ static int cx23885_dev_setup(struct cx23885_dev *dev) ...@@ -791,6 +792,8 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
dev->pci_bus = dev->pci->bus->number; dev->pci_bus = dev->pci->bus->number;
dev->pci_slot = PCI_SLOT(dev->pci->devfn); dev->pci_slot = PCI_SLOT(dev->pci->devfn);
dev->pci_irqmask = 0x001f00; dev->pci_irqmask = 0x001f00;
if (cx23885_boards[dev->board].cimax > 0)
dev->pci_irqmask |= 0x01800000; /* for CiMaxes */
/* External Master 1 Bus */ /* External Master 1 Bus */
dev->i2c_bus[0].nr = 0; dev->i2c_bus[0].nr = 0;
...@@ -1643,7 +1646,9 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id) ...@@ -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_B) ||
(pci_status & PCI_MSK_VID_A) || (pci_status & PCI_MSK_VID_A) ||
(pci_status & PCI_MSK_AUD_INT) || (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) if (pci_status & PCI_MSK_RISC_RD)
dprintk(7, " (PCI_MSK_RISC_RD 0x%08x)\n", dprintk(7, " (PCI_MSK_RISC_RD 0x%08x)\n",
...@@ -1685,8 +1690,19 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id) ...@@ -1685,8 +1690,19 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id)
dprintk(7, " (PCI_MSK_AUD_EXT 0x%08x)\n", dprintk(7, " (PCI_MSK_AUD_EXT 0x%08x)\n",
PCI_MSK_AUD_EXT); 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 (ts1_status) {
if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
handled += cx23885_irq_ts(ts1, ts1_status); handled += cx23885_irq_ts(ts1, ts1_status);
...@@ -1759,6 +1775,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev, ...@@ -1759,6 +1775,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
} }
pci_set_drvdata(pci_dev, dev); pci_set_drvdata(pci_dev, dev);
cx_set(PCI_INT_MSK, 0x01800000); /* for NetUP */
return 0; return 0;
fail_irq: fail_irq:
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "cx23885.h" #include "cx23885.h"
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include "dvb_ca_en50221.h"
#include "s5h1409.h" #include "s5h1409.h"
#include "s5h1411.h" #include "s5h1411.h"
#include "mt2131.h" #include "mt2131.h"
...@@ -43,7 +44,13 @@ ...@@ -43,7 +44,13 @@
#include "dib7000p.h" #include "dib7000p.h"
#include "dibx000_common.h" #include "dibx000_common.h"
#include "zl10353.h" #include "zl10353.h"
#include "stv0900.h"
#include "stv6110.h"
#include "lnbh24.h"
#include "cx24116.h" #include "cx24116.h"
#include "cimax2.h"
#include "netup-eeprom.h"
#include "netup-init.h"
static unsigned int debug; static unsigned int debug;
...@@ -309,6 +316,31 @@ static struct zl10353_config dvico_fusionhdtv_xc3028 = { ...@@ -309,6 +316,31 @@ static struct zl10353_config dvico_fusionhdtv_xc3028 = {
.no_tuner = 1, .no_tuner = 1,
}; };
static struct stv0900_config netup_stv0900_config = {
.demod_address = 0x68,
.xtal = 27000000,
.clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
.diseqc_mode = 2,/* 2/3 PWM */
.path1_mode = 2,/*Serial continues clock */
.path2_mode = 2,/*Serial continues clock */
.tun1_maddress = 0,/* 0x60 */
.tun2_maddress = 3,/* 0x63 */
.tun1_adc = 1,/* 1 Vpp */
.tun2_adc = 1,/* 1 Vpp */
};
static struct stv6110_config netup_stv6110_tunerconfig_a = {
.i2c_address = 0x60,
.mclk = 27000000,
.iq_wiring = 0,
};
static struct stv6110_config netup_stv6110_tunerconfig_b = {
.i2c_address = 0x63,
.mclk = 27000000,
.iq_wiring = 1,
};
static int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) static int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
{ {
struct cx23885_tsport *port = fe->dvb->priv; struct cx23885_tsport *port = fe->dvb->priv;
...@@ -340,6 +372,7 @@ static int dvb_register(struct cx23885_tsport *port) ...@@ -340,6 +372,7 @@ static int dvb_register(struct cx23885_tsport *port)
struct cx23885_dev *dev = port->dev; struct cx23885_dev *dev = port->dev;
struct cx23885_i2c *i2c_bus = NULL; struct cx23885_i2c *i2c_bus = NULL;
struct videobuf_dvb_frontend *fe0; struct videobuf_dvb_frontend *fe0;
int ret;
/* Get the first frontend */ /* Get the first frontend */
fe0 = videobuf_dvb_get_frontend(&port->frontends, 1); fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
...@@ -580,6 +613,51 @@ static int dvb_register(struct cx23885_tsport *port) ...@@ -580,6 +613,51 @@ static int dvb_register(struct cx23885_tsport *port)
&dvbworld_cx24116_config, &dvbworld_cx24116_config,
&i2c_bus->i2c_adap); &i2c_bus->i2c_adap);
break; break;
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
i2c_bus = &dev->i2c_bus[0];
switch (port->nr) {
/* port B */
case 1:
fe0->dvb.frontend = dvb_attach(stv0900_attach,
&netup_stv0900_config,
&i2c_bus->i2c_adap, 0);
if (fe0->dvb.frontend != NULL) {
if (dvb_attach(stv6110_attach,
fe0->dvb.frontend,
&netup_stv6110_tunerconfig_a,
&i2c_bus->i2c_adap)) {
if (!dvb_attach(lnbh24_attach,
fe0->dvb.frontend,
&i2c_bus->i2c_adap,
LNBH24_PCL, 0, 0x09))
printk(KERN_ERR
"No LNBH24 found!\n");
}
}
break;
/* port C */
case 2:
fe0->dvb.frontend = dvb_attach(stv0900_attach,
&netup_stv0900_config,
&i2c_bus->i2c_adap, 1);
if (fe0->dvb.frontend != NULL) {
if (dvb_attach(stv6110_attach,
fe0->dvb.frontend,
&netup_stv6110_tunerconfig_b,
&i2c_bus->i2c_adap)) {
if (!dvb_attach(lnbh24_attach,
fe0->dvb.frontend,
&i2c_bus->i2c_adap,
LNBH24_PCL, 0, 0x0a))
printk(KERN_ERR
"No LNBH24 found!\n");
}
}
break;
}
break;
default: default:
printk(KERN_INFO "%s: The frontend of your DVB/ATSC card " printk(KERN_INFO "%s: The frontend of your DVB/ATSC card "
" isn't supported yet\n", " isn't supported yet\n",
...@@ -601,9 +679,33 @@ static int dvb_register(struct cx23885_tsport *port) ...@@ -601,9 +679,33 @@ static int dvb_register(struct cx23885_tsport *port)
fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend); fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend);
/* register everything */ /* register everything */
return videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port, ret = videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port,
&dev->pci->dev, adapter_nr, 0); &dev->pci->dev, adapter_nr, 0);
/* init CI & MAC */
switch (dev->board) {
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: {
static struct netup_card_info cinfo;
netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
memcpy(port->frontends.adapter.proposed_mac,
cinfo.port[port->nr - 1].mac, 6);
printk(KERN_INFO "NetUP Dual DVB-S2 CI card port%d MAC="
"%02X:%02X:%02X:%02X:%02X:%02X\n",
port->nr,
port->frontends.adapter.proposed_mac[0],
port->frontends.adapter.proposed_mac[1],
port->frontends.adapter.proposed_mac[2],
port->frontends.adapter.proposed_mac[3],
port->frontends.adapter.proposed_mac[4],
port->frontends.adapter.proposed_mac[5]);
netup_ci_init(port);
break;
}
}
return ret;
} }
int cx23885_dvb_register(struct cx23885_tsport *port) int cx23885_dvb_register(struct cx23885_tsport *port)
...@@ -676,6 +778,8 @@ int cx23885_dvb_unregister(struct cx23885_tsport *port) ...@@ -676,6 +778,8 @@ int cx23885_dvb_unregister(struct cx23885_tsport *port)
if (fe0->dvb.frontend) if (fe0->dvb.frontend)
videobuf_dvb_unregister_bus(&port->frontends); videobuf_dvb_unregister_bus(&port->frontends);
netup_ci_exit(port);
return 0; return 0;
} }
...@@ -212,6 +212,8 @@ Channel manager Data Structure entry = 20 DWORD ...@@ -212,6 +212,8 @@ Channel manager Data Structure entry = 20 DWORD
#define DEV_CNTRL2 0x00040000 #define DEV_CNTRL2 0x00040000
#define PCI_MSK_GPIO1 (1 << 24)
#define PCI_MSK_GPIO0 (1 << 23)
#define PCI_MSK_APB_DMA (1 << 12) #define PCI_MSK_APB_DMA (1 << 12)
#define PCI_MSK_AL_WR (1 << 11) #define PCI_MSK_AL_WR (1 << 11)
#define PCI_MSK_AL_RD (1 << 10) #define PCI_MSK_AL_RD (1 << 10)
......
...@@ -70,6 +70,7 @@ ...@@ -70,6 +70,7 @@
#define CX23885_BOARD_TBS_6920 14 #define CX23885_BOARD_TBS_6920 14
#define CX23885_BOARD_TEVII_S470 15 #define CX23885_BOARD_TEVII_S470 15
#define CX23885_BOARD_DVBWORLD_2005 16 #define CX23885_BOARD_DVBWORLD_2005 16
#define CX23885_BOARD_NETUP_DUAL_DVBS2_CI 17
/* Currently unsupported by the driver: PAL/H, NTSC/Kr, SECAM B/G/H/LC */ /* Currently unsupported by the driver: PAL/H, NTSC/Kr, SECAM B/G/H/LC */
#define CX23885_NORMS (\ #define CX23885_NORMS (\
...@@ -187,6 +188,7 @@ struct cx23885_board { ...@@ -187,6 +188,7 @@ struct cx23885_board {
*/ */
u32 clk_freq; u32 clk_freq;
struct cx23885_input input[MAX_CX23885_INPUT]; struct cx23885_input input[MAX_CX23885_INPUT];
int cimax; /* for NetUP */
}; };
struct cx23885_subid { struct cx23885_subid {
...@@ -269,6 +271,7 @@ struct cx23885_tsport { ...@@ -269,6 +271,7 @@ struct cx23885_tsport {
/* Allow a single tsport to have multiple frontends */ /* Allow a single tsport to have multiple frontends */
u32 num_frontends; u32 num_frontends;
void *port_priv;
}; };
struct cx23885_dev { struct cx23885_dev {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment