diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 28332ecce..ac6aff4aa 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -7,9 +7,6 @@ config ARM select HAVE_IMAGE_COMPRESSION default y -config ARM_AMBA - bool - config ARM_LINUX bool default y diff --git a/drivers/Kconfig b/drivers/Kconfig index 988ec9ee0..dac22de98 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 000000000..d1cba6a9b --- /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 d1ab53ca7..dcb52bf73 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 eaaeaf4f4..1f32bfbc4 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -26,6 +26,7 @@ #include #include #include +#include /** * 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 amba_device *dev; + char *name, *at; + + dev = xzalloc(sizeof(*dev)); + + 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; - const struct property *cp; - - if (of_node_disabled(node)) - return NULL; - - cp = of_get_property(node, "compatible", NULL); - if (!cp) - return NULL; 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)