diff options
author | Steven Toth <stoth@linuxtv.org> | 2008-10-16 22:18:49 -0400 |
---|---|---|
committer | Steven Toth <stoth@linuxtv.org> | 2008-10-16 22:18:49 -0400 |
commit | 1b8500f35fad508989d5bdcd8865e059576eaa81 (patch) | |
tree | 0f510d4465f84e5e5385184e66e6191d31e83892 /linux/drivers/media/dvb | |
parent | 18a36373dd651572c6d08e930a38e8421abcafe8 (diff) | |
download | mediapointer-dvb-s2-1b8500f35fad508989d5bdcd8865e059576eaa81.tar.gz mediapointer-dvb-s2-1b8500f35fad508989d5bdcd8865e059576eaa81.tar.bz2 |
s5h1411: bugfix: Setting serial or parallel mode could destroy bits
From: Steven Toth <stoth@linuxtv.org>
Adding a serialmode function to read/and/or/write the register for safety.
Priority: normal
Signed-off-by: Steven Toth <stoth@linuxtv.org>
Diffstat (limited to 'linux/drivers/media/dvb')
-rw-r--r-- | linux/drivers/media/dvb/frontends/s5h1411.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/linux/drivers/media/dvb/frontends/s5h1411.c b/linux/drivers/media/dvb/frontends/s5h1411.c index c79e23ded..4cb056140 100644 --- a/linux/drivers/media/dvb/frontends/s5h1411.c +++ b/linux/drivers/media/dvb/frontends/s5h1411.c @@ -470,6 +470,20 @@ static int s5h1411_set_spectralinversion(struct dvb_frontend *fe, int inversion) return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0x24, val); } +static int s5h1411_set_serialmode(struct dvb_frontend *fe, int serial) +{ + struct s5h1411_state *state = fe->demodulator_priv; + u16 val; + + dprintk("%s(%d)\n", __func__, serial); + val = s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0xbd) & ~0x100; + + if (serial == 1) + val |= 0x100; + + return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, val); +} + static int s5h1411_enable_modulation(struct dvb_frontend *fe, fe_modulation_t m) { @@ -611,10 +625,10 @@ static int s5h1411_init(struct dvb_frontend *fe) if (state->config->output_mode == S5H1411_SERIAL_OUTPUT) /* Serial */ - s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, 0x1101); + s5h1411_set_serialmode(fe, 1); else /* Parallel */ - s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, 0x1001); + s5h1411_set_serialmode(fe, 0); s5h1411_set_spectralinversion(fe, state->config->inversion); s5h1411_set_if_freq(fe, state->config->vsb_if); |