From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Ramiro Oliveira <Ramiro.Oliveira@synopsys.com>,
linux-kernel@vger.kernel.org, CARLOS.PALMINHA@synopsys.com
Subject: Re: [PATCH] reset: Make optional functions really optional.
Date: Fri, 23 Dec 2016 13:23:10 +0200 [thread overview]
Message-ID: <4238328.E0tRokcGUd@avalon> (raw)
In-Reply-To: <1482490737.2394.37.camel@pengutronix.de>
Hello,
On Friday 23 Dec 2016 11:58:57 Philipp Zabel wrote:
> Am Donnerstag, den 15.12.2016, 18:05 +0000 schrieb Ramiro Oliveira:
> > Up until now optional functions in the reset API were similar to the non
> > optional.
> >
> > This patch corrects that, while maintaining compatibility with existing
> > drivers.
> >
> > As suggested here: https://lkml.org/lkml/2016/12/14/502
> >
> > Signed-off-by: Ramiro Oliveira <Ramiro.Oliveira@synopsys.com>
> > ---
> >
> > drivers/reset/core.c | 21 +++++++++++++++++++--
> > include/linux/reset.h | 46 ++++++++++++++++++++++++++++++++++++++++++----
> > 2 files changed, 61 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/reset/core.c b/drivers/reset/core.c
> > index 395dc9c..6150e7c 100644
> > --- a/drivers/reset/core.c
> > +++ b/drivers/reset/core.c
> > @@ -135,9 +135,14 @@ EXPORT_SYMBOL_GPL(devm_reset_controller_register);
> > * @rstc: reset controller
> > *
> > * Calling this on a shared reset controller is an error.
> > + *
> > + * If it's an optional reset it will return 0.
>
> I'd prefer this to explicitly mention that rstc==NULL means this is an
> optional reset:
>
> "If rstc is NULL it is an optional reset and the function will just
> return 0."
Maybe we should document in a single place that NULL is a valid value for a
reset_control pointer and will result in the API behaving as a no-op ? If you
want to duplicate the information I'd still prefer talking about no-op than
about "just returning 0".
> > */
> > int reset_control_reset(struct reset_control *rstc)
> > {
> > + if (!rstc)
> > + return 0;
> > +
> > if (WARN_ON(rstc->shared))
> > return -EINVAL;
> >
> > @@ -158,9 +163,14 @@ EXPORT_SYMBOL_GPL(reset_control_reset);
> > *
> > * For shared reset controls a driver cannot expect the hw's registers
> > and
> > * internal state to be reset, but must be prepared for this to happen.
> > + *
> > + * If it's an optional reset it will return 0.
>
> Same as above.
>
> > */
> >
> > int reset_control_assert(struct reset_control *rstc)
> > {
> > + if (!rstc)
> > + return 0;
> > +
> > if (!rstc->rcdev->ops->assert)
> > return -ENOTSUPP;
> >
> > @@ -180,10 +190,14 @@ EXPORT_SYMBOL_GPL(reset_control_assert);
> > * reset_control_deassert - deasserts the reset line
> > * @rstc: reset controller
> > *
> > - * After calling this function, the reset is guaranteed to be deasserted.
> > + * After calling this function, the reset is guaranteed to be deasserted,
> > if
> > + * it's not optional.
>
> Same as above.
>
> > */
> > int reset_control_deassert(struct reset_control *rstc)
> > {
> > + if (!rstc)
> > + return 0;
> > +
> > if (!rstc->rcdev->ops->deassert)
> > return -ENOTSUPP;
> >
> > @@ -199,11 +213,14 @@ EXPORT_SYMBOL_GPL(reset_control_deassert);
> > /**
> > * reset_control_status - returns a negative errno if not supported, a
> > * positive value if the reset line is asserted, or zero if the reset
> > - * line is not asserted.
> > + * line is not asserted or if the desc is NULL (optional reset).
> > * @rstc: reset controller
> > */
> > int reset_control_status(struct reset_control *rstc)
> > {
> > + if (!rstc)
> > + return 0;
> > +
> > if (rstc->rcdev->ops->status)
> > return rstc->rcdev->ops->status(rstc->rcdev, rstc->id);
> >
> > diff --git a/include/linux/reset.h b/include/linux/reset.h
> > index 5daff15..1af1e62 100644
> > --- a/include/linux/reset.h
> > +++ b/include/linux/reset.h
> > @@ -138,13 +138,33 @@ static inline struct reset_control
> > *reset_control_get_shared(>
> > static inline struct reset_control *reset_control_get_optional_exclusive(
> > struct device *dev, const char *id)
> > {
> > - return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 0);
> > + struct reset_control *desc;
> > +
> > + desc = __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 0);
>
> Note that the __of_reset_control_get stub returns -ENOTSUPP if
> CONFIG_RESET_CONTROLLER is disabled.
>
> > + if (IS_ERR(desc)) {
> > + if (PTR_ERR(desc) == -ENOENT)
> > + return NULL;
> > + }
> > +
> > + return desc;
> > +
> > }
> >
> > static inline struct reset_control *reset_control_get_optional_shared(
> > struct device *dev, const char *id)
> > {
> > - return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 1);
> > +
> > + struct reset_control *desc;
> > +
> > + desc = __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 1);
> > +
> > + if (IS_ERR(desc)) {
> > + if (PTR_ERR(desc) == -ENOENT)
> > + return NULL;
> > + }
>
> With this duplication, I think it might be better to add an int optional
> parameter
What's wrong with bool by the way ? :-)
> to __of_reset_control_get and let that return NULL if optional
> is set and either of_property_match_string or of_parse_phandle_with_args
> would cause an -ENOENT return.
>
> The stub could then
> return optional ? NULL : ERR_PTR(-EONOENT);
>
> > + return desc;
> > }
> >
> > /**
> > @@ -273,13 +293,31 @@ static inline struct reset_control
> > *devm_reset_control_get_shared(
> > static inline struct reset_control
> > *devm_reset_control_get_optional_exclusive(
> > struct device *dev, const char *id)
> > {
> > - return __devm_reset_control_get(dev, id, 0, 0);
> > + struct reset_control *desc;
> > +
> > + desc = __devm_reset_control_get(dev, id, 0, 0);
> > +
> > + if (IS_ERR(desc)) {
> > + if (PTR_ERR(desc) == -ENOENT)
> > + return NULL;
> > + }
>
> Same as for __of_reset_control_get above.
>
> > + return desc;
> > }
> >
> > static inline struct reset_control
> > *devm_reset_control_get_optional_shared(
> > struct device *dev, const char *id)
> > {
> > - return __devm_reset_control_get(dev, id, 0, 1);
> > + struct reset_control *desc;
> > +
> > + desc = __devm_reset_control_get(dev, id, 0, 1);
> > +
> > + if (IS_ERR(desc)) {
> > + if (PTR_ERR(desc) == -ENOENT)
> > + return NULL;
> > + }
> > +
> > + return desc;
> > }
> >
> > /**
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2016-12-23 11:22 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-15 18:05 [PATCH] reset: Make optional functions really optional Ramiro Oliveira
2016-12-23 10:58 ` Philipp Zabel
2016-12-23 11:23 ` Laurent Pinchart [this message]
2016-12-23 12:08 ` Philipp Zabel
2016-12-23 16:41 ` Laurent Pinchart
2016-12-23 16:53 ` Ramiro Oliveira
2016-12-23 17:19 ` Ramiro Oliveira
2016-12-23 17:57 ` 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=4238328.E0tRokcGUd@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=CARLOS.PALMINHA@synopsys.com \
--cc=Ramiro.Oliveira@synopsys.com \
--cc=linux-kernel@vger.kernel.org \
--cc=p.zabel@pengutronix.de \
/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.