All of lore.kernel.org
 help / color / mirror / Atom feed
From: Antti Palosaari <crope@iki.fi>
To: Hans Verkuil <hverkuil@xs4all.nl>
Cc: linux-media@vger.kernel.org,
	Mauro Carvalho Chehab <m.chehab@samsung.com>
Subject: Re: [PATCH] e4000: implement controls via v4l2 control framework
Date: Wed, 05 Feb 2014 11:16:38 +0200	[thread overview]
Message-ID: <52F20176.5070302@iki.fi> (raw)
In-Reply-To: <52F1E828.6020000@xs4all.nl>

Moi Hans

On 05.02.2014 09:28, Hans Verkuil wrote:
> Hi Antti,
>
> Hmm, it's a bit ugly this code. I have some suggestions below...

Yeah, there is some redundancy, I though also the same. But 
functionality is now correct what I see.

It is mostly that DVB gate-control logic which I personally dislike. 
There is quite big changes on my TODO list in order to improve overall 
situation. I already converted that driver to I2C model, it was the 
first step. Next thing is to implement I2C adapter properly => get rid 
of those gate-control callbacks. I did it already [1], but there is 
still some things to study (gate closing, regmap). After driver is 100% 
I2C model (I2C client + no I2C gate hacks) I could switch to regmap, 
which gives some nice stuff like register shadowing and I2C message 
splitting?. So there is a long road to learn and improve things towards 
to current kernel practices, due to payload from history...

After that I likely try to separate tuner functionality out from DVB / 
V4L APIs, still keeping those in same driver, but wrapping functionality.

So lets see if I get some inspiration to rebase that anymore at that 
point :]


[1] 
http://git.linuxtv.org/anttip/media_tree.git/shortlog/refs/heads/mn88472_dvbc

regards
Antti


>
> On 02/05/2014 01:05 AM, Antti Palosaari wrote:
>> Implement gain and bandwidth controls using v4l2 control framework.
>> Pointer to control handler is provided by exported symbol.
>>
>> Cc: Mauro Carvalho Chehab <m.chehab@samsung.com>
>> Cc: Hans Verkuil <hverkuil@xs4all.nl>
>> Signed-off-by: Antti Palosaari <crope@iki.fi>
>> ---
>>   drivers/media/tuners/e4000.c      | 210 +++++++++++++++++++++++++++++++++++++-
>>   drivers/media/tuners/e4000.h      |  14 +++
>>   drivers/media/tuners/e4000_priv.h |  12 +++
>>   3 files changed, 235 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/media/tuners/e4000.c b/drivers/media/tuners/e4000.c
>> index 9187190..77318e9 100644
>> --- a/drivers/media/tuners/e4000.c
>> +++ b/drivers/media/tuners/e4000.c
>> @@ -448,6 +448,178 @@ err:
>>   	return ret;
>>   }
>>
>> +static int e4000_set_lna_gain(struct dvb_frontend *fe)
>
> I would change this to:
>
>   e4000_set_lna_if_gain(struct dvb_frontend *fe, bool lna_auto, bool if_auto, bool set_lna)
>
>> +{
>> +	struct e4000_priv *priv = fe->tuner_priv;
>> +	int ret;
>> +	u8 u8tmp;
>
> General comment: always add a newline after variable declarations.
>
>> +	dev_dbg(&priv->client->dev, "%s: lna auto=%d->%d val=%d->%d\n",
>> +			__func__, priv->lna_gain_auto->cur.val,
>> +			priv->lna_gain_auto->val, priv->lna_gain->cur.val,
>> +			priv->lna_gain->val);
>> +
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 1);
>> +
>> +	if (priv->lna_gain_auto->val && priv->if_gain_auto->cur.val)
>> +		u8tmp = 0x17;
>> +	else if (priv->lna_gain_auto->val)
>> +		u8tmp = 0x19;
>> +	else if (priv->if_gain_auto->cur.val)
>> +		u8tmp = 0x16;
>> +	else
>> +		u8tmp = 0x10;
>> +
>> +	ret = e4000_wr_reg(priv, 0x1a, u8tmp);
>> +	if (ret)
>> +		goto err;
>> +
>> +	if (priv->lna_gain_auto->val == false) {
>> +		ret = e4000_wr_reg(priv, 0x14, priv->lna_gain->val);
>> +		if (ret)
>> +			goto err;
>> +	}
>
> Set lna gain if set_lna is true and lna_auto is false, set if gain if
> set_lna is false and if_gain is false.
>
>> +
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 0);
>> +
>> +	return 0;
>
> I would remove the 4 lines above, and instead just...
>
>> +err:
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 0);
>> +
>
> ...add this:
>
> 	if (ret)
>
>> +	dev_dbg(&priv->client->dev, "%s: failed=%d\n", __func__, ret);
>> +	return ret;
>> +}
>> +
>> +static int e4000_set_mixer_gain(struct dvb_frontend *fe)
>> +{
>> +	struct e4000_priv *priv = fe->tuner_priv;
>> +	int ret;
>> +	u8 u8tmp;
>> +	dev_dbg(&priv->client->dev, "%s: mixer auto=%d->%d val=%d->%d\n",
>> +			__func__, priv->mixer_gain_auto->cur.val,
>> +			priv->mixer_gain_auto->val, priv->mixer_gain->cur.val,
>> +			priv->mixer_gain->val);
>> +
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 1);
>> +
>> +	if (priv->mixer_gain_auto->val)
>> +		u8tmp = 0x15;
>> +	else
>> +		u8tmp = 0x14;
>> +
>> +	ret = e4000_wr_reg(priv, 0x20, u8tmp);
>> +	if (ret)
>> +		goto err;
>> +
>> +	if (priv->mixer_gain_auto->val == false) {
>> +		ret = e4000_wr_reg(priv, 0x15, priv->mixer_gain->val);
>> +		if (ret)
>> +			goto err;
>> +	}
>> +
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 0);
>> +
>> +	return 0;
>> +err:
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 0);
>> +
>> +	dev_dbg(&priv->client->dev, "%s: failed=%d\n", __func__, ret);
>> +	return ret;
>> +}
>> +
>> +static int e4000_set_if_gain(struct dvb_frontend *fe)
>> +{
>> +	struct e4000_priv *priv = fe->tuner_priv;
>> +	int ret;
>> +	u8 buf[2];
>> +	u8 u8tmp;
>> +	dev_dbg(&priv->client->dev, "%s: if auto=%d->%d val=%d->%d\n",
>> +			__func__, priv->if_gain_auto->cur.val,
>> +			priv->if_gain_auto->val, priv->if_gain->cur.val,
>> +			priv->if_gain->val);
>> +
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 1);
>> +
>> +	if (priv->if_gain_auto->val && priv->lna_gain_auto->cur.val)
>> +		u8tmp = 0x17;
>> +	else if (priv->lna_gain_auto->cur.val)
>> +		u8tmp = 0x19;
>> +	else if (priv->if_gain_auto->val)
>> +		u8tmp = 0x16;
>> +	else
>> +		u8tmp = 0x10;
>> +
>> +	ret = e4000_wr_reg(priv, 0x1a, u8tmp);
>> +	if (ret)
>> +		goto err;
>> +
>> +	if (priv->if_gain_auto->val == false) {
>> +		buf[0] = e4000_if_gain_lut[priv->if_gain->val].reg16_val;
>> +		buf[1] = e4000_if_gain_lut[priv->if_gain->val].reg17_val;
>> +		ret = e4000_wr_regs(priv, 0x16, buf, 2);
>> +		if (ret)
>> +			goto err;
>> +	}
>> +
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 0);
>> +
>> +	return 0;
>> +err:
>> +	if (fe->ops.i2c_gate_ctrl)
>> +		fe->ops.i2c_gate_ctrl(fe, 0);
>> +
>> +	dev_dbg(&priv->client->dev, "%s: failed=%d\n", __func__, ret);
>> +	return ret;
>> +}
>
> This function can be dropped.
>
>> +
>> +static int e4000_s_ctrl(struct v4l2_ctrl *ctrl)
>> +{
>> +	struct e4000_priv *priv =
>> +			container_of(ctrl->handler, struct e4000_priv, hdl);
>> +	struct dvb_frontend *fe = priv->fe;
>> +	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
>> +	int ret;
>> +	dev_dbg(&priv->client->dev,
>> +			"%s: id=%d name=%s val=%d min=%d max=%d step=%d\n",
>> +			__func__, ctrl->id, ctrl->name, ctrl->val,
>> +			ctrl->minimum, ctrl->maximum, ctrl->step);
>> +
>> +	switch (ctrl->id) {
>> +	case V4L2_CID_BANDWIDTH_AUTO:
>> +	case V4L2_CID_BANDWIDTH:
>> +		c->bandwidth_hz = priv->bandwidth->val;
>> +		ret = e4000_set_params(priv->fe);
>> +		break;
>> +	case  V4L2_CID_LNA_GAIN_AUTO:
>> +	case  V4L2_CID_LNA_GAIN:
>> +		ret = e4000_set_lna_gain(priv->fe);
>
> Becomes:
>
> 		ret = e4000_set_lna_if_gain(priv->fe, priv->lna_gain_auto->val,
> 				priv->if_gain_auto->cur.val, true);
>
>> +		break;
>> +	case  V4L2_CID_MIXER_GAIN_AUTO:
>> +	case  V4L2_CID_MIXER_GAIN:
>> +		ret = e4000_set_mixer_gain(priv->fe);
>> +		break;
>> +	case  V4L2_CID_IF_GAIN_AUTO:
>> +	case  V4L2_CID_IF_GAIN:
>> +		ret = e4000_set_if_gain(priv->fe);
>
> 		ret = e4000_set_lna_if_gain(priv->fe, priv->lna_gain_auto->cur.val,
> 				priv->if_gain_auto->val, false);
>
>> +		break;
>> +	default:
>> +		ret = -EINVAL;
>> +	}
>> +
>> +	return ret;
>> +}
>
> Regards,
>
> 	Hans
>


-- 
http://palosaari.fi/

      reply	other threads:[~2014-02-05  9:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-05  0:05 [PATCH v2] DVB tuner use v4l2 controls Antti Palosaari
2014-02-05  0:05 ` [PATCH] e4000: implement controls via v4l2 control framework Antti Palosaari
2014-02-05  7:28   ` Hans Verkuil
2014-02-05  9:16     ` Antti Palosaari [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52F20176.5070302@iki.fi \
    --to=crope@iki.fi \
    --cc=hverkuil@xs4all.nl \
    --cc=linux-media@vger.kernel.org \
    --cc=m.chehab@samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.