All of lore.kernel.org
 help / color / mirror / Atom feed
From: laurent.pinchart@ideasonboard.com (Laurent Pinchart)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/4] media: ov2640: add a master clock for sensor
Date: Tue, 02 Dec 2014 00:26:17 +0200	[thread overview]
Message-ID: <2284801.0jEi8Kph7L@avalon> (raw)
In-Reply-To: <1417170507-11172-4-git-send-email-josh.wu@atmel.com>

Hi Josh,

(CC'ing the devicetree at vger.kernel.org mailing list)

Thank you for the patch.

On Friday 28 November 2014 18:28:26 Josh Wu wrote:
> The master clock can be optional. It's a common clock framework clock.
> It can make sensor output a pixel clock to the camera interface.
> 
> If you just use a external oscillator clock as the master clock, then,
> just don't need set 'mck' in dt node.
> 
> Signed-off-by: Josh Wu <josh.wu@atmel.com>
> ---
>  drivers/media/i2c/soc_camera/ov2640.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/drivers/media/i2c/soc_camera/ov2640.c
> b/drivers/media/i2c/soc_camera/ov2640.c index 6506126..06c2aa9 100644
> --- a/drivers/media/i2c/soc_camera/ov2640.c
> +++ b/drivers/media/i2c/soc_camera/ov2640.c
> @@ -13,6 +13,7 @@
>   * published by the Free Software Foundation.
>   */
> 
> +#include <linux/clk.h>
>  #include <linux/init.h>
>  #include <linux/module.h>
>  #include <linux/i2c.h>
> @@ -31,6 +32,8 @@
> 
>  #define VAL_SET(x, mask, rshift, lshift)  \
>  		((((x) >> rshift) & mask) << lshift)
> +#define DEFAULT_MASTER_CLK_FREQ		25000000
> +
>  /*
>   * DSP registers
>   * register offset for BANK_SEL == BANK_SEL_DSP
> @@ -284,6 +287,7 @@ struct ov2640_priv {
>  	struct v4l2_ctrl_handler	hdl;
>  	u32	cfmt_code;
>  	struct v4l2_clk			*clk;
> +	struct clk			*master_clk;
>  	const struct ov2640_win_size	*win;
> 
>  	struct soc_camera_subdev_desc	ssdd_dt;
> @@ -746,6 +750,7 @@ static int ov2640_s_power(struct v4l2_subdev *sd, int
> on) struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
> struct ov2640_priv *priv = to_ov2640(client);
>  	struct v4l2_clk *clk;
> +	int ret = 0;
> 
>  	if (!priv->clk) {
>  		clk = v4l2_clk_get(&client->dev, "mclk");
> @@ -755,6 +760,16 @@ static int ov2640_s_power(struct v4l2_subdev *sd, int
> on) priv->clk = clk;
>  	}
> 
> +	if (!IS_ERR(priv->master_clk)) {

The clock should be mandatory, you can thus drop this check.

> +		if (on)
> +			ret = clk_prepare_enable(priv->master_clk);
> +		else
> +			clk_disable_unprepare(priv->master_clk);
> +
> +		if (ret)
> +			return ret;

You can move the error check inside the first branch of the if and remove the 
ret = 0 initialization above.

> +	}
> +
>  	return soc_camera_set_power(&client->dev, ssdd, priv->clk, on);

If this call fails you should disable or enable the clock to undo the 
enable/disable above.

>  }
> 
> @@ -1153,6 +1168,16 @@ static int ov2640_probe(struct i2c_client *client,
>  		}
>  	}
> 
> +	priv->master_clk = devm_clk_get(&client->dev, "mck");
> +	if (!IS_ERR(priv->master_clk)) {
> +		/* Set ISI_MCK's frequency, it should be faster than pixel
> +		 * clock.
> +		 */
> +		ret = clk_set_rate(priv->master_clk, DEFAULT_MASTER_CLK_FREQ);

The clock frequency should be system-dependent. For the DT case an easy 
implementation would be to use the assigned-clock-rates to set the desired 
clock frequency is case of a variable clock, as adding a sensor-specific 
property to specify the desired clock frequency only to read that property in 
the driver and call clk_set_rate() seems a bit pointless to me.

> +		if (ret < 0)
> +			return ret;
> +	}
> +
>  	v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
>  	v4l2_ctrl_handler_init(&priv->hdl, 2);
>  	v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops,

-- 
Regards,

Laurent Pinchart

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Josh Wu <josh.wu@atmel.com>
Cc: linux-media@vger.kernel.org, m.chehab@samsung.com,
	linux-arm-kernel@lists.infradead.org, g.liakhovetski@gmx.de,
	devicetree@vger.kernel.org
Subject: Re: [PATCH 3/4] media: ov2640: add a master clock for sensor
Date: Tue, 02 Dec 2014 00:26:17 +0200	[thread overview]
Message-ID: <2284801.0jEi8Kph7L@avalon> (raw)
In-Reply-To: <1417170507-11172-4-git-send-email-josh.wu@atmel.com>

Hi Josh,

(CC'ing the devicetree@vger.kernel.org mailing list)

Thank you for the patch.

On Friday 28 November 2014 18:28:26 Josh Wu wrote:
> The master clock can be optional. It's a common clock framework clock.
> It can make sensor output a pixel clock to the camera interface.
> 
> If you just use a external oscillator clock as the master clock, then,
> just don't need set 'mck' in dt node.
> 
> Signed-off-by: Josh Wu <josh.wu@atmel.com>
> ---
>  drivers/media/i2c/soc_camera/ov2640.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/drivers/media/i2c/soc_camera/ov2640.c
> b/drivers/media/i2c/soc_camera/ov2640.c index 6506126..06c2aa9 100644
> --- a/drivers/media/i2c/soc_camera/ov2640.c
> +++ b/drivers/media/i2c/soc_camera/ov2640.c
> @@ -13,6 +13,7 @@
>   * published by the Free Software Foundation.
>   */
> 
> +#include <linux/clk.h>
>  #include <linux/init.h>
>  #include <linux/module.h>
>  #include <linux/i2c.h>
> @@ -31,6 +32,8 @@
> 
>  #define VAL_SET(x, mask, rshift, lshift)  \
>  		((((x) >> rshift) & mask) << lshift)
> +#define DEFAULT_MASTER_CLK_FREQ		25000000
> +
>  /*
>   * DSP registers
>   * register offset for BANK_SEL == BANK_SEL_DSP
> @@ -284,6 +287,7 @@ struct ov2640_priv {
>  	struct v4l2_ctrl_handler	hdl;
>  	u32	cfmt_code;
>  	struct v4l2_clk			*clk;
> +	struct clk			*master_clk;
>  	const struct ov2640_win_size	*win;
> 
>  	struct soc_camera_subdev_desc	ssdd_dt;
> @@ -746,6 +750,7 @@ static int ov2640_s_power(struct v4l2_subdev *sd, int
> on) struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
> struct ov2640_priv *priv = to_ov2640(client);
>  	struct v4l2_clk *clk;
> +	int ret = 0;
> 
>  	if (!priv->clk) {
>  		clk = v4l2_clk_get(&client->dev, "mclk");
> @@ -755,6 +760,16 @@ static int ov2640_s_power(struct v4l2_subdev *sd, int
> on) priv->clk = clk;
>  	}
> 
> +	if (!IS_ERR(priv->master_clk)) {

The clock should be mandatory, you can thus drop this check.

> +		if (on)
> +			ret = clk_prepare_enable(priv->master_clk);
> +		else
> +			clk_disable_unprepare(priv->master_clk);
> +
> +		if (ret)
> +			return ret;

You can move the error check inside the first branch of the if and remove the 
ret = 0 initialization above.

> +	}
> +
>  	return soc_camera_set_power(&client->dev, ssdd, priv->clk, on);

If this call fails you should disable or enable the clock to undo the 
enable/disable above.

>  }
> 
> @@ -1153,6 +1168,16 @@ static int ov2640_probe(struct i2c_client *client,
>  		}
>  	}
> 
> +	priv->master_clk = devm_clk_get(&client->dev, "mck");
> +	if (!IS_ERR(priv->master_clk)) {
> +		/* Set ISI_MCK's frequency, it should be faster than pixel
> +		 * clock.
> +		 */
> +		ret = clk_set_rate(priv->master_clk, DEFAULT_MASTER_CLK_FREQ);

The clock frequency should be system-dependent. For the DT case an easy 
implementation would be to use the assigned-clock-rates to set the desired 
clock frequency is case of a variable clock, as adding a sensor-specific 
property to specify the desired clock frequency only to read that property in 
the driver and call clk_set_rate() seems a bit pointless to me.

> +		if (ret < 0)
> +			return ret;
> +	}
> +
>  	v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
>  	v4l2_ctrl_handler_init(&priv->hdl, 2);
>  	v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops,

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2014-12-01 22:26 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-28 10:28 [PATCH 0/4] media: ov2640: add device tree support Josh Wu
2014-11-28 10:28 ` Josh Wu
2014-11-28 10:28 ` [PATCH 1/4] media: ov2640: add async probe function Josh Wu
2014-11-28 10:28   ` Josh Wu
2014-11-28 10:28 ` [PATCH 2/4] media: ov2640: add primary dt support Josh Wu
2014-11-28 10:28   ` Josh Wu
2014-11-28 10:28   ` Josh Wu
2014-12-01 22:33   ` Laurent Pinchart
2014-12-01 22:33     ` Laurent Pinchart
2014-12-05 10:17     ` Josh Wu
2014-12-05 10:17       ` Josh Wu
2014-12-05 10:17       ` Josh Wu
2014-11-28 10:28 ` [PATCH 3/4] media: ov2640: add a master clock for sensor Josh Wu
2014-11-28 10:28   ` Josh Wu
2014-12-01 22:26   ` Laurent Pinchart [this message]
2014-12-01 22:26     ` Laurent Pinchart
2014-12-03  9:54     ` Josh Wu
2014-12-03  9:54       ` Josh Wu
2014-12-03  9:54       ` Josh Wu
2014-11-28 10:28 ` [PATCH 4/4] media: ov2640: dt: add the device tree binding document Josh Wu
2014-11-28 10:28   ` Josh Wu
2014-11-28 10:28   ` Josh Wu
2014-12-01 22:14   ` Laurent Pinchart
2014-12-01 22:14     ` Laurent Pinchart
2014-12-03  9:49     ` Josh Wu
2014-12-03  9:49       ` Josh Wu
2014-12-03  9:49       ` Josh Wu

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=2284801.0jEi8Kph7L@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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.