From: Linus Walleij <linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Cc: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>,
arm-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
Pawel Moll <pawel.moll-5wv7dgnIgG8@public.gmane.org>
Subject: [PATCH 3/6 v2] ARM: plat-versatile: add DT support to FPGA IRQ controller
Date: Sat, 1 Sep 2012 05:55:55 +0200 [thread overview]
Message-ID: <1346471760-23993-3-git-send-email-linus.walleij@linaro.org> (raw)
In-Reply-To: <1346471760-23993-2-git-send-email-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
This adds Device Tree probing support to the Versatile FPGA
IRQ controller.
Signed-off-by: Linus Walleij <linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
ChangeLog v1->v2:
- Stop passing the Linux IRQ number in the DT node, bad idea.
Register descriptors dynamically, and use whatever IRQ number
base we get. Assume we will switch everything using this over to
DT and live with it.
---
.../devicetree/bindings/arm/versatile-fpga-irq.txt | 31 ++++++++++++++
arch/arm/plat-versatile/fpga-irq.c | 47 ++++++++++++++++++++++
arch/arm/plat-versatile/include/plat/fpga-irq.h | 2 +
3 files changed, 80 insertions(+)
create mode 100644 Documentation/devicetree/bindings/arm/versatile-fpga-irq.txt
diff --git a/Documentation/devicetree/bindings/arm/versatile-fpga-irq.txt b/Documentation/devicetree/bindings/arm/versatile-fpga-irq.txt
new file mode 100644
index 0000000..9989eda
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/versatile-fpga-irq.txt
@@ -0,0 +1,31 @@
+* ARM Versatile FPGA interrupt controller
+
+One or more FPGA IRQ controllers can be synthesized in an ARM reference board
+such as the Integrator or Versatile family. The output of these different
+controllers are OR:ed together and fed to the CPU tile's IRQ input. Each
+instance can handle up to 32 interrupts.
+
+Required properties:
+- compatible: "arm,versatile-fpga-irq"
+- interrupt-controller: Identifies the node as an interrupt controller
+- #interrupt-cells: The number of cells to define the interrupts. Must be 1
+ as the FPGA IRQ controller has no configuration options for interrupt
+ sources. The cell is a u32 and defines the interrupt number.
+- reg: The register bank for the FPGA interrupt controller.
+- clear-mask: a u32 number representing the mask written to clear all IRQs
+ on the controller at boot for example.
+- valid-mask: a u32 number representing a bit mask determining which of
+ the interrupts are valid. Unconnected/unused lines are set to 0, and
+ the system till not make it possible for devices to request these
+ interrupts.
+
+Example:
+
+pic: pic@14000000 {
+ compatible = "arm,versatile-fpga-irq";
+ #interrupt-cells = <1>;
+ interrupt-controller;
+ reg = <0x14000000 0x100>;
+ clear-mask = <0xffffffff>;
+ valid-mask = <0x003fffff>;
+};
diff --git a/arch/arm/plat-versatile/fpga-irq.c b/arch/arm/plat-versatile/fpga-irq.c
index 6e70d03..1ca595c 100644
--- a/arch/arm/plat-versatile/fpga-irq.c
+++ b/arch/arm/plat-versatile/fpga-irq.c
@@ -5,6 +5,8 @@
#include <linux/io.h>
#include <linux/irqdomain.h>
#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
#include <asm/exception.h>
#include <asm/mach/irq.h>
@@ -14,6 +16,13 @@
#define IRQ_RAW_STATUS 0x04
#define IRQ_ENABLE_SET 0x08
#define IRQ_ENABLE_CLEAR 0x0c
+#define INT_SOFT_SET 0x10
+#define INT_SOFT_CLEAR 0x14
+#define FIQ_STATUS 0x20
+#define FIQ_RAW_STATUS 0x24
+#define FIQ_ENABLE 0x28
+#define FIQ_ENABLE_SET 0x28
+#define FIQ_ENABLE_CLEAR 0x2C
/**
* struct fpga_irq_data - irq data container for the FPGA IRQ controller
@@ -156,3 +165,41 @@ void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start,
fpga_irq_id++;
}
+
+#ifdef CONFIG_OF
+int __init fpga_irq_of_init(struct device_node *node,
+ struct device_node *parent)
+{
+ void __iomem *base;
+ u32 irq_start;
+ u32 clear_mask;
+ u32 valid_mask;
+
+ if (WARN_ON(!node))
+ return -ENODEV;
+
+ base = of_iomap(node, 0);
+ WARN(!base, "unable to map fpga irq registers\n");
+
+ if (of_property_read_u32(node, "clear-mask", &clear_mask))
+ clear_mask = 0;
+
+ if (of_property_read_u32(node, "valid-mask", &valid_mask))
+ valid_mask = 0;
+
+ irq_start = irq_alloc_descs(-1, 0, fls(valid_mask), numa_node_id());
+ if (WARN_ON(irq_start < 0))
+ goto out_unmap;
+
+ writel(clear_mask, base + IRQ_ENABLE_CLEAR);
+ writel(clear_mask, base + FIQ_ENABLE_CLEAR);
+
+ fpga_irq_init(base, node->name, irq_start, -1, valid_mask, node);
+
+ return 0;
+
+out_unmap:
+ iounmap(base);
+ return -EIO;
+}
+#endif
diff --git a/arch/arm/plat-versatile/include/plat/fpga-irq.h b/arch/arm/plat-versatile/include/plat/fpga-irq.h
index 91bcfb6..1fac965 100644
--- a/arch/arm/plat-versatile/include/plat/fpga-irq.h
+++ b/arch/arm/plat-versatile/include/plat/fpga-irq.h
@@ -7,5 +7,7 @@ struct pt_regs;
void fpga_handle_irq(struct pt_regs *regs);
void fpga_irq_init(void __iomem *, const char *, int, int, u32,
struct device_node *node);
+int fpga_irq_of_init(struct device_node *node,
+ struct device_node *parent);
#endif
--
1.7.11.4
next prev parent reply other threads:[~2012-09-01 3:55 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-01 3:55 [PATCH 1/6 v2] ARM: integrator: call common init function from machine Linus Walleij
[not found] ` <1346471760-23993-1-git-send-email-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-09-01 3:55 ` [PATCH 2/6 v2] ARM: integrator: check PL010 device name rather than base address Linus Walleij
[not found] ` <1346471760-23993-2-git-send-email-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-09-01 3:55 ` Linus Walleij [this message]
[not found] ` <1346471760-23993-3-git-send-email-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-09-01 3:55 ` [PATCH 4/6 v2] ARM: integrator: initial device tree support Linus Walleij
[not found] ` <1346471760-23993-4-git-send-email-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-09-01 3:55 ` [PATCH 5/6 v2] ARM: integrator: convert AMBA devices to device tree Linus Walleij
[not found] ` <1346471760-23993-5-git-send-email-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-09-01 3:55 ` [PATCH 6/6 v2] ARM: integrator: convert platform devices to Device Tree Linus Walleij
2012-09-01 18:41 ` [PATCH 4/6 v2] ARM: integrator: initial device tree support Arnd Bergmann
[not found] ` <201209011841.58977.arnd-r2nGTMty4D4@public.gmane.org>
2012-09-03 21:43 ` Linus Walleij
2012-09-03 21:55 ` Russell King - ARM Linux
[not found] ` <20120903215505.GB31511-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2012-09-04 7:19 ` Linus Walleij
[not found] ` <CACRpkdbXSaBNystUv9RTmDKrmV=OakFF49LPkoQtoi9FnaXmDg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-09-05 5:34 ` Olof Johansson
[not found] ` <20120905053402.GI6747-O5ziIzlqnXUVNXGz7ipsyg@public.gmane.org>
2012-09-05 5:47 ` Linus Walleij
2012-09-02 22:59 ` Rob Herring
[not found] ` <5043E4BE.1060508-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-09-03 21:51 ` Linus Walleij
[not found] ` <CACRpkdbTRCUnx1JjCQ+WT4PoxtDG38MP=ctUp6TBPd64xQ39jw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-09-06 13:20 ` Rob Herring
[not found] ` <5048A31E.2090704-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-09-06 13:56 ` Linus Walleij
[not found] ` <CACRpkdYy2CZXXA+kkEaOTznaucxXEwiwSn-5ux0ByHjXrsm-2A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-09-06 14:19 ` Arnd Bergmann
[not found] ` <201209061419.07325.arnd-r2nGTMty4D4@public.gmane.org>
2012-09-12 16:52 ` Linus Walleij
2012-09-06 15:35 ` Rob Herring
2012-09-06 14:14 ` Russell King - ARM Linux
2012-09-01 18:32 ` [PATCH 2/6 v2] ARM: integrator: check PL010 device name rather than base address Arnd Bergmann
[not found] ` <201209011832.47805.arnd-r2nGTMty4D4@public.gmane.org>
2012-09-03 19:40 ` Linus Walleij
[not found] ` <CACRpkdYMjJFHscO1BztOFBRMf+YZo+jO5pCrEiGeeeU_Oh_rfw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-09-03 19:51 ` Linus Walleij
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1346471760-23993-3-git-send-email-linus.walleij@linaro.org \
--to=linus.walleij-qsej5fyqhm4dnm+yrofe0a@public.gmane.org \
--cc=arm-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
--cc=pawel.moll-5wv7dgnIgG8@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).