2 * linux/arch/h8300/kernel/cpu/timer/timer8.c
4 * Yoshinori Sato <ysato@users.sourcefoge.jp>
10 #include <linux/errno.h>
11 #include <linux/kernel.h>
12 #include <linux/interrupt.h>
13 #include <linux/init.h>
14 #include <linux/clockchips.h>
15 #include <linux/clk.h>
18 #include <linux/of_address.h>
19 #include <linux/of_irq.h>
30 #define FLAG_STARTED (1 << 3)
34 #define bset(b, a) iowrite8(ioread8(a) | (1 << (b)), (a))
35 #define bclr(b, a) iowrite8(ioread8(a) & ~(1 << (b)), (a))
38 struct clock_event_device ced
;
39 void __iomem
*mapbase
;
44 static irqreturn_t
timer8_interrupt(int irq
, void *dev_id
)
46 struct timer8_priv
*p
= dev_id
;
48 if (clockevent_state_oneshot(&p
->ced
))
49 iowrite16be(0x0000, p
->mapbase
+ _8TCR
);
51 p
->ced
.event_handler(&p
->ced
);
53 bclr(CMFA
, p
->mapbase
+ _8TCSR
);
58 static void timer8_set_next(struct timer8_priv
*p
, unsigned long delta
)
61 pr_warn("delta out of range\n");
62 bclr(CMIEA
, p
->mapbase
+ _8TCR
);
63 iowrite16be(delta
, p
->mapbase
+ TCORA
);
64 iowrite16be(0x0000, p
->mapbase
+ _8TCNT
);
65 bclr(CMFA
, p
->mapbase
+ _8TCSR
);
66 bset(CMIEA
, p
->mapbase
+ _8TCR
);
69 static int timer8_enable(struct timer8_priv
*p
)
71 iowrite16be(0xffff, p
->mapbase
+ TCORA
);
72 iowrite16be(0x0000, p
->mapbase
+ _8TCNT
);
73 iowrite16be(0x0c02, p
->mapbase
+ _8TCR
);
78 static int timer8_start(struct timer8_priv
*p
)
82 if ((p
->flags
& FLAG_STARTED
))
85 ret
= timer8_enable(p
);
87 p
->flags
|= FLAG_STARTED
;
92 static void timer8_stop(struct timer8_priv
*p
)
94 iowrite16be(0x0000, p
->mapbase
+ _8TCR
);
97 static inline struct timer8_priv
*ced_to_priv(struct clock_event_device
*ced
)
99 return container_of(ced
, struct timer8_priv
, ced
);
102 static void timer8_clock_event_start(struct timer8_priv
*p
, unsigned long delta
)
105 timer8_set_next(p
, delta
);
108 static int timer8_clock_event_shutdown(struct clock_event_device
*ced
)
110 timer8_stop(ced_to_priv(ced
));
114 static int timer8_clock_event_periodic(struct clock_event_device
*ced
)
116 struct timer8_priv
*p
= ced_to_priv(ced
);
118 pr_info("%s: used for periodic clock events\n", ced
->name
);
120 timer8_clock_event_start(p
, (p
->rate
+ HZ
/2) / HZ
);
125 static int timer8_clock_event_oneshot(struct clock_event_device
*ced
)
127 struct timer8_priv
*p
= ced_to_priv(ced
);
129 pr_info("%s: used for oneshot clock events\n", ced
->name
);
131 timer8_clock_event_start(p
, 0x10000);
136 static int timer8_clock_event_next(unsigned long delta
,
137 struct clock_event_device
*ced
)
139 struct timer8_priv
*p
= ced_to_priv(ced
);
141 BUG_ON(!clockevent_state_oneshot(ced
));
142 timer8_set_next(p
, delta
- 1);
147 static struct timer8_priv timer8_priv
= {
149 .name
= "h8300_8timer",
150 .features
= CLOCK_EVT_FEAT_PERIODIC
| CLOCK_EVT_FEAT_ONESHOT
,
152 .set_next_event
= timer8_clock_event_next
,
153 .set_state_shutdown
= timer8_clock_event_shutdown
,
154 .set_state_periodic
= timer8_clock_event_periodic
,
155 .set_state_oneshot
= timer8_clock_event_oneshot
,
159 static int __init
h8300_8timer_init(struct device_node
*node
)
165 clk
= of_clk_get(node
, 0);
167 pr_err("failed to get clock for clockevent\n");
172 base
= of_iomap(node
, 0);
174 pr_err("failed to map registers for clockevent\n");
179 irq
= irq_of_parse_and_map(node
, 0);
181 pr_err("failed to get irq for clockevent\n");
185 timer8_priv
.mapbase
= base
;
187 timer8_priv
.rate
= clk_get_rate(clk
) / SCALE
;
188 if (!timer8_priv
.rate
) {
189 pr_err("Failed to get rate for the clocksource\n");
193 if (request_irq(irq
, timer8_interrupt
, IRQF_TIMER
,
194 timer8_priv
.ced
.name
, &timer8_priv
) < 0) {
195 pr_err("failed to request irq %d for clockevent\n", irq
);
199 clockevents_config_and_register(&timer8_priv
.ced
,
200 timer8_priv
.rate
, 1, 0x0000ffff);
210 TIMER_OF_DECLARE(h8300_8bit
, "renesas,8bit-timer", h8300_8timer_init
);