All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: jacopo mondi <jacopo@jmondi.org>
Cc: Akinobu Mita <akinobu.mita@gmail.com>,
	linux-media@vger.kernel.org, devicetree@vger.kernel.org,
	Jacopo Mondi <jacopo+renesas@jmondi.org>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Hans Verkuil <hans.verkuil@cisco.com>,
	Mauro Carvalho Chehab <mchehab@s-opensource.com>
Subject: Re: [PATCH v5 12/14] media: ov772x: avoid accessing registers under power saving mode
Date: Mon, 14 May 2018 12:49:19 +0300	[thread overview]
Message-ID: <20180514094918.2xot5l2frkckfequ@paasikivi.fi.intel.com> (raw)
In-Reply-To: <20180514090646.GD5956@w540>

Hi Jacopo,

On Mon, May 14, 2018 at 11:06:46AM +0200, jacopo mondi wrote:
> Hi Akinobu,
> 
>    a small nit below
> 
> On Sun, May 06, 2018 at 11:19:27PM +0900, Akinobu Mita wrote:
> > The set_fmt() in subdev pad ops, the s_ctrl() for subdev control handler,
> > and the s_frame_interval() in subdev video ops could be called when the
> > device is under power saving mode.  These callbacks for ov772x driver
> > cause updating H/W registers that will fail under power saving mode.
> >
> > This avoids it by not apply any changes to H/W if the device is not powered
> > up.  Instead the changes will be restored right after power-up.
> >
> > Cc: Jacopo Mondi <jacopo+renesas@jmondi.org>
> > Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > Cc: Hans Verkuil <hans.verkuil@cisco.com>
> > Cc: Sakari Ailus <sakari.ailus@linux.intel.com>
> > Cc: Mauro Carvalho Chehab <mchehab@s-opensource.com>
> > Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> > ---
> > * v5
> > - No changes
> >
> >  drivers/media/i2c/ov772x.c | 79 +++++++++++++++++++++++++++++++++++++---------
> >  1 file changed, 64 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c
> > index 9292a18..262a7e5 100644
> > --- a/drivers/media/i2c/ov772x.c
> > +++ b/drivers/media/i2c/ov772x.c
> > @@ -741,19 +741,30 @@ static int ov772x_s_frame_interval(struct v4l2_subdev *sd,
> >  	struct ov772x_priv *priv = to_ov772x(sd);
> >  	struct v4l2_fract *tpf = &ival->interval;
> >  	unsigned int fps;
> > -	int ret;
> > +	int ret = 0;
> >
> >  	fps = ov772x_select_fps(priv, tpf);
> >
> > -	ret = ov772x_set_frame_rate(priv, fps, priv->cfmt, priv->win);
> > -	if (ret)
> > -		return ret;
> > +	mutex_lock(&priv->lock);
> > +	/*
> > +	 * If the device is not powered up by the host driver do
> > +	 * not apply any changes to H/W at this time. Instead
> > +	 * the frame rate will be restored right after power-up.
> > +	 */
> > +	if (priv->power_count > 0) {
> > +		ret = ov772x_set_frame_rate(priv, fps, priv->cfmt, priv->win);
> > +		if (ret)
> > +			goto error;
> > +	}
> >
> >  	tpf->numerator = 1;
> >  	tpf->denominator = fps;
> >  	priv->fps = fps;
> >
> > -	return 0;
> > +error:
> > +	mutex_unlock(&priv->lock);
> > +
> > +	return ret;
> >  }
> >
> >  static int ov772x_s_ctrl(struct v4l2_ctrl *ctrl)
> > @@ -765,6 +776,16 @@ static int ov772x_s_ctrl(struct v4l2_ctrl *ctrl)
> >  	int ret = 0;
> >  	u8 val;
> >
> > +	/* v4l2_ctrl_lock() locks our own mutex */
> > +
> > +	/*
> > +	 * If the device is not powered up by the host driver do
> > +	 * not apply any controls to H/W at this time. Instead
> > +	 * the controls will be restored right after power-up.
> > +	 */
> > +	if (priv->power_count == 0)
> > +		return 0;
> > +
> >  	switch (ctrl->id) {
> >  	case V4L2_CID_VFLIP:
> >  		val = ctrl->val ? VFLIP_IMG : 0x00;
> > @@ -885,6 +906,10 @@ static int ov772x_power_off(struct ov772x_priv *priv)
> >  	return 0;
> >  }
> >
> > +static int ov772x_set_params(struct ov772x_priv *priv,
> > +			     const struct ov772x_color_format *cfmt,
> > +			     const struct ov772x_win_size *win);
> > +
> >  static int ov772x_s_power(struct v4l2_subdev *sd, int on)
> >  {
> >  	struct ov772x_priv *priv = to_ov772x(sd);
> > @@ -895,8 +920,20 @@ static int ov772x_s_power(struct v4l2_subdev *sd, int on)
> >  	/* If the power count is modified from 0 to != 0 or from != 0 to 0,
> >  	 * update the power state.
> >  	 */
> > -	if (priv->power_count == !on)
> > -		ret = on ? ov772x_power_on(priv) : ov772x_power_off(priv);
> > +	if (priv->power_count == !on) {
> > +		if (on) {
> > +			ret = ov772x_power_on(priv);
> > +			/*
> > +			 * Restore the format, the frame rate, and
> > +			 * the controls
> > +			 */
> > +			if (!ret)
> > +				ret = ov772x_set_params(priv, priv->cfmt,
> > +							priv->win);
> > +		} else {
> > +			ret = ov772x_power_off(priv);
> > +		}
> > +	}
> >
> >  	if (!ret) {
> >  		/* Update the power count. */
> > @@ -1163,7 +1200,7 @@ static int ov772x_set_fmt(struct v4l2_subdev *sd,
> >  	struct v4l2_mbus_framefmt *mf = &format->format;
> >  	const struct ov772x_color_format *cfmt;
> >  	const struct ov772x_win_size *win;
> > -	int ret;
> > +	int ret = 0;
> >
> >  	if (format->pad)
> >  		return -EINVAL;
> > @@ -1184,14 +1221,24 @@ static int ov772x_set_fmt(struct v4l2_subdev *sd,
> >  		return 0;
> >  	}
> >
> > -	ret = ov772x_set_params(priv, cfmt, win);
> > -	if (ret < 0)
> > -		return ret;
> > -
> > +	mutex_lock(&priv->lock);
> > +	/*
> > +	 * If the device is not powered up by the host driver do
> > +	 * not apply any changes to H/W at this time. Instead
> > +	 * the format will be restored right after power-up.
> > +	 */
> > +	if (priv->power_count > 0) {
> > +		ret = ov772x_set_params(priv, cfmt, win);
> > +		if (ret < 0)
> > +			goto error;
> > +	}
> >  	priv->win = win;
> >  	priv->cfmt = cfmt;
> >
> > -	return 0;
> > +error:
> > +	mutex_unlock(&priv->lock);
> > +
> > +	return ret;
> >  }
> >
> >  static int ov772x_video_probe(struct ov772x_priv *priv)
> > @@ -1201,7 +1248,7 @@ static int ov772x_video_probe(struct ov772x_priv *priv)
> >  	const char         *devname;
> >  	int		    ret;
> >
> > -	ret = ov772x_s_power(&priv->subdev, 1);
> > +	ret = ov772x_power_on(priv);
> >  	if (ret < 0)
> >  		return ret;
> >
> > @@ -1241,7 +1288,7 @@ static int ov772x_video_probe(struct ov772x_priv *priv)
> >  	ret = v4l2_ctrl_handler_setup(&priv->hdl);
> >
> >  done:
> > -	ov772x_s_power(&priv->subdev, 0);
> > +	ov772x_power_off(priv);
> >
> >  	return ret;
> >  }
> > @@ -1340,6 +1387,8 @@ static int ov772x_probe(struct i2c_client *client,
> >
> >  	v4l2_i2c_subdev_init(&priv->subdev, client, &ov772x_subdev_ops);
> >  	v4l2_ctrl_handler_init(&priv->hdl, 3);
> > +	/* Use our mutex for the controls */
> > +	priv->hdl.lock = &priv->lock;
> 
> Isn't this unrelated?

AFAICT not, since the access to power count is serialised using the
driver's mutex. The power count is used in the s_ctrl callback as well.

> 
> Apart from that,
> 
> Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
> 
> Thanks
>   j
> 
> 
> >  	priv->vflip_ctrl = v4l2_ctrl_new_std(&priv->hdl, &ov772x_ctrl_ops,
> >  					     V4L2_CID_VFLIP, 0, 1, 1, 0);
> >  	priv->hflip_ctrl = v4l2_ctrl_new_std(&priv->hdl, &ov772x_ctrl_ops,
> > --
> > 2.7.4
> >



-- 
Sakari Ailus
sakari.ailus@linux.intel.com

  reply	other threads:[~2018-05-14  9:49 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-06 14:19 [PATCH v5 00/14] media: ov772x: support media controller, device tree probing, etc Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 01/14] media: dt-bindings: ov772x: add device tree binding Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 02/14] media: ov772x: correct setting of banding filter Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 03/14] media: ov772x: allow i2c controllers without I2C_FUNC_PROTOCOL_MANGLING Akinobu Mita
2018-05-29 12:59   ` Mauro Carvalho Chehab
2018-05-29 13:29     ` Wolfram Sang
2018-05-29 14:32       ` Mauro Carvalho Chehab
2018-05-06 14:19 ` [PATCH v5 04/14] media: ov772x: add checks for register read errors Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 05/14] media: ov772x: add media controller support Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 06/14] media: ov772x: use generic names for reset and powerdown gpios Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 07/14] media: ov772x: omit consumer ID when getting clock reference Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 08/14] media: ov772x: support device tree probing Akinobu Mita
2018-05-07  9:26   ` Sakari Ailus
2018-05-07 14:52     ` Akinobu Mita
2018-05-14  9:16     ` jacopo mondi
2018-05-14 11:21       ` Sakari Ailus
2018-05-06 14:19 ` [PATCH v5 09/14] media: ov772x: handle nested s_power() calls Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 10/14] media: ov772x: reconstruct s_frame_interval() Akinobu Mita
2018-05-14  9:02   ` jacopo mondi
2018-05-06 14:19 ` [PATCH v5 11/14] media: ov772x: use v4l2_ctrl to get current control value Akinobu Mita
2018-05-06 14:19 ` [PATCH v5 12/14] media: ov772x: avoid accessing registers under power saving mode Akinobu Mita
2018-05-14  9:06   ` jacopo mondi
2018-05-14  9:49     ` Sakari Ailus [this message]
2018-05-14 10:03       ` jacopo mondi
2018-05-06 14:19 ` [PATCH v5 13/14] media: ov772x: make set_fmt() and s_frame_interval() return -EBUSY while streaming Akinobu Mita
2018-05-14  9:10   ` jacopo mondi
2018-05-06 14:19 ` [PATCH v5 14/14] media: ov772x: create subdevice device node Akinobu Mita
2018-05-14  9:11   ` jacopo mondi

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=20180514094918.2xot5l2frkckfequ@paasikivi.fi.intel.com \
    --to=sakari.ailus@linux.intel.com \
    --cc=akinobu.mita@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=hans.verkuil@cisco.com \
    --cc=jacopo+renesas@jmondi.org \
    --cc=jacopo@jmondi.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@s-opensource.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.