Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 72787
b: refs/heads/master
c: 38760d4
h: refs/heads/master
i:
  72785: 50950d0
  72783: 4a43a46
v: v3
  • Loading branch information
Ralf Baechle committed Oct 29, 2007
1 parent c21e6b0 commit b38f694
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 68 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1238d5d868a56dcbc743d3ffc9bd3c920258b4cb
refs/heads/master: 38760d40ca61b18b2809e9c28df8b3ff9af8a02b
25 changes: 18 additions & 7 deletions trunk/arch/mips/kernel/cevt-r4k.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ void __cpuinit mips_clockevent_init(void)
uint64_t mips_freq = mips_hpt_frequency;
unsigned int cpu = smp_processor_id();
struct clock_event_device *cd;
unsigned int irq = MIPS_CPU_IRQ_BASE + 7;
unsigned int irq;

if (!cpu_has_counter || !mips_hpt_frequency)
return;
Expand All @@ -243,6 +243,15 @@ void __cpuinit mips_clockevent_init(void)
if (!c0_compare_int_usable())
return;

/*
* With vectored interrupts things are getting platform specific.
* get_c0_compare_int is a hook to allow a platform to return the
* interrupt number of it's liking.
*/
irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
if (get_c0_compare_int)
irq = get_c0_compare_int();

cd = &per_cpu(mips_clockevent_device, cpu);

cd->name = "MIPS";
Expand All @@ -267,13 +276,15 @@ void __cpuinit mips_clockevent_init(void)

clockevents_register_device(cd);

if (!cp0_timer_irq_installed) {
if (!cp0_timer_irq_installed)
return;

cp0_timer_irq_installed = 1;

#ifdef CONFIG_MIPS_MT_SMTC
#define CPUCTR_IMASKBIT (0x100 << cp0_compare_irq)
setup_irq_smtc(irq, &c0_compare_irqaction, CPUCTR_IMASKBIT);
setup_irq_smtc(irq, &c0_compare_irqaction, CPUCTR_IMASKBIT);
#else
setup_irq(irq, &c0_compare_irqaction);
#endif /* CONFIG_MIPS_MT_SMTC */
cp0_timer_irq_installed = 1;
}
setup_irq(irq, &c0_compare_irqaction);
#endif
}
52 changes: 22 additions & 30 deletions trunk/arch/mips/mips-boards/generic/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,26 +127,6 @@ unsigned long read_persistent_clock(void)
return mc146818_get_cmos_time();
}

void __init plat_time_init(void)
{
unsigned int est_freq;

/* Set Data mode - binary. */
CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL);

est_freq = estimate_cpu_frequency();

printk("CPU frequency %d.%02d MHz\n", est_freq/1000000,
(est_freq%1000000)*100/1000000);

cpu_khz = est_freq / 1000;

mips_scroll_message();
#ifdef CONFIG_I8253 /* Only Malta has a PIT */
setup_pit_timer();
#endif
}

void __init plat_perf_setup(void)
{
cp0_perfcount_irq = -1;
Expand All @@ -166,28 +146,40 @@ void __init plat_perf_setup(void)
}
}

void __init plat_timer_setup(struct irqaction *irq)
unsigned int __init get_c0_compare_int(void)
{
#ifdef MSC01E_INT_BASE
if (cpu_has_veic) {
set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch);
mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR;
}
else
} else
#endif
{
if (cpu_has_vint)
set_vi_handler(cp0_compare_irq, mips_timer_dispatch);
mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
}

#ifdef CONFIG_MIPS_MT_SMTC
setup_irq_smtc(mips_cpu_timer_irq, irq, 0x100 << cp0_compare_irq);
#else
setup_irq(mips_cpu_timer_irq, irq);
#endif /* CONFIG_MIPS_MT_SMTC */
#ifdef CONFIG_SMP
set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq);
return mips_cpu_timer_irq;
}

void __init plat_time_init(void)
{
unsigned int est_freq;

/* Set Data mode - binary. */
CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL);

est_freq = estimate_cpu_frequency();

printk("CPU frequency %d.%02d MHz\n", est_freq/1000000,
(est_freq%1000000)*100/1000000);

cpu_khz = est_freq / 1000;

mips_scroll_message();
#ifdef CONFIG_I8253 /* Only Malta has a PIT */
setup_pit_timer();
#endif

plat_perf_setup();
Expand Down
52 changes: 22 additions & 30 deletions trunk/arch/mips/mipssim/sim_time.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,25 +75,6 @@ static unsigned int __init estimate_cpu_frequency(void)
return count;
}

void __init plat_time_init(void)
{
unsigned int est_freq, flags;

local_irq_save(flags);

/* Set Data mode - binary. */
CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL);

est_freq = estimate_cpu_frequency();

printk(KERN_INFO "CPU frequency %d.%02d MHz\n", est_freq / 1000000,
(est_freq % 1000000) * 100 / 1000000);

cpu_khz = est_freq / 1000;

local_irq_restore(flags);
}

static int mips_cpu_timer_irq;

static void mips_timer_dispatch(void)
Expand All @@ -102,26 +83,37 @@ static void mips_timer_dispatch(void)
}


void __init plat_timer_setup(struct irqaction *irq)
unsigned __init get_c0_compare_int(void)
{
#ifdef MSC01E_INT_BASE
if (cpu_has_veic) {
set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch);
mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR;
} else {
#endif
if (cpu_has_vint)
set_vi_handler(cp0_compare_irq, mips_timer_dispatch);
mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
}

/* we are using the cpu counter for timer interrupts */
setup_irq(mips_cpu_timer_irq, irq);
return mips_cpu_timer_irq;
}

#ifdef CONFIG_SMP
/* irq_desc(riptor) is a global resource, when the interrupt overlaps
on seperate cpu's the first one tries to handle the second interrupt.
The effect is that the int remains disabled on the second cpu.
Mark the interrupt with IRQ_PER_CPU to avoid any confusion */
irq_desc[mips_cpu_timer_irq].flags |= IRQ_PER_CPU;
set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq);
#endif
void __init plat_time_init(void)
{
unsigned int est_freq, flags;

local_irq_save(flags);

/* Set Data mode - binary. */
CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL);

est_freq = estimate_cpu_frequency();

printk(KERN_INFO "CPU frequency %d.%02d MHz\n", est_freq / 1000000,
(est_freq % 1000000) * 100 / 1000000);

cpu_khz = est_freq / 1000;

local_irq_restore(flags);
}
1 change: 1 addition & 0 deletions trunk/include/asm-mips/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ extern int (*perf_irq)(void);
*/
#ifdef CONFIG_CEVT_R4K
extern void mips_clockevent_init(void);
extern unsigned int __weak get_c0_compare_int(void);
#else
static inline void mips_clockevent_init(void)
{
Expand Down

0 comments on commit b38f694

Please sign in to comment.