V4L/DVB (13976): [STV090x] Added mutex protection around tuner I2C access.
authorAndreas Regel <andreas.regel@gmx.de>
Tue, 5 Jan 2010 22:20:21 +0000 (19:20 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 26 Feb 2010 18:10:36 +0000 (15:10 -0300)
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>
drivers/media/dvb/frontends/stv090x.c
drivers/media/dvb/frontends/stv090x_priv.h

index 9a817a6..e903334 100644 (file)
@@ -758,6 +758,9 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
        struct stv090x_state *state = fe->demodulator_priv;
        u32 reg;
 
+       if (enable)
+               mutex_lock(&state->internal->tuner_lock);
+
        reg = STV090x_READ_DEMOD(state, I2CRPT);
        if (enable) {
                dprintk(FE_DEBUG, 1, "Enable Gate");
@@ -771,9 +774,14 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
                if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0)
                        goto err;
        }
+
+       if (!enable)
+               mutex_unlock(&state->internal->tuner_lock);
+
        return 0;
 err:
        dprintk(FE_ERROR, 1, "I/O error");
+       mutex_unlock(&state->internal->tuner_lock);
        return -1;
 }
 
@@ -4439,6 +4447,7 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
        }
 
        mutex_init(&state->internal->demod_lock);
+       mutex_init(&state->internal->tuner_lock);
 
        if (stv090x_sleep(&state->frontend) < 0) {
                dprintk(FE_ERROR, 1, "Error putting device to sleep");
index d385426..5b780c8 100644 (file)
@@ -235,6 +235,7 @@ struct stv090x_internal {
        u8                      i2c_addr;
 
        struct mutex            demod_lock; /* Lock access to shared register */
+       struct mutex            tuner_lock; /* Lock access to tuners */
        s32                     mclk; /* Masterclock Divider factor */
        u32                     dev_ver;