All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Jacopo Mondi <jacopo@jmondi.org>
Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	"Kieran Bingham" <kieran.bingham@ideasonboard.com>,
	"Niklas Söderlund" <niklas.soderlund@ragnatech.se>,
	"Thomas Nizan" <tnizan@witekio.com>,
	"Mark Brown" <broonie@kernel.org>,
	"Liam Girdwood" <lgirdwood@gmail.com>
Subject: Re: [PATCH v2 04/11] media: i2c: max9286: Add support for port regulators
Date: Mon, 10 Jan 2022 01:16:52 +0200	[thread overview]
Message-ID: <Ydts5Da3mHdvBIng@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20220109100412.z2twzgkeum4fzbaw@uno.localdomain>

Hi Jacopo,

On Sun, Jan 09, 2022 at 11:04:12AM +0100, Jacopo Mondi wrote:
> On Sat, Jan 01, 2022 at 08:27:59PM +0200, Laurent Pinchart wrote:
> > From: Thomas Nizan <tnizan@witekio.com>
> >
> > Allow users to use one PoC regulator per port, instead of a global
> > regulator.
> >
> > The properties '^port[0-3]-poc-supply$' in the DT node are used to
> > indicate the regulators for individual ports.
> >
> > Signed-off-by: Thomas Nizan <tnizan@witekio.com>
> > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> 
> The patch looks almost good, but it will really conflict with gpio-poc work I
> have on the list. Should we decide an ordering and send a single
> series with both efforts in to ease collecting it ?

I'm fine with any order, and I'm also fine merging the two series. I
don't mind rebasing on top of your gpio-poc series at all, would that
help ?

> > ---
> > Changes since v1:
> >
> > - Use to_index()
> > - Use dev_err_probe()
> > - Fix error path in probe()
> > - Use devm_regulator_get_optional() instead of
> >   devm_regulator_get_exclusive()
> > ---
> >  drivers/media/i2c/max9286.c | 107 +++++++++++++++++++++++++++++++-----
> >  1 file changed, 94 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c
> > index eb2b8e42335b..15c80034e3a4 100644
> > --- a/drivers/media/i2c/max9286.c
> > +++ b/drivers/media/i2c/max9286.c
> > @@ -138,6 +138,7 @@
> >  struct max9286_source {
> >  	struct v4l2_subdev *sd;
> >  	struct fwnode_handle *fwnode;
> > +	struct regulator *regulator;
> >  };
> >
> >  struct max9286_asd {
> > @@ -1071,6 +1072,49 @@ static int max9286_register_gpio(struct max9286_priv *priv)
> >  	return ret;
> >  }
> >
> > +static int max9286_poc_power_on(struct max9286_priv *priv)
> > +{
> > +	struct max9286_source *source;
> > +	unsigned int enabled = 0;
> > +	int ret;
> > +
> > +	/* Enable the global regulator if available. */
> > +	if (priv->regulator)
> > +		return regulator_enable(priv->regulator);
> > +
> > +	/* Otherwise use the per-port regulators. */
> > +	for_each_source(priv, source) {
> > +		ret = regulator_enable(source->regulator);
> > +		if (ret < 0)
> > +			goto error;
> > +
> > +		enabled |= BIT(to_index(priv, source));
> > +	}
> > +
> > +	return 0;
> > +
> > +error:
> > +	for_each_source(priv, source) {
> > +		if (enabled & BIT(to_index(priv, source)))
> > +			regulator_disable(source->regulator);
> > +	}
> > +
> > +	return ret;
> > +}
> > +
> > +static void max9286_poc_power_off(struct max9286_priv *priv)
> > +{
> > +	struct max9286_source *source;
> > +
> > +	if (priv->regulator) {
> > +		regulator_disable(priv->regulator);
> > +		return;
> > +	}
> > +
> > +	for_each_source(priv, source)
> > +		regulator_disable(source->regulator);
> > +}
> > +
> >  static int max9286_init(struct device *dev)
> >  {
> >  	struct max9286_priv *priv;
> > @@ -1081,9 +1125,9 @@ static int max9286_init(struct device *dev)
> >  	priv = i2c_get_clientdata(client);
> >
> >  	/* Enable the bus power. */
> > -	ret = regulator_enable(priv->regulator);
> > +	ret = max9286_poc_power_on(priv);
> >  	if (ret < 0) {
> > -		dev_err(&client->dev, "Unable to turn PoC on\n");
> > +		dev_err(dev, "Unable to turn PoC on\n");
> >  		return ret;
> >  	}
> >
> > @@ -1117,7 +1161,7 @@ static int max9286_init(struct device *dev)
> >  err_v4l2_register:
> >  	max9286_v4l2_unregister(priv);
> >  err_regulator:
> > -	regulator_disable(priv->regulator);
> > +	max9286_poc_power_off(priv);
> >
> >  	return ret;
> >  }
> > @@ -1248,6 +1292,47 @@ static int max9286_parse_dt(struct max9286_priv *priv)
> >  	return 0;
> >  }
> >
> > +static int max9286_get_poc_supplies(struct max9286_priv *priv)
> > +{
> > +	struct device *dev = &priv->client->dev;
> > +	struct max9286_source *source;
> > +	int ret;
> > +
> > +	/* Start by getting the global regulator. */
> > +	priv->regulator = devm_regulator_get_optional(dev, "poc");
> > +	if (!IS_ERR(priv->regulator))
> > +		return 0;
> > +
> > +	if (PTR_ERR(priv->regulator) != -ENODEV) {
> > +		if (PTR_ERR(priv->regulator) != -EPROBE_DEFER)
> > +			dev_err(dev, "Unable to get PoC regulator: %ld\n",
> > +				PTR_ERR(priv->regulator));
> > +		return PTR_ERR(priv->regulator);
> > +	}
> > +
> > +	/* If there's no global regulator, get per-port regulators. */
> > +	dev_dbg(dev,
> > +		"No global PoC regulator, looking for per-port regulators\n");
> > +	priv->regulator = NULL;
> > +
> > +	for_each_source(priv, source) {
> > +		unsigned int index = to_index(priv, source);
> > +		char name[10];
> > +
> > +		snprintf(name, sizeof(name), "port%u-poc", index);
> > +		source->regulator = devm_regulator_get(dev, name);
> 
> Are you ok with a dummy being returned ?

I think that's fine. It would mean that there's no global regulator nor
per-port regulator specified in DT, which shouldn't happen even if the
supply is alwaus on. From a driver point of view it won't hurt I think.

> > +		if (IS_ERR(source->regulator)) {
> > +			ret = PTR_ERR(source->regulator);
> > +			dev_err_probe(dev, ret,
> > +				      "Unable to get port %u PoC regulator\n",
> > +				      index);
> > +			return ret;
> > +		}
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> >  static int max9286_probe(struct i2c_client *client)
> >  {
> >  	struct max9286_priv *priv;
> > @@ -1292,17 +1377,13 @@ static int max9286_probe(struct i2c_client *client)
> >  	if (ret)
> >  		goto err_powerdown;
> >
> > -	priv->regulator = devm_regulator_get(&client->dev, "poc");
> > -	if (IS_ERR(priv->regulator)) {
> > -		ret = PTR_ERR(priv->regulator);
> > -		dev_err_probe(&client->dev, ret,
> > -			      "Unable to get PoC regulator\n");
> > -		goto err_powerdown;
> > -	}
> > -
> >  	ret = max9286_parse_dt(priv);
> >  	if (ret)
> > -		goto err_powerdown;
> > +		goto err_cleanup_dt;
> 
> Shouldn't this be still err_powerdown ?

I don't think so, max9286_parse_dt() may have populated the fwnode of
part of the sources before failing.

> > +
> > +	ret = max9286_get_poc_supplies(priv);
> > +	if (ret)
> > +		goto err_cleanup_dt;
> >
> >  	ret = max9286_init(&client->dev);
> >  	if (ret < 0)
> > @@ -1326,7 +1407,7 @@ static int max9286_remove(struct i2c_client *client)
> >
> >  	max9286_v4l2_unregister(priv);
> >
> > -	regulator_disable(priv->regulator);
> > +	max9286_poc_power_off(priv);
> >
> >  	gpiod_set_value_cansleep(priv->gpiod_pwdn, 0);
> >

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2022-01-09 23:17 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-01 18:27 [PATCH v2 00/11] media: i2c: max9286: Small new features Laurent Pinchart
2022-01-01 18:27 ` [PATCH v2 01/11] dt-bindings: media: i2c: max9286: Add support for per-port supplies Laurent Pinchart
2022-01-09 11:48   ` Jacopo Mondi
2022-01-10 20:47   ` Rob Herring
2022-01-01 18:27 ` [PATCH v2 02/11] dt-bindings: media: i2c: max9286: Add property to select I2C speed Laurent Pinchart
2022-01-01 22:01   ` Rob Herring
2022-01-04 15:56   ` Rob Herring
2022-01-01 18:27 ` [PATCH v2 03/11] dt-bindings: media: i2c: max9286: Add property to select bus width Laurent Pinchart
2022-01-09 11:47   ` Jacopo Mondi
2022-01-10 20:53   ` Rob Herring
2022-01-10 21:24   ` [PATCH v2.1 " Laurent Pinchart
2022-01-22  0:28     ` Rob Herring
2022-01-01 18:27 ` [PATCH v2 04/11] media: i2c: max9286: Add support for port regulators Laurent Pinchart
2022-01-09 10:04   ` Jacopo Mondi
2022-01-09 23:16     ` Laurent Pinchart [this message]
2022-01-01 18:28 ` [PATCH v2 05/11] media: i2c: max9286: Support manual framesync operation Laurent Pinchart
2022-01-09 10:26   ` Jacopo Mondi
2022-01-01 18:28 ` [PATCH v2 06/11] media: i2c: max9286: Rename MAX9286_DATATYPE_RAW11 to RAW12 Laurent Pinchart
2022-01-09 10:26   ` Jacopo Mondi
2022-01-01 18:28 ` [PATCH v2 07/11] media: i2c: max9286: Support 12-bit raw bayer formats Laurent Pinchart
2022-01-09 10:34   ` Jacopo Mondi
2022-01-09 23:19     ` Laurent Pinchart
2022-01-01 18:28 ` [PATCH v2 08/11] media: i2c: max9286: Define macros for all bits of register 0x15 Laurent Pinchart
2022-01-09 10:37   ` Jacopo Mondi
2022-01-09 23:21     ` Laurent Pinchart
2022-01-10 10:37       ` Sergey Shtylyov
2022-01-10 11:32         ` Laurent Pinchart
2022-01-01 18:28 ` [PATCH v2 09/11] media: i2c: max9286: Configure remote I2C speed from device tree Laurent Pinchart
2022-01-09 10:43   ` Jacopo Mondi
2022-01-09 23:29     ` Laurent Pinchart
2022-01-01 18:28 ` [PATCH v2 10/11] media: i2c: max9286: Configure bus width " Laurent Pinchart
2022-01-09 10:56   ` Jacopo Mondi
2022-01-09 23:32     ` Laurent Pinchart
2022-01-01 18:28 ` [PATCH v2 11/11] media: i2c: max9286: Select HS as data enable signal Laurent Pinchart
2022-01-09 11:42   ` Jacopo Mondi
2022-01-01 23:26 ` [PATCH v2 12/11] media: i2c: max9286: Print power-up GMSL link configuration Laurent Pinchart
2022-01-09 11:44   ` 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=Ydts5Da3mHdvBIng@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=broonie@kernel.org \
    --cc=jacopo@jmondi.org \
    --cc=kieran.bingham@ideasonboard.com \
    --cc=lgirdwood@gmail.com \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=niklas.soderlund@ragnatech.se \
    --cc=tnizan@witekio.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.