mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-24 16:39:31 +07:00
[media] dvb: move dvb_set_frontend logic into a separate routine
This change is there in order to prepare the code to avoid calling dvb_frontend_ioctl_legacy() from FE_SET_PROPERTY. A call to dvb_frontend_ioctl_legacy() would require to update the DVBv3 cache without need, mangling calls for newer delivery system without any reason. No functional changes here. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
9a27e6a0b7
commit
9682cea27e
@ -1786,6 +1786,97 @@ static int dvb_frontend_ioctl_properties(struct file *file,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int dtv_set_frontend(struct file *file, unsigned int cmd, void *parg)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct dvb_frontend_tune_settings fetunesettings;
|
||||
|
||||
if (c->state == DTV_TUNE) {
|
||||
if (dvb_frontend_check_parameters(fe, &fepriv->parameters_in) < 0)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
if (dvb_frontend_check_parameters(fe, parg) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy (&fepriv->parameters_in, parg,
|
||||
sizeof (struct dvb_frontend_parameters));
|
||||
dtv_property_cache_init(fe, c);
|
||||
dtv_property_cache_sync(fe, c, &fepriv->parameters_in);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize output parameters to match the values given by
|
||||
* the user. FE_SET_FRONTEND triggers an initial frontend event
|
||||
* with status = 0, which copies output parameters to userspace.
|
||||
*/
|
||||
fepriv->parameters_out = fepriv->parameters_in;
|
||||
|
||||
memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
|
||||
|
||||
/* force auto frequency inversion if requested */
|
||||
if (dvb_force_auto_inversion) {
|
||||
c->inversion = INVERSION_AUTO;
|
||||
}
|
||||
if (fe->ops.info.type == FE_OFDM) {
|
||||
/* without hierarchical coding code_rate_LP is irrelevant,
|
||||
* so we tolerate the otherwise invalid FEC_NONE setting */
|
||||
if (c->hierarchy == HIERARCHY_NONE &&
|
||||
c->code_rate_LP == FEC_NONE)
|
||||
c->code_rate_LP = FEC_AUTO;
|
||||
}
|
||||
|
||||
/* get frontend-specific tuning settings */
|
||||
if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
|
||||
fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
|
||||
fepriv->max_drift = fetunesettings.max_drift;
|
||||
fepriv->step_size = fetunesettings.step_size;
|
||||
} else {
|
||||
/* default values */
|
||||
switch(fe->ops.info.type) {
|
||||
case FE_QPSK:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = c->symbol_rate / 16000;
|
||||
fepriv->max_drift = c->symbol_rate / 2000;
|
||||
break;
|
||||
|
||||
case FE_QAM:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = 0; /* no zigzag */
|
||||
fepriv->max_drift = 0;
|
||||
break;
|
||||
|
||||
case FE_OFDM:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
|
||||
fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
|
||||
break;
|
||||
case FE_ATSC:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = 0;
|
||||
fepriv->max_drift = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (dvb_override_tune_delay > 0)
|
||||
fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
|
||||
|
||||
fepriv->state = FESTATE_RETUNE;
|
||||
|
||||
/* Request the search algorithm to search */
|
||||
fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
||||
|
||||
dvb_frontend_clear_events(fe);
|
||||
dvb_frontend_add_event(fe, 0);
|
||||
dvb_frontend_wakeup(fe);
|
||||
fepriv->status = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||
unsigned int cmd, void *parg)
|
||||
{
|
||||
@ -1969,96 +2060,9 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||
err = fe->ops.enable_high_lnb_voltage(fe, (long) parg);
|
||||
break;
|
||||
|
||||
case FE_SET_FRONTEND: {
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct dvb_frontend_tune_settings fetunesettings;
|
||||
|
||||
if (c->state == DTV_TUNE) {
|
||||
if (dvb_frontend_check_parameters(fe, &fepriv->parameters_in) < 0) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (dvb_frontend_check_parameters(fe, parg) < 0) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy (&fepriv->parameters_in, parg,
|
||||
sizeof (struct dvb_frontend_parameters));
|
||||
dtv_property_cache_init(fe, c);
|
||||
dtv_property_cache_sync(fe, c, &fepriv->parameters_in);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize output parameters to match the values given by
|
||||
* the user. FE_SET_FRONTEND triggers an initial frontend event
|
||||
* with status = 0, which copies output parameters to userspace.
|
||||
*/
|
||||
fepriv->parameters_out = fepriv->parameters_in;
|
||||
|
||||
memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
|
||||
|
||||
/* force auto frequency inversion if requested */
|
||||
if (dvb_force_auto_inversion) {
|
||||
c->inversion = INVERSION_AUTO;
|
||||
}
|
||||
if (fe->ops.info.type == FE_OFDM) {
|
||||
/* without hierarchical coding code_rate_LP is irrelevant,
|
||||
* so we tolerate the otherwise invalid FEC_NONE setting */
|
||||
if (c->hierarchy == HIERARCHY_NONE &&
|
||||
c->code_rate_LP == FEC_NONE)
|
||||
c->code_rate_LP = FEC_AUTO;
|
||||
}
|
||||
|
||||
/* get frontend-specific tuning settings */
|
||||
if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
|
||||
fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
|
||||
fepriv->max_drift = fetunesettings.max_drift;
|
||||
fepriv->step_size = fetunesettings.step_size;
|
||||
} else {
|
||||
/* default values */
|
||||
switch(fe->ops.info.type) {
|
||||
case FE_QPSK:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = c->symbol_rate / 16000;
|
||||
fepriv->max_drift = c->symbol_rate / 2000;
|
||||
break;
|
||||
|
||||
case FE_QAM:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = 0; /* no zigzag */
|
||||
fepriv->max_drift = 0;
|
||||
break;
|
||||
|
||||
case FE_OFDM:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
|
||||
fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
|
||||
break;
|
||||
case FE_ATSC:
|
||||
fepriv->min_delay = HZ/20;
|
||||
fepriv->step_size = 0;
|
||||
fepriv->max_drift = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (dvb_override_tune_delay > 0)
|
||||
fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
|
||||
|
||||
fepriv->state = FESTATE_RETUNE;
|
||||
|
||||
/* Request the search algorithm to search */
|
||||
fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
||||
|
||||
dvb_frontend_clear_events(fe);
|
||||
dvb_frontend_add_event(fe, 0);
|
||||
dvb_frontend_wakeup(fe);
|
||||
fepriv->status = 0;
|
||||
err = 0;
|
||||
case FE_SET_FRONTEND:
|
||||
err = dtv_set_frontend(file, cmd, parg);
|
||||
break;
|
||||
}
|
||||
|
||||
case FE_GET_EVENT:
|
||||
err = dvb_frontend_get_event (fe, parg, file->f_flags);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user