All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jackson <info@arducam.com>
To: jacopo@jmondi.org
Cc: bingbu.cao@intel.com, devicetree@vger.kernel.org,
	info@arducam.com, krzysztof.kozlowski+dt@linaro.org,
	linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
	mchehab@kernel.org, robh+dt@kernel.org, tian.shu.qiu@intel.com,
	y.oudjana@protonmail.com, yassine.oudjana@gmail.com
Subject: Re: [PATCH v2 3/3] media: i2c: ak7375: Add regulator management
Date: Wed, 20 Jul 2022 10:58:42 +0800	[thread overview]
Message-ID: <20220720105842.00006db4@arducam.com> (raw)
In-Reply-To: <20220714155831.c2nzbimf5oyndtdn@uno.localdomain>

Hello All,

This is Lee Jackson from Arducam, please check the reply following.

On Thu, 14 Jul 2022 17:58:31 +0200
Jacopo Mondi <jacopo@jmondi.org> wrote:

> Hello Yassine
> 
> On Thu, Jul 14, 2022 at 06:06:32PM +0400, Yassine Oudjana wrote:
> >
> > On Wed, Jul 13 2022 at 09:39:51 +0200, Jacopo Mondi
> > <jacopo@jmondi.org> wrote:  
> > > Hi Yassine
> > >
> > > On Mon, Jul 11, 2022 at 06:40:39PM +0400, Yassine Oudjana wrote:  
> > > >  From: Yassine Oudjana <y.oudjana@protonmail.com>
> > > >
> > > >  Make the driver get needed regulators on probe and
> > > > enable/disable them on runtime PM callbacks.
> > > >
> > > >  Signed-off-by: Yassine Oudjana <y.oudjana@protonmail.com>  
> > >
> > > Have you seen this ?
> > > https://github.com/ArduCAM/IMX519_AK7375/blob/main/AK7375/0002-media-i2c-ak7375-driver-add-optional-regulator-suppo.patch#L172
> > >
> > > It claims
> > > +	* Initialisation delay between VDD low->high and the
> > > moment
> > > +	* when the i2c command is available.
> > > +	* From the datasheet, it should be 10ms + 2ms (max power
> > > +	* up sequence duration)
> > >
> > > 10ms seems like a long time, it would be nice to have the
> > > datasheet to cross-check.  
> >
> > It does seem quite long. I couldn't find a datasheet anywhere
> > so the value I discovered is the best I have. I've added the
> > author of that patch to CC; maybe they have some info to
> > contribute.
> >  
> 
> I have now tested these patches with an Arducam IMX519 camera.
> Using a 3msec delay I get failures in the establishing i2c
> communications (I only tested 2 times though).
> 
> With 10milliseconds (which I concur is a lot) I get stable results.
> Let's see if we can get more info from who has the manual.
> 
> Thanks
>   j
> 

We have the datasheet for the ak7371 and as far as we know they are not
much different, here is the power up sequence for the ak7371:
https://www.arducam.com/wp-content/uploads/2022/07/ak7371-power-sequence.png
(We're not very familiar with working on the linux kernel mailing list
yet, that's one reason we didn't submit ak7375patch, please let me know
if I'm doing something wrong.)

> > >
> > > Thanks
> > >    j
> > >  
> > > >  ---
> > > >  Changes since v1:
> > > >    - Reorganize variable declaration
> > > >    - Change the power-on delay range to 3000-3500 microseconds.
> > > >
> > > >   drivers/media/i2c/ak7375.c | 39
> > > > ++++++++++++++++++++++++++++++++++++++
> > > >   1 file changed, 39 insertions(+)
> > > >
> > > >  diff --git a/drivers/media/i2c/ak7375.c
> > > > b/drivers/media/i2c/ak7375.c index 40b1a4aa846c..c2b2542a0056
> > > > 100644 --- a/drivers/media/i2c/ak7375.c
> > > >  +++ b/drivers/media/i2c/ak7375.c
> > > >  @@ -6,6 +6,7 @@
> > > >   #include <linux/i2c.h>
> > > >   #include <linux/module.h>
> > > >   #include <linux/pm_runtime.h>
> > > >  +#include <linux/regulator/consumer.h>
> > > >   #include <media/v4l2-ctrls.h>
> > > >   #include <media/v4l2-device.h>
> > > >
> > > >  @@ -23,17 +24,32 @@
> > > >    */
> > > >   #define AK7375_CTRL_STEPS	64
> > > >   #define AK7375_CTRL_DELAY_US	1000
> > > >  +/*
> > > >  + * The vcm takes around 3 ms to power on and start taking
> > > >  + * I2C messages. This value was found experimentally due to
> > > >  + * lack of documentation.
> > > >  + */
> > > >  +#define AK7375_POWER_DELAY_US	3000
> > > >
> > > >   #define AK7375_REG_POSITION	0x0
> > > >   #define AK7375_REG_CONT		0x2
> > > >   #define AK7375_MODE_ACTIVE	0x0
> > > >   #define AK7375_MODE_STANDBY	0x40
> > > >
> > > >  +static const char * const ak7375_supply_names[] = {
> > > >  +	"vdd",
> > > >  +	"vio",
> > > >  +};
> > > >  +
> > > >  +#define AK7375_NUM_SUPPLIES ARRAY_SIZE(ak7375_supply_names)
> > > >  +
> > > >   /* ak7375 device structure */
> > > >   struct ak7375_device {
> > > >   	struct v4l2_ctrl_handler ctrls_vcm;
> > > >   	struct v4l2_subdev sd;
> > > >   	struct v4l2_ctrl *focus;
> > > >  +	struct regulator_bulk_data
> > > > supplies[AK7375_NUM_SUPPLIES]; +
> > > >   	/* active or standby mode */
> > > >   	bool active;
> > > >   };
> > > >  @@ -133,12 +149,24 @@ static int ak7375_probe(struct i2c_client
> > > > *client)
> > > >   {
> > > >   	struct ak7375_device *ak7375_dev;
> > > >   	int ret;
> > > >  +	int i;
> > > >
> > > >   	ak7375_dev = devm_kzalloc(&client->dev,
> > > > sizeof(*ak7375_dev), GFP_KERNEL);
> > > >   	if (!ak7375_dev)
> > > >   		return -ENOMEM;
> > > >
> > > >  +	for (i = 0; i < AK7375_NUM_SUPPLIES; i++)
> > > >  +		ak7375_dev->supplies[i].supply =
> > > > ak7375_supply_names[i]; +
> > > >  +	ret = devm_regulator_bulk_get(&client->dev,
> > > > AK7375_NUM_SUPPLIES,
> > > >  +				      ak7375_dev->supplies);
> > > >  +	if (ret) {
> > > >  +		dev_err(&client->dev, "Failed to get
> > > > regulators: %pe",
> > > >  +			ERR_PTR(ret));
> > > >  +		return ret;
> > > >  +	}
> > > >  +
> > > >   	v4l2_i2c_subdev_init(&ak7375_dev->sd, client,
> > > > &ak7375_ops); ak7375_dev->sd.flags |=
> > > > V4L2_SUBDEV_FL_HAS_DEVNODE; ak7375_dev->sd.internal_ops =
> > > > &ak7375_int_ops; @@ -210,6 +238,10 @@ static int __maybe_unused
> > > > ak7375_vcm_suspend(struct device *dev)
> > > >   	if (ret)
> > > >   		dev_err(dev, "%s I2C failure: %d\n",
> > > > __func__, ret);
> > > >
> > > >  +	ret = regulator_bulk_disable(AK7375_NUM_SUPPLIES,
> > > > ak7375_dev->supplies);
> > > >  +	if (ret)
> > > >  +		return ret;
> > > >  +
> > > >   	ak7375_dev->active = false;
> > > >
> > > >   	return 0;
> > > >  @@ -230,6 +262,13 @@ static int __maybe_unused
> > > > ak7375_vcm_resume(struct device *dev)
> > > >   	if (ak7375_dev->active)
> > > >   		return 0;
> > > >
> > > >  +	ret = regulator_bulk_enable(AK7375_NUM_SUPPLIES,
> > > > ak7375_dev->supplies);
> > > >  +	if (ret)
> > > >  +		return ret;
> > > >  +
> > > >  +	/* Wait for vcm to become ready */
> > > >  +	usleep_range(AK7375_POWER_DELAY_US,
> > > > AK7375_POWER_DELAY_US + 500); +
> > > >   	ret = ak7375_i2c_write(ak7375_dev, AK7375_REG_CONT,
> > > >   		AK7375_MODE_ACTIVE, 1);
> > > >   	if (ret) {
> > > >  --
> > > >  2.37.0
> > > >  
> >
> >  


  reply	other threads:[~2022-07-20  2:58 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-11 14:40 [PATCH v2 0/3] media: i2c: ak7375: Add regulator management Yassine Oudjana
2022-07-11 14:40 ` [PATCH v2 1/3] media: dt-bindings: ak7375: Convert to DT schema Yassine Oudjana
2022-07-12  8:17   ` Krzysztof Kozlowski
2022-11-28  6:44   ` Umang Jain
2022-07-11 14:40 ` [PATCH v2 2/3] media: dt-bindings: ak7375: Add supplies Yassine Oudjana
2022-11-28  6:45   ` Umang Jain
2022-07-11 14:40 ` [PATCH v2 3/3] media: i2c: ak7375: Add regulator management Yassine Oudjana
2022-07-11 17:31   ` Jacopo Mondi
2022-07-14 13:56     ` Yassine Oudjana
2022-07-14 15:56       ` Jacopo Mondi
2022-07-20  7:36     ` Christophe JAILLET
2022-07-13  7:39   ` Jacopo Mondi
2022-07-14 14:06     ` Yassine Oudjana
2022-07-14 15:58       ` Jacopo Mondi
2022-07-20  2:58         ` Lee Jackson [this message]
2022-07-23 11:33   ` Sakari Ailus
2022-11-28  6:47   ` Umang Jain

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=20220720105842.00006db4@arducam.com \
    --to=info@arducam.com \
    --cc=bingbu.cao@intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=jacopo@jmondi.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=tian.shu.qiu@intel.com \
    --cc=y.oudjana@protonmail.com \
    --cc=yassine.oudjana@gmail.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.