3171a0305d
Pass ticks to do_timer() and update_times(), and adjust x86_64 and s390
timer interrupt handler with this change.
Currently update_times() calculates ticks by "jiffies - wall_jiffies", but
callers of do_timer() should know how many ticks to update. Passing ticks
get rid of this redundant calculation. Also there are another redundancy
pointed out by Martin Schwidefsky.
This cleanup make a barrier added by
5aee405c66
needless. So this patch removes
it.
As a bonus, this cleanup make wall_jiffies can be removed easily, since now
wall_jiffies is always synced with jiffies. (This patch does not really
remove wall_jiffies. It would be another cleanup patch)
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Andi Kleen <ak@muc.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Acked-by: Russell King <rmk@arm.linux.org.uk>
Cc: Ian Molton <spyro@f2s.com>
Cc: Mikael Starvik <starvik@axis.com>
Acked-by: David Howells <dhowells@redhat.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Hirokazu Takata <takata.hirokazu@renesas.com>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Cc: Richard Curnow <rc@rc0.org.uk>
Cc: William Lee Irwin III <wli@holomorphy.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp>
Cc: Chris Zankel <chris@zankel.net>
Acked-by: "Luck, Tony" <tony.luck@intel.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
111 lines
2.5 KiB
C
111 lines
2.5 KiB
C
/*
|
|
* linux/arch/m68k/sun3/sun3ints.c -- Sun-3(x) Linux interrupt handling code
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/kernel_stat.h>
|
|
#include <linux/interrupt.h>
|
|
#include <asm/segment.h>
|
|
#include <asm/intersil.h>
|
|
#include <asm/oplib.h>
|
|
#include <asm/sun3ints.h>
|
|
#include <linux/seq_file.h>
|
|
|
|
extern void sun3_leds (unsigned char);
|
|
|
|
void sun3_disable_interrupts(void)
|
|
{
|
|
sun3_disable_irq(0);
|
|
}
|
|
|
|
void sun3_enable_interrupts(void)
|
|
{
|
|
sun3_enable_irq(0);
|
|
}
|
|
|
|
int led_pattern[8] = {
|
|
~(0x80), ~(0x01),
|
|
~(0x40), ~(0x02),
|
|
~(0x20), ~(0x04),
|
|
~(0x10), ~(0x08)
|
|
};
|
|
|
|
volatile unsigned char* sun3_intreg;
|
|
|
|
void sun3_enable_irq(unsigned int irq)
|
|
{
|
|
*sun3_intreg |= (1 << irq);
|
|
}
|
|
|
|
void sun3_disable_irq(unsigned int irq)
|
|
{
|
|
*sun3_intreg &= ~(1 << irq);
|
|
}
|
|
|
|
static irqreturn_t sun3_int7(int irq, void *dev_id, struct pt_regs *fp)
|
|
{
|
|
*sun3_intreg |= (1 << irq);
|
|
if (!(kstat_cpu(0).irqs[irq] % 2000))
|
|
sun3_leds(led_pattern[(kstat_cpu(0).irqs[irq] % 16000) / 2000]);
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static irqreturn_t sun3_int5(int irq, void *dev_id, struct pt_regs *fp)
|
|
{
|
|
#ifdef CONFIG_SUN3
|
|
intersil_clear();
|
|
#endif
|
|
*sun3_intreg |= (1 << irq);
|
|
#ifdef CONFIG_SUN3
|
|
intersil_clear();
|
|
#endif
|
|
do_timer(1);
|
|
#ifndef CONFIG_SMP
|
|
update_process_times(user_mode(fp));
|
|
#endif
|
|
if (!(kstat_cpu(0).irqs[irq] % 20))
|
|
sun3_leds(led_pattern[(kstat_cpu(0).irqs[irq] % 160) / 20]);
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static irqreturn_t sun3_vec255(int irq, void *dev_id, struct pt_regs *fp)
|
|
{
|
|
// intersil_clear();
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static void sun3_inthandle(unsigned int irq, struct pt_regs *fp)
|
|
{
|
|
*sun3_intreg &= ~(1 << irq);
|
|
|
|
m68k_handle_int(irq, fp);
|
|
}
|
|
|
|
static struct irq_controller sun3_irq_controller = {
|
|
.name = "sun3",
|
|
.lock = SPIN_LOCK_UNLOCKED,
|
|
.startup = m68k_irq_startup,
|
|
.shutdown = m68k_irq_shutdown,
|
|
.enable = sun3_enable_irq,
|
|
.disable = sun3_disable_irq,
|
|
};
|
|
|
|
void sun3_init_IRQ(void)
|
|
{
|
|
*sun3_intreg = 1;
|
|
|
|
m68k_setup_auto_interrupt(sun3_inthandle);
|
|
m68k_setup_irq_controller(&sun3_irq_controller, IRQ_AUTO_1, 7);
|
|
m68k_setup_user_interrupt(VEC_USER, 192, NULL);
|
|
|
|
request_irq(IRQ_AUTO_5, sun3_int5, 0, "int5", NULL);
|
|
request_irq(IRQ_AUTO_7, sun3_int7, 0, "int7", NULL);
|
|
request_irq(IRQ_USER+127, sun3_vec255, 0, "vec255", NULL);
|
|
}
|