diff options
Diffstat (limited to 'arch/sparc/kernel/sun4d_irq.c')
| -rw-r--r-- | arch/sparc/kernel/sun4d_irq.c | 48 | 
1 files changed, 20 insertions, 28 deletions
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index 1d13c5bda0b..e490ac9327c 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c @@ -15,6 +15,7 @@  #include <asm/sbi.h>  #include <asm/cacheflush.h>  #include <asm/setup.h> +#include <asm/oplib.h>  #include "kernel.h"  #include "irq.h" @@ -243,19 +244,6 @@ struct irq_chip sun4d_irq = {  };  #ifdef CONFIG_SMP -static void sun4d_set_cpu_int(int cpu, int level) -{ -	sun4d_send_ipi(cpu, level); -} - -static void sun4d_clear_ipi(int cpu, int level) -{ -} - -static void sun4d_set_udt(int cpu) -{ -} -  /* Setup IRQ distribution scheme. */  void __init sun4d_distribute_irqs(void)  { @@ -282,7 +270,8 @@ static void sun4d_clear_clock_irq(void)  static void sun4d_load_profile_irq(int cpu, unsigned int limit)  { -	bw_set_prof_limit(cpu, limit); +	unsigned int value = limit ? timer_value(limit) : 0; +	bw_set_prof_limit(cpu, value);  }  static void __init sun4d_load_profile_irqs(void) @@ -418,12 +407,12 @@ static void __init sun4d_fixup_trap_table(void)  	trap_table->inst_two = lvl14_save[1];  	trap_table->inst_three = lvl14_save[2];  	trap_table->inst_four = lvl14_save[3]; -	local_flush_cache_all(); +	local_ops->cache_all();  	local_irq_restore(flags);  #endif  } -static void __init sun4d_init_timers(irq_handler_t counter_fn) +static void __init sun4d_init_timers(void)  {  	struct device_node *dp;  	struct resource res; @@ -466,12 +455,20 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn)  		prom_halt();  	} -	sbus_writel((((1000000/HZ) + 1) << 10), &sun4d_timers->l10_timer_limit); +#ifdef CONFIG_SMP +	sparc_config.cs_period = SBUS_CLOCK_RATE * 2;  /* 2 seconds */ +#else +	sparc_config.cs_period = SBUS_CLOCK_RATE / HZ; /* 1/HZ sec  */ +	sparc_config.features |= FEAT_L10_CLOCKEVENT; +#endif +	sparc_config.features |= FEAT_L10_CLOCKSOURCE; +	sbus_writel(timer_value(sparc_config.cs_period), +		    &sun4d_timers->l10_timer_limit);  	master_l10_counter = &sun4d_timers->l10_cur_count;  	irq = sun4d_build_timer_irq(board, SUN4D_TIMER_IRQ); -	err = request_irq(irq, counter_fn, IRQF_TIMER, "timer", NULL); +	err = request_irq(irq, timer_interrupt, IRQF_TIMER, "timer", NULL);  	if (err) {  		prom_printf("sun4d_init_timers: request_irq() failed with %d\n",  		             err); @@ -509,16 +506,11 @@ void __init sun4d_init_IRQ(void)  {  	local_irq_disable(); -	BTFIXUPSET_CALL(clear_clock_irq, sun4d_clear_clock_irq, BTFIXUPCALL_NORM); -	BTFIXUPSET_CALL(load_profile_irq, sun4d_load_profile_irq, BTFIXUPCALL_NORM); +	sparc_config.init_timers      = sun4d_init_timers; +	sparc_config.build_device_irq = sun4d_build_device_irq; +	sparc_config.clock_rate       = SBUS_CLOCK_RATE; +	sparc_config.clear_clock_irq  = sun4d_clear_clock_irq; +	sparc_config.load_profile_irq = sun4d_load_profile_irq; -	sparc_irq_config.init_timers      = sun4d_init_timers; -	sparc_irq_config.build_device_irq = sun4d_build_device_irq; - -#ifdef CONFIG_SMP -	BTFIXUPSET_CALL(set_cpu_int, sun4d_set_cpu_int, BTFIXUPCALL_NORM); -	BTFIXUPSET_CALL(clear_cpu_int, sun4d_clear_ipi, BTFIXUPCALL_NOP); -	BTFIXUPSET_CALL(set_irq_udt, sun4d_set_udt, BTFIXUPCALL_NOP); -#endif  	/* Cannot enable interrupts until OBP ticker is disabled. */  }  |