Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[linux-2.6] / arch / v850 / kernel / v850e_timer_d.c
1 /*
2  * include/asm-v850/v850e_timer_d.c -- `Timer D' component often used
3  *      with V850E CPUs
4  *
5  *  Copyright (C) 2001,02,03  NEC Electronics Corporation
6  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
7  *
8  * This file is subject to the terms and conditions of the GNU General
9  * Public License.  See the file COPYING in the main directory of this
10  * archive for more details.
11  *
12  * Written by Miles Bader <miles@gnu.org>
13  */
14
15 #include <linux/kernel.h>
16
17 #include <asm/v850e_utils.h>
18 #include <asm/v850e_timer_d.h>
19
20 /* Start interval timer TIMER (0-3).  The timer will issue the
21    corresponding INTCMD interrupt RATE times per second.
22    This function does not enable the interrupt.  */
23 void v850e_timer_d_configure (unsigned timer, unsigned rate)
24 {
25         unsigned divlog2, count;
26
27         /* Calculate params for timer.  */
28         if (! calc_counter_params (
29                     V850E_TIMER_D_BASE_FREQ, rate,
30                     V850E_TIMER_D_TMCD_CS_MIN, V850E_TIMER_D_TMCD_CS_MAX, 16,
31                     &divlog2, &count))
32                 printk (KERN_WARNING
33                         "Cannot find interval timer %d setting suitable"
34                         " for rate of %dHz.\n"
35                         "Using rate of %dHz instead.\n",
36                         timer, rate,
37                         (V850E_TIMER_D_BASE_FREQ >> divlog2) >> 16);
38
39         /* Do the actual hardware timer initialization:  */
40
41         /* Enable timer.  */
42         V850E_TIMER_D_TMCD(timer) = V850E_TIMER_D_TMCD_CAE;
43         /* Set clock divider.  */
44         V850E_TIMER_D_TMCD(timer)
45                 = V850E_TIMER_D_TMCD_CAE
46                 | V850E_TIMER_D_TMCD_CS(divlog2);
47         /* Set timer compare register.  */
48         V850E_TIMER_D_CMD(timer) = count;
49         /* Start counting.  */
50         V850E_TIMER_D_TMCD(timer)
51                 = V850E_TIMER_D_TMCD_CAE
52                 | V850E_TIMER_D_TMCD_CS(divlog2)
53                 | V850E_TIMER_D_TMCD_CE;
54 }