2 * linux/arch/h8300/kernel/timer/itu.c
4 * Yoshinori Sato <ysato@users.sourcefoge.jp>
10 #include <linux/errno.h>
11 #include <linux/sched.h>
12 #include <linux/kernel.h>
13 #include <linux/param.h>
14 #include <linux/string.h>
16 #include <linux/interrupt.h>
17 #include <linux/init.h>
18 #include <linux/timex.h>
20 #include <asm/segment.h>
23 #include <asm/regs306x.h>
25 #if CONFIG_H8300_ITU_CH == 0
26 #define ITUBASE 0xffff64
28 #elif CONFIG_H8300_ITU_CH == 1
29 #define ITUBASE 0xffff6e
31 #elif CONFIG_H8300_ITU_CH == 2
32 #define ITUBASE 0xffff78
34 #elif CONFIG_H8300_ITU_CH == 3
35 #define ITUBASE 0xffff82
37 #elif CONFIG_H8300_ITU_CH == 4
38 #define ITUBASE 0xffff92
41 #error Unknown timer channel.
52 static irqreturn_t
timer_interrupt(int irq
, void *dev_id
)
55 ctrl_bclr(IMFA
, ITUBASE
+ TSR
);
59 static struct irqaction itu_irq
= {
61 .handler
= timer_interrupt
,
62 .flags
= IRQF_DISABLED
| IRQF_TIMER
,
65 static const int __initdata divide_rate
[] = {1, 2, 4, 8};
67 void __init
h8300_timer_setup(void)
72 calc_param(cnt
, div
, divide_rate
, 0x10000);
74 setup_irq(ITUIRQ
, &itu_irq
);
76 /* initialize timer */
78 ctrl_outb(CCLR0
| div
, ITUBASE
+ TCR
);
79 ctrl_outb(0x01, ITUBASE
+ TIER
);
80 ctrl_outw(cnt
, ITUBASE
+ GRA
);
81 ctrl_bset(CONFIG_H8300_ITU_CH
, TSTR
);