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 = amba_device_alloc(NULL, 0, 0); if (!dev) { pr_err("%s(): amba_device_alloc() failed for %s\n", __func__, node->full_name); 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); /* 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) { pr_err("%s(): of_address_to_resource() failed (%d) for %s\n", __func__, ret, node->full_name); goto err_free; } ret = amba_device_add(dev, &iomem_resource); if (ret) { pr_err("%s(): amba_device_add() failed (%d) for %s\n", __func__, ret, node->full_name); goto err_free; } return dev; err_free: amba_device_put(dev); return NULL; }
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 = amba_device_alloc(NULL, 0, 0); if (!dev) return NULL; 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); dev->dma_mask = ~0; prop = of_get_property(node, "arm,primecell-periphid", NULL); if (prop) dev->periphid = of_read_ulong(prop, 1); 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_add(dev, &iomem_resource); if (ret) goto err_free; return dev; err_free: amba_device_put(dev); return NULL; }
/** * of_device_alloc - Allocate and initialize an of_device * @np: device node to assign to device * @bus_id: Name to assign to the device. May be null to use default name. * @parent: Parent device. */ struct platform_device *of_device_alloc(struct device_node *np, const char *bus_id, struct device *parent) { struct platform_device *dev; int rc, i, num_reg = 0, num_irq; struct resource *res, temp_res; dev = platform_device_alloc("", -1); if (!dev) return NULL; /* count the io and irq resources */ if (of_can_translate_address(np)) while (of_address_to_resource(np, num_reg, &temp_res) == 0) num_reg++; num_irq = of_irq_count(np); /* Populate the resource table */ if (num_irq || num_reg) { res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL); if (!res) { platform_device_put(dev); return NULL; } dev->num_resources = num_reg + num_irq; dev->resource = res; for (i = 0; i < num_reg; i++, res++) { rc = of_address_to_resource(np, i, res); WARN_ON(rc); } WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); } dev->dev.of_node = of_node_get(np); #if defined(CONFIG_MICROBLAZE) dev->dev.dma_mask = &dev->archdata.dma_mask; #endif dev->dev.parent = parent; if (bus_id) dev_set_name(&dev->dev, "%s", bus_id); else of_device_make_bus_id(&dev->dev); return dev; }
/** * of_device_alloc - Allocate and initialize an of_device * @np: device node to assign to device * @bus_id: Name to assign to the device. May be null to use default name. * @parent: Parent device. */ struct platform_device *of_device_alloc(struct device_node *np, const char *bus_id, struct device *parent) { struct platform_device *dev; int rc, i, num_reg = 0, num_irq; struct resource *res, temp_res; dev = platform_device_alloc("", -1); if (!dev) return NULL; /* count the io and irq resources */ while (of_address_to_resource(np, num_reg, &temp_res) == 0) num_reg++; num_irq = of_irq_count(np); /* Populate the resource table */ if (num_irq || num_reg) { res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL); if (!res) { platform_device_put(dev); return NULL; } dev->num_resources = num_reg + num_irq; dev->resource = res; for (i = 0; i < num_reg; i++, res++) { rc = of_address_to_resource(np, i, res); WARN_ON(rc); } if (of_irq_to_resource_table(np, res, num_irq) != num_irq) pr_debug("not all legacy IRQ resources mapped for %s\n", np->name); } dev->dev.of_node = of_node_get(np); dev->dev.fwnode = &np->fwnode; dev->dev.parent = parent ? : &platform_bus; if (bus_id) dev_set_name(&dev->dev, "%s", bus_id); else of_device_make_bus_id(&dev->dev); return dev; }
static struct device_d *of_amba_device_create(struct device_node *np) { struct amba_device *dev; int ret; debug("Creating amba device %s\n", np->full_name); if (!of_device_is_available(np)) return NULL; dev = xzalloc(sizeof(*dev)); /* setup generic device info */ dev->dev.id = DEVICE_ID_SINGLE; dev->dev.device_node = np; of_device_make_bus_id(&dev->dev); ret = of_address_to_resource(np, 0, &dev->res); if (ret) goto amba_err_free; dev->dev.resource = &dev->res; dev->dev.num_resources = 1; /* Allow the HW Peripheral ID to be overridden */ of_property_read_u32(np, "arm,primecell-periphid", &dev->periphid); debug("register device 0x%08x\n", dev->dev.resource[0].start); ret = amba_device_add(dev); if (ret) goto amba_err_free; return &dev->dev; amba_err_free: free(dev); return NULL; }
struct of_device *of_device_alloc(struct device_node *np, const char *bus_id, struct device *parent) { struct of_device *dev; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) return NULL; dev->dev.of_node = of_node_get(np); dev->dev.dma_mask = &dev->archdata.dma_mask; dev->dev.parent = parent; dev->dev.release = of_release_dev; if (bus_id) dev_set_name(&dev->dev, "%s", bus_id); else of_device_make_bus_id(dev); return dev; }
struct of_device *of_device_alloc(struct device_node *np, const char *bus_id, struct device *parent) { struct of_device *dev; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) return NULL; dev->node = of_node_get(np); dev->dev.dma_mask = &dev->dma_mask; dev->dev.parent = parent; dev->dev.release = of_release_dev; dev->dev.archdata.of_node = np; if (bus_id) strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE); else of_device_make_bus_id(dev); return dev; }
/** * of_platform_device_create - Alloc, initialize and register an of_device * @np: pointer to node to create device for * @parent: device model parent device. * * Returns pointer to created platform device, or NULL if a device was not * registered. Unavailable devices will not get registered. */ static struct device_d *of_platform_device_create(struct device_node *np, struct device_d *parent) { struct device_d *dev; struct resource *res = NULL, temp_res; int i, j, ret, num_reg = 0, match; if (!of_device_is_available(np)) return NULL; /* count the io resources */ if (of_can_translate_address(np)) while (of_address_to_resource(np, num_reg, &temp_res) == 0) num_reg++; /* Populate the resource table */ if (num_reg) { res = xzalloc(sizeof(*res) * num_reg); for (i = 0; i < num_reg; i++) { ret = of_address_to_resource(np, i, &res[i]); if (ret) { free(res); return NULL; } } /* * A device may already be registered as platform_device. * Instead of registering the same device again, just * add this node to the existing device. */ for_each_device(dev) { if (!dev->resource) continue; for (i = 0, match = 0; i < num_reg; i++) for (j = 0; j < dev->num_resources; j++) if (dev->resource[j].start == res[i].start && dev->resource[j].end == res[i].end) { match++; break; } /* check if all address resources match */ if (match == num_reg) { debug("connecting %s to %s\n", np->name, dev_name(dev)); dev->device_node = np; free(res); return dev; } } } /* setup generic device info */ dev = xzalloc(sizeof(*dev)); dev->id = DEVICE_ID_SINGLE; dev->device_node = np; dev->parent = parent; dev->resource = res; dev->num_resources = num_reg; of_device_make_bus_id(dev); debug("%s: register device %s, io=" PRINTF_CONVERSION_RESOURCE "\n", __func__, dev_name(dev), (num_reg) ? dev->resource[0].start : (-1)); ret = platform_device_register(dev); if (!ret) return dev; free(dev); if (num_reg) free(res); return NULL; }