Commit 1c956a3a authored by Vadim Catana's avatar Vadim Catana Committed by Mauro Carvalho Chehab

DVB (2451): Add support for KWorld DVB-S 100, based on the same chips as Hauppauge


- Add support for KWorld DVB-S 100, based on the same chips as Hauppauge
Nova-S Plus (CX23883/CX24123/CX24109), without the Intersil ISL6421,
which is used for LNB control.
- LNB voltage and tone are controled by LNBDC and LNBTone bits from
register 0x29 of the CX24123 demodulator.
- The MO_GP0_IO register from CX23883 is used to turn LNB power on and off.
Signed-off-by: default avatarVadim Catana <skystar@moldova.cc>
Acked-by: default avatarJohannes Stezenbach <js@linuxtv.org>
Signed-off-by: default avatarMichael Krufky <mkrufky@m1k.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@brturbo.com.br>
parent e3b152bc
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
Copyright (C) 2005 Steven Toth <stoth@hauppauge.com> Copyright (C) 2005 Steven Toth <stoth@hauppauge.com>
Support for KWorld DVB-S 100 by Vadim Catana <skystar@moldova.cc>
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
...@@ -573,6 +575,7 @@ static int cx24123_initfe(struct dvb_frontend* fe) ...@@ -573,6 +575,7 @@ static int cx24123_initfe(struct dvb_frontend* fe)
state->config->pll_init(fe); state->config->pll_init(fe);
/* Configure the LNB for 14V */ /* Configure the LNB for 14V */
if (state->config->use_isl6421)
cx24123_writelnbreg(state, 0x0, 0x2a); cx24123_writelnbreg(state, 0x0, 0x2a);
return 0; return 0;
...@@ -583,6 +586,10 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage ...@@ -583,6 +586,10 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
struct cx24123_state *state = fe->demodulator_priv; struct cx24123_state *state = fe->demodulator_priv;
u8 val; u8 val;
switch (state->config->use_isl6421) {
case 1:
val = cx24123_readlnbreg(state, 0x0); val = cx24123_readlnbreg(state, 0x0);
switch (voltage) { switch (voltage) {
...@@ -595,6 +602,33 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage ...@@ -595,6 +602,33 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
default: default:
return -EINVAL; return -EINVAL;
}; };
case 0:
val = cx24123_readreg(state, 0x29);
switch (voltage) {
case SEC_VOLTAGE_13:
dprintk("%s: setting voltage 13V\n", __FUNCTION__);
if (state->config->enable_lnb_voltage)
state->config->enable_lnb_voltage(fe, 1);
return cx24123_writereg(state, 0x29, val | 0x80);
case SEC_VOLTAGE_18:
dprintk("%s: setting voltage 18V\n", __FUNCTION__);
if (state->config->enable_lnb_voltage)
state->config->enable_lnb_voltage(fe, 1);
return cx24123_writereg(state, 0x29, val & 0x7f);
case SEC_VOLTAGE_OFF:
dprintk("%s: setting voltage off\n", __FUNCTION__);
if (state->config->enable_lnb_voltage)
state->config->enable_lnb_voltage(fe, 0);
return 0;
default:
return -EINVAL;
};
}
return 0;
} }
static int cx24123_send_diseqc_msg(struct dvb_frontend* fe, static int cx24123_send_diseqc_msg(struct dvb_frontend* fe,
...@@ -729,6 +763,9 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) ...@@ -729,6 +763,9 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
struct cx24123_state *state = fe->demodulator_priv; struct cx24123_state *state = fe->demodulator_priv;
u8 val; u8 val;
switch (state->config->use_isl6421) {
case 1:
val = cx24123_readlnbreg(state, 0x0); val = cx24123_readlnbreg(state, 0x0);
switch (tone) { switch (tone) {
...@@ -740,6 +777,25 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) ...@@ -740,6 +777,25 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone); printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone);
return -EINVAL; return -EINVAL;
} }
case 0:
val = cx24123_readreg(state, 0x29);
switch (tone) {
case SEC_TONE_ON:
dprintk("%s: setting tone on\n", __FUNCTION__);
return cx24123_writereg(state, 0x29, val | 0x10);
case SEC_TONE_OFF:
dprintk("%s: setting tone off\n",__FUNCTION__);
return cx24123_writereg(state, 0x29, val & 0xef);
default:
printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone);
return -EINVAL;
}
}
return 0;
} }
static void cx24123_release(struct dvb_frontend* fe) static void cx24123_release(struct dvb_frontend* fe)
......
...@@ -28,12 +28,21 @@ struct cx24123_config ...@@ -28,12 +28,21 @@ struct cx24123_config
/* the demodulator's i2c address */ /* the demodulator's i2c address */
u8 demod_address; u8 demod_address;
/*
cards like Hauppauge Nova-S Plus/Nova-SE2 use an Intersil ISL6421 chip
for LNB control, while KWorld DVB-S 100 use the LNBDC and LNBTone bits
from register 0x29 of the CX24123 demodulator
*/
int use_isl6421;
/* PLL maintenance */ /* PLL maintenance */
int (*pll_init)(struct dvb_frontend* fe); int (*pll_init)(struct dvb_frontend* fe);
int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
/* Need to set device param for start_dma */ /* Need to set device param for start_dma */
int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured);
void (*enable_lnb_voltage)(struct dvb_frontend* fe, int on);
}; };
extern struct dvb_frontend* cx24123_attach(const struct cx24123_config* config, extern struct dvb_frontend* cx24123_attach(const struct cx24123_config* config,
......
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