mirror of
https://github.com/adulau/aha.git
synced 2025-01-02 14:13:18 +00:00
V4L/DVB (3984): Fix CI interface on KNC1 DVBT and DVBC cards
These cards need special handling for CI - reinitialising the frontend device when the CI module is reset. Additionally the tda10021 needs to be set into a different transport stream mode when a CI module is present. Signed-off-by: Andrew de Quincey <adq_dvb@lidskialf.net> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
48c35756a7
commit
5c1208ba45
4 changed files with 154 additions and 77 deletions
|
@ -1060,8 +1060,18 @@ static int dvb_ca_en50221_thread(void *data)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DVB_CA_SLOTSTATE_VALIDATE:
|
case DVB_CA_SLOTSTATE_VALIDATE:
|
||||||
if (dvb_ca_en50221_parse_attributes(ca, slot)
|
if (dvb_ca_en50221_parse_attributes(ca, slot) != 0) {
|
||||||
!= 0) {
|
/* we need this extra check for annoying interfaces like the budget-av */
|
||||||
|
if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
|
||||||
|
(ca->pub->poll_slot_status)) {
|
||||||
|
int status = ca->pub->poll_slot_status(ca->pub, slot, 0);
|
||||||
|
if (!(status & DVB_CA_EN50221_POLL_CAM_PRESENT)) {
|
||||||
|
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
|
||||||
|
dvb_ca_en50221_thread_update_delay(ca);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
printk("dvb_ca adapter %d: Invalid PC card inserted :(\n",
|
printk("dvb_ca adapter %d: Invalid PC card inserted :(\n",
|
||||||
ca->dvbdev->adapter->num);
|
ca->dvbdev->adapter->num);
|
||||||
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
|
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
|
||||||
|
@ -1108,6 +1118,17 @@ static int dvb_ca_en50221_thread(void *data)
|
||||||
|
|
||||||
case DVB_CA_SLOTSTATE_LINKINIT:
|
case DVB_CA_SLOTSTATE_LINKINIT:
|
||||||
if (dvb_ca_en50221_link_init(ca, slot) != 0) {
|
if (dvb_ca_en50221_link_init(ca, slot) != 0) {
|
||||||
|
/* we need this extra check for annoying interfaces like the budget-av */
|
||||||
|
if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
|
||||||
|
(ca->pub->poll_slot_status)) {
|
||||||
|
int status = ca->pub->poll_slot_status(ca->pub, slot, 0);
|
||||||
|
if (!(status & DVB_CA_EN50221_POLL_CAM_PRESENT)) {
|
||||||
|
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
|
||||||
|
dvb_ca_en50221_thread_update_delay(ca);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
printk("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n", ca->dvbdev->adapter->num);
|
printk("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n", ca->dvbdev->adapter->num);
|
||||||
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
|
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
|
||||||
dvb_ca_en50221_thread_update_delay(ca);
|
dvb_ca_en50221_thread_update_delay(ca);
|
||||||
|
|
|
@ -90,6 +90,14 @@ static int tda10021_writereg (struct tda10021_state* state, u8 reg, u8 data)
|
||||||
return (ret != 1) ? -EREMOTEIO : 0;
|
return (ret != 1) ? -EREMOTEIO : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tda10021_write_byte(struct dvb_frontend* fe, int reg, int data)
|
||||||
|
{
|
||||||
|
struct tda10021_state* state = fe->demodulator_priv;
|
||||||
|
|
||||||
|
return tda10021_writereg(state, reg, data);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(tda10021_write_byte);
|
||||||
|
|
||||||
static u8 tda10021_readreg (struct tda10021_state* state, u8 reg)
|
static u8 tda10021_readreg (struct tda10021_state* state, u8 reg)
|
||||||
{
|
{
|
||||||
u8 b0 [] = { reg };
|
u8 b0 [] = { reg };
|
||||||
|
|
|
@ -35,4 +35,6 @@ struct tda10021_config
|
||||||
extern struct dvb_frontend* tda10021_attach(const struct tda10021_config* config,
|
extern struct dvb_frontend* tda10021_attach(const struct tda10021_config* config,
|
||||||
struct i2c_adapter* i2c, u8 pwm);
|
struct i2c_adapter* i2c, u8 pwm);
|
||||||
|
|
||||||
|
extern int tda10021_write_byte(struct dvb_frontend* fe, int reg, int data);
|
||||||
|
|
||||||
#endif // TDA10021_H
|
#endif // TDA10021_H
|
||||||
|
|
|
@ -50,6 +50,12 @@
|
||||||
|
|
||||||
#define DEBICICAM 0x02420000
|
#define DEBICICAM 0x02420000
|
||||||
|
|
||||||
|
#define SLOTSTATUS_NONE 1
|
||||||
|
#define SLOTSTATUS_PRESENT 2
|
||||||
|
#define SLOTSTATUS_RESET 4
|
||||||
|
#define SLOTSTATUS_READY 8
|
||||||
|
#define SLOTSTATUS_OCCUPIED (SLOTSTATUS_PRESENT|SLOTSTATUS_RESET|SLOTSTATUS_READY)
|
||||||
|
|
||||||
struct budget_av {
|
struct budget_av {
|
||||||
struct budget budget;
|
struct budget budget;
|
||||||
struct video_device *vd;
|
struct video_device *vd;
|
||||||
|
@ -58,8 +64,15 @@ struct budget_av {
|
||||||
struct tasklet_struct ciintf_irq_tasklet;
|
struct tasklet_struct ciintf_irq_tasklet;
|
||||||
int slot_status;
|
int slot_status;
|
||||||
struct dvb_ca_en50221 ca;
|
struct dvb_ca_en50221 ca;
|
||||||
|
u8 reinitialise_demod:1;
|
||||||
|
u8 tda10021_poclkp:1;
|
||||||
|
u8 tda10021_ts_enabled;
|
||||||
|
int (*tda10021_set_frontend)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int ciintf_slot_shutdown(struct dvb_ca_en50221 *ca, int slot);
|
||||||
|
|
||||||
|
|
||||||
/* GPIO Connections:
|
/* GPIO Connections:
|
||||||
* 0 - Vcc/Reset (Reset is controlled by capacitor). Resets the frontend *AS WELL*!
|
* 0 - Vcc/Reset (Reset is controlled by capacitor). Resets the frontend *AS WELL*!
|
||||||
* 1 - CI memory select 0=>IO memory, 1=>Attribute Memory
|
* 1 - CI memory select 0=>IO memory, 1=>Attribute Memory
|
||||||
|
@ -129,9 +142,10 @@ static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int ad
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
|
||||||
result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 0xfff, 1, 0, 1);
|
result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 0xfff, 1, 0, 1);
|
||||||
|
if (result == -ETIMEDOUT) {
|
||||||
if (result == -ETIMEDOUT)
|
ciintf_slot_shutdown(ca, slot);
|
||||||
budget_av->slot_status = 0;
|
printk(KERN_INFO "budget-av: cam ejected 1\n");
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,9 +161,10 @@ static int ciintf_write_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int a
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
|
||||||
result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 0xfff, 1, value, 0, 1);
|
result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 0xfff, 1, value, 0, 1);
|
||||||
|
if (result == -ETIMEDOUT) {
|
||||||
if (result == -ETIMEDOUT)
|
ciintf_slot_shutdown(ca, slot);
|
||||||
budget_av->slot_status = 0;
|
printk(KERN_INFO "budget-av: cam ejected 2\n");
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,9 +180,11 @@ static int ciintf_read_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 addre
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
|
||||||
result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 3, 1, 0, 0);
|
result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 3, 1, 0, 0);
|
||||||
|
if ((result == -ETIMEDOUT) || ((result == 0xff) && ((address & 3) < 2))) {
|
||||||
if (result == -ETIMEDOUT)
|
ciintf_slot_shutdown(ca, slot);
|
||||||
budget_av->slot_status = 0;
|
printk(KERN_INFO "budget-av: cam ejected 3\n");
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,9 +200,10 @@ static int ciintf_write_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 addr
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
|
||||||
result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 3, 1, value, 0, 0);
|
result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 3, 1, value, 0, 0);
|
||||||
|
if (result == -ETIMEDOUT) {
|
||||||
if (result == -ETIMEDOUT)
|
ciintf_slot_shutdown(ca, slot);
|
||||||
budget_av->slot_status = 0;
|
printk(KERN_INFO "budget-av: cam ejected 5\n");
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,12 +211,12 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
|
||||||
{
|
{
|
||||||
struct budget_av *budget_av = (struct budget_av *) ca->data;
|
struct budget_av *budget_av = (struct budget_av *) ca->data;
|
||||||
struct saa7146_dev *saa = budget_av->budget.dev;
|
struct saa7146_dev *saa = budget_av->budget.dev;
|
||||||
int timeout = 50; // 5 seconds (4.4.6 Ready)
|
|
||||||
|
|
||||||
if (slot != 0)
|
if (slot != 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
dprintk(1, "ciintf_slot_reset\n");
|
dprintk(1, "ciintf_slot_reset\n");
|
||||||
|
budget_av->slot_status = SLOTSTATUS_RESET;
|
||||||
|
|
||||||
saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */
|
saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */
|
||||||
|
|
||||||
|
@ -208,20 +226,17 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
|
||||||
msleep(20); /* 20 ms Vcc settling time */
|
msleep(20); /* 20 ms Vcc settling time */
|
||||||
|
|
||||||
saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTLO); /* enable card */
|
saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTLO); /* enable card */
|
||||||
|
ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
|
||||||
|
msleep(20);
|
||||||
|
|
||||||
/* This should have been based on pin 16 READY of the pcmcia port,
|
/* reinitialise the frontend if necessary */
|
||||||
* but AFAICS it is not routed to the saa7146 */
|
if (budget_av->reinitialise_demod)
|
||||||
while (--timeout > 0 && ciintf_read_attribute_mem(ca, slot, 0) != 0x1d)
|
dvb_frontend_reinitialise(budget_av->budget.dvb_frontend);
|
||||||
msleep(100);
|
|
||||||
|
|
||||||
/* reinitialise the frontend */
|
/* set tda10021 back to original clock configuration on reset */
|
||||||
dvb_frontend_reinitialise(budget_av->budget.dvb_frontend);
|
if (budget_av->tda10021_poclkp) {
|
||||||
|
tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa0);
|
||||||
if (timeout <= 0)
|
budget_av->tda10021_ts_enabled = 0;
|
||||||
{
|
|
||||||
printk(KERN_ERR "budget-av: cam reset failed (timeout).\n");
|
|
||||||
saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */
|
|
||||||
return -ETIMEDOUT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -238,7 +253,13 @@ static int ciintf_slot_shutdown(struct dvb_ca_en50221 *ca, int slot)
|
||||||
dprintk(1, "ciintf_slot_shutdown\n");
|
dprintk(1, "ciintf_slot_shutdown\n");
|
||||||
|
|
||||||
ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
|
ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
|
||||||
budget_av->slot_status = 0;
|
budget_av->slot_status = SLOTSTATUS_NONE;
|
||||||
|
|
||||||
|
/* set tda10021 back to original clock configuration when cam removed */
|
||||||
|
if (budget_av->tda10021_poclkp) {
|
||||||
|
tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa0);
|
||||||
|
budget_av->tda10021_ts_enabled = 0;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,6 +274,13 @@ static int ciintf_slot_ts_enable(struct dvb_ca_en50221 *ca, int slot)
|
||||||
dprintk(1, "ciintf_slot_ts_enable: %d\n", budget_av->slot_status);
|
dprintk(1, "ciintf_slot_ts_enable: %d\n", budget_av->slot_status);
|
||||||
|
|
||||||
ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTA);
|
ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTA);
|
||||||
|
|
||||||
|
/* tda10021 seems to need a different TS clock config when data is routed to the CAM */
|
||||||
|
if (budget_av->tda10021_poclkp) {
|
||||||
|
tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa1);
|
||||||
|
budget_av->tda10021_ts_enabled = 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,50 +288,61 @@ static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open
|
||||||
{
|
{
|
||||||
struct budget_av *budget_av = (struct budget_av *) ca->data;
|
struct budget_av *budget_av = (struct budget_av *) ca->data;
|
||||||
struct saa7146_dev *saa = budget_av->budget.dev;
|
struct saa7146_dev *saa = budget_av->budget.dev;
|
||||||
int cam_present = 0;
|
int result;
|
||||||
|
|
||||||
if (slot != 0)
|
if (slot != 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!budget_av->slot_status)
|
/* test the card detect line - needs to be done carefully
|
||||||
{
|
* since it never goes high for some CAMs on this interface (e.g. topuptv) */
|
||||||
// first of all test the card detect line
|
if (budget_av->slot_status == SLOTSTATUS_NONE) {
|
||||||
saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
|
saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
|
||||||
udelay(1);
|
udelay(1);
|
||||||
if (saa7146_read(saa, PSR) & MASK_06)
|
if (saa7146_read(saa, PSR) & MASK_06) {
|
||||||
{
|
if (budget_av->slot_status == SLOTSTATUS_NONE) {
|
||||||
cam_present = 1;
|
budget_av->slot_status = SLOTSTATUS_PRESENT;
|
||||||
}
|
printk(KERN_INFO "budget-av: cam inserted A\n");
|
||||||
saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
|
|
||||||
|
|
||||||
// that is unreliable however, so try and read from IO memory
|
|
||||||
if (!cam_present)
|
|
||||||
{
|
|
||||||
saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO);
|
|
||||||
if (ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1) != -ETIMEDOUT)
|
|
||||||
{
|
|
||||||
cam_present = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
|
||||||
|
}
|
||||||
|
|
||||||
// did we find something?
|
/* We also try and read from IO memory to work round the above detection bug. If
|
||||||
if (cam_present) {
|
* there is no CAM, we will get a timeout. Only done if there is no cam
|
||||||
printk(KERN_INFO "budget-av: cam inserted\n");
|
* present, since this test actually breaks some cams :(
|
||||||
budget_av->slot_status = 1;
|
*
|
||||||
}
|
* if the CI interface is not open, we also do the above test since we
|
||||||
} else if (!open) {
|
* don't care if the cam has problems - we'll be resetting it on open() anyway */
|
||||||
|
if ((budget_av->slot_status == SLOTSTATUS_NONE) || (!open)) {
|
||||||
saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO);
|
saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO);
|
||||||
if (ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1) == -ETIMEDOUT)
|
result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1);
|
||||||
{
|
if ((result >= 0) && (budget_av->slot_status == SLOTSTATUS_NONE)) {
|
||||||
printk(KERN_INFO "budget-av: cam ejected\n");
|
budget_av->slot_status = SLOTSTATUS_PRESENT;
|
||||||
saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */
|
printk(KERN_INFO "budget-av: cam inserted B\n");
|
||||||
budget_av->slot_status = 0;
|
} else if (result < 0) {
|
||||||
|
if (budget_av->slot_status != SLOTSTATUS_NONE) {
|
||||||
|
ciintf_slot_shutdown(ca, slot);
|
||||||
|
printk(KERN_INFO "budget-av: cam ejected 5\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (budget_av->slot_status == 1)
|
/* read from attribute memory in reset/ready state to know when the CAM is ready */
|
||||||
return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
|
if (budget_av->slot_status == SLOTSTATUS_RESET) {
|
||||||
|
result = ciintf_read_attribute_mem(ca, slot, 0);
|
||||||
|
if (result == 0x1d) {
|
||||||
|
budget_av->slot_status = SLOTSTATUS_READY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* work out correct return code */
|
||||||
|
if (budget_av->slot_status != SLOTSTATUS_NONE) {
|
||||||
|
if (budget_av->slot_status & SLOTSTATUS_READY) {
|
||||||
|
return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
|
||||||
|
}
|
||||||
|
return DVB_CA_EN50221_POLL_CAM_PRESENT;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,6 +372,8 @@ static int ciintf_init(struct budget_av *budget_av)
|
||||||
budget_av->ca.slot_ts_enable = ciintf_slot_ts_enable;
|
budget_av->ca.slot_ts_enable = ciintf_slot_ts_enable;
|
||||||
budget_av->ca.poll_slot_status = ciintf_poll_slot_status;
|
budget_av->ca.poll_slot_status = ciintf_poll_slot_status;
|
||||||
budget_av->ca.data = budget_av;
|
budget_av->ca.data = budget_av;
|
||||||
|
budget_av->budget.ci_present = 1;
|
||||||
|
budget_av->slot_status = SLOTSTATUS_NONE;
|
||||||
|
|
||||||
if ((result = dvb_ca_en50221_init(&budget_av->budget.dvb_adapter,
|
if ((result = dvb_ca_en50221_init(&budget_av->budget.dvb_adapter,
|
||||||
&budget_av->ca, 0, 1)) != 0) {
|
&budget_av->ca, 0, 1)) != 0) {
|
||||||
|
@ -341,7 +382,6 @@ static int ciintf_init(struct budget_av *budget_av)
|
||||||
}
|
}
|
||||||
|
|
||||||
printk(KERN_INFO "budget-av: ci interface initialised.\n");
|
printk(KERN_INFO "budget-av: ci interface initialised.\n");
|
||||||
budget_av->budget.ci_present = 1;
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
@ -976,7 +1016,7 @@ static int philips_sd1878_ci_set_symbol_rate(struct dvb_frontend *fe,
|
||||||
|
|
||||||
static struct stv0299_config philips_sd1878_config = {
|
static struct stv0299_config philips_sd1878_config = {
|
||||||
.demod_address = 0x68,
|
.demod_address = 0x68,
|
||||||
.inittab = philips_sd1878_inittab,
|
.inittab = philips_sd1878_inittab,
|
||||||
.mclk = 88000000UL,
|
.mclk = 88000000UL,
|
||||||
.invert = 0,
|
.invert = 0,
|
||||||
.skip_reinit = 0,
|
.skip_reinit = 0,
|
||||||
|
@ -1018,6 +1058,23 @@ static u8 read_pwm(struct budget_av *budget_av)
|
||||||
#define SUBID_DVBT_KNC1 0x0030
|
#define SUBID_DVBT_KNC1 0x0030
|
||||||
#define SUBID_DVBT_CINERGY1200 0x1157
|
#define SUBID_DVBT_CINERGY1200 0x1157
|
||||||
|
|
||||||
|
|
||||||
|
static int tda10021_set_frontend(struct dvb_frontend *fe,
|
||||||
|
struct dvb_frontend_parameters *p)
|
||||||
|
{
|
||||||
|
struct budget_av* budget_av = fe->dvb->priv;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = budget_av->tda10021_set_frontend(fe, p);
|
||||||
|
if (budget_av->tda10021_ts_enabled) {
|
||||||
|
tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa1);
|
||||||
|
} else {
|
||||||
|
tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void frontend_init(struct budget_av *budget_av)
|
static void frontend_init(struct budget_av *budget_av)
|
||||||
{
|
{
|
||||||
struct saa7146_dev * saa = budget_av->budget.dev;
|
struct saa7146_dev * saa = budget_av->budget.dev;
|
||||||
|
@ -1083,34 +1140,23 @@ static void frontend_init(struct budget_av *budget_av)
|
||||||
|
|
||||||
case SUBID_DVBC_KNC1:
|
case SUBID_DVBC_KNC1:
|
||||||
case SUBID_DVBC_KNC1_PLUS:
|
case SUBID_DVBC_KNC1_PLUS:
|
||||||
|
case SUBID_DVBC_CINERGY1200:
|
||||||
|
budget_av->reinitialise_demod = 1;
|
||||||
fe = tda10021_attach(&philips_cu1216_config,
|
fe = tda10021_attach(&philips_cu1216_config,
|
||||||
&budget_av->budget.i2c_adap,
|
&budget_av->budget.i2c_adap,
|
||||||
read_pwm(budget_av));
|
read_pwm(budget_av));
|
||||||
if (fe) {
|
if (fe) {
|
||||||
|
budget_av->tda10021_poclkp = 1;
|
||||||
|
budget_av->tda10021_set_frontend = fe->ops->set_frontend;
|
||||||
|
fe->ops->set_frontend = tda10021_set_frontend;
|
||||||
fe->ops->tuner_ops.set_params = philips_cu1216_tuner_set_params;
|
fe->ops->tuner_ops.set_params = philips_cu1216_tuner_set_params;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBID_DVBT_KNC1:
|
case SUBID_DVBT_KNC1:
|
||||||
case SUBID_DVBT_KNC1_PLUS:
|
case SUBID_DVBT_KNC1_PLUS:
|
||||||
fe = tda10046_attach(&philips_tu1216_config,
|
|
||||||
&budget_av->budget.i2c_adap);
|
|
||||||
if (fe) {
|
|
||||||
fe->ops->tuner_ops.init = philips_tu1216_tuner_init;
|
|
||||||
fe->ops->tuner_ops.set_params = philips_tu1216_tuner_set_params;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SUBID_DVBC_CINERGY1200:
|
|
||||||
fe = tda10021_attach(&philips_cu1216_config,
|
|
||||||
&budget_av->budget.i2c_adap,
|
|
||||||
read_pwm(budget_av));
|
|
||||||
if (fe) {
|
|
||||||
fe->ops->tuner_ops.set_params = philips_cu1216_tuner_set_params;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SUBID_DVBT_CINERGY1200:
|
case SUBID_DVBT_CINERGY1200:
|
||||||
|
budget_av->reinitialise_demod = 1;
|
||||||
fe = tda10046_attach(&philips_tu1216_config,
|
fe = tda10046_attach(&philips_tu1216_config,
|
||||||
&budget_av->budget.i2c_adap);
|
&budget_av->budget.i2c_adap);
|
||||||
if (fe) {
|
if (fe) {
|
||||||
|
|
Loading…
Reference in a new issue