LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] misc: ioc4: fix variable may be used uninitialized warning
@ 2014-12-08 12:27 Richard Leitner
  2014-12-08 12:42 ` Arnd Bergmann
  0 siblings, 1 reply; 9+ messages in thread
From: Richard Leitner @ 2014-12-08 12:27 UTC (permalink / raw)
  To: Arnd Bergmann, Greg Kroah-Hartman; +Cc: linux-kernel

Fix the following build warning:
drivers/misc/ioc4.c: In function ‘ioc4_probe’:
drivers/misc/ioc4.c:194:16: warning: ‘start’ may be used uninitialized
in this function [-Wmaybe-uninitialized]
  period = (end - start) /
                ^
drivers/misc/ioc4.c:148:11: note: ‘start’ was declared here
  uint64_t start, end, period;
           ^

As far as I can tell 'start' cannot really be used uninitialized
here, but for the sanity of gcc output explicitly initialize it.
Same goes for the 'end' variable.

Signed-off-by: Richard Leitner <dev@g0hl1n.net>
---
Used gcc version was 4.9.1 (Debian 4.9.1-19)
P.S.: I know I'm too late for 3.18 but hopefully it still helps.
---
 drivers/misc/ioc4.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c
index 3336ddc..7ec2733 100644
--- a/drivers/misc/ioc4.c
+++ b/drivers/misc/ioc4.c
@@ -145,7 +145,7 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
 	union ioc4_int_out int_out;
 	union ioc4_gpcr gpcr;
 	unsigned int state, last_state = 1;
-	uint64_t start, end, period;
+	uint64_t start = 0, end = 0, period;
 	unsigned int count = 0;
 
 	/* Enable output */
-- 
2.1.3


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

* Re: [PATCH] misc: ioc4: fix variable may be used uninitialized warning
  2014-12-08 12:27 [PATCH] misc: ioc4: fix variable may be used uninitialized warning Richard Leitner
@ 2014-12-08 12:42 ` Arnd Bergmann
  2014-12-08 13:18   ` Richard Leitner
  0 siblings, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2014-12-08 12:42 UTC (permalink / raw)
  To: Richard Leitner; +Cc: Greg Kroah-Hartman, linux-kernel, Lad, Prabhakar

On Monday 08 December 2014 13:27:20 Richard Leitner wrote:
> Fix the following build warning:
> drivers/misc/ioc4.c: In function ‘ioc4_probe’:
> drivers/misc/ioc4.c:194:16: warning: ‘start’ may be used uninitialized
> in this function [-Wmaybe-uninitialized]
>   period = (end - start) /
>                 ^
> drivers/misc/ioc4.c:148:11: note: ‘start’ was declared here
>   uint64_t start, end, period;
>            ^
> 
> As far as I can tell 'start' cannot really be used uninitialized
> here, but for the sanity of gcc output explicitly initialize it.
> Same goes for the 'end' variable.
> 
> Signed-off-by: Richard Leitner <dev@g0hl1n.net>

Prabhakar Lad also sent a patch for this already, which was lacking
a good patch description. Your patch does this slightly better but
still fails to explain how you concluded it was safe and you don't
really explain why you initialize the 'end' variable that we don't
even get a warning about.

	Arnd

> ---
> Used gcc version was 4.9.1 (Debian 4.9.1-19)
> P.S.: I know I'm too late for 3.18 but hopefully it still helps.
> ---
>  drivers/misc/ioc4.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c
> index 3336ddc..7ec2733 100644
> --- a/drivers/misc/ioc4.c
> +++ b/drivers/misc/ioc4.c
> @@ -145,7 +145,7 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
>  	union ioc4_int_out int_out;
>  	union ioc4_gpcr gpcr;
>  	unsigned int state, last_state = 1;
> -	uint64_t start, end, period;
> +	uint64_t start = 0, end = 0, period;
>  	unsigned int count = 0;
>  
>  	/* Enable output */
> 


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

* Re: [PATCH] misc: ioc4: fix variable may be used uninitialized warning
  2014-12-08 12:42 ` Arnd Bergmann
@ 2014-12-08 13:18   ` Richard Leitner
  2014-12-08 13:34     ` Prabhakar Lad
  0 siblings, 1 reply; 9+ messages in thread
From: Richard Leitner @ 2014-12-08 13:18 UTC (permalink / raw)
  To: Arnd Bergmann, Lad, Prabhakar; +Cc: Greg Kroah-Hartman, linux-kernel

On Mon, 08 Dec 2014 13:42:47 +0100
Arnd Bergmann <arnd@arndb.de> wrote:

> On Monday 08 December 2014 13:27:20 Richard Leitner wrote:
> > 
> > As far as I can tell 'start' cannot really be used uninitialized
> > here, but for the sanity of gcc output explicitly initialize it.
> > Same goes for the 'end' variable.
> 
> Prabhakar Lad also sent a patch for this already, which was lacking
> a good patch description. Your patch does this slightly better but
> still fails to explain how you concluded it was safe and you don't
> really explain why you initialize the 'end' variable that we don't
> even get a warning about.

Oops, I'm sorry, I haven't seen the patch and the answers to it.

According to the comments by Andrew a simplification of this code
section would be nice. I think it should be possible to do this in a
way that the initialize-to-zero won't be needed anymore.

Prabhakar Lad, are you working on this already?
If not I'll take a look at it.

regards,
richard


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

* Re: [PATCH] misc: ioc4: fix variable may be used uninitialized warning
  2014-12-08 13:18   ` Richard Leitner
@ 2014-12-08 13:34     ` Prabhakar Lad
  2014-12-08 15:28       ` [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate Richard Leitner
  0 siblings, 1 reply; 9+ messages in thread
From: Prabhakar Lad @ 2014-12-08 13:34 UTC (permalink / raw)
  To: Richard Leitner; +Cc: Arnd Bergmann, Greg Kroah-Hartman, LKML

On Mon, Dec 8, 2014 at 1:18 PM, Richard Leitner <dev@g0hl1n.net> wrote:
> On Mon, 08 Dec 2014 13:42:47 +0100
> Arnd Bergmann <arnd@arndb.de> wrote:
>
>> On Monday 08 December 2014 13:27:20 Richard Leitner wrote:
>> >
>> > As far as I can tell 'start' cannot really be used uninitialized
>> > here, but for the sanity of gcc output explicitly initialize it.
>> > Same goes for the 'end' variable.
>>
>> Prabhakar Lad also sent a patch for this already, which was lacking
>> a good patch description. Your patch does this slightly better but
>> still fails to explain how you concluded it was safe and you don't
>> really explain why you initialize the 'end' variable that we don't
>> even get a warning about.
>
> Oops, I'm sorry, I haven't seen the patch and the answers to it.
>
> According to the comments by Andrew a simplification of this code
> section would be nice. I think it should be possible to do this in a
> way that the initialize-to-zero won't be needed anymore.
>
> Prabhakar Lad, are you working on this already?
> If not I'll take a look at it.
>
Definitely you can go ahead, I am busy with other stuff.

Thanks,
--Prabhakar Lad

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

* [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate
  2014-12-08 13:34     ` Prabhakar Lad
@ 2014-12-08 15:28       ` Richard Leitner
  2014-12-08 15:46         ` Arnd Bergmann
  2014-12-08 15:54         ` Paul Bolle
  0 siblings, 2 replies; 9+ messages in thread
From: Richard Leitner @ 2014-12-08 15:28 UTC (permalink / raw)
  To: Arnd Bergmann, Greg Kroah-Hartman; +Cc: Prabhakar Lad, LKML, Andrew Morton

The loop for measuring the square wave periods over some cycles is
refactored to be more easily readable. This includes avoiding a
"by-hand-implemented" for loop with a "real" one and adding some
comments.

Furthermore the following compiler warning is avoided by this patch:
drivers/misc/ioc4.c: In function ‘ioc4_probe’:
drivers/misc/ioc4.c:194:16: warning: ‘start’ may be used uninitialized
in this function [-Wmaybe-uninitialized]
  period = (end - start) /
                ^
drivers/misc/ioc4.c:148:11: note: ‘start’ was declared here
  uint64_t start, end, period;
           ^

Signed-off-by: Richard Leitner <dev@g0hl1n.net>
---
A simplification of this loop was suggested by Andrew Morton [1].
This is my first proposal of such a simplification.

Furthermore I'm not sure if the commit message is sufficient.
Please give me also some feedback on it.

If this simplification is not needed only initializing start to
ktime_get_ns() would fix the compiler warning too.

[1] https://lkml.org/lkml/2014/12/5/76
---
 drivers/misc/ioc4.c | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c
index 3336ddc..8758d03 100644
--- a/drivers/misc/ioc4.c
+++ b/drivers/misc/ioc4.c
@@ -144,9 +144,9 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
 {
 	union ioc4_int_out int_out;
 	union ioc4_gpcr gpcr;
-	unsigned int state, last_state = 1;
+	unsigned int state, last_state;
 	uint64_t start, end, period;
-	unsigned int count = 0;
+	unsigned int count;
 
 	/* Enable output */
 	gpcr.raw = 0;
@@ -167,19 +167,20 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
 	mmiowb();
 
 	/* Check square wave period averaged over some number of cycles */
-	do {
-		int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
-		state = int_out.fields.int_out;
-		if (!last_state && state) {
-			count++;
-			if (count == IOC4_CALIBRATE_END) {
-				end = ktime_get_ns();
-				break;
-			} else if (count == IOC4_CALIBRATE_DISCARD)
-				start = ktime_get_ns();
-		}
-		last_state = state;
-	} while (1);
+	start = ktime_get_ns();
+	state = 1; /* make sure the first read isn't a rising edge */
+	for (count = 0; count <= IOC4_CALIBRATE_END; count++) {
+		do { /* wait for a rising edge */
+			last_state = state;
+			int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
+			state = int_out.fields.int_out;
+		} while (last_state || !state);
+
+		/* discard the first few cycles */
+		if (count == IOC4_CALIBRATE_DISCARD)
+			start = ktime_get_ns();
+	}
+	end = ktime_get_ns();
 
 	/* Calculation rearranged to preserve intermediate precision.
 	 * Logically:
-- 
2.1.3


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

* Re: [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate
  2014-12-08 15:28       ` [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate Richard Leitner
@ 2014-12-08 15:46         ` Arnd Bergmann
  2014-12-08 15:58           ` Richard Leitner
  2014-12-08 15:54         ` Paul Bolle
  1 sibling, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2014-12-08 15:46 UTC (permalink / raw)
  To: Richard Leitner; +Cc: Greg Kroah-Hartman, Prabhakar Lad, LKML, Andrew Morton

On Monday 08 December 2014 16:28:10 Richard Leitner wrote:
> The loop for measuring the square wave periods over some cycles is
> refactored to be more easily readable. This includes avoiding a
> "by-hand-implemented" for loop with a "real" one and adding some
> comments.
> 
> Furthermore the following compiler warning is avoided by this patch:
> drivers/misc/ioc4.c: In function ‘ioc4_probe’:
> drivers/misc/ioc4.c:194:16: warning: ‘start’ may be used uninitialized
> in this function [-Wmaybe-uninitialized]
>   period = (end - start) /
>                 ^
> drivers/misc/ioc4.c:148:11: note: ‘start’ was declared here
>   uint64_t start, end, period;
>            ^
> 
> Signed-off-by: Richard Leitner <dev@g0hl1n.net>

Acked-by: Arnd Bergmann <arnd@arndb.de>

> ---
> A simplification of this loop was suggested by Andrew Morton [1].
> This is my first proposal of such a simplification.
> 
> Furthermore I'm not sure if the commit message is sufficient.
> Please give me also some feedback on it.
> 
> If this simplification is not needed only initializing start to
> ktime_get_ns() would fix the compiler warning too.

With the changed loop, do you still get a warning if you
remove the extra 'start = ktime_get_ns()' at the start of the loop?

	Arnd

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

* Re: [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate
  2014-12-08 15:28       ` [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate Richard Leitner
  2014-12-08 15:46         ` Arnd Bergmann
@ 2014-12-08 15:54         ` Paul Bolle
  2014-12-08 21:03           ` Richard Leitner
  1 sibling, 1 reply; 9+ messages in thread
From: Paul Bolle @ 2014-12-08 15:54 UTC (permalink / raw)
  To: Richard Leitner
  Cc: Arnd Bergmann, Greg Kroah-Hartman, Prabhakar Lad, LKML, Andrew Morton

On Mon, 2014-12-08 at 16:28 +0100, Richard Leitner wrote:
> The loop for measuring the square wave periods over some cycles is
> refactored to be more easily readable. This includes avoiding a
> "by-hand-implemented" for loop with a "real" one and adding some
> comments.
> 
> Furthermore the following compiler warning is avoided by this patch:
> drivers/misc/ioc4.c: In function ‘ioc4_probe’:
> drivers/misc/ioc4.c:194:16: warning: ‘start’ may be used uninitialized
> in this function [-Wmaybe-uninitialized]
>   period = (end - start) /
>                 ^
> drivers/misc/ioc4.c:148:11: note: ‘start’ was declared here
>   uint64_t start, end, period;
>            ^
> 
> Signed-off-by: Richard Leitner <dev@g0hl1n.net>
> ---
> A simplification of this loop was suggested by Andrew Morton [1].
> This is my first proposal of such a simplification.
> 
> Furthermore I'm not sure if the commit message is sufficient.
> Please give me also some feedback on it.
> 
> If this simplification is not needed only initializing start to
> ktime_get_ns() would fix the compiler warning too.
> 
> [1] https://lkml.org/lkml/2014/12/5/76
> ---
>  drivers/misc/ioc4.c | 31 ++++++++++++++++---------------
>  1 file changed, 16 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c
> index 3336ddc..8758d03 100644
> --- a/drivers/misc/ioc4.c
> +++ b/drivers/misc/ioc4.c
> @@ -144,9 +144,9 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
>  {
>  	union ioc4_int_out int_out;
>  	union ioc4_gpcr gpcr;
> -	unsigned int state, last_state = 1;
> +	unsigned int state, last_state;
>  	uint64_t start, end, period;
> -	unsigned int count = 0;
> +	unsigned int count;
>  
>  	/* Enable output */
>  	gpcr.raw = 0;
> @@ -167,19 +167,20 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
>  	mmiowb();
>  
>  	/* Check square wave period averaged over some number of cycles */
> -	do {
> -		int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
> -		state = int_out.fields.int_out;
> -		if (!last_state && state) {
> -			count++;
> -			if (count == IOC4_CALIBRATE_END) {
> -				end = ktime_get_ns();
> -				break;
> -			} else if (count == IOC4_CALIBRATE_DISCARD)
> -				start = ktime_get_ns();
> -		}
> -		last_state = state;
> -	} while (1);
> +	start = ktime_get_ns();
> +	state = 1; /* make sure the first read isn't a rising edge */
> +	for (count = 0; count <= IOC4_CALIBRATE_END; count++) {
> +		do { /* wait for a rising edge */
> +			last_state = state;
> +			int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
> +			state = int_out.fields.int_out;
> +		} while (last_state || !state);
> +
> +		/* discard the first few cycles */
> +		if (count == IOC4_CALIBRATE_DISCARD)
> +			start = ktime_get_ns();
> +	}
> +	end = ktime_get_ns();
>  
>  	/* Calculation rearranged to preserve intermediate precision.
>  	 * Logically:

I've had the patch pasted at the end of this message in my local stack
of patches for some time now. It uses another approach: by using a
helper function things become much simpler. I _think_ it doesn't
introduce any functional changes but still need to a quiet day to make
sure that is correct.

Hope this helps,


Paul Bolle
---
>From 6fd7078b622323a2d9b72c9fffad347a1321204d Mon Sep 17 00:00:00 2001
From: Paul Bolle <pebolle@tiscali.nl>
Date: Tue, 19 Aug 2014 09:11:40 +0200
Subject: [PATCH] ioc4: silence GCC warning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Building ioc4.o triggers a GCC warning since v3.17-rc1:
    drivers/misc/ioc4.c: In function ‘ioc4_probe’:
    drivers/misc/ioc4.c:194:16: warning: ‘start’ may be used uninitialized in this function [-Wmaybe-uninitialized]
      period = (end - start) /
                    ^
    drivers/misc/ioc4.c:148:11: note: ‘start’ was declared here
      uint64_t start, end, period;
               ^

This is a false positive. Apparently the recent change to use
ktime_get_ns() makes it harder for GCC to analyze the codeflow.

Adding a small (inline) function that only returns after a certain
number of wave cycles have been seen allows to reorder the code a bit.
And after reordering it is clearer for both the compiler and the human
reader what's going on here. So let's do that.

Not-yet-signed-off-by: Paul Bolle <pebolle@tiscali.nl>
---
 drivers/misc/ioc4.c | 39 +++++++++++++++++++++------------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c
index 3336ddca45ac..e8209fa78713 100644
--- a/drivers/misc/ioc4.c
+++ b/drivers/misc/ioc4.c
@@ -122,11 +122,25 @@ ioc4_unregister_submodule(struct ioc4_submodule *is)
 #define IOC4_CALIBRATE_DEFAULT \
 	(1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_DEFAULT_MHZ)
 
-#define IOC4_CALIBRATE_END \
-	(IOC4_CALIBRATE_CYCLES + IOC4_CALIBRATE_DISCARD)
-
 #define IOC4_INT_OUT_MODE_TOGGLE 0x7	/* Toggle INT_OUT every COUNT+1 ticks */
 
+/* return after count wave cycles have been seen */
+static inline void
+ioc4_clock_wave_cycles(struct ioc4_driver_data *idd, unsigned int count)
+{
+	union ioc4_int_out int_out;
+	unsigned int state, last_state = 1;
+	unsigned int i = 0;
+
+	do {
+		int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
+		state = int_out.fields.int_out;
+		if (!last_state && state)
+			i++;
+		last_state = state;
+	} while (i < count);
+}
+
 /* Determines external interrupt output clock period of the PCI bus an
  * IOC4 is attached to.  This value can be used to determine the PCI
  * bus speed.
@@ -144,9 +158,7 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
 {
 	union ioc4_int_out int_out;
 	union ioc4_gpcr gpcr;
-	unsigned int state, last_state = 1;
 	uint64_t start, end, period;
-	unsigned int count = 0;
 
 	/* Enable output */
 	gpcr.raw = 0;
@@ -167,19 +179,10 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
 	mmiowb();
 
 	/* Check square wave period averaged over some number of cycles */
-	do {
-		int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
-		state = int_out.fields.int_out;
-		if (!last_state && state) {
-			count++;
-			if (count == IOC4_CALIBRATE_END) {
-				end = ktime_get_ns();
-				break;
-			} else if (count == IOC4_CALIBRATE_DISCARD)
-				start = ktime_get_ns();
-		}
-		last_state = state;
-	} while (1);
+	ioc4_clock_wave_cycles(idd, IOC4_CALIBRATE_DISCARD);
+	start = ktime_get_ns();
+	ioc4_clock_wave_cycles(idd, IOC4_CALIBRATE_COUNT);
+	end = ktime_get_ns();
 
 	/* Calculation rearranged to preserve intermediate precision.
 	 * Logically:
-- 
1.9.3



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

* Re: [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate
  2014-12-08 15:46         ` Arnd Bergmann
@ 2014-12-08 15:58           ` Richard Leitner
  0 siblings, 0 replies; 9+ messages in thread
From: Richard Leitner @ 2014-12-08 15:58 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: Greg Kroah-Hartman, Prabhakar Lad, LKML, Andrew Morton

On Mon, 08 Dec 2014 16:46:31 +0100
Arnd Bergmann <arnd@arndb.de> wrote:

> On Monday 08 December 2014 16:28:10 Richard Leitner wrote:
> > 
> > Signed-off-by: Richard Leitner <dev@g0hl1n.net>
> 
> Acked-by: Arnd Bergmann <arnd@arndb.de>
> 
> 
> With the changed loop, do you still get a warning if you
> remove the extra 'start = ktime_get_ns()' at the start of the loop?
> 
Yes. Although IOC4_CALIBRATE_DISCARD is smaller than IOC4_CALIBRATE_END
and there's no more break in the loop, it seems gcc doesn't get it...

regards,
richard


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

* Re: [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate
  2014-12-08 15:54         ` Paul Bolle
@ 2014-12-08 21:03           ` Richard Leitner
  0 siblings, 0 replies; 9+ messages in thread
From: Richard Leitner @ 2014-12-08 21:03 UTC (permalink / raw)
  To: Paul Bolle
  Cc: Arnd Bergmann, Greg Kroah-Hartman, Prabhakar Lad, LKML, Andrew Morton

Hi Paul,
regarding the general approach ("helper-function" versus loop) a
maintainer should decide what suits better here.

IMHO on the one hand the readability of the ioc4_clock_calibrate is better
with the "helper-function", on the other hand when using the loop you
don't have to look up the function an see the implementation at the
first glance.

Some comments on the code are embedded below.

On Mon, 08 Dec 2014 16:54:11 +0100
Paul Bolle <pebolle@tiscali.nl> wrote:

> On Mon, 2014-12-08 at 16:28 +0100, Richard Leitner wrote:
> > The loop for measuring the square wave periods over some cycles is
> > refactored to be more easily readable. This includes avoiding a
> > "by-hand-implemented" for loop with a "real" one and adding some
> > comments.
> > 
> 
> I've had the patch pasted at the end of this message in my local stack
> of patches for some time now. It uses another approach: by using a
> helper function things become much simpler. I _think_ it doesn't
> introduce any functional changes but still need to a quiet day to make
> sure that is correct.
> 
> Hope this helps,

...

> Adding a small (inline) function that only returns after a certain
> number of wave cycles have been seen allows to reorder the code a bit.
> And after reordering it is clearer for both the compiler and the human
> reader what's going on here. So let's do that.

Maybe this function name should include "wait" or something similar to
make clear it does nothing during the wave cycles?

> +/* return after count wave cycles have been seen */
> +static inline void
> +ioc4_clock_wave_cycles(struct ioc4_driver_data *idd, unsigned int count)
> +{
> +	union ioc4_int_out int_out;
> +	unsigned int state, last_state = 1;
> +	unsigned int i = 0;
> +
> +	do {
> +		int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
> +		state = int_out.fields.int_out;
> +		if (!last_state && state)
> +			i++;
> +		last_state = state;
> +	} while (i < count);
> +}
> +
>  /* Determines external interrupt output clock period of the PCI bus an
>   * IOC4 is attached to.  This value can be used to determine the PCI
>   * bus speed.
> @@ -144,9 +158,7 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd)
>  {
>  	union ioc4_int_out int_out;
>  	union ioc4_gpcr gpcr;
> -	unsigned int state, last_state = 1;
>  	uint64_t start, end, period;
> -	unsigned int count = 0;
>  
>  	/* Enable output */
>  	gpcr.raw = 0;
> @@ -167,19 +179,10 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) mmiowb();
>  
>  	/* Check square wave period averaged over some number of cycles */
> -	do {
> -		int_out.raw = readl(&idd->idd_misc_regs->int_out.raw);
> -		state = int_out.fields.int_out;
> -		if (!last_state && state) {
> -			count++;
> -			if (count == IOC4_CALIBRATE_END) {
> -				end = ktime_get_ns();
> -				break;
> -			} else if (count == IOC4_CALIBRATE_DISCARD)
> -				start = ktime_get_ns();
> -		}
> -		last_state = state;
> -	} while (1);
> +	ioc4_clock_wave_cycles(idd, IOC4_CALIBRATE_DISCARD);
> +	start = ktime_get_ns();
> +	ioc4_clock_wave_cycles(idd, IOC4_CALIBRATE_COUNT);

Shouldn't this be IOC4_CALIBRATE_CYCLES instead of IOC4_CALIBRATE_COUNT?
IOC4_CALIBRATE_END was (IOC4_CALIBRATE_CYCLES + IOC4_CALIBRATE_DISCARD).

> +	end = ktime_get_ns();
>  
>  	/* Calculation rearranged to preserve intermediate precision.
>  	 * Logically:

regards,
richard


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

end of thread, other threads:[~2014-12-08 21:03 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-08 12:27 [PATCH] misc: ioc4: fix variable may be used uninitialized warning Richard Leitner
2014-12-08 12:42 ` Arnd Bergmann
2014-12-08 13:18   ` Richard Leitner
2014-12-08 13:34     ` Prabhakar Lad
2014-12-08 15:28       ` [PATCH] misc: ioc4: simplify wave period measurement in clock_calibrate Richard Leitner
2014-12-08 15:46         ` Arnd Bergmann
2014-12-08 15:58           ` Richard Leitner
2014-12-08 15:54         ` Paul Bolle
2014-12-08 21:03           ` Richard Leitner

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).