git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
arch
/
mips
/
philips
/
pnx8550
/
common
/
time.c
diff --git
a/arch/mips/philips/pnx8550/common/time.c
b/arch/mips/philips/pnx8550/common/time.c
index
70664ea
..
68def38
100644
(file)
--- a/
arch/mips/philips/pnx8550/common/time.c
+++ b/
arch/mips/philips/pnx8550/common/time.c
@@
-33,7
+33,17
@@
#include <int.h>
#include <cm.h>
#include <int.h>
#include <cm.h>
-extern unsigned int mips_hpt_frequency;
+static unsigned long cpj;
+
+static cycle_t hpt_read(void)
+{
+ return read_c0_count2();
+}
+
+static void timer_ack(void)
+{
+ write_c0_compare(cpj);
+}
/*
* pnx8550_time_init() - it does the following things:
/*
* pnx8550_time_init() - it does the following things:
@@
-41,8
+51,8
@@
extern unsigned int mips_hpt_frequency;
* 1) board_time_init() -
* a) (optional) set up RTC routines,
* b) (optional) calibrate and set the mips_hpt_frequency
* 1) board_time_init() -
* a) (optional) set up RTC routines,
* b) (optional) calibrate and set the mips_hpt_frequency
- * (only needed if you intended to use
fixed_rate_gettimeoffse
t
- *
or use cpu counter as timer interrupt
source)
+ * (only needed if you intended to use
cpu counter as timer interrup
t
+ * source)
*/
void pnx8550_time_init(void)
*/
void pnx8550_time_init(void)
@@
-68,36
+78,48
@@
void pnx8550_time_init(void)
* HZ timer interrupts per second.
*/
mips_hpt_frequency = 27UL * ((1000000UL * n)/(m * pow2p));
* HZ timer interrupts per second.
*/
mips_hpt_frequency = 27UL * ((1000000UL * n)/(m * pow2p));
+ cpj = (mips_hpt_frequency + HZ / 2) / HZ;
+ write_c0_count(0);
+ timer_ack();
+
+ /* Setup Timer 2 */
+ write_c0_count2(0);
+ write_c0_compare2(0xffffffff);
+
+ clocksource_mips.read = hpt_read;
+ mips_timer_ack = timer_ack;
}
}
-/*
- * pnx8550_timer_setup() - it does the following things:
- *
- * 5) board_timer_setup() -
- * a) (optional) over-write any choices made above by time_init().
- * b) machine specific code should setup the timer irqaction.
- * c) enable the timer interrupt
- */
+static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
+{
+ /* Timer 2 clear interrupt */
+ write_c0_compare2(-1);
+ return IRQ_HANDLED;
+}
-void __init pnx8550_timer_setup(struct irqaction *irq)
+static struct irqaction monotonic_irqaction = {
+ .handler = monotonic_interrupt,
+ .flags = IRQF_DISABLED,
+ .name = "Monotonic timer",
+};
+
+void __init plat_timer_setup(struct irqaction *irq)
{
int configPR;
setup_irq(PNX8550_INT_TIMER1, irq);
{
int configPR;
setup_irq(PNX8550_INT_TIMER1, irq);
+ setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
- /*
Start timer1
*/
+ /*
Timer 1 start
*/
configPR = read_c0_config7();
configPR &= ~0x00000008;
write_c0_config7(configPR);
configPR = read_c0_config7();
configPR &= ~0x00000008;
write_c0_config7(configPR);
- /* Timer 2 st
op
*/
+ /* Timer 2 st
art
*/
configPR = read_c0_config7();
configPR = read_c0_config7();
- configPR
|=
0x00000010;
+ configPR
&= ~
0x00000010;
write_c0_config7(configPR);
write_c0_config7(configPR);
- write_c0_count2(0);
- write_c0_compare2(0xffffffff);
-
/* Timer 3 stop */
configPR = read_c0_config7();
configPR |= 0x00000020;
/* Timer 3 stop */
configPR = read_c0_config7();
configPR |= 0x00000020;