diff options
Diffstat (limited to 'arch/powerpc/sysdev/i8259.c')
| -rw-r--r-- | arch/powerpc/sysdev/i8259.c | 75 | 
1 files changed, 30 insertions, 45 deletions
diff --git a/arch/powerpc/sysdev/i8259.c b/arch/powerpc/sysdev/i8259.c index 6323e70e6bf..45598da0b32 100644 --- a/arch/powerpc/sysdev/i8259.c +++ b/arch/powerpc/sysdev/i8259.c @@ -8,7 +8,6 @@   */  #undef DEBUG -#include <linux/init.h>  #include <linux/ioport.h>  #include <linux/interrupt.h>  #include <linux/kernel.h> @@ -25,7 +24,7 @@ static unsigned char cached_8259[2] = { 0xff, 0xff };  static DEFINE_RAW_SPINLOCK(i8259_lock); -static struct irq_host *i8259_host; +static struct irq_domain *i8259_host;  /*   * Acknowledge the IRQ using either the PCI host bridge's interrupt @@ -78,19 +77,19 @@ unsigned int i8259_irq(void)  	return irq;  } -static void i8259_mask_and_ack_irq(unsigned int irq_nr) +static void i8259_mask_and_ack_irq(struct irq_data *d)  {  	unsigned long flags;  	raw_spin_lock_irqsave(&i8259_lock, flags); -	if (irq_nr > 7) { -		cached_A1 |= 1 << (irq_nr-8); +	if (d->irq > 7) { +		cached_A1 |= 1 << (d->irq-8);  		inb(0xA1); 	/* DUMMY */  		outb(cached_A1, 0xA1);  		outb(0x20, 0xA0);	/* Non-specific EOI */  		outb(0x20, 0x20);	/* Non-specific EOI to cascade */  	} else { -		cached_21 |= 1 << irq_nr; +		cached_21 |= 1 << d->irq;  		inb(0x21); 	/* DUMMY */  		outb(cached_21, 0x21);  		outb(0x20, 0x20);	/* Non-specific EOI */ @@ -104,42 +103,42 @@ static void i8259_set_irq_mask(int irq_nr)  	outb(cached_21,0x21);  } -static void i8259_mask_irq(unsigned int irq_nr) +static void i8259_mask_irq(struct irq_data *d)  {  	unsigned long flags; -	pr_debug("i8259_mask_irq(%d)\n", irq_nr); +	pr_debug("i8259_mask_irq(%d)\n", d->irq);  	raw_spin_lock_irqsave(&i8259_lock, flags); -	if (irq_nr < 8) -		cached_21 |= 1 << irq_nr; +	if (d->irq < 8) +		cached_21 |= 1 << d->irq;  	else -		cached_A1 |= 1 << (irq_nr-8); -	i8259_set_irq_mask(irq_nr); +		cached_A1 |= 1 << (d->irq-8); +	i8259_set_irq_mask(d->irq);  	raw_spin_unlock_irqrestore(&i8259_lock, flags);  } -static void i8259_unmask_irq(unsigned int irq_nr) +static void i8259_unmask_irq(struct irq_data *d)  {  	unsigned long flags; -	pr_debug("i8259_unmask_irq(%d)\n", irq_nr); +	pr_debug("i8259_unmask_irq(%d)\n", d->irq);  	raw_spin_lock_irqsave(&i8259_lock, flags); -	if (irq_nr < 8) -		cached_21 &= ~(1 << irq_nr); +	if (d->irq < 8) +		cached_21 &= ~(1 << d->irq);  	else -		cached_A1 &= ~(1 << (irq_nr-8)); -	i8259_set_irq_mask(irq_nr); +		cached_A1 &= ~(1 << (d->irq-8)); +	i8259_set_irq_mask(d->irq);  	raw_spin_unlock_irqrestore(&i8259_lock, flags);  }  static struct irq_chip i8259_pic = {  	.name		= "i8259", -	.mask		= i8259_mask_irq, -	.disable	= i8259_mask_irq, -	.unmask		= i8259_unmask_irq, -	.mask_ack	= i8259_mask_and_ack_irq, +	.irq_mask	= i8259_mask_irq, +	.irq_disable	= i8259_mask_irq, +	.irq_unmask	= i8259_unmask_irq, +	.irq_mask_ack	= i8259_mask_and_ack_irq,  };  static struct resource pic1_iores = { @@ -163,41 +162,29 @@ static struct resource pic_edgectrl_iores = {  	.flags = IORESOURCE_BUSY,  }; -static int i8259_host_match(struct irq_host *h, struct device_node *node) +static int i8259_host_match(struct irq_domain *h, struct device_node *node)  {  	return h->of_node == NULL || h->of_node == node;  } -static int i8259_host_map(struct irq_host *h, unsigned int virq, +static int i8259_host_map(struct irq_domain *h, unsigned int virq,  			  irq_hw_number_t hw)  {  	pr_debug("i8259_host_map(%d, 0x%lx)\n", virq, hw);  	/* We block the internal cascade */  	if (hw == 2) -		irq_to_desc(virq)->status |= IRQ_NOREQUEST; +		irq_set_status_flags(virq, IRQ_NOREQUEST);  	/* We use the level handler only for now, we might want to  	 * be more cautious here but that works for now  	 */ -	irq_to_desc(virq)->status |= IRQ_LEVEL; -	set_irq_chip_and_handler(virq, &i8259_pic, handle_level_irq); +	irq_set_status_flags(virq, IRQ_LEVEL); +	irq_set_chip_and_handler(virq, &i8259_pic, handle_level_irq);  	return 0;  } -static void i8259_host_unmap(struct irq_host *h, unsigned int virq) -{ -	/* Make sure irq is masked in hardware */ -	i8259_mask_irq(virq); - -	/* remove chip and handler */ -	set_irq_chip_and_handler(virq, NULL, NULL); - -	/* Make sure it's completed */ -	synchronize_irq(virq); -} - -static int i8259_host_xlate(struct irq_host *h, struct device_node *ct, +static int i8259_host_xlate(struct irq_domain *h, struct device_node *ct,  			    const u32 *intspec, unsigned int intsize,  			    irq_hw_number_t *out_hwirq, unsigned int *out_flags)  { @@ -217,14 +204,13 @@ static int i8259_host_xlate(struct irq_host *h, struct device_node *ct,  	return 0;  } -static struct irq_host_ops i8259_host_ops = { +static struct irq_domain_ops i8259_host_ops = {  	.match = i8259_host_match,  	.map = i8259_host_map, -	.unmap = i8259_host_unmap,  	.xlate = i8259_host_xlate,  }; -struct irq_host *i8259_get_host(void) +struct irq_domain *i8259_get_host(void)  {  	return i8259_host;  } @@ -276,8 +262,7 @@ void i8259_init(struct device_node *node, unsigned long intack_addr)  	raw_spin_unlock_irqrestore(&i8259_lock, flags);  	/* create a legacy host */ -	i8259_host = irq_alloc_host(node, IRQ_HOST_MAP_LEGACY, -				    0, &i8259_host_ops, 0); +	i8259_host = irq_domain_add_legacy_isa(node, &i8259_host_ops, NULL);  	if (i8259_host == NULL) {  		printk(KERN_ERR "i8259: failed to allocate irq host !\n");  		return;  | 
