linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* Inconsistency in clk framework
@ 2012-12-19  4:10 Tony Prisk
  2012-12-19  9:26 ` Russell King - ARM Linux
  0 siblings, 1 reply; 7+ messages in thread
From: Tony Prisk @ 2012-12-19  4:10 UTC (permalink / raw)
  To: linux-arm-kernel

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.

This seems to contradict the kernel docs associated with the normal
clk_get (when HAVE_CLK is defined) which states:

* Returns a struct clk corresponding to the clock producer, or
* valid IS_ERR() condition containing errno.

Wouldn't a return code of ERR_PTR(-ENOENT) make more sense and be inline
with the empty of_ versions as well (which return -ENOENT when CONFIG_OF
is undefined).

Also, I noticed that clk_get_sys() doesn't appear to be defined in clk.h
when HAVE_CLK is undefined - is this correct?

Regards
Tony Prisk

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Inconsistency in clk framework
  2012-12-19  4:10 Inconsistency in clk framework Tony Prisk
@ 2012-12-19  9:26 ` Russell King - ARM Linux
  2012-12-19 17:34   ` Tony Prisk
  0 siblings, 1 reply; 7+ messages in thread
From: Russell King - ARM Linux @ 2012-12-19  9:26 UTC (permalink / raw)
  To: linux-arm-kernel

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?

> This seems to contradict the kernel docs associated with the normal
> clk_get (when HAVE_CLK is defined) which states:
> 
> * Returns a struct clk corresponding to the clock producer, or
> * valid IS_ERR() condition containing errno.
> 
> Wouldn't a return code of ERR_PTR(-ENOENT) make more sense and be inline
> with the empty of_ versions as well (which return -ENOENT when CONFIG_OF
> is undefined).

No.

> Also, I noticed that clk_get_sys() doesn't appear to be defined in clk.h
> when HAVE_CLK is undefined - is this correct?

It was never promoted to an official API because its only platform code
which should be using it; no device driver (which should have a struct
device to pass into clk_get()) should ever use clk_get_sys().

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Inconsistency in clk framework
  2012-12-19  9:26 ` Russell King - ARM Linux
@ 2012-12-19 17:34   ` Tony Prisk
  2012-12-19 19:00     ` Tony Prisk
  0 siblings, 1 reply; 7+ messages in thread
From: Tony Prisk @ 2012-12-19 17:34 UTC (permalink / raw)
  To: linux-arm-kernel

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?

Regards
Tony P

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Inconsistency in clk framework
  2012-12-19 17:34   ` Tony Prisk
@ 2012-12-19 19:00     ` Tony Prisk
  2012-12-19 19:08       ` Russell King - ARM Linux
  0 siblings, 1 reply; 7+ messages in thread
From: Tony Prisk @ 2012-12-19 19:00 UTC (permalink / raw)
  To: linux-arm-kernel

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.

Regards
Tony P

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Inconsistency in clk framework
  2012-12-19 19:00     ` Tony Prisk
@ 2012-12-19 19:08       ` Russell King - ARM Linux
  2012-12-20  4:13         ` Tony Prisk
  0 siblings, 1 reply; 7+ messages in thread
From: Russell King - ARM Linux @ 2012-12-19 19:08 UTC (permalink / raw)
  To: linux-arm-kernel

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.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Inconsistency in clk framework
  2012-12-19 19:08       ` Russell King - ARM Linux
@ 2012-12-20  4:13         ` Tony Prisk
  2012-12-20  9:40           ` Russell King - ARM Linux
  0 siblings, 1 reply; 7+ messages in thread
From: Tony Prisk @ 2012-12-20  4:13 UTC (permalink / raw)
  To: linux-arm-kernel

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)


I apologise if it seems like I am not getting it, but I would like to
understand this properly to avoid further problems later.

Regards
Tony P

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Inconsistency in clk framework
  2012-12-20  4:13         ` Tony Prisk
@ 2012-12-20  9:40           ` Russell King - ARM Linux
  0 siblings, 0 replies; 7+ messages in thread
From: Russell King - ARM Linux @ 2012-12-20  9:40 UTC (permalink / raw)
  To: linux-arm-kernel

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.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-12-20  9:40 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-19  4:10 Inconsistency in clk framework Tony Prisk
2012-12-19  9:26 ` Russell King - ARM Linux
2012-12-19 17:34   ` Tony Prisk
2012-12-19 19:00     ` Tony Prisk
2012-12-19 19:08       ` Russell King - ARM Linux
2012-12-20  4:13         ` Tony Prisk
2012-12-20  9:40           ` Russell King - ARM Linux

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).