diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-03-04 09:21:37 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-03-04 09:21:37 +0100 |
commit | 1eb77960b8f45e48e3b1bd49bd45c4c18a9e3e01 (patch) | |
tree | 1b0cf66fac40ff2dd62ff1465352e820a99741af /drivers | |
parent | 3d9c75131259c413682434b2d90355952b007a37 (diff) | |
parent | 8428a8c6e30f232cce3fe789bf32493a8e056916 (diff) | |
download | barebox-1eb77960b8f45e48e3b1bd49bd45c4c18a9e3e01.tar.gz barebox-1eb77960b8f45e48e3b1bd49bd45c4c18a9e3e01.tar.xz |
Merge branch 'for-next/dt'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/Kconfig | 1 | ||||
-rw-r--r-- | drivers/amba/Kconfig | 2 | ||||
-rw-r--r-- | drivers/amba/bus.c | 1 | ||||
-rw-r--r-- | drivers/of/base.c | 61 |
4 files changed, 57 insertions, 8 deletions
diff --git a/drivers/Kconfig b/drivers/Kconfig index 988ec9ee06..dac22de98b 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -1,5 +1,6 @@ menu "Drivers" +source "drivers/amba/Kconfig" source "drivers/serial/Kconfig" source "drivers/net/Kconfig" source "drivers/spi/Kconfig" diff --git a/drivers/amba/Kconfig b/drivers/amba/Kconfig new file mode 100644 index 0000000000..d1cba6a9b3 --- /dev/null +++ b/drivers/amba/Kconfig @@ -0,0 +1,2 @@ +config ARM_AMBA + bool diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index d1ab53ca72..dcb52bf73d 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -212,6 +212,7 @@ struct amba_device *amba_device_alloc(const char *name, int id, resource_size_t dev->res.start = base; dev->res.end = base + size - 1; dev->res.flags = IORESOURCE_MEM; + dev->dev.resource = &dev->res; return dev; } diff --git a/drivers/of/base.c b/drivers/of/base.c index eaaeaf4f49..1f32bfbc4e 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -26,6 +26,7 @@ #include <memory.h> #include <sizes.h> #include <linux/ctype.h> +#include <linux/amba/bus.h> /** * struct alias_prop - Alias property in 'aliases' node @@ -641,18 +642,44 @@ void of_delete_property(struct property *pp) free(pp); } -static struct device_d *add_of_device(struct device_node *node) +static struct device_d *add_of_amba_device(struct device_node *node) { - struct device_d *dev; + struct amba_device *dev; char *name, *at; - const struct property *cp; - if (of_node_disabled(node)) - return NULL; + dev = xzalloc(sizeof(*dev)); - cp = of_get_property(node, "compatible", NULL); - if (!cp) - return NULL; + name = xstrdup(node->name); + at = strchr(name, '@'); + if (at) { + *at = 0; + snprintf(dev->dev.name, MAX_DRIVER_NAME, "%s.%s", at + 1, name); + } else { + strncpy(dev->dev.name, node->name, MAX_DRIVER_NAME); + } + + dev->dev.id = DEVICE_ID_SINGLE; + memcpy(&dev->res, &node->resource[0], sizeof(struct resource)); + dev->dev.resource = node->resource; + dev->dev.num_resources = 1; + dev->dev.device_node = node; + node->device = &dev->dev; + + of_property_read_u32(node, "arm,primecell-periphid", &dev->periphid); + + debug("register device 0x%08x\n", node->resource[0].start); + + amba_device_add(dev); + + free(name); + + return &dev->dev; +} + +static struct device_d *add_of_platform_device(struct device_node *node) +{ + struct device_d *dev; + char *name, *at; dev = xzalloc(sizeof(*dev)); @@ -679,6 +706,24 @@ static struct device_d *add_of_device(struct device_node *node) return dev; } + +static struct device_d *add_of_device(struct device_node *node) +{ + const struct property *cp; + + if (of_node_disabled(node)) + return NULL; + + cp = of_get_property(node, "compatible", NULL); + if (!cp) + return NULL; + + if (IS_ENABLED(CONFIG_ARM_AMBA) && + of_device_is_compatible(node, "arm,primecell") == 1) + return add_of_amba_device(node); + else + return add_of_platform_device(node); +} EXPORT_SYMBOL(add_of_device); u64 dt_mem_next_cell(int s, const __be32 **cellp) |