From: linux@arm.linux.org.uk (Russell King - ARM Linux)
To: linux-arm-kernel@lists.infradead.org
Subject: Inconsistency in clk framework
Date: Thu, 20 Dec 2012 09:40:10 +0000 [thread overview]
Message-ID: <20121220094010.GY14363@n2100.arm.linux.org.uk> (raw)
In-Reply-To: <1355976817.2968.12.camel@gitbox>
On Thu, Dec 20, 2012 at 05:13:37PM +1300, Tony Prisk wrote:
> On Wed, 2012-12-19 at 19:08 +0000, Russell King - ARM Linux wrote:
> > On Thu, Dec 20, 2012 at 08:00:49AM +1300, Tony Prisk wrote:
> > > On Thu, 2012-12-20 at 06:34 +1300, Tony Prisk wrote:
> > > > On Wed, 2012-12-19 at 09:26 +0000, Russell King - ARM Linux wrote:
> > > > > On Wed, Dec 19, 2012 at 05:10:33PM +1300, Tony Prisk wrote:
> > > > > > Hi Mike,
> > > > > >
> > > > > > In attempting to remove some IS_ERR_OR_NULL references, it was pointed
> > > > > > out that clk_get() can return NULL if CONFIG_HAVE_CLK is not defined.
> > > > >
> > > > > That is correct - but why is that a problem? As far as users are
> > > > > concerned, NULL is a valid clock. If HAVE_CLK is undefined, do you
> > > > > want all your drivers to suddenly stop working?
> > > >
> > > > That will be where the misunderstanding has occurred - I didn't consider
> > > > NULL to be a valid clock.
> > > >
> > > > Given that NULL is a valid clock, I guess all tests against get_clk and
> > > > of_get_clk results should be IS_ERR_OR_NULL. Correct?
> > > >
> > > For the sake of clarity, I should rephrase:
> > >
> > > If the driver can't operate with a NULL clk, it should use a
> > > IS_ERR_OR_NULL test to test for failure, rather than IS_ERR.
> >
> > Why should a _consumer_ of a clock care? It is _very_ important that
> > people get this idea - to a consumer, the struct clk is just an opaque
> > cookie. The fact that it appears to be a pointer does _not_ mean that
> > the driver can do any kind of dereferencing on that pointer - it should
> > never do so.
>
> As a simple example:
> We have a PWM module that requires a clock source to be enabled before
> registers can be read/written.
>
> *pseudo code*
> x = clk_get("pwm_clock")
> if IS_ERR(x) then fail
> err = clk_enable(x)
> if (err != 0) then fail
> start writing to module registers
>
>
> Assuming HAVE_CLK is undefined:
>
> x = clk_get("pwm_clock") (= NULL)
> if IS_ERR(x) then fail (not an error)
> err = clk_enable(x) (= 0)
> if (err) then fail (not an error)
> start writing to module registers
> (register writes lock the bus because the clock wasn't really enabled,
> but no errors occurred enabling the clock)
Which is really silly if you have a platform which requires clock control
and HAVE_CLK is not selected. The clk API is not designed to cope with
that situation.
WARNING: multiple messages have this Message-ID (diff)
From: Russell King - ARM Linux <linux@arm.linux.org.uk>
To: Tony Prisk <linux@prisktech.co.nz>
Cc: Mike Turquette <mturquette@linaro.org>,
linux-kernel@vger.kernel.org,
Arm Kernel Mailing List <linux-arm-kernel@lists.infradead.org>
Subject: Re: Inconsistency in clk framework
Date: Thu, 20 Dec 2012 09:40:10 +0000 [thread overview]
Message-ID: <20121220094010.GY14363@n2100.arm.linux.org.uk> (raw)
In-Reply-To: <1355976817.2968.12.camel@gitbox>
On Thu, Dec 20, 2012 at 05:13:37PM +1300, Tony Prisk wrote:
> On Wed, 2012-12-19 at 19:08 +0000, Russell King - ARM Linux wrote:
> > On Thu, Dec 20, 2012 at 08:00:49AM +1300, Tony Prisk wrote:
> > > On Thu, 2012-12-20 at 06:34 +1300, Tony Prisk wrote:
> > > > On Wed, 2012-12-19 at 09:26 +0000, Russell King - ARM Linux wrote:
> > > > > On Wed, Dec 19, 2012 at 05:10:33PM +1300, Tony Prisk wrote:
> > > > > > Hi Mike,
> > > > > >
> > > > > > In attempting to remove some IS_ERR_OR_NULL references, it was pointed
> > > > > > out that clk_get() can return NULL if CONFIG_HAVE_CLK is not defined.
> > > > >
> > > > > That is correct - but why is that a problem? As far as users are
> > > > > concerned, NULL is a valid clock. If HAVE_CLK is undefined, do you
> > > > > want all your drivers to suddenly stop working?
> > > >
> > > > That will be where the misunderstanding has occurred - I didn't consider
> > > > NULL to be a valid clock.
> > > >
> > > > Given that NULL is a valid clock, I guess all tests against get_clk and
> > > > of_get_clk results should be IS_ERR_OR_NULL. Correct?
> > > >
> > > For the sake of clarity, I should rephrase:
> > >
> > > If the driver can't operate with a NULL clk, it should use a
> > > IS_ERR_OR_NULL test to test for failure, rather than IS_ERR.
> >
> > Why should a _consumer_ of a clock care? It is _very_ important that
> > people get this idea - to a consumer, the struct clk is just an opaque
> > cookie. The fact that it appears to be a pointer does _not_ mean that
> > the driver can do any kind of dereferencing on that pointer - it should
> > never do so.
>
> As a simple example:
> We have a PWM module that requires a clock source to be enabled before
> registers can be read/written.
>
> *pseudo code*
> x = clk_get("pwm_clock")
> if IS_ERR(x) then fail
> err = clk_enable(x)
> if (err != 0) then fail
> start writing to module registers
>
>
> Assuming HAVE_CLK is undefined:
>
> x = clk_get("pwm_clock") (= NULL)
> if IS_ERR(x) then fail (not an error)
> err = clk_enable(x) (= 0)
> if (err) then fail (not an error)
> start writing to module registers
> (register writes lock the bus because the clock wasn't really enabled,
> but no errors occurred enabling the clock)
Which is really silly if you have a platform which requires clock control
and HAVE_CLK is not selected. The clk API is not designed to cope with
that situation.
next prev parent reply other threads:[~2012-12-20 9:40 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-19 4:10 Inconsistency in clk framework Tony Prisk
2012-12-19 4:10 ` Tony Prisk
2012-12-19 9:26 ` Russell King - ARM Linux
2012-12-19 9:26 ` Russell King - ARM Linux
2012-12-19 17:34 ` Tony Prisk
2012-12-19 17:34 ` Tony Prisk
2012-12-19 19:00 ` Tony Prisk
2012-12-19 19:00 ` Tony Prisk
2012-12-19 19:08 ` Russell King - ARM Linux
2012-12-19 19:08 ` Russell King - ARM Linux
2012-12-20 4:13 ` Tony Prisk
2012-12-20 4:13 ` Tony Prisk
2012-12-20 9:40 ` Russell King - ARM Linux [this message]
2012-12-20 9:40 ` Russell King - ARM Linux
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=20121220094010.GY14363@n2100.arm.linux.org.uk \
--to=linux@arm.linux.org.uk \
--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.