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

V4L/DVB (6138): tea5761: add get_rf_strength and improve status reading efficiency

parent 735f0b9a
Loading
Loading
Loading
Loading
+41 −23
Original line number Diff line number Diff line
@@ -177,49 +177,66 @@ static int set_radio_freq(struct dvb_frontend *fe,
	return 0;
}

static int tea5761_signal(struct dvb_frontend *fe)
static int tea5761_read_status(struct dvb_frontend *fe, char *buffer)
{
	unsigned char buffer[16];
	int rc;
	struct tea5761_priv *priv = fe->tuner_priv;
	int rc;

	memset(buffer, 0, sizeof(buffer));
	if (16 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props, buffer, 16)))
		tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc);
	memset(buffer, 0, 16);
	if (16 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props, buffer, 16))) {
		tuner_warn("i2c i/o error: rc == %d (should be 16)\n", rc);
		return -EREMOTEIO;
	}

	return ((buffer[9] & TEA5761_TUNCHECK_LEV_MASK) << (13 - 4));
	return 0;
}

static int tea5761_stereo(struct dvb_frontend *fe)
static inline int tea5761_signal(struct dvb_frontend *fe, const char *buffer)
{
	unsigned char buffer[16];
	int rc;
	struct tea5761_priv *priv = fe->tuner_priv;

	memset(buffer, 0, sizeof(buffer));
	if (16 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props, buffer, 16)))
		tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc);
	int signal = ((buffer[9] & TEA5761_TUNCHECK_LEV_MASK) << (13 - 4));

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

	rc = buffer[9] & TEA5761_TUNCHECK_STEREO;
	return signal;
}

	tuner_dbg("TEA5761 radio ST GET = %02x\n", rc);
static inline int tea5761_stereo(struct dvb_frontend *fe, const char *buffer)
{
	struct tea5761_priv *priv = fe->tuner_priv;

	return (rc ? V4L2_TUNER_SUB_STEREO : 0);
	int stereo = buffer[9] & TEA5761_TUNCHECK_STEREO;

	tuner_dbg("Radio ST GET = %02x\n", stereo);

	return (stereo ? V4L2_TUNER_SUB_STEREO : 0);
}

static int tea5761_get_status(struct dvb_frontend *fe, u32 *status)
{
	struct tea5761_priv *priv = fe->tuner_priv;
	int signal = tea5761_signal(fe);
	unsigned char buffer[16];

	*status = 0;

	if (signal)
	if (0 == tea5761_read_status(fe, buffer)) {
		if (tea5761_signal(fe, buffer))
			*status = TUNER_STATUS_LOCKED;
	if (tea5761_stereo(fe))
		if (tea5761_stereo(fe, buffer))
			*status |= TUNER_STATUS_STEREO;
	}

	return 0;
}

static int tea5761_get_rf_strength(struct dvb_frontend *fe, u16 *strength)
{
	unsigned char buffer[16];

	*strength = 0;

	tuner_dbg("tea5761: Signal strength: %d\n", signal);
	if (0 == tea5761_read_status(fe, buffer))
		*strength = tea5761_signal(fe, buffer);

	return 0;
}
@@ -266,6 +283,7 @@ static struct dvb_tuner_ops tea5761_tuner_ops = {
	.release           = tea5761_release,
	.get_frequency     = tea5761_get_frequency,
	.get_status        = tea5761_get_status,
	.get_rf_strength   = tea5761_get_rf_strength,
};

struct dvb_frontend *tea5761_attach(struct dvb_frontend *fe,