Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
arm
mach-gemini
time.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2001-2006 Storlink, Corp.
3
* Copyright (C) 2008-2009 Paulius Zaleckas <
[email protected]
>
4
*
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
9
*/
10
#include <
linux/interrupt.h
>
11
#include <
linux/irq.h
>
12
#include <
linux/io.h
>
13
#include <mach/hardware.h>
14
#include <
mach/global_reg.h
>
15
#include <
asm/mach/time.h
>
16
17
/*
18
* Register definitions for the timers
19
*/
20
#define TIMER_COUNT(BASE_ADDR) (BASE_ADDR + 0x00)
21
#define TIMER_LOAD(BASE_ADDR) (BASE_ADDR + 0x04)
22
#define TIMER_MATCH1(BASE_ADDR) (BASE_ADDR + 0x08)
23
#define TIMER_MATCH2(BASE_ADDR) (BASE_ADDR + 0x0C)
24
#define TIMER_CR(BASE_ADDR) (BASE_ADDR + 0x30)
25
26
#define TIMER_1_CR_ENABLE (1 << 0)
27
#define TIMER_1_CR_CLOCK (1 << 1)
28
#define TIMER_1_CR_INT (1 << 2)
29
#define TIMER_2_CR_ENABLE (1 << 3)
30
#define TIMER_2_CR_CLOCK (1 << 4)
31
#define TIMER_2_CR_INT (1 << 5)
32
#define TIMER_3_CR_ENABLE (1 << 6)
33
#define TIMER_3_CR_CLOCK (1 << 7)
34
#define TIMER_3_CR_INT (1 << 8)
35
36
/*
37
* IRQ handler for the timer
38
*/
39
static
irqreturn_t
gemini_timer_interrupt(
int
irq,
void
*
dev_id
)
40
{
41
timer_tick
();
42
43
return
IRQ_HANDLED
;
44
}
45
46
static
struct
irqaction
gemini_timer_irq = {
47
.name =
"Gemini Timer Tick"
,
48
.flags =
IRQF_DISABLED
|
IRQF_TIMER
,
49
.handler = gemini_timer_interrupt,
50
};
51
52
/*
53
* Set up timer interrupt, and return the current time in seconds.
54
*/
55
void
__init
gemini_timer_init
(
void
)
56
{
57
unsigned
int
tick_rate, reg_v;
58
59
reg_v =
__raw_readl
(
IO_ADDRESS
(
GEMINI_GLOBAL_BASE
+
GLOBAL_STATUS
));
60
tick_rate =
REG_TO_AHB_SPEED
(reg_v) * 1000000;
61
62
printk
(
KERN_INFO
"Bus: %dMHz"
, tick_rate / 1000000);
63
64
tick_rate /= 6;
/* APB bus run AHB*(1/6) */
65
66
switch
(reg_v &
CPU_AHB_RATIO_MASK
) {
67
case
CPU_AHB_1_1
:
68
printk
(
KERN_CONT
"(1/1)\n"
);
69
break
;
70
case
CPU_AHB_3_2
:
71
printk
(
KERN_CONT
"(3/2)\n"
);
72
break
;
73
case
CPU_AHB_24_13
:
74
printk
(
KERN_CONT
"(24/13)\n"
);
75
break
;
76
case
CPU_AHB_2_1
:
77
printk
(
KERN_CONT
"(2/1)\n"
);
78
break
;
79
}
80
81
/*
82
* Make irqs happen for the system timer
83
*/
84
setup_irq
(
IRQ_TIMER2
, &gemini_timer_irq);
85
/* Start the timer */
86
__raw_writel
(tick_rate /
HZ
,
TIMER_COUNT
(
IO_ADDRESS
(
GEMINI_TIMER2_BASE
)));
87
__raw_writel
(tick_rate /
HZ
,
TIMER_LOAD
(
IO_ADDRESS
(
GEMINI_TIMER2_BASE
)));
88
__raw_writel
(
TIMER_2_CR_ENABLE
|
TIMER_2_CR_INT
,
TIMER_CR
(
IO_ADDRESS
(
GEMINI_TIMER_BASE
)));
89
}
Generated on Thu Jan 10 2013 12:53:30 for Linux Kernel by
1.8.2