| From mkrufky@linuxtv.org Tue Nov 4 14:13:20 2008 |
| From: Steven Toth <stoth@linuxtv.org> |
| Date: Sun, 02 Nov 2008 23:04:44 -0500 |
| Subject: DVB: s5h1411: bugfix: Setting serial or parallel mode could destroy bits |
| To: stable@kernel.org |
| Cc: v4l-dvb maintainer list <v4l-dvb-maintainer@linuxtv.org>, Steven Toth <stoth@linuxtv.org>, Mauro Carvalho Chehab <mchehab@redhat.com> |
| Message-ID: <490E785C.6080105@linuxtv.org> |
| |
| From: Steven Toth <stoth@linuxtv.org> |
| |
| cherry picked from commit 1af46b450fa49c57d73764d66f267335ccd807e2 |
| |
| DVB: s5h1411: bugfix: Setting serial or parallel mode could destroy bits |
| |
| Adding a serialmode function to read/and/or/write the register for safety. |
| |
| Signed-off-by: Steven Toth <stoth@linuxtv.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/media/dvb/frontends/s5h1411.c | 18 ++++++++++++++++-- |
| 1 file changed, 16 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/media/dvb/frontends/s5h1411.c |
| +++ b/drivers/media/dvb/frontends/s5h1411.c |
| @@ -471,6 +471,20 @@ static int s5h1411_set_spectralinversion |
| 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) |
| { |
| @@ -612,10 +626,10 @@ static int s5h1411_init(struct dvb_front |
| |
| 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); |