Signed-off-by: Andreas Steinmetz <ast@domdv.de>
@@ -703,6 +703,9 @@ static int cx24116_read_status(struct dv
if (lock & CX24116_HAS_SYNCLOCK)
*status |= FE_HAS_SYNC | FE_HAS_LOCK;
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, *status & FE_HAS_LOCK);
+
return 0;
}
@@ -1111,6 +1114,8 @@ static void cx24116_release(struct dvb_f
{
struct cx24116_state *state = fe->demodulator_priv;
dprintk("%s\n", __func__);
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, 0);
kfree(state);
}
@@ -1196,6 +1201,9 @@ static int cx24116_sleep(struct dvb_fron
dprintk("%s()\n", __func__);
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, 0);
+
/* Firmware CMD 36: Power config */
cmd.args[0x00] = CMD_TUNERSLEEP;
cmd.args[0x01] = 1;
@@ -34,6 +34,9 @@ struct cx24116_config {
/* Need to reset device during firmware loading */
int (*reset_device)(struct dvb_frontend *fe);
+ /* Hook for Lock LED */
+ void (*set_lock_led)(struct dvb_frontend *fe, int offon);
+
/* Need to set MPEG parameters */
u8 mpg_clk_pos_pol:0x02;
@@ -381,6 +381,9 @@ static int stv0288_read_status(struct dv
dprintk("stv0288 has locked\n");
}
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, *status & FE_HAS_LOCK);
+
return 0;
}
@@ -415,6 +418,9 @@ static int stv0288_sleep(struct dvb_fron
{
struct stv0288_state *state = fe->demodulator_priv;
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, 0);
+
stv0288_writeregI(state, 0x41, 0x84);
state->initialised = 0;
@@ -532,6 +538,8 @@ static int stv0288_i2c_gate_ctrl(struct
static void stv0288_release(struct dvb_frontend *fe)
{
struct stv0288_state *state = fe->demodulator_priv;
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, 0);
kfree(state);
}
@@ -41,6 +41,9 @@ struct stv0288_config {
int min_delay_ms;
int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured);
+
+ /* Hook for Lock LED */
+ void (*set_lock_led)(struct dvb_frontend *fe, int offon);
};
#if IS_ENABLED(CONFIG_DVB_STV0288)
@@ -3546,6 +3546,9 @@ static int stv090x_read_status(struct dv
break;
}
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, *status & FE_HAS_LOCK);
+
return 0;
}
@@ -3893,6 +3896,9 @@ static int stv090x_sleep(struct dvb_fron
u32 reg;
u8 full_standby = 0;
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, 0);
+
if (stv090x_i2c_gate_ctrl(state, 1) < 0)
goto err;
@@ -4124,6 +4130,9 @@ static void stv090x_release(struct dvb_f
{
struct stv090x_state *state = fe->demodulator_priv;
+ if (state->config->set_lock_led)
+ state->config->set_lock_led(fe, 0);
+
state->internal->num_used--;
if (state->internal->num_used <= 0) {
@@ -101,6 +101,9 @@ struct stv090x_config {
int (*tuner_set_refclk) (struct dvb_frontend *fe, u32 refclk);
int (*tuner_get_status) (struct dvb_frontend *fe, u32 *status);
void (*tuner_i2c_lock) (struct dvb_frontend *fe, int lock);
+
+ /* Hook for Lock LED */
+ void (*set_lock_led)(struct dvb_frontend *fe, int offon);
};
#if IS_ENABLED(CONFIG_DVB_STV090x)
@@ -501,6 +501,9 @@ static int tda10071_read_status(struct d
if (tmp & 0x08) /* RS or BCH */
*status |= FE_HAS_SYNC | FE_HAS_LOCK;
+ if (priv->cfg.set_lock_led)
+ priv->cfg.set_lock_led(fe, *status & FE_HAS_LOCK);
+
priv->fe_status = *status;
return ret;
@@ -1165,6 +1168,9 @@ static int tda10071_sleep(struct dvb_fro
goto error;
}
+ if (priv->cfg.set_lock_led)
+ priv->cfg.set_lock_led(fe, 0);
+
cmd.args[0] = CMD_SET_SLEEP_MODE;
cmd.args[1] = 0;
cmd.args[2] = 1;
@@ -1199,6 +1205,8 @@ static int tda10071_get_tune_settings(st
static void tda10071_release(struct dvb_frontend *fe)
{
struct tda10071_priv *priv = fe->demodulator_priv;
+ if (priv->cfg.set_lock_led)
+ priv->cfg.set_lock_led(fe, 0);
kfree(priv);
}
@@ -69,6 +69,9 @@ struct tda10071_config {
* Values:
*/
u8 pll_multiplier;
+
+ /* Hook for Lock LED */
+ void (*set_lock_led)(struct dvb_frontend *fe, int offon);
};