1 #include <linux/kernel.h>
2 #include <linux/stddef.h>
4 #include <linux/sched.h>
5 #include <linux/signal.h>
16 #define PIC_VEC_SPURRIOUS 15
21 static unsigned long mpc8xx_cached_irq_mask;
22 static sysconf8xx_t
__iomem *siu_reg;
24 static inline unsigned long mpc8xx_irqd_to_bit(
struct irq_data *
d)
26 return 0x80000000 >> irqd_to_hwirq(d);
29 static void mpc8xx_unmask_irq(
struct irq_data *
d)
31 mpc8xx_cached_irq_mask |= mpc8xx_irqd_to_bit(d);
32 out_be32(&siu_reg->sc_simask, mpc8xx_cached_irq_mask);
35 static void mpc8xx_mask_irq(
struct irq_data *
d)
37 mpc8xx_cached_irq_mask &= ~mpc8xx_irqd_to_bit(d);
38 out_be32(&siu_reg->sc_simask, mpc8xx_cached_irq_mask);
41 static void mpc8xx_ack(
struct irq_data *
d)
43 out_be32(&siu_reg->sc_sipend, mpc8xx_irqd_to_bit(d));
46 static void mpc8xx_end_irq(
struct irq_data *d)
48 mpc8xx_cached_irq_mask |= mpc8xx_irqd_to_bit(d);
49 out_be32(&siu_reg->sc_simask, mpc8xx_cached_irq_mask);
52 static int mpc8xx_set_irq_type(
struct irq_data *d,
unsigned int flow_type)
56 unsigned int siel =
in_be32(&siu_reg->sc_siel);
57 siel |= mpc8xx_irqd_to_bit(d);
64 static struct irq_chip mpc8xx_pic = {
66 .irq_unmask = mpc8xx_unmask_irq,
67 .irq_mask = mpc8xx_mask_irq,
68 .irq_ack = mpc8xx_ack,
69 .irq_eoi = mpc8xx_end_irq,
70 .irq_set_type = mpc8xx_set_irq_type,
80 irq =
in_be32(&siu_reg->sc_sivec) >> 26;
89 static int mpc8xx_pic_host_map(
struct irq_domain *
h,
unsigned int virq,
92 pr_debug(
"mpc8xx_pic_host_map(%d, 0x%lx)\n", virq, hw);
101 const u32 *intspec,
unsigned int intsize,
104 static unsigned char map_pic_senses[4] = {
111 if (intspec[0] > 0x1f)
114 *out_hwirq = intspec[0];
115 if (intsize > 1 && intspec[1] < 4)
116 *out_flags = map_pic_senses[intspec[1]];
125 .map = mpc8xx_pic_host_map,
126 .xlate = mpc8xx_pic_host_xlate,
148 if (siu_reg ==
NULL) {
154 if (mpc8xx_pic_host ==
NULL) {