diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-05-08 13:39:59 +0200 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-05-08 13:39:59 +0200 | 
| commit | 5e13a0c5ec05d382b488a691dfb8af015b1dea1e (patch) | |
| tree | 7a06dfa1f7661f8908193f2437b32452520221d3 /arch/powerpc/sysdev/mpc8xx_pic.c | |
| parent | b615b57a124a4af7b68196bc2fb8acc236041fa2 (diff) | |
| parent | 4f256e8aa3eda15c11c3cec3ec5336e1fc579cbd (diff) | |
| download | olio-linux-3.10-5e13a0c5ec05d382b488a691dfb8af015b1dea1e.tar.xz olio-linux-3.10-5e13a0c5ec05d382b488a691dfb8af015b1dea1e.zip  | |
Merge remote-tracking branch 'airlied/drm-core-next' into drm-intel-next-queued
Backmerge of drm-next to resolve a few ugly conflicts and to get a few
fixes from 3.4-rc6 (which drm-next has already merged). Note that this
merge also restricts the stencil cache lra evict policy workaround to
snb (as it should) - I had to frob the code anyway because the
CM0_MASK_SHIFT define died in the masked bit cleanups.
We need the backmerge to get Paulo Zanoni's infoframe regression fix
for gm45 - further bugfixes from him touch the same area and would
needlessly conflict.
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'arch/powerpc/sysdev/mpc8xx_pic.c')
| -rw-r--r-- | arch/powerpc/sysdev/mpc8xx_pic.c | 61 | 
1 files changed, 20 insertions, 41 deletions
diff --git a/arch/powerpc/sysdev/mpc8xx_pic.c b/arch/powerpc/sysdev/mpc8xx_pic.c index d5f5416be31..b724622c3a0 100644 --- a/arch/powerpc/sysdev/mpc8xx_pic.c +++ b/arch/powerpc/sysdev/mpc8xx_pic.c @@ -18,69 +18,45 @@  extern int cpm_get_irq(struct pt_regs *regs);  static struct irq_domain *mpc8xx_pic_host; -#define NR_MASK_WORDS   ((NR_IRQS + 31) / 32) -static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS]; +static unsigned long mpc8xx_cached_irq_mask;  static sysconf8xx_t __iomem *siu_reg; -int cpm_get_irq(struct pt_regs *regs); +static inline unsigned long mpc8xx_irqd_to_bit(struct irq_data *d) +{ +	return 0x80000000 >> irqd_to_hwirq(d); +}  static void mpc8xx_unmask_irq(struct irq_data *d)  { -	int	bit, word; -	unsigned int irq_nr = (unsigned int)irqd_to_hwirq(d); - -	bit = irq_nr & 0x1f; -	word = irq_nr >> 5; - -	ppc_cached_irq_mask[word] |= (1 << (31-bit)); -	out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]); +	mpc8xx_cached_irq_mask |= mpc8xx_irqd_to_bit(d); +	out_be32(&siu_reg->sc_simask, mpc8xx_cached_irq_mask);  }  static void mpc8xx_mask_irq(struct irq_data *d)  { -	int	bit, word; -	unsigned int irq_nr = (unsigned int)irqd_to_hwirq(d); - -	bit = irq_nr & 0x1f; -	word = irq_nr >> 5; - -	ppc_cached_irq_mask[word] &= ~(1 << (31-bit)); -	out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]); +	mpc8xx_cached_irq_mask &= ~mpc8xx_irqd_to_bit(d); +	out_be32(&siu_reg->sc_simask, mpc8xx_cached_irq_mask);  }  static void mpc8xx_ack(struct irq_data *d)  { -	int	bit; -	unsigned int irq_nr = (unsigned int)irqd_to_hwirq(d); - -	bit = irq_nr & 0x1f; -	out_be32(&siu_reg->sc_sipend, 1 << (31-bit)); +	out_be32(&siu_reg->sc_sipend, mpc8xx_irqd_to_bit(d));  }  static void mpc8xx_end_irq(struct irq_data *d)  { -	int bit, word; -	unsigned int irq_nr = (unsigned int)irqd_to_hwirq(d); - -	bit = irq_nr & 0x1f; -	word = irq_nr >> 5; - -	ppc_cached_irq_mask[word] |= (1 << (31-bit)); -	out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]); +	mpc8xx_cached_irq_mask |= mpc8xx_irqd_to_bit(d); +	out_be32(&siu_reg->sc_simask, mpc8xx_cached_irq_mask);  }  static int mpc8xx_set_irq_type(struct irq_data *d, unsigned int flow_type)  { -	if (flow_type & IRQ_TYPE_EDGE_FALLING) { -		irq_hw_number_t hw = (unsigned int)irqd_to_hwirq(d); +	/* only external IRQ senses are programmable */ +	if ((flow_type & IRQ_TYPE_EDGE_FALLING) && !(irqd_to_hwirq(d) & 1)) {  		unsigned int siel = in_be32(&siu_reg->sc_siel); - -		/* only external IRQ senses are programmable */ -		if ((hw & 1) == 0) { -			siel |= (0x80000000 >> hw); -			out_be32(&siu_reg->sc_siel, siel); -			__irq_set_handler_locked(d->irq, handle_edge_irq); -		} +		siel |= mpc8xx_irqd_to_bit(d); +		out_be32(&siu_reg->sc_siel, siel); +		__irq_set_handler_locked(d->irq, handle_edge_irq);  	}  	return 0;  } @@ -132,6 +108,9 @@ static int mpc8xx_pic_host_xlate(struct irq_domain *h, struct device_node *ct,  		IRQ_TYPE_EDGE_FALLING,  	}; +	if (intspec[0] > 0x1f) +		return 0; +  	*out_hwirq = intspec[0];  	if (intsize > 1 && intspec[1] < 4)  		*out_flags = map_pic_senses[intspec[1]];  |