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

Commit a2192cf4 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

[media] tuner-core/tda9887: get_afc can be tuner mode specific



The get_afc op in tda9887 is valid only for the radio mode.
But due to the way get_afc in analog_demod_ops was designed it would
overwrite the afc value with a bogus value when in TV mode.
Pass a pointer to the afc value instead, and when not in radio mode
leave it alone in the tda9887.
This broke a long time ago in 2.6.19 when the get_afc op was introduced.
Before that the afc was only set for radio mode in the tda9887.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent d047795c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -246,7 +246,7 @@ struct analog_demod_ops {
	void (*set_params)(struct dvb_frontend *fe,
			   struct analog_parameters *params);
	int  (*has_signal)(struct dvb_frontend *fe);
	int  (*get_afc)(struct dvb_frontend *fe);
	int  (*get_afc)(struct dvb_frontend *fe, s32 *afc);
	void (*tuner_status)(struct dvb_frontend *fe);
	void (*standby)(struct dvb_frontend *fe);
	void (*release)(struct dvb_frontend *fe);
+7 −7
Original line number Diff line number Diff line
@@ -596,22 +596,22 @@ static void tda9887_tuner_status(struct dvb_frontend *fe)
		   priv->data[1], priv->data[2], priv->data[3]);
}

static int tda9887_get_afc(struct dvb_frontend *fe)
static int tda9887_get_afc(struct dvb_frontend *fe, s32 *afc)
{
	struct tda9887_priv *priv = fe->analog_demod_priv;
	static int AFC_BITS_2_kHz[] = {
	static const int AFC_BITS_2_kHz[] = {
		-12500,  -37500,  -62500,  -97500,
		-112500, -137500, -162500, -187500,
		187500,  162500,  137500,  112500,
		97500 ,  62500,   37500 ,  12500
	};
	int afc=0;
	__u8 reg = 0;

	if (priv->mode != V4L2_TUNER_RADIO)
		return 0;
	if (1 == tuner_i2c_xfer_recv(&priv->i2c_props, &reg, 1))
		afc = AFC_BITS_2_kHz[(reg>>1)&0x0f];

	return afc;
		*afc = AFC_BITS_2_kHz[(reg >> 1) & 0x0f];
	return 0;
}

static void tda9887_standby(struct dvb_frontend *fe)
+2 −12
Original line number Diff line number Diff line
@@ -228,16 +228,6 @@ static int fe_has_signal(struct dvb_frontend *fe)
	return strength;
}

static int fe_get_afc(struct dvb_frontend *fe)
{
	s32 afc;

	if (fe->ops.tuner_ops.get_afc(fe, &afc) < 0)
		return 0;

	return afc;
}

static int fe_set_config(struct dvb_frontend *fe, void *priv_cfg)
{
	struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
@@ -448,7 +438,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
		if (fe_tuner_ops->get_rf_strength)
			analog_ops->has_signal = fe_has_signal;
		if (fe_tuner_ops->get_afc)
			analog_ops->get_afc = fe_get_afc;
			analog_ops->get_afc = fe_tuner_ops->get_afc;

	} else {
		t->name = analog_ops->info.name;
@@ -1190,7 +1180,7 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
	if (check_mode(t, vt->type) == -EINVAL)
		return 0;
	if (vt->type == t->mode && analog_ops->get_afc)
		vt->afc = analog_ops->get_afc(&t->fe);
		analog_ops->get_afc(&t->fe, &vt->afc);
	if (analog_ops->has_signal)
		vt->signal = analog_ops->has_signal(&t->fe);
	if (vt->type != V4L2_TUNER_RADIO) {