The patch number 9457 was added via Manu Abraham <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.
Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel
If anyone has any objections, please let us know by sending a message to:
[EMAIL PROTECTED]
------
From: Manu Abraham <[EMAIL PROTECTED]>
Optimization, Fix a Bug
* cut down some I/O operations by disabling "disable gate"
* budget_av was left with the gate open, thereby more susceptible
to RF interference due to I/O operations
Signed-off-by: Manu Abraham <[EMAIL PROTECTED]>
---
linux/drivers/media/dvb/frontends/stb0899_algo.c | 13 ++++++++
linux/drivers/media/dvb/frontends/stb0899_drv.c | 22 +++++++++++++--
linux/drivers/media/dvb/frontends/stb0899_priv.h | 2 +
linux/drivers/media/dvb/frontends/stb6100.c | 17 -----------
linux/drivers/media/dvb/frontends/tda8261.c | 8 -----
linux/drivers/media/dvb/ttpci/budget-av.c | 2 -
linux/drivers/media/dvb/ttpci/budget-ci.c | 2 -
7 files changed, 37 insertions(+), 29 deletions(-)
diff -r 47ef232fb3fd -r 9fccce5c73e3
linux/drivers/media/dvb/frontends/stb0899_algo.c
--- a/linux/drivers/media/dvb/frontends/stb0899_algo.c Sun Jan 27 21:57:05
2008 +0400
+++ b/linux/drivers/media/dvb/frontends/stb0899_algo.c Mon Feb 04 02:37:02
2008 +0400
@@ -583,6 +583,9 @@ enum stb0899_status stb0899_dvbs_algo(st
internal->derot_freq = 0;
internal->status = NOAGC1;
+ /* enable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 1);
+
/* Move tuner to frequency */
dprintk(state->verbose, FE_DEBUG, 1, "Tuner set frequency");
if (state->config->tuner_set_frequency)
@@ -598,6 +601,10 @@ enum stb0899_status stb0899_dvbs_algo(st
/* There is signal in the band */
if (config->tuner_get_bandwidth)
config->tuner_get_bandwidth(&state->frontend,
&bandwidth);
+
+ /* disable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 0);
+
if (params->srate <= bandwidth / 2)
stb0899_search_tmg(state); /* For low rates (SCPC)
*/
else
@@ -1338,11 +1345,17 @@ enum stb0899_status stb0899_dvbs2_algo(s
STB0899_SETFIELD_VAL(FRESRS, reg, 1);
stb0899_write_reg(state, STB0899_TSTRES, reg);
+ /* enable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 1);
+
/* Move tuner to frequency */
if (state->config->tuner_set_frequency)
state->config->tuner_set_frequency(&state->frontend,
internal->freq);
if (state->config->tuner_get_frequency)
state->config->tuner_get_frequency(&state->frontend,
&internal->freq);
+
+ /* disable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 0);
/* Set IF AGC to acquisition */
reg = STB0899_READ_S2REG(STB0899_S2DEMOD, IF_AGC_CNTRL);
diff -r 47ef232fb3fd -r 9fccce5c73e3
linux/drivers/media/dvb/frontends/stb0899_drv.c
--- a/linux/drivers/media/dvb/frontends/stb0899_drv.c Sun Jan 27 21:57:05
2008 +0400
+++ b/linux/drivers/media/dvb/frontends/stb0899_drv.c Mon Feb 04 02:37:02
2008 +0400
@@ -1282,7 +1282,7 @@ static int stb0899_set_tone(struct dvb_f
return 0;
}
-static int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
{
int i2c_stat;
struct stb0899_state *state = fe->demodulator_priv;
@@ -1296,10 +1296,15 @@ static int stb0899_i2c_gate_ctrl(struct
i2c_stat |= STB0899_I2CTON;
if (stb0899_write_reg(state, STB0899_I2CRPT, i2c_stat) < 0)
goto err;
+ } else {
+ dprintk(state->verbose, FE_DEBUG, 1, "Disabling I2C Repeater
...");
+ i2c_stat &= ~STB0899_I2CTON;
+ if (stb0899_write_reg(state, STB0899_I2CRPT, i2c_stat) < 0)
+ goto err;
}
return 0;
err:
- dprintk(state->verbose, FE_ERROR, 1, "I2C Repeater enable failed");
+ dprintk(state->verbose, FE_ERROR, 1, "I2C Repeater control failed");
return -EREMOTEIO;
}
@@ -1633,10 +1638,17 @@ static enum dvbfe_search stb0899_search(
internal->derot_percent = 30;
/* What to do for tuners having no bandwidth setup ?
*/
+ /* enable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 1);
+
if (state->config->tuner_set_bandwidth)
state->config->tuner_set_bandwidth(fe, (13 *
(stb0899_carr_width(state) + SearchRange)) / 10);
if (state->config->tuner_get_bandwidth)
state->config->tuner_get_bandwidth(fe,
&internal->tuner_bw);
+
+ /* disable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 0);
+
/* Set DVB-S1 AGC */
stb0899_write_reg(state, STB0899_AGCRFCFG, 0x11);
@@ -1665,10 +1677,16 @@ static enum dvbfe_search stb0899_search(
internal->srate = i_params->srate;
internal->srch_range = SearchRange;
+ /* enable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 1);
+
if (state->config->tuner_set_bandwidth)
state->config->tuner_set_bandwidth(fe,
(stb0899_carr_width(state) + SearchRange));
if (state->config->tuner_get_bandwidth)
state->config->tuner_get_bandwidth(fe,
&internal->tuner_bw);
+
+ /* disable tuner I/O */
+ stb0899_i2c_gate_ctrl(&state->frontend, 0);
// pParams->SpectralInv = pSearch->IQ_Inversion;
diff -r 47ef232fb3fd -r 9fccce5c73e3
linux/drivers/media/dvb/frontends/stb0899_priv.h
--- a/linux/drivers/media/dvb/frontends/stb0899_priv.h Sun Jan 27 21:57:05
2008 +0400
+++ b/linux/drivers/media/dvb/frontends/stb0899_priv.h Mon Feb 04 02:37:02
2008 +0400
@@ -253,6 +253,8 @@ extern int stb0899_write_s2reg(struct st
u16 stb0899_reg_offset,
u32 stb0899_data);
+extern int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable);
+
#if 0
extern int _stb0899_write_s2reg(struct stb0899_state *state,
u32 stb0899_i2cdev,
diff -r 47ef232fb3fd -r 9fccce5c73e3 linux/drivers/media/dvb/frontends/stb6100.c
--- a/linux/drivers/media/dvb/frontends/stb6100.c Sun Jan 27 21:57:05
2008 +0400
+++ b/linux/drivers/media/dvb/frontends/stb6100.c Mon Feb 04 02:37:02
2008 +0400
@@ -134,16 +134,7 @@ static int stb6100_read_regs(struct stb6
.len = STB6100_NUMREGS
};
- if (state->frontend->ops.i2c_gate_ctrl)
- if ((rc = state->frontend->ops.i2c_gate_ctrl(state->frontend,
1)) < 0)
- return rc;
-
rc = i2c_transfer(state->i2c, &msg, 1);
- if (state->frontend->ops.i2c_gate_ctrl) {
- int rc2;
- if ((rc2 = state->frontend->ops.i2c_gate_ctrl(state->frontend,
0)) < 0)
- return rc2;
- }
if (unlikely(rc != 1)) {
dprintk(verbose, FE_ERROR, 1, "Read (0x%x) err, rc=[%d]",
state->config->tuner_address, rc);
@@ -200,15 +191,7 @@ static int stb6100_write_reg_range(struc
for (i = 0; i < len; i++)
dprintk(verbose, FE_DEBUG, 1, " %s: 0x%02x",
stb6100_regnames[start + i], buf[i]);
}
- if (state->frontend->ops.i2c_gate_ctrl)
- if ((rc = state->frontend->ops.i2c_gate_ctrl(state->frontend,
1)) < 0)
- return rc;
rc = i2c_transfer(state->i2c, &msg, 1);
- if (state->frontend->ops.i2c_gate_ctrl) {
- int rc2;
- if ((rc2 = state->frontend->ops.i2c_gate_ctrl(state->frontend,
0)) < 0)
- return rc2;
- }
if (unlikely(rc != 1)) {
dprintk(verbose, FE_ERROR, 1, "(0x%x) write err [%d:%d],
rc=[%d]",
(unsigned int)state->config->tuner_address, start, len,
rc);
diff -r 47ef232fb3fd -r 9fccce5c73e3 linux/drivers/media/dvb/frontends/tda8261.c
--- a/linux/drivers/media/dvb/frontends/tda8261.c Sun Jan 27 21:57:05
2008 +0400
+++ b/linux/drivers/media/dvb/frontends/tda8261.c Mon Feb 04 02:37:02
2008 +0400
@@ -37,13 +37,9 @@ struct tda8261_state {
static int tda8261_read(struct tda8261_state *state, u8 *buf)
{
- struct dvb_frontend *fe = state->fe;
const struct tda8261_config *config = state->config;
int err = 0;
struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD,.buf
= buf, .len = 2 };
-
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 1);
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1)
printk("%s: read error, err=%d\n", __func__, err);
@@ -53,13 +49,9 @@ static int tda8261_read(struct tda8261_s
static int tda8261_write(struct tda8261_state *state, u8 *buf)
{
- struct dvb_frontend *fe = state->fe;
const struct tda8261_config *config = state->config;
int err = 0;
struct i2c_msg msg = { .addr = config->addr, .flags = 0, .buf = buf,
.len = 4 };
-
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 1);
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1)
printk("%s: write error, err=%d\n", __func__, err);
diff -r 47ef232fb3fd -r 9fccce5c73e3 linux/drivers/media/dvb/ttpci/budget-av.c
--- a/linux/drivers/media/dvb/ttpci/budget-av.c Sun Jan 27 21:57:05 2008 +0400
+++ b/linux/drivers/media/dvb/ttpci/budget-av.c Mon Feb 04 02:37:02 2008 +0400
@@ -919,7 +919,7 @@ static const struct stb0899_s1_reg knc1_
{ STB0899_IRQMSK_0 , 0xff },
{ STB0899_IRQCFG , 0x00 },
{ STB0899_I2CCFG , 0x88 },
- { STB0899_I2CRPT , 0x5c },
+ { STB0899_I2CRPT , 0x58 }, /* Repeater=8, Stop=disabled
*/
{ STB0899_IOPVALUE5 , 0x00 },
{ STB0899_IOPVALUE4 , 0x20 },
{ STB0899_IOPVALUE3 , 0xc9 },
diff -r 47ef232fb3fd -r 9fccce5c73e3 linux/drivers/media/dvb/ttpci/budget-ci.c
--- a/linux/drivers/media/dvb/ttpci/budget-ci.c Sun Jan 27 21:57:05 2008 +0400
+++ b/linux/drivers/media/dvb/ttpci/budget-ci.c Mon Feb 04 02:37:02 2008 +0400
@@ -1116,7 +1116,7 @@ static const struct stb0899_s1_reg tt320
{ STB0899_IRQMSK_0 , 0xff },
{ STB0899_IRQCFG , 0x00 },
{ STB0899_I2CCFG , 0x88 },
- { STB0899_I2CRPT , 0x48 }, /* 12k Pullup */
+ { STB0899_I2CRPT , 0x48 }, /* 12k Pullup, Repeater=16,
Stop=disabled */
{ STB0899_IOPVALUE5 , 0x00 },
{ STB0899_IOPVALUE4 , 0x20 },
{ STB0899_IOPVALUE3 , 0xc9 },
---
Patch is available at:
http://linuxtv.org/hg/v4l-dvb/rev/9fccce5c73e3fb4e95838a2c506c3e38a3dca19b
_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits