Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+77 −21
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@

    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
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
@@ -573,6 +575,7 @@ static int cx24123_initfe(struct dvb_frontend* fe)
		state->config->pll_init(fe);

	/* Configure the LNB for 14V */
	if (state->config->use_isl6421)
		cx24123_writelnbreg(state, 0x0, 0x2a);

	return 0;
@@ -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;
	u8 val;

	switch (state->config->use_isl6421) {

	case 1:

		val = cx24123_readlnbreg(state, 0x0);

		switch (voltage) {
@@ -595,6 +602,33 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
		default:
			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,
@@ -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;
	u8 val;

	switch (state->config->use_isl6421) {
	case 1:

		val = cx24123_readlnbreg(state, 0x0);

		switch (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);
			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)
+9 −0
Original line number Diff line number Diff line
@@ -28,12 +28,21 @@ struct cx24123_config
	/* the demodulator's i2c 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 */
	int (*pll_init)(struct dvb_frontend* fe);
	int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);

	/* Need to set device param for start_dma */
	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,