Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 256775
b: refs/heads/master
c: 5de1540
h: refs/heads/master
i:
  256773: 9263ce0
  256771: 5923392
  256767: e98e0c4
v: v3
  • Loading branch information
Grant Likely committed Jun 21, 2011
1 parent 0d38790 commit cf138eb
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 29d4f8a4974aacf46b028fa92f9dd3ffdba3e614
refs/heads/master: 5de1540b7bc4c23470f86add1e517be41e7fefe2
21 changes: 21 additions & 0 deletions trunk/Documentation/devicetree/bindings/arm/primecell.txt
Original file line number Diff line number Diff line change
@@ -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,primecell"

Optional properties:

- arm,primecell-periphid : Value to override the h/w value with

Example:

serial@fff36000 {
compatible = "arm,pl011", "arm,primecell";
arm,primecell-periphid = <0x00341011>;
};

71 changes: 71 additions & 0 deletions trunk/drivers/of/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*/
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/amba/bus.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -217,6 +218,71 @@ struct platform_device *of_platform_device_create(struct device_node *np,
}
EXPORT_SYMBOL(of_platform_device_create);

#ifdef CONFIG_ARM_AMBA
static struct amba_device *of_amba_device_create(struct device_node *node,
const char *bus_id,
void *platform_data,
struct device *parent)
{
struct amba_device *dev;
const void *prop;
int i, ret;

pr_debug("Creating amba device %s\n", node->full_name);

if (!of_device_is_available(node))
return NULL;

dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return NULL;

/* setup generic device info */
dev->dev.coherent_dma_mask = ~0;
dev->dev.of_node = of_node_get(node);
dev->dev.parent = parent;
dev->dev.platform_data = platform_data;
if (bus_id)
dev_set_name(&dev->dev, "%s", bus_id);
else
of_device_make_bus_id(&dev->dev);

/* setup amba-specific device info */
dev->dma_mask = ~0;

/* Allow the HW Peripheral ID to be overridden */
prop = of_get_property(node, "arm,primecell-periphid", 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 dev;

err_free:
kfree(dev);
return NULL;
}
#else /* CONFIG_ARM_AMBA */
static struct amba_device *of_amba_device_create(struct device_node *node,
const char *bus_id,
void *platform_data,
struct device *parent)
{
return NULL;
}
#endif /* CONFIG_ARM_AMBA */

/**
* of_platform_bus_create() - Create a device for a node and its children.
* @bus: device node of the bus to instantiate
Expand All @@ -242,6 +308,11 @@ static int of_platform_bus_create(struct device_node *bus,
return 0;
}

if (of_device_is_compatible(bus, "arm,primecell")) {
of_amba_device_create(bus, NULL, NULL, parent);
return 0;
}

dev = of_platform_device_create(bus, NULL, parent);
if (!dev || !of_match_node(matches, bus))
return 0;
Expand Down

0 comments on commit cf138eb

Please sign in to comment.