Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 5245
b: refs/heads/master
c: 6ddcc91
h: refs/heads/master
i:
  5243: bfbde5f
v: v3
  • Loading branch information
Michael Krufky authored and Linus Torvalds committed Jul 27, 2005
1 parent cf7117e commit be21e58
Show file tree
Hide file tree
Showing 10 changed files with 94 additions and 98 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9d2599d98e9cb511f326b2d1b353e462bc360774
refs/heads/master: 6ddcc9197beef7cba993c38cdcad45aefb557d33
4 changes: 2 additions & 2 deletions trunk/drivers/media/dvb/frontends/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ config DVB_BCM3510
An ATSC 8VSB/16VSB and QAM64/256 tuner module. Say Y when you want to
support this frontend.

config DVB_LGDT3302
tristate "LGDT3302 based (DViCO FusionHDTV3 Gold)"
config DVB_LGDT330X
tristate "LGDT3302 or LGDT3303 based (DViCO FusionHDTV Gold)"
depends on DVB_CORE
help
An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/media/dvb/frontends/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,4 @@ obj-$(CONFIG_DVB_OR51211) += or51211.o
obj-$(CONFIG_DVB_OR51132) += or51132.o
obj-$(CONFIG_DVB_BCM3510) += bcm3510.o
obj-$(CONFIG_DVB_S5H1420) += s5h1420.o
obj-$(CONFIG_DVB_LGDT3302) += lgdt3302.o
obj-$(CONFIG_DVB_LGDT330X) += lgdt330x.o
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Support for LGDT3302 (DViCO FustionHDTV 3 Gold) - VSB/QAM
* Support for LGDT3302 & LGDT3303 (DViCO FusionHDTV Gold) - VSB/QAM
*
* Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
*
Expand All @@ -25,10 +25,11 @@
/*
* NOTES ABOUT THIS DRIVER
*
* This driver supports DViCO FusionHDTV 3 Gold under Linux.
* This driver supports DViCO FusionHDTV Gold under Linux.
*
* TODO:
* BER and signal strength always return 0.
* Include support for LGDT3303
*
*/

Expand All @@ -41,24 +42,24 @@

#include "dvb_frontend.h"
#include "dvb-pll.h"
#include "lgdt3302_priv.h"
#include "lgdt3302.h"
#include "lgdt330x_priv.h"
#include "lgdt330x.h"

static int debug = 0;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug,"Turn on/off lgdt3302 frontend debugging (default:off).");
MODULE_PARM_DESC(debug,"Turn on/off lgdt330x frontend debugging (default:off).");
#define dprintk(args...) \
do { \
if (debug) printk(KERN_DEBUG "lgdt3302: " args); \
if (debug) printk(KERN_DEBUG "lgdt330x: " args); \
} while (0)

struct lgdt3302_state
struct lgdt330x_state
{
struct i2c_adapter* i2c;
struct dvb_frontend_ops ops;

/* Configuration settings */
const struct lgdt3302_config* config;
const struct lgdt330x_config* config;

struct dvb_frontend frontend;

Expand All @@ -69,7 +70,7 @@ struct lgdt3302_state
u32 current_frequency;
};

static int i2c_writebytes (struct lgdt3302_state* state,
static int i2c_writebytes (struct lgdt330x_state* state,
u8 addr, /* demod_address or pll_address */
u8 *buf, /* data bytes to send */
int len /* number of bytes to send */ )
Expand All @@ -83,7 +84,7 @@ static int i2c_writebytes (struct lgdt3302_state* state,
for (i=1; i<len; i++) {
tmp[1] = buf[i];
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
printk(KERN_WARNING "lgdt3302: %s error (addr %02x <- %02x, err == %i)\n", __FUNCTION__, addr, buf[0], err);
printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err == %i)\n", __FUNCTION__, addr, buf[0], err);
if (err < 0)
return err;
else
Expand All @@ -95,7 +96,7 @@ static int i2c_writebytes (struct lgdt3302_state* state,
}

#if 0
static int i2c_readbytes (struct lgdt3302_state* state,
static int i2c_readbytes (struct lgdt330x_state* state,
u8 addr, /* demod_address or pll_address */
u8 *buf, /* holds data bytes read */
int len /* number of bytes to read */ )
Expand All @@ -105,7 +106,7 @@ static int i2c_readbytes (struct lgdt3302_state* state,
int err;

if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
printk(KERN_WARNING "lgdt3302: %s error (addr %02x, err == %i)\n", __FUNCTION__, addr, err);
printk(KERN_WARNING "lgdt330x: %s error (addr %02x, err == %i)\n", __FUNCTION__, addr, err);
return -EREMOTEIO;
}
return 0;
Expand All @@ -117,7 +118,7 @@ static int i2c_readbytes (struct lgdt3302_state* state,
* then reads the data returned for (len) bytes.
*/

static u8 i2c_selectreadbytes (struct lgdt3302_state* state,
static u8 i2c_selectreadbytes (struct lgdt330x_state* state,
enum I2C_REG reg, u8* buf, int len)
{
u8 wr [] = { reg };
Expand All @@ -130,15 +131,15 @@ static u8 i2c_selectreadbytes (struct lgdt3302_state* state,
int ret;
ret = i2c_transfer(state->i2c, msg, 2);
if (ret != 2) {
printk(KERN_WARNING "lgdt3302: %s: addr 0x%02x select 0x%02x error (ret == %i)\n", __FUNCTION__, state->config->demod_address, reg, ret);
printk(KERN_WARNING "lgdt330x: %s: addr 0x%02x select 0x%02x error (ret == %i)\n", __FUNCTION__, state->config->demod_address, reg, ret);
} else {
ret = 0;
}
return ret;
}

/* Software reset */
int lgdt3302_SwReset(struct lgdt3302_state* state)
int lgdt330x_SwReset(struct lgdt330x_state* state)
{
u8 ret;
u8 reset[] = {
Expand All @@ -164,7 +165,7 @@ int lgdt3302_SwReset(struct lgdt3302_state* state)
return ret;
}

static int lgdt3302_init(struct dvb_frontend* fe)
static int lgdt330x_init(struct dvb_frontend* fe)
{
/* Hardware reset is done using gpio[0] of cx23880x chip.
* I'd like to do it here, but don't know how to find chip address.
Expand All @@ -173,18 +174,18 @@ static int lgdt3302_init(struct dvb_frontend* fe)
* the caller of this function needs to do it. */

dprintk("%s entered\n", __FUNCTION__);
return lgdt3302_SwReset((struct lgdt3302_state*) fe->demodulator_priv);
return lgdt330x_SwReset((struct lgdt330x_state*) fe->demodulator_priv);
}

static int lgdt3302_read_ber(struct dvb_frontend* fe, u32* ber)
static int lgdt330x_read_ber(struct dvb_frontend* fe, u32* ber)
{
*ber = 0; /* Dummy out for now */
return 0;
}

static int lgdt3302_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
static int lgdt330x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
{
struct lgdt3302_state* state = (struct lgdt3302_state*) fe->demodulator_priv;
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
u8 buf[2];

i2c_selectreadbytes(state, PACKET_ERR_COUNTER1, buf, sizeof(buf));
Expand All @@ -193,11 +194,11 @@ static int lgdt3302_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
return 0;
}

static int lgdt3302_set_parameters(struct dvb_frontend* fe,
static int lgdt330x_set_parameters(struct dvb_frontend* fe,
struct dvb_frontend_parameters *param)
{
struct lgdt3302_state* state =
(struct lgdt3302_state*) fe->demodulator_priv;
struct lgdt330x_state* state =
(struct lgdt330x_state*) fe->demodulator_priv;

/* Use 50MHz parameter values from spec sheet since xtal is 50 */
static u8 top_ctrl_cfg[] = { TOP_CONTROL, 0x03 };
Expand Down Expand Up @@ -244,7 +245,7 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
state->config->pll_rf_set(fe, 0);
break;
default:
printk(KERN_WARNING "lgdt3302: %s: Modulation type(%d) UNSUPPORTED\n", __FUNCTION__, param->u.vsb.modulation);
printk(KERN_WARNING "lgdt330x: %s: Modulation type(%d) UNSUPPORTED\n", __FUNCTION__, param->u.vsb.modulation);
return -1;
}
/* Initializations common to all modes */
Expand Down Expand Up @@ -291,19 +292,17 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
/* Change only if we are actually changing the channel */
if (state->current_frequency != param->frequency) {
u8 buf[5];
struct i2c_msg msg = { .flags = 0, .buf = &buf[1], .len = 4 };
int err;

/* This must be done before the initialized msg is declared */
state->config->pll_set(fe, param, buf);

struct i2c_msg msg =
{ .addr = buf[0], .flags = 0, .buf = &buf[1], .len = 4 };
int err;
msg.addr = buf[0];

dprintk("%s: tuner at 0x%02x bytes: 0x%02x 0x%02x "
"0x%02x 0x%02x\n", __FUNCTION__,
buf[0],buf[1],buf[2],buf[3],buf[4]);
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
printk(KERN_WARNING "lgdt3302: %s error (addr %02x <- %02x, err = %i)\n", __FUNCTION__, buf[0], buf[1], err);
printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err = %i)\n", __FUNCTION__, buf[0], buf[1], err);
if (err < 0)
return err;
else
Expand All @@ -317,21 +316,21 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
/* Update current frequency */
state->current_frequency = param->frequency;
}
lgdt3302_SwReset(state);
lgdt330x_SwReset(state);
return 0;
}

static int lgdt3302_get_frontend(struct dvb_frontend* fe,
static int lgdt330x_get_frontend(struct dvb_frontend* fe,
struct dvb_frontend_parameters* param)
{
struct lgdt3302_state *state = fe->demodulator_priv;
struct lgdt330x_state *state = fe->demodulator_priv;
param->frequency = state->current_frequency;
return 0;
}

static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
static int lgdt330x_read_status(struct dvb_frontend* fe, fe_status_t* status)
{
struct lgdt3302_state* state = (struct lgdt3302_state*) fe->demodulator_priv;
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
u8 buf[3];

*status = 0; /* Reset status result */
Expand Down Expand Up @@ -391,19 +390,19 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
*status |= FE_HAS_CARRIER;
break;
default:
printk("KERN_WARNING lgdt3302: %s: Modulation set to unsupported value\n", __FUNCTION__);
printk("KERN_WARNING lgdt330x: %s: Modulation set to unsupported value\n", __FUNCTION__);
}

return 0;
}

static int lgdt3302_read_signal_strength(struct dvb_frontend* fe, u16* strength)
static int lgdt330x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
{
/* not directly available. */
return 0;
}

static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
static int lgdt330x_read_snr(struct dvb_frontend* fe, u16* snr)
{
#ifdef SNR_IN_DB
/*
Expand Down Expand Up @@ -458,7 +457,7 @@ static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
static u8 buf[5];/* read data buffer */
static u32 noise; /* noise value */
static u32 snr_db; /* index into SNR_EQ[] */
struct lgdt3302_state* state = (struct lgdt3302_state*) fe->demodulator_priv;
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;

/* read both equalizer and pase tracker noise data */
i2c_selectreadbytes(state, EQPH_ERR0, buf, sizeof(buf));
Expand Down Expand Up @@ -494,7 +493,7 @@ static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
/* Return the raw noise value */
static u8 buf[5];/* read data buffer */
static u32 noise; /* noise value */
struct lgdt3302_state* state = (struct lgdt3302_state*) fe->demodulator_priv;
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;

/* read both equalizer and pase tracker noise data */
i2c_selectreadbytes(state, EQPH_ERR0, buf, sizeof(buf));
Expand All @@ -517,7 +516,7 @@ static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
return 0;
}

static int lgdt3302_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
static int lgdt330x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
{
/* I have no idea about this - it may not be needed */
fe_tune_settings->min_delay_ms = 500;
Expand All @@ -526,30 +525,30 @@ static int lgdt3302_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronte
return 0;
}

static void lgdt3302_release(struct dvb_frontend* fe)
static void lgdt330x_release(struct dvb_frontend* fe)
{
struct lgdt3302_state* state = (struct lgdt3302_state*) fe->demodulator_priv;
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
kfree(state);
}

static struct dvb_frontend_ops lgdt3302_ops;
static struct dvb_frontend_ops lgdt330x_ops;

struct dvb_frontend* lgdt3302_attach(const struct lgdt3302_config* config,
struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
struct i2c_adapter* i2c)
{
struct lgdt3302_state* state = NULL;
struct lgdt330x_state* state = NULL;
u8 buf[1];

/* Allocate memory for the internal state */
state = (struct lgdt3302_state*) kmalloc(sizeof(struct lgdt3302_state), GFP_KERNEL);
state = (struct lgdt330x_state*) kmalloc(sizeof(struct lgdt330x_state), GFP_KERNEL);
if (state == NULL)
goto error;
memset(state,0,sizeof(*state));

/* Setup the state */
state->config = config;
state->i2c = i2c;
memcpy(&state->ops, &lgdt3302_ops, sizeof(struct dvb_frontend_ops));
memcpy(&state->ops, &lgdt330x_ops, sizeof(struct dvb_frontend_ops));
/* Verify communication with demod chip */
if (i2c_selectreadbytes(state, 2, buf, 1))
goto error;
Expand All @@ -569,9 +568,9 @@ struct dvb_frontend* lgdt3302_attach(const struct lgdt3302_config* config,
return NULL;
}

static struct dvb_frontend_ops lgdt3302_ops = {
static struct dvb_frontend_ops lgdt330x_ops = {
.info = {
.name= "LG Electronics LGDT3302 VSB/QAM Frontend",
.name= "LG Electronics lgdt330x VSB/QAM Frontend",
.type = FE_ATSC,
.frequency_min= 54000000,
.frequency_max= 858000000,
Expand All @@ -581,23 +580,23 @@ static struct dvb_frontend_ops lgdt3302_ops = {
.symbol_rate_max = 10762000,
.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
},
.init = lgdt3302_init,
.set_frontend = lgdt3302_set_parameters,
.get_frontend = lgdt3302_get_frontend,
.get_tune_settings = lgdt3302_get_tune_settings,
.read_status = lgdt3302_read_status,
.read_ber = lgdt3302_read_ber,
.read_signal_strength = lgdt3302_read_signal_strength,
.read_snr = lgdt3302_read_snr,
.read_ucblocks = lgdt3302_read_ucblocks,
.release = lgdt3302_release,
.init = lgdt330x_init,
.set_frontend = lgdt330x_set_parameters,
.get_frontend = lgdt330x_get_frontend,
.get_tune_settings = lgdt330x_get_tune_settings,
.read_status = lgdt330x_read_status,
.read_ber = lgdt330x_read_ber,
.read_signal_strength = lgdt330x_read_signal_strength,
.read_snr = lgdt330x_read_snr,
.read_ucblocks = lgdt330x_read_ucblocks,
.release = lgdt330x_release,
};

MODULE_DESCRIPTION("LGDT3302 [DViCO FusionHDTV 3 Gold] (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
MODULE_DESCRIPTION("lgdt330x [DViCO FusionHDTV 3 Gold] (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
MODULE_AUTHOR("Wilson Michaels");
MODULE_LICENSE("GPL");

EXPORT_SYMBOL(lgdt3302_attach);
EXPORT_SYMBOL(lgdt330x_attach);

/*
* Local variables:
Expand Down
Loading

0 comments on commit be21e58

Please sign in to comment.