Commit 6cb393c8 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] drxk_hard: fix locking issues when changing the delsys

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent fa4b2a17
...@@ -6188,7 +6188,6 @@ static int drxk_sleep(struct dvb_frontend *fe) ...@@ -6188,7 +6188,6 @@ static int drxk_sleep(struct dvb_frontend *fe)
dprintk(1, "\n"); dprintk(1, "\n");
ShutDown(state); ShutDown(state);
mutex_unlock(&state->ctlock);
return 0; return 0;
} }
...@@ -6203,7 +6202,7 @@ static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) ...@@ -6203,7 +6202,7 @@ static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
static int drxk_set_parameters(struct dvb_frontend *fe) static int drxk_set_parameters(struct dvb_frontend *fe)
{ {
struct dtv_frontend_properties *p = &fe->dtv_property_cache; struct dtv_frontend_properties *p = &fe->dtv_property_cache;
u32 delsys = p->delivery_system; u32 delsys = p->delivery_system, old_delsys;
struct drxk_state *state = fe->demodulator_priv; struct drxk_state *state = fe->demodulator_priv;
u32 IF; u32 IF;
...@@ -6221,28 +6220,33 @@ static int drxk_set_parameters(struct dvb_frontend *fe) ...@@ -6221,28 +6220,33 @@ static int drxk_set_parameters(struct dvb_frontend *fe)
fe->ops.tuner_ops.set_params(fe); fe->ops.tuner_ops.set_params(fe);
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); fe->ops.i2c_gate_ctrl(fe, 0);
old_delsys = state->props.delivery_system;
state->props = *p; state->props = *p;
switch (delsys) { if (old_delsys != delsys) {
case SYS_DVBC_ANNEX_A: ShutDown(state);
case SYS_DVBC_ANNEX_C: switch (delsys) {
if (!state->m_hasDVBC) case SYS_DVBC_ANNEX_A:
return -EINVAL; case SYS_DVBC_ANNEX_C:
state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ? true : false; if (!state->m_hasDVBC)
if (state->m_itut_annex_c) return -EINVAL;
SetOperationMode(state, OM_QAM_ITU_C); state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ? true : false;
else if (state->m_itut_annex_c)
SetOperationMode(state, OM_QAM_ITU_A); SetOperationMode(state, OM_QAM_ITU_C);
else
SetOperationMode(state, OM_QAM_ITU_A);
break;
state->m_itut_annex_c = true;
break; break;
state->m_itut_annex_c = true; case SYS_DVBT:
break; if (!state->m_hasDVBT)
case SYS_DVBT: return -EINVAL;
if (!state->m_hasDVBT) SetOperationMode(state, OM_DVBT);
break;
default:
return -EINVAL; return -EINVAL;
SetOperationMode(state, OM_DVBT); }
break;
default:
return -EINVAL;
} }
fe->ops.tuner_ops.get_if_frequency(fe, &IF); fe->ops.tuner_ops.get_if_frequency(fe, &IF);
...@@ -6405,7 +6409,6 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config, ...@@ -6405,7 +6409,6 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config,
state->m_GPIO &= ~state->antenna_gpio; state->m_GPIO &= ~state->antenna_gpio;
mutex_init(&state->mutex); mutex_init(&state->mutex);
mutex_init(&state->ctlock);
memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops)); memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
state->frontend.demodulator_priv = state; state->frontend.demodulator_priv = state;
......
...@@ -204,7 +204,6 @@ struct drxk_state { ...@@ -204,7 +204,6 @@ struct drxk_state {
void *priv; void *priv;
struct mutex mutex; struct mutex mutex;
struct mutex ctlock;
u32 m_Instance; /**< Channel 1,2,3 or 4 */ u32 m_Instance; /**< Channel 1,2,3 or 4 */
......
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