diff options
Diffstat (limited to 'arch/mips/kernel/i8259.c')
| -rw-r--r-- | arch/mips/kernel/i8259.c | 72 | 
1 files changed, 28 insertions, 44 deletions
diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c index c58176cc796..50b364897dd 100644 --- a/arch/mips/kernel/i8259.c +++ b/arch/mips/kernel/i8259.c @@ -14,7 +14,7 @@  #include <linux/interrupt.h>  #include <linux/kernel.h>  #include <linux/spinlock.h> -#include <linux/sysdev.h> +#include <linux/syscore_ops.h>  #include <linux/irq.h>  #include <asm/i8259.h> @@ -31,20 +31,17 @@  static int i8259A_auto_eoi = -1;  DEFINE_RAW_SPINLOCK(i8259A_lock); -static void disable_8259A_irq(unsigned int irq); -static void enable_8259A_irq(unsigned int irq); -static void mask_and_ack_8259A(unsigned int irq); +static void disable_8259A_irq(struct irq_data *d); +static void enable_8259A_irq(struct irq_data *d); +static void mask_and_ack_8259A(struct irq_data *d);  static void init_8259A(int auto_eoi);  static struct irq_chip i8259A_chip = { -	.name		= "XT-PIC", -	.mask		= disable_8259A_irq, -	.disable	= disable_8259A_irq, -	.unmask		= enable_8259A_irq, -	.mask_ack	= mask_and_ack_8259A, -#ifdef CONFIG_MIPS_MT_SMTC_IRQAFF -	.set_affinity	= plat_set_irq_affinity, -#endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */ +	.name			= "XT-PIC", +	.irq_mask		= disable_8259A_irq, +	.irq_disable		= disable_8259A_irq, +	.irq_unmask		= enable_8259A_irq, +	.irq_mask_ack		= mask_and_ack_8259A,  };  /* @@ -59,12 +56,11 @@ static unsigned int cached_irq_mask = 0xffff;  #define cached_master_mask	(cached_irq_mask)  #define cached_slave_mask	(cached_irq_mask >> 8) -static void disable_8259A_irq(unsigned int irq) +static void disable_8259A_irq(struct irq_data *d)  { -	unsigned int mask; +	unsigned int mask, irq = d->irq - I8259A_IRQ_BASE;  	unsigned long flags; -	irq -= I8259A_IRQ_BASE;  	mask = 1 << irq;  	raw_spin_lock_irqsave(&i8259A_lock, flags);  	cached_irq_mask |= mask; @@ -75,12 +71,11 @@ static void disable_8259A_irq(unsigned int irq)  	raw_spin_unlock_irqrestore(&i8259A_lock, flags);  } -static void enable_8259A_irq(unsigned int irq) +static void enable_8259A_irq(struct irq_data *d)  { -	unsigned int mask; +	unsigned int mask, irq = d->irq - I8259A_IRQ_BASE;  	unsigned long flags; -	irq -= I8259A_IRQ_BASE;  	mask = ~(1 << irq);  	raw_spin_lock_irqsave(&i8259A_lock, flags);  	cached_irq_mask &= mask; @@ -112,7 +107,7 @@ int i8259A_irq_pending(unsigned int irq)  void make_8259A_irq(unsigned int irq)  {  	disable_irq_nosync(irq); -	set_irq_chip_and_handler(irq, &i8259A_chip, handle_level_irq); +	irq_set_chip_and_handler(irq, &i8259A_chip, handle_level_irq);  	enable_irq(irq);  } @@ -145,12 +140,11 @@ static inline int i8259A_irq_real(unsigned int irq)   * first, _then_ send the EOI, and the order of EOI   * to the two 8259s is important!   */ -static void mask_and_ack_8259A(unsigned int irq) +static void mask_and_ack_8259A(struct irq_data *d)  { -	unsigned int irqmask; +	unsigned int irqmask, irq = d->irq - I8259A_IRQ_BASE;  	unsigned long flags; -	irq -= I8259A_IRQ_BASE;  	irqmask = 1 << irq;  	raw_spin_lock_irqsave(&i8259A_lock, flags);  	/* @@ -181,9 +175,8 @@ handle_real_irq:  	} else {  		inb(PIC_MASTER_IMR);	/* DUMMY - (do we need this?) */  		outb(cached_master_mask, PIC_MASTER_IMR); -		outb(0x60+irq, PIC_MASTER_CMD);	/* 'Specific EOI to master */ +		outb(0x60+irq, PIC_MASTER_CMD); /* 'Specific EOI to master */  	} -	smtc_im_ack_irq(irq);  	raw_spin_unlock_irqrestore(&i8259A_lock, flags);  	return; @@ -218,14 +211,13 @@ spurious_8259A_irq:  	}  } -static int i8259A_resume(struct sys_device *dev) +static void i8259A_resume(void)  {  	if (i8259A_auto_eoi >= 0)  		init_8259A(i8259A_auto_eoi); -	return 0;  } -static int i8259A_shutdown(struct sys_device *dev) +static void i8259A_shutdown(void)  {  	/* Put the i8259A into a quiescent state that  	 * the kernel initialization code can get it @@ -233,28 +225,19 @@ static int i8259A_shutdown(struct sys_device *dev)  	 */  	if (i8259A_auto_eoi >= 0) {  		outb(0xff, PIC_MASTER_IMR);	/* mask all of 8259A-1 */ -		outb(0xff, PIC_SLAVE_IMR);	/* mask all of 8259A-1 */ +		outb(0xff, PIC_SLAVE_IMR);	/* mask all of 8259A-2 */  	} -	return 0;  } -static struct sysdev_class i8259_sysdev_class = { -	.name = "i8259", +static struct syscore_ops i8259_syscore_ops = {  	.resume = i8259A_resume,  	.shutdown = i8259A_shutdown,  }; -static struct sys_device device_i8259A = { -	.id	= 0, -	.cls	= &i8259_sysdev_class, -}; -  static int __init i8259A_init_sysfs(void)  { -	int error = sysdev_class_register(&i8259_sysdev_class); -	if (!error) -		error = sysdev_register(&device_i8259A); -	return error; +	register_syscore_ops(&i8259_syscore_ops); +	return 0;  }  device_initcall(i8259A_init_sysfs); @@ -290,9 +273,9 @@ static void init_8259A(int auto_eoi)  		 * In AEOI mode we just have to mask the interrupt  		 * when acking.  		 */ -		i8259A_chip.mask_ack = disable_8259A_irq; +		i8259A_chip.irq_mask_ack = disable_8259A_irq;  	else -		i8259A_chip.mask_ack = mask_and_ack_8259A; +		i8259A_chip.irq_mask_ack = mask_and_ack_8259A;  	udelay(100);		/* wait for 8259A to initialize */ @@ -308,6 +291,7 @@ static void init_8259A(int auto_eoi)  static struct irqaction irq2 = {  	.handler = no_action,  	.name = "cascade", +	.flags = IRQF_NO_THREAD,  };  static struct resource pic1_io_resource = { @@ -339,8 +323,8 @@ void __init init_i8259_irqs(void)  	init_8259A(0);  	for (i = I8259A_IRQ_BASE; i < I8259A_IRQ_BASE + 16; i++) { -		set_irq_chip_and_handler(i, &i8259A_chip, handle_level_irq); -		set_irq_probe(i); +		irq_set_chip_and_handler(i, &i8259A_chip, handle_level_irq); +		irq_set_probe(i);  	}  	setup_irq(I8259A_IRQ_BASE + PIC_CASCADE_IR, &irq2);  | 
