diff options
Diffstat (limited to 'arch/um/kernel/irq.c')
| -rw-r--r-- | arch/um/kernel/irq.c | 110 | 
1 files changed, 36 insertions, 74 deletions
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 3f0ac9e0c96..1d8505b1e29 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c @@ -5,61 +5,17 @@   *	Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar   */ -#include "linux/cpumask.h" -#include "linux/hardirq.h" -#include "linux/interrupt.h" -#include "linux/kernel_stat.h" -#include "linux/module.h" -#include "linux/sched.h" -#include "linux/seq_file.h" -#include "linux/slab.h" -#include "as-layout.h" -#include "kern_util.h" -#include "os.h" - -/* - * Generic, controller-independent functions: - */ - -int show_interrupts(struct seq_file *p, void *v) -{ -	int i = *(loff_t *) v, j; -	struct irqaction * action; -	unsigned long flags; - -	if (i == 0) { -		seq_printf(p, "           "); -		for_each_online_cpu(j) -			seq_printf(p, "CPU%d       ",j); -		seq_putc(p, '\n'); -	} - -	if (i < NR_IRQS) { -		raw_spin_lock_irqsave(&irq_desc[i].lock, flags); -		action = irq_desc[i].action; -		if (!action) -			goto skip; -		seq_printf(p, "%3d: ",i); -#ifndef CONFIG_SMP -		seq_printf(p, "%10u ", kstat_irqs(i)); -#else -		for_each_online_cpu(j) -			seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); -#endif -		seq_printf(p, " %14s", irq_desc[i].chip->name); -		seq_printf(p, "  %s", action->name); - -		for (action=action->next; action; action = action->next) -			seq_printf(p, ", %s", action->name); - -		seq_putc(p, '\n'); -skip: -		raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); -	} else if (i == NR_IRQS) -		seq_putc(p, '\n'); - -	return 0; -} +#include <linux/cpumask.h> +#include <linux/hardirq.h> +#include <linux/interrupt.h> +#include <linux/kernel_stat.h> +#include <linux/module.h> +#include <linux/sched.h> +#include <linux/seq_file.h> +#include <linux/slab.h> +#include <as-layout.h> +#include <kern_util.h> +#include <os.h>  /*   * This list is accessed under irq_lock, except in sigio_handler, @@ -74,7 +30,7 @@ static struct irq_fd **last_irq_ptr = &active_fds;  extern void free_irqs(void); -void sigio_handler(int sig, struct uml_pt_regs *regs) +void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)  {  	struct irq_fd *irq_fd;  	int n; @@ -302,6 +258,7 @@ void deactivate_fd(int fd, int irqnum)  	ignore_sigio_fd(fd);  } +EXPORT_SYMBOL(deactivate_fd);  /*   * Called just before shutdown in order to provide a clean exec @@ -340,6 +297,13 @@ unsigned int do_IRQ(int irq, struct uml_pt_regs *regs)  	return 1;  } +void um_free_irq(unsigned int irq, void *dev) +{ +	free_irq_by_irq_and_dev(irq, dev); +	free_irq(irq, dev); +} +EXPORT_SYMBOL(um_free_irq); +  int um_request_irq(unsigned int irq, int fd, int type,  		   irq_handler_t handler,  		   unsigned long irqflags, const char * devname, @@ -360,42 +324,40 @@ EXPORT_SYMBOL(um_request_irq);  EXPORT_SYMBOL(reactivate_fd);  /* - * irq_chip must define (startup || enable) && - * (shutdown || disable) && end + * irq_chip must define at least enable/disable and ack when + * the edge handler is used.   */ -static void dummy(unsigned int irq) +static void dummy(struct irq_data *d)  {  }  /* This is used for everything else than the timer. */  static struct irq_chip normal_irq_type = {  	.name = "SIGIO", -	.release = free_irq_by_irq_and_dev, -	.disable = dummy, -	.enable = dummy, -	.ack = dummy, -	.end = dummy +	.irq_disable = dummy, +	.irq_enable = dummy, +	.irq_ack = dummy, +	.irq_mask = dummy, +	.irq_unmask = dummy,  };  static struct irq_chip SIGVTALRM_irq_type = {  	.name = "SIGVTALRM", -	.release = free_irq_by_irq_and_dev, -	.shutdown = dummy, /* never called */ -	.disable = dummy, -	.enable = dummy, -	.ack = dummy, -	.end = dummy +	.irq_disable = dummy, +	.irq_enable = dummy, +	.irq_ack = dummy, +	.irq_mask = dummy, +	.irq_unmask = dummy,  };  void __init init_IRQ(void)  {  	int i; -	set_irq_chip_and_handler(TIMER_IRQ, &SIGVTALRM_irq_type, handle_edge_irq); +	irq_set_chip_and_handler(TIMER_IRQ, &SIGVTALRM_irq_type, handle_edge_irq); -	for (i = 1; i < NR_IRQS; i++) { -		set_irq_chip_and_handler(i, &normal_irq_type, handle_edge_irq); -	} +	for (i = 1; i < NR_IRQS; i++) +		irq_set_chip_and_handler(i, &normal_irq_type, handle_edge_irq);  }  /*  | 
