Thread (1 message) 1 message, 1 author, 2011-06-10

Re: [PATCH v4 3/4] drivers/amba: create devices from device tree

From: Grant Likely <hidden>
Date: 2011-06-10 23:11:46
Also in: linux-arm-kernel

On Fri, Jun 10, 2011 at 05:37:37PM -0500, Rob Herring wrote:
On 06/10/2011 05:22 PM, Grant Likely wrote:
quoted
On Fri, Jun 10, 2011 at 03:48:42PM -0500, Rob Herring wrote:
quoted
From: Rob Herring<rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>

Add a function to create amba bus devices (i.e. primecell peripherals) from
device tree nodes. The device tree scanning is done by
of_platform_probe/populate functions which can call of_amba_device_create
based on a match table entry.

Nodes with a "arm,amba-deviceid" property can override the h/w peripheral id
value.

Based on the original work by Jeremy Kerr.

Cc: Jeremy Kerr<redacted>
Cc: Grant Likely<grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
Cc: linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org
Cc: arnd-r2nGTMty4D4@public.gmane.org
Acked-by: Linus Walleij<redacted>
Signed-off-by: Rob Herring<rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
---
 Documentation/devicetree/bindings/arm/amba.txt |   21 ++++++++++
 drivers/amba/bus.c                             |   51 ++++++++++++++++++++++++
 include/linux/amba/bus.h                       |   18 ++++++++
 3 files changed, 90 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/arm/amba.txt
diff --git a/Documentation/devicetree/bindings/arm/amba.txt b/Documentation/devicetree/bindings/arm/amba.txt
new file mode 100644
index 0000000..23fde7f
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/amba.txt
@@ -0,0 +1,21 @@
+* ARM Primecell Peripherals
+
+ARM, Ltd. Primecell peripherals have a standard id register that can be used to
+identify the peripheral type, vendor, and revision. This value can be used for
+driver matching.
+
+Required properties:
+
+- compatible : should be a specific value for peripheral and "arm,amba-device"
After recent conversations, I'd like to change this to
"arm,primecell" to better reflect the kind of devices it models.
That did cross my mind as I was writing the doc...
quoted
quoted
+
+Optional properties:
+
+- arm,amba-deviceid : Value to override the h/w value with
Similarly, based on the primecell device documents, this should
probabaly be arm,primecell-periphid.
quoted
+
+Example:
+
+serial@fff36000 {
+	compatible = "arm,pl011", "arm,amba-device";
+	arm,amba-deviceid =<0x00341011>;
+};
+
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
index d74926e..19f712b 100644
--- a/drivers/amba/bus.c
+++ b/drivers/amba/bus.c
@@ -13,6 +13,11 @@
 #include<linux/string.h>
 #include<linux/slab.h>
 #include<linux/io.h>
+#include<linux/of.h>
+#include<linux/of_irq.h>
+#include<linux/of_address.h>
+#include<linux/of_device.h>
+#include<linux/of_platform.h>
 #include<linux/pm.h>
 #include<linux/pm_runtime.h>
 #include<linux/amba/bus.h>
@@ -785,3 +790,49 @@ EXPORT_SYMBOL(amba_device_unregister);
 EXPORT_SYMBOL(amba_find_device);
 EXPORT_SYMBOL(amba_request_regions);
 EXPORT_SYMBOL(amba_release_regions);
+
+#ifdef CONFIG_OF
+int of_amba_device_create(struct device_node *node, struct device *parent)
+{
+	struct amba_device *dev;
+	const void *prop;
+	int i, ret;
+
+	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+	if (!dev)
+		return -ENOMEM;
+
+	/* setup generic device info */
+	dev->dev.coherent_dma_mask = ~0;
+	dev->dev.of_node = node;
+	dev->dev.parent = parent;
+	of_device_make_bus_id(&dev->dev);
+
+	/* setup amba-specific device info */
+	dev->dma_mask = ~0;
+
+	/* Allow the arm,amba-deviceid value to override the h/w value */
+	prop = of_get_property(node, "arm,amba-deviceid", NULL);
+	if (prop)
+		dev->periphid = of_read_ulong(prop, 1);
+
+	/* Decode the IRQs and address ranges */
+	for (i = 0; i<  AMBA_NR_IRQS; i++)
+		dev->irq[i] = irq_of_parse_and_map(node, i);
+
+	ret = of_address_to_resource(node, 0,&dev->res);
+	if (ret)
+		goto err_free;
+
+	ret = amba_device_register(dev,&iomem_resource);
+	if (ret)
+		goto err_free;
+
+	return 0;
+
+err_free:
+	kfree(dev);
+	return ret;
+}
+
Yeah, I think this looks like the right thing to do.  I'll pick it up
into devicetree/test and probably move it to devicetree/arm in the
near future after testing a bit.
Okay, I'll respin with your and Arnd's comments.
Actually, hold off.  I'm working on it right now so I can get it into
my tree.  I'll take care of the respin.

g.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help