Commit 8d316bf5 authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab

V4L/DVB (6979): tda18271: use a mutex to protect state in critical sections

Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent ccbac9bb
...@@ -598,26 +598,36 @@ static int tda18271_init(struct dvb_frontend *fe) ...@@ -598,26 +598,36 @@ static int tda18271_init(struct dvb_frontend *fe)
{ {
struct tda18271_priv *priv = fe->tuner_priv; struct tda18271_priv *priv = fe->tuner_priv;
mutex_lock(&priv->lock);
/* initialization */ /* initialization */
tda18271_ir_cal_init(fe); tda18271_ir_cal_init(fe);
if (priv->id == TDA18271HDC2) if (priv->id == TDA18271HDC2)
tda18271_rf_cal_init(fe); tda18271_rf_cal_init(fe);
mutex_unlock(&priv->lock);
return 0; return 0;
} }
static int tda18271c2_tune(struct dvb_frontend *fe, static int tda18271c2_tune(struct dvb_frontend *fe,
u32 ifc, u32 freq, u32 bw, u8 std) u32 ifc, u32 freq, u32 bw, u8 std)
{ {
struct tda18271_priv *priv = fe->tuner_priv;
tda_dbg("freq = %d, ifc = %d\n", freq, ifc); tda_dbg("freq = %d, ifc = %d\n", freq, ifc);
tda18271_init(fe); tda18271_init(fe);
mutex_lock(&priv->lock);
tda18271_rf_tracking_filters_correction(fe, freq); tda18271_rf_tracking_filters_correction(fe, freq);
tda18271_channel_configuration(fe, ifc, freq, bw, std); tda18271_channel_configuration(fe, ifc, freq, bw, std);
mutex_unlock(&priv->lock);
return 0; return 0;
} }
...@@ -632,6 +642,8 @@ static int tda18271c1_tune(struct dvb_frontend *fe, ...@@ -632,6 +642,8 @@ static int tda18271c1_tune(struct dvb_frontend *fe,
tda18271_init(fe); tda18271_init(fe);
mutex_lock(&priv->lock);
tda_dbg("freq = %d, ifc = %d\n", freq, ifc); tda_dbg("freq = %d, ifc = %d\n", freq, ifc);
/* RF tracking filter calibration */ /* RF tracking filter calibration */
...@@ -766,6 +778,7 @@ static int tda18271c1_tune(struct dvb_frontend *fe, ...@@ -766,6 +778,7 @@ static int tda18271c1_tune(struct dvb_frontend *fe,
tda18271_write_regs(fe, R_TM, 15); tda18271_write_regs(fe, R_TM, 15);
msleep(5); msleep(5);
mutex_unlock(&priv->lock);
return 0; return 0;
} }
...@@ -1012,7 +1025,9 @@ static int tda18271_get_id(struct dvb_frontend *fe) ...@@ -1012,7 +1025,9 @@ static int tda18271_get_id(struct dvb_frontend *fe)
char *name; char *name;
int ret = 0; int ret = 0;
mutex_lock(&priv->lock);
tda18271_read_regs(fe); tda18271_read_regs(fe);
mutex_unlock(&priv->lock);
switch (regs[R_ID] & 0x7f) { switch (regs[R_ID] & 0x7f) {
case 3: case 3:
...@@ -1065,6 +1080,7 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr, ...@@ -1065,6 +1080,7 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
priv->i2c_adap = i2c; priv->i2c_adap = i2c;
priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO; priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
priv->cal_initialized = false; priv->cal_initialized = false;
mutex_init(&priv->lock);
fe->tuner_priv = priv; fe->tuner_priv = priv;
...@@ -1084,8 +1100,12 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr, ...@@ -1084,8 +1100,12 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
if (tda18271_debug & DBG_MAP) if (tda18271_debug & DBG_MAP)
tda18271_dump_std_map(fe); tda18271_dump_std_map(fe);
mutex_lock(&priv->lock);
tda18271_init_regs(fe); tda18271_init_regs(fe);
mutex_unlock(&priv->lock);
return fe; return fe;
fail: fail:
tda18271_release(fe); tda18271_release(fe);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/mutex.h>
#include "tda18271.h" #include "tda18271.h"
#define R_ID 0x00 /* ID byte */ #define R_ID 0x00 /* ID byte */
...@@ -112,6 +113,8 @@ struct tda18271_priv { ...@@ -112,6 +113,8 @@ struct tda18271_priv {
struct tda18271_std_map std; struct tda18271_std_map std;
struct tda18271_rf_tracking_filter_cal rf_cal_state[8]; struct tda18271_rf_tracking_filter_cal rf_cal_state[8];
struct mutex lock;
u32 frequency; u32 frequency;
u32 bandwidth; u32 bandwidth;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment