aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends
diff options
context:
space:
mode:
authorAndreas Regel <andreas.regel@gmx.de>2010-01-05 17:20:21 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-02-26 13:10:36 -0500
commit96506a5086d0e9fd7332d6da74f115fa37bb58c6 (patch)
treea48271fc1f4799f29614ae6f83935dbaa69969f5 /drivers/media/dvb/frontends
parent97f7a2ae1a8a1e44a481456375efced75210e5eb (diff)
V4L/DVB (13976): [STV090x] Added mutex protection around tuner I2C access.
With this change it is possible to have the same I2C address for both tuners. Signed-off-by: Andreas Regel <andreas.regel@gmx.de> Signed-off-by: Manu Abraham <manu@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/frontends')
-rw-r--r--drivers/media/dvb/frontends/stv090x.c9
-rw-r--r--drivers/media/dvb/frontends/stv090x_priv.h1
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/media/dvb/frontends/stv090x.c b/drivers/media/dvb/frontends/stv090x.c
index 9a817a69ed30..e903334a8323 100644
--- a/drivers/media/dvb/frontends/stv090x.c
+++ b/drivers/media/dvb/frontends/stv090x.c
@@ -758,6 +758,9 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
758 struct stv090x_state *state = fe->demodulator_priv; 758 struct stv090x_state *state = fe->demodulator_priv;
759 u32 reg; 759 u32 reg;
760 760
761 if (enable)
762 mutex_lock(&state->internal->tuner_lock);
763
761 reg = STV090x_READ_DEMOD(state, I2CRPT); 764 reg = STV090x_READ_DEMOD(state, I2CRPT);
762 if (enable) { 765 if (enable) {
763 dprintk(FE_DEBUG, 1, "Enable Gate"); 766 dprintk(FE_DEBUG, 1, "Enable Gate");
@@ -771,9 +774,14 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
771 if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0) 774 if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0)
772 goto err; 775 goto err;
773 } 776 }
777
778 if (!enable)
779 mutex_unlock(&state->internal->tuner_lock);
780
774 return 0; 781 return 0;
775err: 782err:
776 dprintk(FE_ERROR, 1, "I/O error"); 783 dprintk(FE_ERROR, 1, "I/O error");
784 mutex_unlock(&state->internal->tuner_lock);
777 return -1; 785 return -1;
778} 786}
779 787
@@ -4439,6 +4447,7 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
4439 } 4447 }
4440 4448
4441 mutex_init(&state->internal->demod_lock); 4449 mutex_init(&state->internal->demod_lock);
4450 mutex_init(&state->internal->tuner_lock);
4442 4451
4443 if (stv090x_sleep(&state->frontend) < 0) { 4452 if (stv090x_sleep(&state->frontend) < 0) {
4444 dprintk(FE_ERROR, 1, "Error putting device to sleep"); 4453 dprintk(FE_ERROR, 1, "Error putting device to sleep");
diff --git a/drivers/media/dvb/frontends/stv090x_priv.h b/drivers/media/dvb/frontends/stv090x_priv.h
index d38542665b0a..5b780c80d496 100644
--- a/drivers/media/dvb/frontends/stv090x_priv.h
+++ b/drivers/media/dvb/frontends/stv090x_priv.h
@@ -235,6 +235,7 @@ struct stv090x_internal {
235 u8 i2c_addr; 235 u8 i2c_addr;
236 236
237 struct mutex demod_lock; /* Lock access to shared register */ 237 struct mutex demod_lock; /* Lock access to shared register */
238 struct mutex tuner_lock; /* Lock access to tuners */
238 s32 mclk; /* Masterclock Divider factor */ 239 s32 mclk; /* Masterclock Divider factor */
239 u32 dev_ver; 240 u32 dev_ver;
240 241