OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [mips/] [kernel/] [time.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
 * Copyright 2001 MontaVista Software Inc.
3
 * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
4
 * Copyright (c) 2003, 2004  Maciej W. Rozycki
5
 *
6
 * Common time service routines for MIPS machines.
7
 *
8
 * This program is free software; you can redistribute  it and/or modify it
9
 * under  the terms of  the GNU General  Public License as published by the
10
 * Free Software Foundation;  either version 2 of the  License, or (at your
11
 * option) any later version.
12
 */
13
#include <linux/bug.h>
14
#include <linux/clockchips.h>
15
#include <linux/types.h>
16
#include <linux/kernel.h>
17
#include <linux/init.h>
18
#include <linux/sched.h>
19
#include <linux/param.h>
20
#include <linux/time.h>
21
#include <linux/timex.h>
22
#include <linux/smp.h>
23
#include <linux/spinlock.h>
24
#include <linux/module.h>
25
 
26
#include <asm/cpu-features.h>
27
#include <asm/div64.h>
28
#include <asm/smtc_ipi.h>
29
#include <asm/time.h>
30
 
31
/*
32
 * forward reference
33
 */
34
DEFINE_SPINLOCK(rtc_lock);
35
EXPORT_SYMBOL(rtc_lock);
36
 
37
int __weak rtc_mips_set_time(unsigned long sec)
38
{
39
        return 0;
40
}
41
EXPORT_SYMBOL(rtc_mips_set_time);
42
 
43
int __weak rtc_mips_set_mmss(unsigned long nowtime)
44
{
45
        return rtc_mips_set_time(nowtime);
46
}
47
 
48
int update_persistent_clock(struct timespec now)
49
{
50
        return rtc_mips_set_mmss(now.tv_sec);
51
}
52
 
53
int (*mips_timer_state)(void);
54
 
55
int null_perf_irq(void)
56
{
57
        return 0;
58
}
59
 
60
EXPORT_SYMBOL(null_perf_irq);
61
 
62
int (*perf_irq)(void) = null_perf_irq;
63
 
64
EXPORT_SYMBOL(perf_irq);
65
 
66
/*
67
 * time_init() - it does the following things.
68
 *
69
 * 1) plat_time_init() -
70
 *      a) (optional) set up RTC routines,
71
 *      b) (optional) calibrate and set the mips_hpt_frequency
72
 *          (only needed if you intended to use cpu counter as timer interrupt
73
 *           source)
74
 * 2) calculate a couple of cached variables for later usage
75
 */
76
 
77
unsigned int mips_hpt_frequency;
78
 
79
void __init clocksource_set_clock(struct clocksource *cs, unsigned int clock)
80
{
81
        u64 temp;
82
        u32 shift;
83
 
84
        /* Find a shift value */
85
        for (shift = 32; shift > 0; shift--) {
86
                temp = (u64) NSEC_PER_SEC << shift;
87
                do_div(temp, clock);
88
                if ((temp >> 32) == 0)
89
                        break;
90
        }
91
        cs->shift = shift;
92
        cs->mult = (u32) temp;
93
}
94
 
95
void __cpuinit clockevent_set_clock(struct clock_event_device *cd,
96
        unsigned int clock)
97
{
98
        u64 temp;
99
        u32 shift;
100
 
101
        /* Find a shift value */
102
        for (shift = 32; shift > 0; shift--) {
103
                temp = (u64) clock << shift;
104
                do_div(temp, NSEC_PER_SEC);
105
                if ((temp >> 32) == 0)
106
                        break;
107
        }
108
        cd->shift = shift;
109
        cd->mult = (u32) temp;
110
}
111
 
112
/*
113
 * This function exists in order to cause an error due to a duplicate
114
 * definition if platform code should have its own implementation.  The hook
115
 * to use instead is plat_time_init.  plat_time_init does not receive the
116
 * irqaction pointer argument anymore.  This is because any function which
117
 * initializes an interrupt timer now takes care of its own request_irq rsp.
118
 * setup_irq calls and each clock_event_device should use its own
119
 * struct irqrequest.
120
 */
121
void __init plat_timer_setup(void)
122
{
123
        BUG();
124
}
125
 
126
static __init int cpu_has_mfc0_count_bug(void)
127
{
128
        switch (current_cpu_type()) {
129
        case CPU_R4000PC:
130
        case CPU_R4000SC:
131
        case CPU_R4000MC:
132
                /*
133
                 * V3.0 is documented as suffering from the mfc0 from count bug.
134
                 * Afaik this is the last version of the R4000.  Later versions
135
                 * were marketed as R4400.
136
                 */
137
                return 1;
138
 
139
        case CPU_R4400PC:
140
        case CPU_R4400SC:
141
        case CPU_R4400MC:
142
                /*
143
                 * The published errata for the R4400 upto 3.0 say the CPU
144
                 * has the mfc0 from count bug.
145
                 */
146
                if ((current_cpu_data.processor_id & 0xff) <= 0x30)
147
                        return 1;
148
 
149
                /*
150
                 * we assume newer revisions are ok
151
                 */
152
                return 0;
153
        }
154
 
155
        return 0;
156
}
157
 
158
void __init time_init(void)
159
{
160
        plat_time_init();
161
 
162
        if (mips_clockevent_init() || !cpu_has_mfc0_count_bug())
163
                init_mips_clocksource();
164
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.