Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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

parent ccbac9bb
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -598,26 +598,36 @@ static int tda18271_init(struct dvb_frontend *fe)
{
	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 @@ static int tda18271c1_tune(struct dvb_frontend *fe,

	tda18271_init(fe);

	mutex_lock(&priv->lock);

	tda_dbg("freq = %d, ifc = %d\n", freq, ifc);

	/* RF tracking filter calibration */
@@ -766,6 +778,7 @@ static int tda18271c1_tune(struct dvb_frontend *fe,

	tda18271_write_regs(fe, R_TM, 15);
	msleep(5);
	mutex_unlock(&priv->lock);

	return 0;
}
@@ -1012,7 +1025,9 @@ static int tda18271_get_id(struct dvb_frontend *fe)
	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 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
	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 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
	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);
+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@

#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/mutex.h>
#include "tda18271.h"

#define R_ID     0x00	/* ID byte                */
@@ -112,6 +113,8 @@ struct tda18271_priv {
	struct tda18271_std_map std;
	struct tda18271_rf_tracking_filter_cal rf_cal_state[8];

	struct mutex lock;

	u32 frequency;
	u32 bandwidth;
};