12 #include <linux/kernel.h>
16 #include <linux/device.h>
28 #include <mach/regs-gpio.h>
30 static inline void s5p_irq_eint_mask(
struct irq_data *
data)
39 static void s5p_irq_eint_unmask(
struct irq_data *data)
48 static inline void s5p_irq_eint_ack(
struct irq_data *data)
54 static void s5p_irq_eint_maskack(
struct irq_data *data)
57 s5p_irq_eint_mask(data);
58 s5p_irq_eint_ack(data);
61 static int s5p_irq_eint_set_type(
struct irq_data *data,
unsigned int type)
94 shift = (offs & 0x7) * 4;
99 ctrl |= newvalue << shift;
102 if ((0 <= offs) && (offs < 8))
105 else if ((8 <= offs) && (offs < 16))
108 else if ((16 <= offs) && (offs < 24))
111 else if ((24 <= offs) && (offs < 32))
120 static struct irq_chip s5p_irq_eint = {
122 .irq_mask = s5p_irq_eint_mask,
123 .irq_unmask = s5p_irq_eint_unmask,
124 .irq_mask_ack = s5p_irq_eint_maskack,
125 .irq_ack = s5p_irq_eint_ack,
126 .irq_set_type = s5p_irq_eint_set_type,
140 static inline void s5p_irq_demux_eint(
unsigned int start)
150 irq = fls(status) - 1;
152 status &= ~(1 << irq);
156 static void s5p_irq_demux_eint16_31(
unsigned int irq,
struct irq_desc *
desc)
162 static inline void s5p_irq_vic_eint_mask(
struct irq_data *data)
164 void __iomem *
base = irq_data_get_irq_chip_data(data);
166 s5p_irq_eint_mask(data);
170 static void s5p_irq_vic_eint_unmask(
struct irq_data *data)
172 void __iomem *base = irq_data_get_irq_chip_data(data);
174 s5p_irq_eint_unmask(data);
178 static inline void s5p_irq_vic_eint_ack(
struct irq_data *data)
184 static void s5p_irq_vic_eint_maskack(
struct irq_data *data)
186 s5p_irq_vic_eint_mask(data);
187 s5p_irq_vic_eint_ack(data);
190 static struct irq_chip s5p_irq_vic_eint = {
191 .name =
"s5p_vic_eint",
192 .irq_mask = s5p_irq_vic_eint_mask,
193 .irq_unmask = s5p_irq_vic_eint_unmask,
194 .irq_mask_ack = s5p_irq_vic_eint_maskack,
195 .irq_ack = s5p_irq_vic_eint_ack,
196 .irq_set_type = s5p_irq_eint_set_type,
202 static int __init s5p_init_irq_eint(
void)
214 irq_set_chained_handler(
IRQ_EINT16_31, s5p_irq_demux_eint16_31);