Commit 735f0b9a authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (6137): tuner-simple: add get_rf_strength and improve status reading efficiency

parent 8fb3b9f7
Loading
Loading
Loading
Loading
+36 −22
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ struct tuner_simple_priv {

/* ---------------------------------------------------------------------- */

static int tuner_getstatus(struct dvb_frontend *fe)
static int tuner_read_status(struct dvb_frontend *fe)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	unsigned char byte;
@@ -113,47 +113,60 @@ static int tuner_getstatus(struct dvb_frontend *fe)
	return byte;
}

static int tuner_signal(struct dvb_frontend *fe)
static inline int tuner_signal(const int status)
{
	return (tuner_getstatus(fe) & TUNER_SIGNAL) << 13;
	return (status & TUNER_SIGNAL) << 13;
}

static int tuner_stereo(struct dvb_frontend *fe)
static inline int tuner_stereo(const int type, const int status)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;

	int stereo, status;

	status = tuner_getstatus(fe);

	switch (priv->type) {
	switch (type) {
		case TUNER_PHILIPS_FM1216ME_MK3:
		case TUNER_PHILIPS_FM1236_MK3:
		case TUNER_PHILIPS_FM1256_IH3:
		case TUNER_LG_NTSC_TAPE:
			stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
			break;
			return ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
		default:
			stereo = status & TUNER_STEREO;
			return status & TUNER_STEREO;
	}
}

	return stereo;
static inline int tuner_islocked(const int status)
{
	return (status & TUNER_FL);
}

static inline int tuner_afcstatus(const int status)
{
	return (status & TUNER_AFC) - 2;
}


static int simple_get_status(struct dvb_frontend *fe, u32 *status)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	int signal = tuner_signal(fe);
	int tuner_status = tuner_read_status(fe);

	*status = 0;

	if (signal)
	if (tuner_islocked(tuner_status))
		*status = TUNER_STATUS_LOCKED;
	if (tuner_stereo(fe))
	if (tuner_stereo(priv->type, tuner_status))
		*status |= TUNER_STATUS_STEREO;

	tuner_dbg("tuner-simple: Signal strength: %d\n", signal);
	tuner_dbg("AFC Status: %d\n", tuner_afcstatus(tuner_status));

	return 0;
}

static int simple_get_rf_strength(struct dvb_frontend *fe, u16 *strength)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	int signal = tuner_signal(tuner_read_status(fe));

	*strength = signal;

	tuner_dbg("Signal strength: %d\n", signal);

	return 0;
}
@@ -583,6 +596,7 @@ static struct dvb_tuner_ops simple_tuner_ops = {
	.release           = simple_release,
	.get_frequency     = simple_get_frequency,
	.get_status        = simple_get_status,
	.get_rf_strength   = simple_get_rf_strength,
};

struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe,