mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
V4L/DVB (9026): Add support for ST STV0288 demodulator and cards with it.
Add support for ST STV0288 demodulator and cards with it, such as TeVii S420. Patch is co-authored with Georg Acher <acher@baycom.de> Signed-off-by: Georg Acher <acher@baycom.de> Signed-off-by: Igor M. Liplianin <liplianin@me.by> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
8316568930
commit
e4aab64cb7
@@ -39,8 +39,8 @@
|
||||
#include "dvb-pll.h"
|
||||
|
||||
#include "stv0299.h"
|
||||
/*#include "stv0288.h"
|
||||
*#include "stb6000.h"*/
|
||||
#include "stv0288.h"
|
||||
#include "stb6000.h"
|
||||
#include "si21xx.h"
|
||||
#include "cx24116.h"
|
||||
#include "z0194a.h"
|
||||
@@ -594,13 +594,12 @@ static void dm1105dvb_hw_exit(struct dm1105dvb *dm1105dvb)
|
||||
|
||||
dm1105dvb_dma_unmap(dm1105dvb);
|
||||
}
|
||||
#if 0
|
||||
|
||||
static struct stv0288_config earda_config = {
|
||||
.demod_address = 0x68,
|
||||
.min_delay_ms = 100,
|
||||
};
|
||||
|
||||
#endif /* keep */
|
||||
static struct si21xx_config serit_config = {
|
||||
.demod_address = 0x68,
|
||||
.min_delay_ms = 100,
|
||||
@@ -627,7 +626,7 @@ static int __devinit frontend_init(struct dm1105dvb *dm1105dvb)
|
||||
dvb_attach(dvb_pll_attach, dm1105dvb->fe, 0x60,
|
||||
&dm1105dvb->i2c_adap, DVB_PLL_OPERA1);
|
||||
}
|
||||
#if 0
|
||||
|
||||
if (!dm1105dvb->fe) {
|
||||
dm1105dvb->fe = dvb_attach(
|
||||
stv0288_attach, &earda_config,
|
||||
@@ -639,7 +638,7 @@ static int __devinit frontend_init(struct dm1105dvb *dm1105dvb)
|
||||
&dm1105dvb->i2c_adap);
|
||||
}
|
||||
}
|
||||
#endif /* keep */
|
||||
|
||||
if (!dm1105dvb->fe) {
|
||||
dm1105dvb->fe = dvb_attach(
|
||||
si21xx_attach, &serit_config,
|
||||
|
||||
@@ -43,6 +43,20 @@ config DVB_S5H1420
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_STV0288
|
||||
tristate "ST STV0288 based"
|
||||
depends on DVB_CORE && I2C
|
||||
default m if DVB_FE_CUSTOMISE
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_STB6000
|
||||
tristate "ST STB6000 silicon tuner"
|
||||
depends on DVB_CORE && I2C
|
||||
default m if DVB_FE_CUSTOMISE
|
||||
help
|
||||
A DVB-S silicon tuner module. Say Y when you want to support this tuner.
|
||||
|
||||
config DVB_STV0299
|
||||
tristate "ST STV0299 based"
|
||||
depends on DVB_CORE && I2C
|
||||
|
||||
@@ -53,3 +53,5 @@ obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o
|
||||
obj-$(CONFIG_DVB_AF9013) += af9013.o
|
||||
obj-$(CONFIG_DVB_CX24116) += cx24116.o
|
||||
obj-$(CONFIG_DVB_SI21XX) += si21xx.o
|
||||
obj-$(CONFIG_DVB_STV0299) += stv0288.o
|
||||
obj-$(CONFIG_DVB_STB6000) += stb6000.o
|
||||
|
||||
254
drivers/media/dvb/frontends/stb6000.c
Normal file
254
drivers/media/dvb/frontends/stb6000.c
Normal file
@@ -0,0 +1,254 @@
|
||||
/*
|
||||
Driver for ST STB6000 DVBS Silicon tuner
|
||||
|
||||
Copyright (C) 2008 Igor M. Liplianin (liplianin@me.by)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#include "stb6000.h"
|
||||
|
||||
static int debug;
|
||||
#define dprintk(args...) \
|
||||
do { \
|
||||
if (debug) \
|
||||
printk(KERN_DEBUG "stb6000: " args); \
|
||||
} while (0)
|
||||
|
||||
struct stb6000_priv {
|
||||
/* i2c details */
|
||||
int i2c_address;
|
||||
struct i2c_adapter *i2c;
|
||||
u32 frequency;
|
||||
};
|
||||
|
||||
static int stb6000_release(struct dvb_frontend *fe)
|
||||
{
|
||||
kfree(fe->tuner_priv);
|
||||
fe->tuner_priv = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stb6000_sleep(struct dvb_frontend *fe)
|
||||
{
|
||||
struct stb6000_priv *priv = fe->tuner_priv;
|
||||
int ret;
|
||||
u8 buf[] = { 10, 0 };
|
||||
struct i2c_msg msg = {
|
||||
.addr = priv->i2c_address,
|
||||
.flags = 0,
|
||||
.buf = buf,
|
||||
.len = 2
|
||||
};
|
||||
|
||||
dprintk("%s:\n", __func__);
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
|
||||
ret = i2c_transfer(priv->i2c, &msg, 1);
|
||||
if (ret != 1)
|
||||
dprintk("%s: i2c error\n", __func__);
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
|
||||
return (ret == 1) ? 0 : ret;
|
||||
}
|
||||
|
||||
static int stb6000_set_params(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *params)
|
||||
{
|
||||
struct stb6000_priv *priv = fe->tuner_priv;
|
||||
unsigned int n, m;
|
||||
int ret;
|
||||
u32 freq_mhz;
|
||||
int bandwidth;
|
||||
u8 buf[12];
|
||||
struct i2c_msg msg = {
|
||||
.addr = priv->i2c_address,
|
||||
.flags = 0,
|
||||
.buf = buf,
|
||||
.len = 12
|
||||
};
|
||||
|
||||
dprintk("%s:\n", __func__);
|
||||
|
||||
freq_mhz = params->frequency / 1000;
|
||||
bandwidth = params->u.qpsk.symbol_rate / 1000000;
|
||||
|
||||
if (bandwidth > 31)
|
||||
bandwidth = 31;
|
||||
|
||||
if ((freq_mhz > 949) && (freq_mhz < 2151)) {
|
||||
buf[0] = 0x01;
|
||||
buf[1] = 0xac;
|
||||
if (freq_mhz < 1950)
|
||||
buf[1] = 0xaa;
|
||||
if (freq_mhz < 1800)
|
||||
buf[1] = 0xa8;
|
||||
if (freq_mhz < 1650)
|
||||
buf[1] = 0xa6;
|
||||
if (freq_mhz < 1530)
|
||||
buf[1] = 0xa5;
|
||||
if (freq_mhz < 1470)
|
||||
buf[1] = 0xa4;
|
||||
if (freq_mhz < 1370)
|
||||
buf[1] = 0xa2;
|
||||
if (freq_mhz < 1300)
|
||||
buf[1] = 0xa1;
|
||||
if (freq_mhz < 1200)
|
||||
buf[1] = 0xa0;
|
||||
if (freq_mhz < 1075)
|
||||
buf[1] = 0xbc;
|
||||
if (freq_mhz < 1000)
|
||||
buf[1] = 0xba;
|
||||
if (freq_mhz < 1075) {
|
||||
n = freq_mhz / 8; /* vco=lo*4 */
|
||||
m = 2;
|
||||
} else {
|
||||
n = freq_mhz / 16; /* vco=lo*2 */
|
||||
m = 1;
|
||||
}
|
||||
buf[2] = n >> 1;
|
||||
buf[3] = (unsigned char)(((n & 1) << 7) |
|
||||
(m * freq_mhz - n * 16) | 0x60);
|
||||
buf[4] = 0x04;
|
||||
buf[5] = 0x0e;
|
||||
|
||||
buf[6] = (unsigned char)(bandwidth);
|
||||
|
||||
buf[7] = 0xd8;
|
||||
buf[8] = 0xd0;
|
||||
buf[9] = 0x50;
|
||||
buf[10] = 0xeb;
|
||||
buf[11] = 0x4f;
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
|
||||
ret = i2c_transfer(priv->i2c, &msg, 1);
|
||||
if (ret != 1)
|
||||
dprintk("%s: i2c error\n", __func__);
|
||||
|
||||
udelay(10);
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
|
||||
buf[0] = 0x07;
|
||||
buf[1] = 0xdf;
|
||||
buf[2] = 0xd0;
|
||||
buf[3] = 0x50;
|
||||
buf[4] = 0xfb;
|
||||
msg.len = 5;
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
|
||||
ret = i2c_transfer(priv->i2c, &msg, 1);
|
||||
if (ret != 1)
|
||||
dprintk("%s: i2c error\n", __func__);
|
||||
|
||||
udelay(10);
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
|
||||
priv->frequency = freq_mhz * 1000;
|
||||
|
||||
return (ret == 1) ? 0 : ret;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int stb6000_get_frequency(struct dvb_frontend *fe, u32 *frequency)
|
||||
{
|
||||
struct stb6000_priv *priv = fe->tuner_priv;
|
||||
*frequency = priv->frequency;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dvb_tuner_ops stb6000_tuner_ops = {
|
||||
.info = {
|
||||
.name = "ST STB6000",
|
||||
.frequency_min = 950000,
|
||||
.frequency_max = 2150000
|
||||
},
|
||||
.release = stb6000_release,
|
||||
.sleep = stb6000_sleep,
|
||||
.set_params = stb6000_set_params,
|
||||
.get_frequency = stb6000_get_frequency,
|
||||
};
|
||||
|
||||
struct dvb_frontend *stb6000_attach(struct dvb_frontend *fe, int addr,
|
||||
struct i2c_adapter *i2c)
|
||||
{
|
||||
struct stb6000_priv *priv = NULL;
|
||||
u8 b1[] = { 0, 0 };
|
||||
struct i2c_msg msg[2] = {
|
||||
{
|
||||
.addr = addr,
|
||||
.flags = 0,
|
||||
.buf = NULL,
|
||||
.len = 0
|
||||
}, {
|
||||
.addr = addr,
|
||||
.flags = I2C_M_RD,
|
||||
.buf = b1,
|
||||
.len = 2
|
||||
}
|
||||
};
|
||||
int ret;
|
||||
|
||||
dprintk("%s:\n", __func__);
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
|
||||
/* is some i2c device here ? */
|
||||
ret = i2c_transfer(i2c, msg, 2);
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
|
||||
if (ret != 2)
|
||||
return NULL;
|
||||
|
||||
priv = kzalloc(sizeof(struct stb6000_priv), GFP_KERNEL);
|
||||
if (priv == NULL)
|
||||
return NULL;
|
||||
|
||||
priv->i2c_address = addr;
|
||||
priv->i2c = i2c;
|
||||
|
||||
memcpy(&fe->ops.tuner_ops, &stb6000_tuner_ops,
|
||||
sizeof(struct dvb_tuner_ops));
|
||||
|
||||
fe->tuner_priv = priv;
|
||||
|
||||
return fe;
|
||||
}
|
||||
EXPORT_SYMBOL(stb6000_attach);
|
||||
|
||||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
|
||||
|
||||
MODULE_DESCRIPTION("DVB STB6000 driver");
|
||||
MODULE_AUTHOR("Igor M. Liplianin <liplianin@me.by>");
|
||||
MODULE_LICENSE("GPL");
|
||||
51
drivers/media/dvb/frontends/stb6000.h
Normal file
51
drivers/media/dvb/frontends/stb6000.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
Driver for ST stb6000 DVBS Silicon tuner
|
||||
|
||||
Copyright (C) 2008 Igor M. Liplianin (liplianin@me.by)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __DVB_STB6000_H__
|
||||
#define __DVB_STB6000_H__
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include "dvb_frontend.h"
|
||||
|
||||
/**
|
||||
* Attach a stb6000 tuner to the supplied frontend structure.
|
||||
*
|
||||
* @param fe Frontend to attach to.
|
||||
* @param addr i2c address of the tuner.
|
||||
* @param i2c i2c adapter to use.
|
||||
* @return FE pointer on success, NULL on failure.
|
||||
*/
|
||||
#if defined(CONFIG_DVB_STB6000) || (defined(CONFIG_DVB_STB6000_MODULE) \
|
||||
&& defined(MODULE))
|
||||
extern struct dvb_frontend *stb6000_attach(struct dvb_frontend *fe, int addr,
|
||||
struct i2c_adapter *i2c);
|
||||
#else
|
||||
static inline struct dvb_frontend *stb6000_attach(struct dvb_frontend *fe,
|
||||
int addr,
|
||||
struct i2c_adapter *i2c)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_DVB_STB6000 */
|
||||
|
||||
#endif /* __DVB_STB6000_H__ */
|
||||
606
drivers/media/dvb/frontends/stv0288.c
Normal file
606
drivers/media/dvb/frontends/stv0288.c
Normal file
File diff suppressed because it is too large
Load Diff
65
drivers/media/dvb/frontends/stv0288.h
Normal file
65
drivers/media/dvb/frontends/stv0288.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
Driver for ST STV0288 demodulator
|
||||
|
||||
Copyright (C) 2006 Georg Acher, BayCom GmbH, acher (at) baycom (dot) de
|
||||
for Reel Multimedia
|
||||
Copyright (C) 2008 TurboSight.com, <bob@turbosight.com>
|
||||
Copyright (C) 2008 Igor M. Liplianin <liplianin@me.by>
|
||||
Removed stb6000 specific tuner code and revised some
|
||||
procedures.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef STV0288_H
|
||||
#define STV0288_H
|
||||
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include "dvb_frontend.h"
|
||||
|
||||
struct stv0288_config {
|
||||
/* the demodulator's i2c address */
|
||||
u8 demod_address;
|
||||
|
||||
/* minimum delay before retuning */
|
||||
int min_delay_ms;
|
||||
|
||||
int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_STV0288) || (defined(CONFIG_DVB_STV0288_MODULE) && \
|
||||
defined(MODULE))
|
||||
extern struct dvb_frontend *stv0288_attach(const struct stv0288_config *config,
|
||||
struct i2c_adapter *i2c);
|
||||
#else
|
||||
static inline struct dvb_frontend *stv0288_attach(const struct stv0288_config *config,
|
||||
struct i2c_adapter *i2c)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_DVB_STV0288 */
|
||||
|
||||
static inline int stv0288_writereg(struct dvb_frontend *fe, u8 reg, u8 val)
|
||||
{
|
||||
int r = 0;
|
||||
u8 buf[] = { reg, val };
|
||||
if (fe->ops.write)
|
||||
r = fe->ops.write(fe, buf, 2);
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif /* STV0288_H */
|
||||
@@ -559,6 +559,8 @@ static int stv0299_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
|
||||
int invval = 0;
|
||||
|
||||
dprintk ("%s : FE_SET_FRONTEND\n", __func__);
|
||||
if (state->config->set_ts_params)
|
||||
state->config->set_ts_params(fe, 0);
|
||||
|
||||
// set the inversion
|
||||
if (p->inversion == INVERSION_OFF) invval = 0;
|
||||
|
||||
@@ -89,15 +89,18 @@ struct stv0299_config
|
||||
int min_delay_ms;
|
||||
|
||||
/* Set the symbol rate */
|
||||
int (*set_symbol_rate)(struct dvb_frontend* fe, u32 srate, u32 ratio);
|
||||
int (*set_symbol_rate)(struct dvb_frontend *fe, u32 srate, u32 ratio);
|
||||
|
||||
/* Set device param to start dma */
|
||||
int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_STV0299) || (defined(CONFIG_DVB_STV0299_MODULE) && defined(MODULE))
|
||||
extern struct dvb_frontend* stv0299_attach(const struct stv0299_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
extern struct dvb_frontend *stv0299_attach(const struct stv0299_config *config,
|
||||
struct i2c_adapter *i2c);
|
||||
#else
|
||||
static inline struct dvb_frontend* stv0299_attach(const struct stv0299_config* config,
|
||||
struct i2c_adapter* i2c)
|
||||
static inline struct dvb_frontend *stv0299_attach(const struct stv0299_config *config,
|
||||
struct i2c_adapter *i2c)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
return NULL;
|
||||
|
||||
@@ -59,6 +59,9 @@ config VIDEO_CX88_DVB
|
||||
select MEDIA_TUNER_SIMPLE if !DVB_FE_CUSTOMISE
|
||||
select DVB_S5H1411 if !DVB_FE_CUSTOMISE
|
||||
select DVB_CX24116 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0299 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0288 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STB6000 if !DVB_FE_CUSTOMISE
|
||||
---help---
|
||||
This adds support for DVB/ATSC cards based on the
|
||||
Conexant 2388x chip.
|
||||
|
||||
@@ -1732,6 +1732,18 @@ static const struct cx88_board cx88_boards[] = {
|
||||
} },
|
||||
.mpeg = CX88_MPEG_DVB,
|
||||
},
|
||||
[CX88_BOARD_TEVII_S420] = {
|
||||
.name = "TeVii S420 DVB-S",
|
||||
.tuner_type = UNSET,
|
||||
.radio_type = UNSET,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
.input = {{
|
||||
.type = CX88_VMUX_DVB,
|
||||
.vmux = 0,
|
||||
} },
|
||||
.mpeg = CX88_MPEG_DVB,
|
||||
},
|
||||
[CX88_BOARD_TEVII_S460] = {
|
||||
.name = "TeVii S460 DVB-S/S2",
|
||||
.tuner_type = UNSET,
|
||||
@@ -2138,7 +2150,11 @@ static const struct cx88_subid cx88_subids[] = {
|
||||
.subdevice = 0x6906,
|
||||
.card = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
|
||||
}, {
|
||||
.subvendor = 0xD460,
|
||||
.subvendor = 0xd420,
|
||||
.subdevice = 0x9022,
|
||||
.card = CX88_BOARD_TEVII_S420,
|
||||
}, {
|
||||
.subvendor = 0xd460,
|
||||
.subdevice = 0x9022,
|
||||
.card = CX88_BOARD_TEVII_S460,
|
||||
}, {
|
||||
@@ -2730,6 +2746,7 @@ static void cx88_card_setup(struct cx88_core *core)
|
||||
cx88_call_i2c_clients(core, TUNER_SET_CONFIG, &tea5767_cfg);
|
||||
break;
|
||||
}
|
||||
case CX88_BOARD_TEVII_S420:
|
||||
case CX88_BOARD_TEVII_S460:
|
||||
cx_write(MO_SRST_IO, 0);
|
||||
msleep(100);
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
#include "tuner-simple.h"
|
||||
#include "tda9887.h"
|
||||
#include "s5h1411.h"
|
||||
#include "stv0299.h"
|
||||
#include "z0194a.h"
|
||||
#include "stv0288.h"
|
||||
#include "stb6000.h"
|
||||
#include "cx24116.h"
|
||||
|
||||
MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
|
||||
@@ -579,6 +583,25 @@ static struct cx24116_config tevii_s460_config = {
|
||||
.reset_device = cx24116_reset_device,
|
||||
};
|
||||
|
||||
static struct stv0299_config tevii_tuner_sharp_config = {
|
||||
.demod_address = 0x68,
|
||||
.inittab = sharp_z0194a__inittab,
|
||||
.mclk = 88000000UL,
|
||||
.invert = 1,
|
||||
.skip_reinit = 0,
|
||||
.lock_output = 1,
|
||||
.volt13_op0_op1 = STV0299_VOLT13_OP1,
|
||||
.min_delay_ms = 100,
|
||||
.set_symbol_rate = sharp_z0194a__set_symbol_rate,
|
||||
.set_ts_params = cx24116_set_ts_param,
|
||||
};
|
||||
|
||||
static struct stv0288_config tevii_tuner_earda_config = {
|
||||
.demod_address = 0x68,
|
||||
.min_delay_ms = 100,
|
||||
.set_ts_params = cx24116_set_ts_param,
|
||||
};
|
||||
|
||||
static int dvb_register(struct cx8802_dev *dev)
|
||||
{
|
||||
struct cx88_core *core = dev->core;
|
||||
@@ -949,6 +972,31 @@ static int dvb_register(struct cx8802_dev *dev)
|
||||
0x08, ISL6421_DCL, 0x00);
|
||||
}
|
||||
break;
|
||||
case CX88_BOARD_TEVII_S420:
|
||||
dev->dvb.frontend = dvb_attach(stv0299_attach,
|
||||
&tevii_tuner_sharp_config,
|
||||
&core->i2c_adap);
|
||||
if (dev->dvb.frontend != NULL) {
|
||||
if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60,
|
||||
&core->i2c_adap, DVB_PLL_OPERA1))
|
||||
goto frontend_detach;
|
||||
core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage;
|
||||
dev->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
|
||||
|
||||
} else {
|
||||
dev->dvb.frontend = dvb_attach(stv0288_attach,
|
||||
&tevii_tuner_earda_config,
|
||||
&core->i2c_adap);
|
||||
if (dev->dvb.frontend != NULL) {
|
||||
if (!dvb_attach(stb6000_attach, dev->dvb.frontend, 0x61,
|
||||
&core->i2c_adap))
|
||||
goto frontend_detach;
|
||||
core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage;
|
||||
dev->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CX88_BOARD_TEVII_S460:
|
||||
dev->dvb.frontend = dvb_attach(cx24116_attach,
|
||||
&tevii_s460_config,
|
||||
|
||||
@@ -226,6 +226,7 @@ extern struct sram_channel cx88_sram_channels[];
|
||||
#define CX88_BOARD_TEVII_S460 70
|
||||
#define CX88_BOARD_OMICOM_SS4_PCI 71
|
||||
#define CX88_BOARD_TBS_8920 72
|
||||
#define CX88_BOARD_TEVII_S420 73
|
||||
|
||||
enum cx88_itype {
|
||||
CX88_VMUX_COMPOSITE1 = 1,
|
||||
|
||||
Reference in New Issue
Block a user