V4L/DVB (6979): tda18271: use a mutex to protect state in critical sections
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
diff --git a/drivers/media/dvb/frontends/tda18271-fe.c b/drivers/media/dvb/frontends/tda18271-fe.c
index c1da16a..e860f4c 100644
--- a/drivers/media/dvb/frontends/tda18271-fe.c
+++ b/drivers/media/dvb/frontends/tda18271-fe.c
@@ -598,26 +598,36 @@
{
struct tda18271_priv *priv = fe->tuner_priv;
+ mutex_lock(&priv->lock);
+
/* initialization */
tda18271_ir_cal_init(fe);
if (priv->id == TDA18271HDC2)
tda18271_rf_cal_init(fe);
+ mutex_unlock(&priv->lock);
+
return 0;
}
static int tda18271c2_tune(struct dvb_frontend *fe,
u32 ifc, u32 freq, u32 bw, u8 std)
{
+ struct tda18271_priv *priv = fe->tuner_priv;
+
tda_dbg("freq = %d, ifc = %d\n", freq, ifc);
tda18271_init(fe);
+ mutex_lock(&priv->lock);
+
tda18271_rf_tracking_filters_correction(fe, freq);
tda18271_channel_configuration(fe, ifc, freq, bw, std);
+ mutex_unlock(&priv->lock);
+
return 0;
}
@@ -632,6 +642,8 @@
tda18271_init(fe);
+ mutex_lock(&priv->lock);
+
tda_dbg("freq = %d, ifc = %d\n", freq, ifc);
/* RF tracking filter calibration */
@@ -766,6 +778,7 @@
tda18271_write_regs(fe, R_TM, 15);
msleep(5);
+ mutex_unlock(&priv->lock);
return 0;
}
@@ -1012,7 +1025,9 @@
char *name;
int ret = 0;
+ mutex_lock(&priv->lock);
tda18271_read_regs(fe);
+ mutex_unlock(&priv->lock);
switch (regs[R_ID] & 0x7f) {
case 3:
@@ -1065,6 +1080,7 @@
priv->i2c_adap = i2c;
priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
priv->cal_initialized = false;
+ mutex_init(&priv->lock);
fe->tuner_priv = priv;
@@ -1084,8 +1100,12 @@
if (tda18271_debug & DBG_MAP)
tda18271_dump_std_map(fe);
+ mutex_lock(&priv->lock);
+
tda18271_init_regs(fe);
+ mutex_unlock(&priv->lock);
+
return fe;
fail:
tda18271_release(fe);