diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2011-11-26 19:46:19 -0800 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-11-26 19:46:48 -0800 | 
| commit | 47b649590dbbea182f854d6470ee1cd59b7b7684 (patch) | |
| tree | a2de3610f9c5e963234cffb35b9d559aab62e164 /arch/powerpc/platforms/ps3/interrupt.c | |
| parent | 3af5154a869bc278a829bb03e65a709480e821b0 (diff) | |
| parent | caca6a03d365883564885f2c1da3e88dcf65d139 (diff) | |
| download | olio-linux-3.10-47b649590dbbea182f854d6470ee1cd59b7b7684.tar.xz olio-linux-3.10-47b649590dbbea182f854d6470ee1cd59b7b7684.zip  | |
Merge 3.2-rc3 into usb-linus
This pulls in the latest USB bugfixes and helps a few of the drivers
merge nicer in the future due to changes in both branches.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'arch/powerpc/platforms/ps3/interrupt.c')
| -rw-r--r-- | arch/powerpc/platforms/ps3/interrupt.c | 23 | 
1 files changed, 22 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/ps3/interrupt.c b/arch/powerpc/platforms/ps3/interrupt.c index 404bc52b780..1d6f4f478fe 100644 --- a/arch/powerpc/platforms/ps3/interrupt.c +++ b/arch/powerpc/platforms/ps3/interrupt.c @@ -88,6 +88,7 @@ struct ps3_private {  	struct ps3_bmp bmp __attribute__ ((aligned (PS3_BMP_MINALIGN)));  	u64 ppe_id;  	u64 thread_id; +	unsigned long ipi_mask;  };  static DEFINE_PER_CPU(struct ps3_private, ps3_private); @@ -144,7 +145,11 @@ static void ps3_chip_unmask(struct irq_data *d)  static void ps3_chip_eoi(struct irq_data *d)  {  	const struct ps3_private *pd = irq_data_get_irq_chip_data(d); -	lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq); + +	/* non-IPIs are EOIed here. */ + +	if (!test_bit(63 - d->irq, &pd->ipi_mask)) +		lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq);  }  /** @@ -691,6 +696,16 @@ void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq)  		cpu, virq, pd->bmp.ipi_debug_brk_mask);  } +void __init ps3_register_ipi_irq(unsigned int cpu, unsigned int virq) +{ +	struct ps3_private *pd = &per_cpu(ps3_private, cpu); + +	set_bit(63 - virq, &pd->ipi_mask); + +	DBG("%s:%d: cpu %u, virq %u, ipi_mask %lxh\n", __func__, __LINE__, +		cpu, virq, pd->ipi_mask); +} +  static unsigned int ps3_get_irq(void)  {  	struct ps3_private *pd = &__get_cpu_var(ps3_private); @@ -720,6 +735,12 @@ static unsigned int ps3_get_irq(void)  		BUG();  	}  #endif + +	/* IPIs are EOIed here. */ + +	if (test_bit(63 - plug, &pd->ipi_mask)) +		lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, plug); +  	return plug;  }  |