* [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