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

Commit 9682cea2 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

[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: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9a27e6a0
Loading
Loading
Loading
Loading
+93 −89
Original line number Diff line number Diff line
@@ -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;
	case FE_SET_FRONTEND:
		err = dtv_set_frontend(file, cmd, parg);
		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;
		break;
	}

	case FE_GET_EVENT:
		err = dvb_frontend_get_event (fe, parg, file->f_flags);
		break;