]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/irqchip/irq-atmel-aic-common.c
Merge tag 'dt-for-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[karo-tx-linux.git] / drivers / irqchip / irq-atmel-aic-common.c
index 18b76fc03d5353357bd593f2f8559d7a7d8c5b80..6ae3cdee0681a8008218fbcf25762280b64e48ce 100644 (file)
@@ -139,6 +139,53 @@ static void __init aic_common_ext_irq_of_init(struct irq_domain *domain)
        }
 }
 
+#define AT91_RTC_IDR           0x24
+#define AT91_RTC_IMR           0x28
+#define AT91_RTC_IRQ_MASK      0x1f
+
+void __init aic_common_rtc_irq_fixup(struct device_node *root)
+{
+       struct device_node *np;
+       void __iomem *regs;
+
+       np = of_find_compatible_node(root, NULL, "atmel,at91rm9200-rtc");
+       if (!np)
+               np = of_find_compatible_node(root, NULL,
+                                            "atmel,at91sam9x5-rtc");
+
+       if (!np)
+               return;
+
+       regs = of_iomap(np, 0);
+       of_node_put(np);
+
+       if (!regs)
+               return;
+
+       writel(AT91_RTC_IRQ_MASK, regs + AT91_RTC_IDR);
+
+       iounmap(regs);
+}
+
+void __init aic_common_irq_fixup(const struct of_device_id *matches)
+{
+       struct device_node *root = of_find_node_by_path("/");
+       const struct of_device_id *match;
+
+       if (!root)
+               return;
+
+       match = of_match_node(matches, root);
+       of_node_put(root);
+
+       if (match) {
+               void (*fixup)(struct device_node *) = match->data;
+               fixup(root);
+       }
+
+       of_node_put(root);
+}
+
 struct irq_domain *__init aic_common_of_init(struct device_node *node,
                                             const struct irq_domain_ops *ops,
                                             const char *name, int nirqs)