All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Thomas Nizan <tomniz035@gmail.com>
Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	"Jacopo Mondi" <jacopo+renesas@jmondi.org>,
	"Kieran Bingham" <kieran.bingham+renesas@ideasonboard.com>,
	"Niklas Söderlund" <niklas.soderlund+renesas@ragnatech.se>,
	"Thomas Nizan" <tnizan@witekio.com>
Subject: Re: [PATCH 2/3] media: i2c: max9286: Add support for port regulators
Date: Mon, 20 Dec 2021 17:25:10 +0200	[thread overview]
Message-ID: <YcCgVvppKkSwRHuu@pendragon.ideasonboard.com> (raw)
In-Reply-To: <351eddd4-fc73-420e-0817-7282e413c126@gmail.com>

Hi Thomas,

On Mon, Dec 20, 2021 at 04:06:26PM +0100, Thomas Nizan wrote:
> On 2021-12-16 11:09 p.m., 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>

Thank you.

> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> >  drivers/media/i2c/max9286.c | 112 +++++++++++++++++++++++++++++++-----
> >  1 file changed, 98 insertions(+), 14 deletions(-)
> > 
> > diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c
> > index 7c663fd587bb..fa2f6a823fe6 100644
> > --- a/drivers/media/i2c/max9286.c
> > +++ b/drivers/media/i2c/max9286.c
> > @@ -136,8 +136,10 @@
> >  #define MAX9286_SRC_PAD			4
> >  
> >  struct max9286_source {
> > +	unsigned int index;
> >  	struct v4l2_subdev *sd;
> >  	struct fwnode_handle *fwnode;
> > +	struct regulator *regulator;
> >  };
> >  
> >  struct max9286_asd {
> > @@ -1072,6 +1074,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(source->index);
> > +	}
> > +
> > +	return 0;
> > +
> > +error:
> > +	for_each_source(priv, source) {
> > +		if (enabled & BIT(source->index))
> > +			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;
> > @@ -1082,9 +1127,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;
> >  	}
> >  
> > @@ -1118,7 +1163,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;
> >  }
> > @@ -1215,6 +1260,7 @@ static int max9286_parse_dt(struct max9286_priv *priv)
> >  		}
> >  
> >  		source = &priv->sources[ep.port];
> > +		source->index = ep.port;
> >  		source->fwnode = fwnode_graph_get_remote_endpoint(
> >  						of_fwnode_handle(node));
> >  		if (!source->fwnode) {
> > @@ -1249,6 +1295,50 @@ 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;
> > +
> > +	/*
> > +	 * Start by getting the global regulator. Usage of the exclusive API is
> > +	 * required to receive an error in case the supply isn't specified in
> > +	 * the device tree.
> > +	 */
> > +	priv->regulator = devm_regulator_get_exclusive(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) {
> > +		char name[10];
> > +
> > +		snprintf(name, sizeof(name), "port%u-poc", source->index);
> > +		source->regulator = devm_regulator_get_exclusive(dev, name);
> > +		if (IS_ERR(source->regulator)) {
> > +			if (PTR_ERR(source->regulator) != -EPROBE_DEFER)
> > +				dev_err(dev,
> > +					"Unable to get port %u PoC regulator: %ld\n",
> > +					source->index,
> > +					PTR_ERR(source->regulator));
> > +			return PTR_ERR(source->regulator);
> > +		}
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> >  static int max9286_probe(struct i2c_client *client)
> >  {
> >  	struct max9286_priv *priv;
> > @@ -1293,17 +1383,11 @@ 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)) {
> > -		if (PTR_ERR(priv->regulator) != -EPROBE_DEFER)
> > -			dev_err(&client->dev,
> > -				"Unable to get PoC regulator (%ld)\n",
> > -				PTR_ERR(priv->regulator));
> > -		ret = PTR_ERR(priv->regulator);
> > -		goto err_powerdown;
> > -	}
> > -
> >  	ret = max9286_parse_dt(priv);
> > +	if (ret)
> > +		goto err_cleanup_dt;
> > +
> > +	ret = max9286_get_poc_supplies(priv);
> >  	if (ret)
> >  		goto err_powerdown;
> >  
> > @@ -1329,7 +1413,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:[~2021-12-20 15:25 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-16 22:09 [PATCH 0/3] media: i2c: max9286: Small new features Laurent Pinchart
2021-12-16 22:09 ` [PATCH 1/3] dt-bindings: media: i2c: max9286: Add support for per-port supplies Laurent Pinchart
2021-12-17 10:47   ` Jacopo Mondi
2021-12-17 15:58     ` Laurent Pinchart
2021-12-17 14:18   ` Rob Herring
2021-12-17 15:59     ` Laurent Pinchart
2021-12-16 22:09 ` [PATCH 2/3] media: i2c: max9286: Add support for port regulators Laurent Pinchart
2021-12-17 11:08   ` Jacopo Mondi
2021-12-17 16:41     ` Laurent Pinchart
2021-12-17 14:00   ` Jacopo Mondi
2021-12-20 15:06   ` Thomas Nizan
2021-12-20 15:25     ` Laurent Pinchart [this message]
2021-12-16 22:09 ` [PATCH 3/3] media: i2c: max9286: Support manual framesync operation Laurent Pinchart
2021-12-17 11:14   ` Jacopo Mondi
2021-12-17 16:05     ` Laurent Pinchart
2021-12-17 17:49       ` Laurent Pinchart
2021-12-20  8:43         ` Jacopo Mondi
2021-12-20  8:45           ` Laurent Pinchart

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=YcCgVvppKkSwRHuu@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=jacopo+renesas@jmondi.org \
    --cc=kieran.bingham+renesas@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=niklas.soderlund+renesas@ragnatech.se \
    --cc=tnizan@witekio.com \
    --cc=tomniz035@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.