* [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros
@ 2015-11-08 22:36 Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 02/10] clocksource/drivers/h8300: Remove pointless headers for TPU Daniel Lezcano
` (9 more replies)
0 siblings, 10 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
Some macros are unused, delete them.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_tpu.c | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/drivers/clocksource/h8300_tpu.c b/drivers/clocksource/h8300_tpu.c
index ed0b493..576dae6 100644
--- a/drivers/clocksource/h8300_tpu.c
+++ b/drivers/clocksource/h8300_tpu.c
@@ -20,16 +20,9 @@
#include <linux/of_address.h>
#include <linux/of_irq.h>
-#define TCR 0
-#define TMDR 1
-#define TIOR 2
-#define TER 4
-#define TSR 5
-#define TCNT 6
-#define TGRA 8
-#define TGRB 10
-#define TGRC 12
-#define TGRD 14
+#define TCR 0x0
+#define TSR 0x5
+#define TCNT 0x6
struct tpu_priv {
struct clocksource cs;
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 02/10] clocksource/drivers/h8300: Remove pointless headers for TPU
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 03/10] clocksource/drivers/h8300_timer8: Remove unused headers Daniel Lezcano
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_tpu.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/drivers/clocksource/h8300_tpu.c b/drivers/clocksource/h8300_tpu.c
index 576dae6..c1eef42 100644
--- a/drivers/clocksource/h8300_tpu.c
+++ b/drivers/clocksource/h8300_tpu.c
@@ -6,14 +6,9 @@
*/
#include <linux/errno.h>
-#include <linux/sched.h>
#include <linux/kernel.h>
-#include <linux/interrupt.h>
#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
#include <linux/clocksource.h>
-#include <linux/module.h>
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/of.h>
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 03/10] clocksource/drivers/h8300_timer8: Remove unused headers
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 02/10] clocksource/drivers/h8300: Remove pointless headers for TPU Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 04/10] clocksource/drivers/h8300_timer8: Remove unused macros Daniel Lezcano
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_timer8.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index f0680eb..8ac39a5 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -8,21 +8,16 @@
*/
#include <linux/errno.h>
-#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/init.h>
-#include <linux/slab.h>
#include <linux/clockchips.h>
-#include <linux/module.h>
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
-#include <asm/irq.h>
-
#define _8TCR 0
#define _8TCSR 2
#define TCORA 4
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 04/10] clocksource/drivers/h8300_timer8: Remove unused macros
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 02/10] clocksource/drivers/h8300: Remove pointless headers for TPU Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 03/10] clocksource/drivers/h8300_timer8: Remove unused headers Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 05/10] clocksource/drivers/h8300_timer8: Remove PERIODIC and ONESHOT macro Daniel Lezcano
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_timer8.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index 8ac39a5..598bea2 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -24,7 +24,6 @@
#define TCORB 6
#define _8TCNT 8
-#define FLAG_REPROGRAM (1 << 0)
#define FLAG_SKIPEVENT (1 << 1)
#define FLAG_IRQCONTEXT (1 << 2)
#define FLAG_STARTED (1 << 3)
@@ -32,9 +31,6 @@
#define ONESHOT 0
#define PERIODIC 1
-#define RELATIVE 0
-#define ABSOLUTE 1
-
#define SCALE 64
struct timer8_priv {
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 05/10] clocksource/drivers/h8300_timer8: Remove PERIODIC and ONESHOT macro
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
` (2 preceding siblings ...)
2015-11-08 22:36 ` [RFC PATCH 04/10] clocksource/drivers/h8300_timer8: Remove unused macros Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 06/10] clocksource/drivers/h8300_timer8: Fix irq return value check Daniel Lezcano
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
Specify the delta as parameter for the timer8_clock_event_start function
instead of using a macro to tell PERIODIC or ONESHOT.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_timer8.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index 598bea2..f66cd6f 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -28,9 +28,6 @@
#define FLAG_IRQCONTEXT (1 << 2)
#define FLAG_STARTED (1 << 3)
-#define ONESHOT 0
-#define PERIODIC 1
-
#define SCALE 64
struct timer8_priv {
@@ -147,7 +144,7 @@ static inline struct timer8_priv *ced_to_priv(struct clock_event_device *ced)
return container_of(ced, struct timer8_priv, ced);
}
-static void timer8_clock_event_start(struct timer8_priv *p, int periodic)
+static void timer8_clock_event_start(struct timer8_priv *p, unsigned long delta)
{
struct clock_event_device *ced = &p->ced;
@@ -158,7 +155,7 @@ static void timer8_clock_event_start(struct timer8_priv *p, int periodic)
ced->max_delta_ns = clockevent_delta2ns(0xffff, ced);
ced->min_delta_ns = clockevent_delta2ns(0x0001, ced);
- timer8_set_next(p, periodic?(p->rate + HZ/2) / HZ:0x10000);
+ timer8_set_next(p, delta);
}
static int timer8_clock_event_shutdown(struct clock_event_device *ced)
@@ -173,7 +170,7 @@ static int timer8_clock_event_periodic(struct clock_event_device *ced)
pr_info("%s: used for periodic clock events\n", ced->name);
timer8_stop(p);
- timer8_clock_event_start(p, PERIODIC);
+ timer8_clock_event_start(p, (p->rate + HZ/2) / HZ);
return 0;
}
@@ -184,7 +181,7 @@ static int timer8_clock_event_oneshot(struct clock_event_device *ced)
pr_info("%s: used for oneshot clock events\n", ced->name);
timer8_stop(p);
- timer8_clock_event_start(p, ONESHOT);
+ timer8_clock_event_start(p, 0x10000);
return 0;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 06/10] clocksource/drivers/h8300_timer8: Fix irq return value check
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
` (3 preceding siblings ...)
2015-11-08 22:36 ` [RFC PATCH 05/10] clocksource/drivers/h8300_timer8: Remove PERIODIC and ONESHOT macro Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 07/10] clocksource/drivers/h8300_timer8: Remove pointless irq re-entrant safe code Daniel Lezcano
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
The value returned in case of error for the 'irq_of_parse_and_map' function is
zero in case of error. Fix the check in the init code.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_timer8.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index f66cd6f..680f65b 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -230,7 +230,7 @@ static void __init h8300_8timer_init(struct device_node *node)
}
irq = irq_of_parse_and_map(node, 0);
- if (irq < 0) {
+ if (!irq) {
pr_err("failed to get irq for clockevent\n");
goto unmap_reg;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 07/10] clocksource/drivers/h8300_timer8: Remove pointless irq re-entrant safe code
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
` (4 preceding siblings ...)
2015-11-08 22:36 ` [RFC PATCH 06/10] clocksource/drivers/h8300_timer8: Fix irq return value check Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 08/10] clocksource/drivers/h8300_timer8: Remove irq and lock legacy code Daniel Lezcano
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
The current code assumes the interrupt function is re-entrant.
That is not correct. An interrupt handler is never invoked concurrently. The
interrupt line is masked on all processors.
Remove the chewing flags in the code.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_timer8.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index 680f65b..ba219cf 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -24,8 +24,6 @@
#define TCORB 6
#define _8TCNT 8
-#define FLAG_SKIPEVENT (1 << 1)
-#define FLAG_IRQCONTEXT (1 << 2)
#define FLAG_STARTED (1 << 3)
#define SCALE 64
@@ -67,14 +65,13 @@ static irqreturn_t timer8_interrupt(int irq, void *dev_id)
ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~0x40,
p->mapbase + _8TCSR);
- p->flags |= FLAG_IRQCONTEXT;
+
ctrl_outw(p->tcora, p->mapbase + TCORA);
- if (!(p->flags & FLAG_SKIPEVENT)) {
- if (clockevent_state_oneshot(&p->ced))
- ctrl_outw(0x0000, p->mapbase + _8TCR);
- p->ced.event_handler(&p->ced);
- }
- p->flags &= ~(FLAG_SKIPEVENT | FLAG_IRQCONTEXT);
+
+ if (clockevent_state_oneshot(&p->ced))
+ ctrl_outw(0x0000, p->mapbase + _8TCR);
+
+ p->ced.event_handler(&p->ced);
return IRQ_HANDLED;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 08/10] clocksource/drivers/h8300_timer8: Remove irq and lock legacy code
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
` (5 preceding siblings ...)
2015-11-08 22:36 ` [RFC PATCH 07/10] clocksource/drivers/h8300_timer8: Remove pointless irq re-entrant safe code Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 09/10] h8300: Rename ctlr_out/in[bwl] to read/write[bwl] Daniel Lezcano
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
The time framawork takes care of disabling the interrupts and takes a lock
to prevent races.
Remove the legacy code in the driver taking care of the races.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_timer8.c | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index ba219cf..0885014 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -31,7 +31,6 @@
struct timer8_priv {
struct clock_event_device ced;
unsigned long mapbase;
- raw_spinlock_t lock;
unsigned long flags;
unsigned int rate;
unsigned int tcora;
@@ -78,10 +77,8 @@ static irqreturn_t timer8_interrupt(int irq, void *dev_id)
static void timer8_set_next(struct timer8_priv *p, unsigned long delta)
{
- unsigned long flags;
unsigned long now;
- raw_spin_lock_irqsave(&p->lock, flags);
if (delta >= 0x10000)
dev_warn(&p->pdev->dev, "delta out of range\n");
now = timer8_get_counter(p);
@@ -91,8 +88,6 @@ static void timer8_set_next(struct timer8_priv *p, unsigned long delta)
ctrl_outw(delta, p->mapbase + TCORA);
else
ctrl_outw(now + 1, p->mapbase + TCORA);
-
- raw_spin_unlock_irqrestore(&p->lock, flags);
}
static int timer8_enable(struct timer8_priv *p)
@@ -108,9 +103,6 @@ static int timer8_enable(struct timer8_priv *p)
static int timer8_start(struct timer8_priv *p)
{
int ret = 0;
- unsigned long flags;
-
- raw_spin_lock_irqsave(&p->lock, flags);
if (!(p->flags & FLAG_STARTED))
ret = timer8_enable(p);
@@ -120,20 +112,12 @@ static int timer8_start(struct timer8_priv *p)
p->flags |= FLAG_STARTED;
out:
- raw_spin_unlock_irqrestore(&p->lock, flags);
-
return ret;
}
static void timer8_stop(struct timer8_priv *p)
{
- unsigned long flags;
-
- raw_spin_lock_irqsave(&p->lock, flags);
-
ctrl_outw(0x0000, p->mapbase + _8TCR);
-
- raw_spin_unlock_irqrestore(&p->lock, flags);
}
static inline struct timer8_priv *ced_to_priv(struct clock_event_device *ced)
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 09/10] h8300: Rename ctlr_out/in[bwl] to read/write[bwl]
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
` (6 preceding siblings ...)
2015-11-08 22:36 ` [RFC PATCH 08/10] clocksource/drivers/h8300_timer8: Remove irq and lock legacy code Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 10/10] clocksource/drivers/h8300_timer8: Retrieve the clock rate at init time Daniel Lezcano
2015-11-08 22:38 ` [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
For the sake of consistency, let rename all ctrl_out/in calls to the write/read
calls so we have the same API consistent with the other architectures hence
open the door for the increasing of the test compilation coverage.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
arch/h8300/include/asm/io.h | 12 ++++++------
arch/h8300/kernel/setup.c | 8 ++++----
drivers/clocksource/h8300_timer16.c | 20 ++++++++++----------
drivers/clocksource/h8300_timer8.c | 30 +++++++++++++++---------------
drivers/clocksource/h8300_tpu.c | 20 ++++++++++----------
5 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/arch/h8300/include/asm/io.h b/arch/h8300/include/asm/io.h
index 1d09b2f..eed2218 100644
--- a/arch/h8300/include/asm/io.h
+++ b/arch/h8300/include/asm/io.h
@@ -6,32 +6,32 @@
#include <asm-generic/io.h>
/* H8/300 internal I/O functions */
-static inline unsigned char ctrl_inb(unsigned long addr)
+static inline unsigned char readb(unsigned long addr)
{
return *(volatile unsigned char *)addr;
}
-static inline unsigned short ctrl_inw(unsigned long addr)
+static inline unsigned short readw(unsigned long addr)
{
return *(volatile unsigned short *)addr;
}
-static inline unsigned long ctrl_inl(unsigned long addr)
+static inline unsigned long readl(unsigned long addr)
{
return *(volatile unsigned long *)addr;
}
-static inline void ctrl_outb(unsigned char b, unsigned long addr)
+static inline void writeb(unsigned char b, unsigned long addr)
{
*(volatile unsigned char *)addr = b;
}
-static inline void ctrl_outw(unsigned short b, unsigned long addr)
+static inline void writew(unsigned short b, unsigned long addr)
{
*(volatile unsigned short *)addr = b;
}
-static inline void ctrl_outl(unsigned long b, unsigned long addr)
+static inline void writel(unsigned long b, unsigned long addr)
{
*(volatile unsigned long *)addr = b;
}
diff --git a/arch/h8300/kernel/setup.c b/arch/h8300/kernel/setup.c
index 0fd1fe6..9b92aea 100644
--- a/arch/h8300/kernel/setup.c
+++ b/arch/h8300/kernel/setup.c
@@ -206,14 +206,14 @@ device_initcall(device_probe);
#define get_wait(base, addr) ({ \
int baddr; \
baddr = ((addr) / 0x200000 * 2); \
- w *= (ctrl_inw((unsigned long)(base) + 2) & (3 << baddr)) + 1; \
+ w *= (readw((unsigned long)(base) + 2) & (3 << baddr)) + 1; \
})
#endif
#if defined(CONFIG_CPU_H8S)
#define get_wait(base, addr) ({ \
int baddr; \
baddr = ((addr) / 0x200000 * 16); \
- w *= (ctrl_inl((unsigned long)(base) + 2) & (7 << baddr)) + 1; \
+ w *= (readl((unsigned long)(base) + 2) & (7 << baddr)) + 1; \
})
#endif
@@ -227,8 +227,8 @@ static __init int access_timing(void)
bsc = of_find_compatible_node(NULL, NULL, "renesas,h8300-bsc");
base = of_iomap(bsc, 0);
- w = (ctrl_inb((unsigned long)base + 0) & bit)?2:1;
- if (ctrl_inb((unsigned long)base + 1) & bit)
+ w = (readb((unsigned long)base + 0) & bit)?2:1;
+ if (readb((unsigned long)base + 1) & bit)
w *= get_wait(base, addr);
else
w *= 2;
diff --git a/drivers/clocksource/h8300_timer16.c b/drivers/clocksource/h8300_timer16.c
index cdf0d83..2472da1 100644
--- a/drivers/clocksource/h8300_timer16.c
+++ b/drivers/clocksource/h8300_timer16.c
@@ -69,15 +69,15 @@ static unsigned long timer16_get_counter(struct timer16_priv *p)
unsigned long v1, v2, v3;
int o1, o2;
- o1 = ctrl_inb(p->mapcommon + TISRC) & p->ovf;
+ o1 = readb(p->mapcommon + TISRC) & p->ovf;
/* Make sure the timer value is stable. Stolen from acpi_pm.c */
do {
o2 = o1;
- v1 = ctrl_inw(p->mapbase + TCNT);
- v2 = ctrl_inw(p->mapbase + TCNT);
- v3 = ctrl_inw(p->mapbase + TCNT);
- o1 = ctrl_inb(p->mapcommon + TISRC) & p->ovf;
+ v1 = readw(p->mapbase + TCNT);
+ v2 = readw(p->mapbase + TCNT);
+ v3 = readw(p->mapbase + TCNT);
+ o1 = readb(p->mapcommon + TISRC) & p->ovf;
} while (unlikely((o1 != o2) || (v1 > v2 && v1 < v3)
|| (v2 > v3 && v2 < v1) || (v3 > v1 && v3 < v2)));
@@ -90,7 +90,7 @@ static irqreturn_t timer16_interrupt(int irq, void *dev_id)
{
struct timer16_priv *p = (struct timer16_priv *)dev_id;
- ctrl_outb(ctrl_inb(p->mapcommon + TISRA) & ~p->imfa,
+ writeb(readb(p->mapcommon + TISRA) & ~p->imfa,
p->mapcommon + TISRA);
p->total_cycles += 0x10000;
@@ -123,9 +123,9 @@ static int timer16_enable(struct clocksource *cs)
WARN_ON(p->cs_enabled);
p->total_cycles = 0;
- ctrl_outw(0x0000, p->mapbase + TCNT);
- ctrl_outb(0x83, p->mapbase + TCR);
- ctrl_outb(ctrl_inb(p->mapcommon + TSTR) | p->enb,
+ writew(0x0000, p->mapbase + TCNT);
+ writeb(0x83, p->mapbase + TCR);
+ writeb(readb(p->mapcommon + TSTR) | p->enb,
p->mapcommon + TSTR);
p->cs_enabled = true;
@@ -138,7 +138,7 @@ static void timer16_disable(struct clocksource *cs)
WARN_ON(!p->cs_enabled);
- ctrl_outb(ctrl_inb(p->mapcommon + TSTR) & ~p->enb,
+ writeb(readb(p->mapcommon + TSTR) & ~p->enb,
p->mapcommon + TSTR);
p->cs_enabled = false;
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index 0885014..cf0feee 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -42,15 +42,15 @@ static unsigned long timer8_get_counter(struct timer8_priv *p)
unsigned long v1, v2, v3;
int o1, o2;
- o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20;
+ o1 = readb(p->mapbase + _8TCSR) & 0x20;
/* Make sure the timer value is stable. Stolen from acpi_pm.c */
do {
o2 = o1;
- v1 = ctrl_inw(p->mapbase + _8TCNT);
- v2 = ctrl_inw(p->mapbase + _8TCNT);
- v3 = ctrl_inw(p->mapbase + _8TCNT);
- o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20;
+ v1 = readw(p->mapbase + _8TCNT);
+ v2 = readw(p->mapbase + _8TCNT);
+ v3 = readw(p->mapbase + _8TCNT);
+ o1 = readb(p->mapbase + _8TCSR) & 0x20;
} while (unlikely((o1 != o2) || (v1 > v2 && v1 < v3)
|| (v2 > v3 && v2 < v1) || (v3 > v1 && v3 < v2)));
@@ -62,13 +62,13 @@ static irqreturn_t timer8_interrupt(int irq, void *dev_id)
{
struct timer8_priv *p = dev_id;
- ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~0x40,
+ writeb(readb(p->mapbase + _8TCSR) & ~0x40,
p->mapbase + _8TCSR);
- ctrl_outw(p->tcora, p->mapbase + TCORA);
+ writew(p->tcora, p->mapbase + TCORA);
if (clockevent_state_oneshot(&p->ced))
- ctrl_outw(0x0000, p->mapbase + _8TCR);
+ writew(0x0000, p->mapbase + _8TCR);
p->ced.event_handler(&p->ced);
@@ -83,19 +83,19 @@ static void timer8_set_next(struct timer8_priv *p, unsigned long delta)
dev_warn(&p->pdev->dev, "delta out of range\n");
now = timer8_get_counter(p);
p->tcora = delta;
- ctrl_outb(ctrl_inb(p->mapbase + _8TCR) | 0x40, p->mapbase + _8TCR);
+ writeb(readb(p->mapbase + _8TCR) | 0x40, p->mapbase + _8TCR);
if (delta > now)
- ctrl_outw(delta, p->mapbase + TCORA);
+ writew(delta, p->mapbase + TCORA);
else
- ctrl_outw(now + 1, p->mapbase + TCORA);
+ writew(now + 1, p->mapbase + TCORA);
}
static int timer8_enable(struct timer8_priv *p)
{
p->rate = clk_get_rate(p->pclk) / SCALE;
- ctrl_outw(0xffff, p->mapbase + TCORA);
- ctrl_outw(0x0000, p->mapbase + _8TCNT);
- ctrl_outw(0x0c02, p->mapbase + _8TCR);
+ writew(0xffff, p->mapbase + TCORA);
+ writew(0x0000, p->mapbase + _8TCNT);
+ writew(0x0c02, p->mapbase + _8TCR);
return 0;
}
@@ -117,7 +117,7 @@ static int timer8_start(struct timer8_priv *p)
static void timer8_stop(struct timer8_priv *p)
{
- ctrl_outw(0x0000, p->mapbase + _8TCR);
+ writew(0x0000, p->mapbase + _8TCR);
}
static inline struct timer8_priv *ced_to_priv(struct clock_event_device *ced)
diff --git a/drivers/clocksource/h8300_tpu.c b/drivers/clocksource/h8300_tpu.c
index c1eef42..1f67a38 100644
--- a/drivers/clocksource/h8300_tpu.c
+++ b/drivers/clocksource/h8300_tpu.c
@@ -31,8 +31,8 @@ static inline unsigned long read_tcnt32(struct tpu_priv *p)
{
unsigned long tcnt;
- tcnt = ctrl_inw(p->mapbase1 + TCNT) << 16;
- tcnt |= ctrl_inw(p->mapbase2 + TCNT);
+ tcnt = readw(p->mapbase1 + TCNT) << 16;
+ tcnt |= readw(p->mapbase2 + TCNT);
return tcnt;
}
@@ -41,7 +41,7 @@ static int tpu_get_counter(struct tpu_priv *p, unsigned long long *val)
unsigned long v1, v2, v3;
int o1, o2;
- o1 = ctrl_inb(p->mapbase1 + TSR) & 0x10;
+ o1 = readb(p->mapbase1 + TSR) & 0x10;
/* Make sure the timer value is stable. Stolen from acpi_pm.c */
do {
@@ -49,7 +49,7 @@ static int tpu_get_counter(struct tpu_priv *p, unsigned long long *val)
v1 = read_tcnt32(p);
v2 = read_tcnt32(p);
v3 = read_tcnt32(p);
- o1 = ctrl_inb(p->mapbase1 + TSR) & 0x10;
+ o1 = readb(p->mapbase1 + TSR) & 0x10;
} while (unlikely((o1 != o2) || (v1 > v2 && v1 < v3)
|| (v2 > v3 && v2 < v1) || (v3 > v1 && v3 < v2)));
@@ -82,10 +82,10 @@ static int tpu_clocksource_enable(struct clocksource *cs)
WARN_ON(p->cs_enabled);
- ctrl_outw(0, p->mapbase1 + TCNT);
- ctrl_outw(0, p->mapbase2 + TCNT);
- ctrl_outb(0x0f, p->mapbase1 + TCR);
- ctrl_outb(0x03, p->mapbase2 + TCR);
+ writew(0, p->mapbase1 + TCNT);
+ writew(0, p->mapbase2 + TCNT);
+ writeb(0x0f, p->mapbase1 + TCR);
+ writeb(0x03, p->mapbase2 + TCR);
p->cs_enabled = true;
return 0;
@@ -97,8 +97,8 @@ static void tpu_clocksource_disable(struct clocksource *cs)
WARN_ON(!p->cs_enabled);
- ctrl_outb(0, p->mapbase1 + TCR);
- ctrl_outb(0, p->mapbase2 + TCR);
+ writeb(0, p->mapbase1 + TCR);
+ writeb(0, p->mapbase2 + TCR);
p->cs_enabled = false;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 10/10] clocksource/drivers/h8300_timer8: Retrieve the clock rate at init time
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
` (7 preceding siblings ...)
2015-11-08 22:36 ` [RFC PATCH 09/10] h8300: Rename ctlr_out/in[bwl] to read/write[bwl] Daniel Lezcano
@ 2015-11-08 22:36 ` Daniel Lezcano
2015-11-08 22:38 ` [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:36 UTC (permalink / raw)
To: daniel.lezcano, ysato
Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
The current code retrieves the rate value when the timer is enabled which
occurs each time a timer is re-armed. Except if the clock frequency has changed
magically I don't see why this should be done each time.
Retrieve the clock rate value at init time only.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/h8300_timer8.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c
index cf0feee..020f109 100644
--- a/drivers/clocksource/h8300_timer8.c
+++ b/drivers/clocksource/h8300_timer8.c
@@ -34,7 +34,6 @@ struct timer8_priv {
unsigned long flags;
unsigned int rate;
unsigned int tcora;
- struct clk *pclk;
};
static unsigned long timer8_get_counter(struct timer8_priv *p)
@@ -92,7 +91,6 @@ static void timer8_set_next(struct timer8_priv *p, unsigned long delta)
static int timer8_enable(struct timer8_priv *p)
{
- p->rate = clk_get_rate(p->pclk) / SCALE;
writew(0xffff, p->mapbase + TCORA);
writew(0x0000, p->mapbase + _8TCNT);
writew(0x0c02, p->mapbase + _8TCR);
@@ -102,16 +100,15 @@ static int timer8_enable(struct timer8_priv *p)
static int timer8_start(struct timer8_priv *p)
{
- int ret = 0;
+ int ret;
- if (!(p->flags & FLAG_STARTED))
- ret = timer8_enable(p);
+ if ((p->flags & FLAG_STARTED))
+ return 0;
- if (ret)
- goto out;
- p->flags |= FLAG_STARTED;
+ ret = timer8_enable(p);
+ if (!ret)
+ p->flags |= FLAG_STARTED;
- out:
return ret;
}
@@ -217,7 +214,12 @@ static void __init h8300_8timer_init(struct device_node *node)
}
timer8_priv.mapbase = (unsigned long)base;
- timer8_priv.pclk = clk;
+
+ rate = clk_get_rate(clk) / SCALE;
+ if (!rate) {
+ pr_err("Failed to get rate for the clocksource\n");
+ goto unmap_reg;
+ }
ret = request_irq(irq, timer8_interrupt,
IRQF_TIMER, timer8_priv.ced.name, &timer8_priv);
@@ -225,10 +227,10 @@ static void __init h8300_8timer_init(struct device_node *node)
pr_err("failed to request irq %d for clockevent\n", irq);
goto unmap_reg;
}
- rate = clk_get_rate(clk) / SCALE;
+
clockevents_config_and_register(&timer8_priv.ced, rate, 1, 0x0000ffff);
- return;
+ return;
unmap_reg:
iounmap(base);
free_clk:
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
` (8 preceding siblings ...)
2015-11-08 22:36 ` [RFC PATCH 10/10] clocksource/drivers/h8300_timer8: Retrieve the clock rate at init time Daniel Lezcano
@ 2015-11-08 22:38 ` Daniel Lezcano
9 siblings, 0 replies; 11+ messages in thread
From: Daniel Lezcano @ 2015-11-08 22:38 UTC (permalink / raw)
To: ysato; +Cc: tglx, linux-kernel, moderated list:H8/300 ARCHITECTURE
Series not compiled, not tested.
Greetings
-- Daniel
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-11-08 22:38 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-08 22:36 [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 02/10] clocksource/drivers/h8300: Remove pointless headers for TPU Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 03/10] clocksource/drivers/h8300_timer8: Remove unused headers Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 04/10] clocksource/drivers/h8300_timer8: Remove unused macros Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 05/10] clocksource/drivers/h8300_timer8: Remove PERIODIC and ONESHOT macro Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 06/10] clocksource/drivers/h8300_timer8: Fix irq return value check Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 07/10] clocksource/drivers/h8300_timer8: Remove pointless irq re-entrant safe code Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 08/10] clocksource/drivers/h8300_timer8: Remove irq and lock legacy code Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 09/10] h8300: Rename ctlr_out/in[bwl] to read/write[bwl] Daniel Lezcano
2015-11-08 22:36 ` [RFC PATCH 10/10] clocksource/drivers/h8300_timer8: Retrieve the clock rate at init time Daniel Lezcano
2015-11-08 22:38 ` [RFC PATCH 01/10] clocksource/drivers/h8300: Remove unused macros Daniel Lezcano
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.