19 #include <linux/kernel.h>
20 #include <linux/module.h>
25 #include <linux/slab.h>
27 #include <plat/common.h>
39 #define OMAP_PRCM_MAX_NR_PENDING_REG 2
47 static struct irq_chip_generic **prcm_irq_chips;
61 static void omap_prcm_events_filter_priority(
unsigned long *
events,
62 unsigned long *priority_events)
66 for (i = 0; i < prcm_irq_setup->
nr_regs; i++) {
69 events[
i] ^= priority_events[
i];
81 static void omap_prcm_irq_handler(
unsigned int irq,
struct irq_desc *
desc)
87 int nr_irq = prcm_irq_setup->
nr_regs * 32;
115 omap_prcm_events_filter_priority(pending, priority_pending);
133 chip->
irq_eoi(&desc->irq_data);
136 prcm_irq_setup->ocp_barrier();
153 if (!prcm_irq_setup || !name)
156 for (i = 0; i < prcm_irq_setup->
nr_irqs; i++)
157 if (!
strcmp(prcm_irq_setup->
irqs[i].name, name))
159 prcm_irq_setup->
irqs[
i].offset;
174 if (!prcm_irq_setup) {
175 pr_err(
"PRCM: IRQ handler not initialized; cannot cleanup\n");
179 if (prcm_irq_chips) {
180 for (i = 0; i < prcm_irq_setup->
nr_regs; i++) {
181 if (prcm_irq_chips[i])
184 prcm_irq_chips[
i] =
NULL;
186 kfree(prcm_irq_chips);
187 prcm_irq_chips =
NULL;
196 irq_set_chained_handler(prcm_irq_setup->
irq,
NULL);
242 struct irq_chip_generic *
gc;
243 struct irq_chip_type *
ct;
250 if (prcm_irq_setup) {
251 pr_err(
"PRCM: already initialized; won't reinitialize\n");
256 pr_err(
"PRCM: nr_regs too large\n");
260 prcm_irq_setup = irq_setup;
262 prcm_irq_chips = kzalloc(
sizeof(
void *) * nr_regs,
GFP_KERNEL);
267 if (!prcm_irq_chips || !prcm_irq_setup->
saved_mask ||
269 pr_err(
"PRCM: kzalloc failed\n");
273 memset(mask, 0,
sizeof(mask));
275 for (i = 0; i < irq_setup->
nr_irqs; i++) {
276 offset = irq_setup->
irqs[
i].offset;
277 mask[offset >> 5] |= 1 << (offset & 0x1f);
278 if (irq_setup->
irqs[i].priority)
280 1 << (offset & 0x1f);
283 irq_set_chained_handler(irq_setup->
irq, omap_prcm_irq_handler);
289 pr_err(
"PRCM: failed to allocate irq descs: %d\n",
294 for (i = 0; i < irq_setup->
nr_regs; i++) {
300 pr_err(
"PRCM: failed to allocate generic chip\n");
308 ct->regs.ack = irq_setup->
ack + i * 4;
309 ct->regs.mask = irq_setup->
mask + i * 4;
312 prcm_irq_chips[
i] = gc;
330 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
336 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
342 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
348 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
354 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
360 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
366 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
372 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");
379 WARN(1,
"prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n");