public inbox for linux-m68k@lists.linux-m68k.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Make PPC macro spin_event_timeout() architecture independent
@ 2013-08-14  7:03 Arpit Goel
  2013-08-14  7:03 ` [PATCH v2 1/2] Make USECS_PER_JIFFY available for generic use Arpit Goel
  2013-08-14  7:03 ` [PATCH v2 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro Arpit Goel
  0 siblings, 2 replies; 3+ messages in thread
From: Arpit Goel @ 2013-08-14  7:03 UTC (permalink / raw)
  To: linux, takata, philb, geert
  Cc: schwidefsky, heiko.carstens, linux390, davem, rob.herring, arnd,
	swarren, john.stultz, jesper.nilsson, gregkh, sam,
	linux-arm-kernel, linux-kernel, linux-m32r, linux-m32r-ja,
	linux-m68k, linux-s390, sparclinux, mattw, timur, sboyd, akpm,
	Arpit Goel

This patch-set moves USECS_PER_JIFFY to architecture timex.h from architecture
specific C files. Patch-set further uses this to make PPC macro
spin_event_timeout() architecture independent. This change enables drivers to
use spin_event_timeout() even in non-PowerPC based SoC's.

This patchset has been compiled for ARM, PowerPC and x86.

Patch[1/2] : Moves USECS_PER_JIFFY to architecture specific timex.h files from
	     architecture specific C files.

Patch[2/2] : Converts PPC macro spin_event_timeout() in architecture independent
	     macro.

Changes in v2:
	Patch[1/2] Adds USEC_PER_JIFFY to linux/timex.h
	Patch[2/2] uses usecs_to_jiffies for conversion

Arpit Goel (2):
  Make USECS_PER_JIFFY available for generic use
  Convert PowerPC macro spin_event_timeout() to architecture independent
    macro

 arch/arm/include/asm/timex.h      |  2 ++
 arch/arm/kernel/time.c            |  3 ---
 arch/m32r/include/asm/timex.h     |  2 ++
 arch/m32r/kernel/time.c           |  3 ---
 arch/m68k/hp300/time.c            |  4 +---
 arch/m68k/include/asm/timex.h     |  2 ++
 arch/s390/include/asm/timex.h     |  2 ++
 arch/s390/kernel/time.c           |  2 --
 arch/sparc/include/asm/timex_32.h |  2 ++
 arch/sparc/include/asm/timex_64.h |  2 ++
 arch/sparc/kernel/pcic.c          |  1 -
 include/linux/delay.h             | 40 +++++++++++++++++++++++++++++++++++++++
 include/linux/timex.h             |  5 +++++
 13 files changed, 58 insertions(+), 12 deletions(-)

-- 
1.8.1.4

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

* [PATCH v2 1/2] Make USECS_PER_JIFFY available for generic use
  2013-08-14  7:03 [PATCH v2 0/2] Make PPC macro spin_event_timeout() architecture independent Arpit Goel
@ 2013-08-14  7:03 ` Arpit Goel
  2013-08-14  7:03 ` [PATCH v2 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro Arpit Goel
  1 sibling, 0 replies; 3+ messages in thread
From: Arpit Goel @ 2013-08-14  7:03 UTC (permalink / raw)
  To: linux, takata, philb, geert
  Cc: schwidefsky, heiko.carstens, linux390, davem, rob.herring, arnd,
	swarren, john.stultz, jesper.nilsson, gregkh, sam,
	linux-arm-kernel, linux-kernel, linux-m32r, linux-m32r-ja,
	linux-m68k, linux-s390, sparclinux, mattw, timur, sboyd, akpm,
	Arpit Goel

USECS_PER_JIFFY is used in several ARCHITECTURE C files.Now USECS_PER_JIFFY
has been moved from architecture specific C files to architecture specific
timex.h. This enables users to include timex.h and make use of USECS_PER_JIFFY.

Signed-off-by: Arpit Goel <B44344@freescale.com>
---
 arch/arm/include/asm/timex.h      | 2 ++
 arch/arm/kernel/time.c            | 3 ---
 arch/m32r/include/asm/timex.h     | 2 ++
 arch/m32r/kernel/time.c           | 3 ---
 arch/m68k/hp300/time.c            | 4 +---
 arch/m68k/include/asm/timex.h     | 2 ++
 arch/s390/include/asm/timex.h     | 2 ++
 arch/s390/kernel/time.c           | 2 --
 arch/sparc/include/asm/timex_32.h | 2 ++
 arch/sparc/include/asm/timex_64.h | 2 ++
 arch/sparc/kernel/pcic.c          | 1 -
 include/linux/timex.h             | 5 +++++
 12 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h
index 83f2aa8..55a4f34 100644
--- a/arch/arm/include/asm/timex.h
+++ b/arch/arm/include/asm/timex.h
@@ -18,6 +18,8 @@
 #include <mach/timex.h>
 #endif
 
+/* change this if you have some constant time drift */
+#define USECS_PER_JIFFY	(1000000/HZ)
 typedef unsigned long cycles_t;
 #define get_cycles()	({ cycles_t c; read_current_timer(&c) ? 0 : c; })
 
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c
index 98aee32..7aaead4 100644
--- a/arch/arm/kernel/time.c
+++ b/arch/arm/kernel/time.c
@@ -38,9 +38,6 @@ DEFINE_SPINLOCK(rtc_lock);
 EXPORT_SYMBOL(rtc_lock);
 #endif	/* pc-style 'CMOS' RTC support */
 
-/* change this if you have some constant time drift */
-#define USECS_PER_JIFFY	(1000000/HZ)
-
 #ifdef CONFIG_SMP
 unsigned long profile_pc(struct pt_regs *regs)
 {
diff --git a/arch/m32r/include/asm/timex.h b/arch/m32r/include/asm/timex.h
index bb9fe4f..ff8e6b1 100644
--- a/arch/m32r/include/asm/timex.h
+++ b/arch/m32r/include/asm/timex.h
@@ -9,6 +9,8 @@
 
 #define CLOCK_TICK_RATE	(CONFIG_BUS_CLOCK / CONFIG_TIMER_DIVIDE)
 #define CLOCK_TICK_FACTOR	20	/* Factor of both 1000000 and CLOCK_TICK_RATE */
+/* change this if you have some constant time drift */
+#define USECS_PER_JIFFY	(1000000/HZ)
 
 #ifdef __KERNEL__
 /*
diff --git a/arch/m32r/kernel/time.c b/arch/m32r/kernel/time.c
index 1a15f81..0608e02 100644
--- a/arch/m32r/kernel/time.c
+++ b/arch/m32r/kernel/time.c
@@ -52,9 +52,6 @@ extern void smp_local_timer_interrupt(void);
  * Change this if you have some constant time drift
  */
 
-/* This is for machines which generate the exact clock. */
-#define USECS_PER_JIFFY (1000000/HZ)
-
 static unsigned long latch;
 
 static u32 m32r_gettimeoffset(void)
diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c
index 749543b..9d751d3 100644
--- a/arch/m68k/hp300/time.c
+++ b/arch/m68k/hp300/time.c
@@ -12,6 +12,7 @@
 #include <linux/sched.h>
 #include <linux/kernel_stat.h>
 #include <linux/interrupt.h>
+#include <linux/time.h>
 #include <asm/machdep.h>
 #include <asm/irq.h>
 #include <asm/io.h>
@@ -30,9 +31,6 @@
 #define	CLKMSB2		0x9
 #define	CLKMSB3		0xD
 
-/* This is for machines which generate the exact clock. */
-#define USECS_PER_JIFFY (1000000/HZ)
-
 #define INTVAL ((10000 / 4) - 1)
 
 static irqreturn_t hp300_tick(int irq, void *dev_id)
diff --git a/arch/m68k/include/asm/timex.h b/arch/m68k/include/asm/timex.h
index 6759dad..44f2603 100644
--- a/arch/m68k/include/asm/timex.h
+++ b/arch/m68k/include/asm/timex.h
@@ -21,6 +21,8 @@
 #define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
 #endif
 
+/* change this if you have some constant time drift */
+#define USECS_PER_JIFFY	(1000000/HZ)
 typedef unsigned long cycles_t;
 
 static inline cycles_t get_cycles(void)
diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h
index 8ad8af9..91175c9 100644
--- a/arch/s390/include/asm/timex.h
+++ b/arch/s390/include/asm/timex.h
@@ -13,6 +13,8 @@
 
 /* The value of the TOD clock for 1.1.1970. */
 #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL
+/* change this if you have some constant time drift */
+#define USECS_PER_JIFFY	(1000000/HZ)
 
 /* Inline functions for clock register access. */
 static inline int set_tod_clock(__u64 time)
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
index 876546b..eb659b6 100644
--- a/arch/s390/kernel/time.c
+++ b/arch/s390/kernel/time.c
@@ -49,8 +49,6 @@
 #include <asm/cio.h>
 #include "entry.h"
 
-/* change this if you have some constant time drift */
-#define USECS_PER_JIFFY     ((unsigned long) 1000000/HZ)
 #define CLK_TICKS_PER_JIFFY ((unsigned long) USECS_PER_JIFFY << 12)
 
 u64 sched_clock_base_cc = -1;	/* Force to data section. */
diff --git a/arch/sparc/include/asm/timex_32.h b/arch/sparc/include/asm/timex_32.h
index b6ccdb0..cb7f412 100644
--- a/arch/sparc/include/asm/timex_32.h
+++ b/arch/sparc/include/asm/timex_32.h
@@ -7,6 +7,8 @@
 #define _ASMsparc_TIMEX_H
 
 #define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
+/* change this if you have some constant time drift */
+#define USECS_PER_JIFFY	(1000000/HZ)
 
 /* XXX Maybe do something better at some point... -DaveM */
 typedef unsigned long cycles_t;
diff --git a/arch/sparc/include/asm/timex_64.h b/arch/sparc/include/asm/timex_64.h
index 18b30bc..1a5738a 100644
--- a/arch/sparc/include/asm/timex_64.h
+++ b/arch/sparc/include/asm/timex_64.h
@@ -9,6 +9,8 @@
 #include <asm/timer.h>
 
 #define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
+/* change this if you have some constant time drift */
+#define USECS_PER_JIFFY	(1000000/HZ)
 
 /* Getting on the cycle counter on sparc64. */
 typedef unsigned long cycles_t;
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index 09f4fdd..2a62932 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -703,7 +703,6 @@ static void pcic_clear_clock_irq(void)
 }
 
 /* CPU frequency is 100 MHz, timer increments every 4 CPU clocks */
-#define USECS_PER_JIFFY  (1000000 / HZ)
 #define TICK_TIMER_LIMIT ((100 * 1000000 / 4) / HZ)
 
 static unsigned int pcic_cycles_offset(void)
diff --git a/include/linux/timex.h b/include/linux/timex.h
index b3726e6..851dec4 100644
--- a/include/linux/timex.h
+++ b/include/linux/timex.h
@@ -145,4 +145,9 @@ int read_current_timer(unsigned long *timer_val);
 /* The clock frequency of the i8253/i8254 PIT */
 #define PIT_TICK_RATE 1193182ul
 
+#ifndef USECS_PER_JIFFY
+/* change this if you have some constant time drift */
+#define USECS_PER_JIFFY        (1000000/HZ)
+#endif
+
 #endif /* LINUX_TIMEX_H */
-- 
1.8.1.4

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

* [PATCH v2 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro
  2013-08-14  7:03 [PATCH v2 0/2] Make PPC macro spin_event_timeout() architecture independent Arpit Goel
  2013-08-14  7:03 ` [PATCH v2 1/2] Make USECS_PER_JIFFY available for generic use Arpit Goel
@ 2013-08-14  7:03 ` Arpit Goel
  1 sibling, 0 replies; 3+ messages in thread
From: Arpit Goel @ 2013-08-14  7:03 UTC (permalink / raw)
  To: linux, takata, philb, geert
  Cc: schwidefsky, heiko.carstens, linux390, davem, rob.herring, arnd,
	swarren, john.stultz, jesper.nilsson, gregkh, sam,
	linux-arm-kernel, linux-kernel, linux-m32r, linux-m32r-ja,
	linux-m68k, linux-s390, sparclinux, mattw, timur, sboyd, akpm,
	Arpit Goel

This patch ports PowerPC implementation of spin_event_timeout() for generic
use. Architecture specific implementation can be added to asm/delay.h, which
will override the generic linux implementation.

Signed-off-by: Arpit Goel <B44344@freescale.com>
---
 include/linux/delay.h | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/include/linux/delay.h b/include/linux/delay.h
index a6ecb34..2ee7fa8 100644
--- a/include/linux/delay.h
+++ b/include/linux/delay.h
@@ -52,4 +52,44 @@ static inline void ssleep(unsigned int seconds)
 	msleep(seconds * 1000);
 }
 
+#ifndef spin_event_timeout
+/**
+ * spin_event_timeout - spin until a condition gets true or a timeout elapses
+ * @condition: a C expression to evalate
+ * @timeout: timeout, in microseconds
+ * @delay: the number of microseconds to delay between each evaluation of
+ *         @condition
+ *
+ * The process spins until the condition evaluates to true (non-zero) or the
+ * timeout elapses.  The return value of this macro is the value of
+ * @condition when the loop terminates. This allows you to determine the cause
+ * of the loop terminates.  If the return value is zero, then you know a
+ * timeout has occurred.
+ *
+ * This primary purpose of this macro is to poll on a hardware register
+ * until a status bit changes.  The timeout ensures that the loop still
+ * terminates even if the bit never changes.  The delay is for devices that
+ * need a delay in between successive reads.
+ *
+ * gcc will optimize out the if-statement if @delay is a constant.
+ *
+ * This is copied from PowerPC based spin_event_timeout() implementation
+ * and modified for generic usecase.
+ */
+#define spin_event_timeout(condition, timeout, delay)		\
+({								\
+	typeof(condition) __ret;				\
+	unsigned long __loops = usecs_to_jiffies(timeout);	\
+	unsigned long __start = jiffies;			\
+	while (!(__ret = (condition)) &&			\
+		time_before(jiffies, __start + __loops + 1))	\
+		if (delay)					\
+			udelay(delay);				\
+		else						\
+			schedule();				\
+	if (!__ret)						\
+		__ret = (condition);				\
+	__ret;							\
+})
+#endif
 #endif /* defined(_LINUX_DELAY_H) */
-- 
1.8.1.4

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

end of thread, other threads:[~2013-08-14  7:19 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-14  7:03 [PATCH v2 0/2] Make PPC macro spin_event_timeout() architecture independent Arpit Goel
2013-08-14  7:03 ` [PATCH v2 1/2] Make USECS_PER_JIFFY available for generic use Arpit Goel
2013-08-14  7:03 ` [PATCH v2 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro Arpit Goel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox