*参照元 [#t625f128] #backlinks *説明 [#n98ca22f] -パス: [[linux-4.4.1/drivers/base/platform.c]] -FIXME: これは何? --説明 **引数 [#g47b07eb] -struct platform_device *pdev -- --[[linux-4.4.1/platform_device]] **返り値 [#g27d1a95] -int -- **参考 [#w306863c] *実装 [#w347217d] /** * platform_device_add - add a platform device to device hierarchy * @pdev: platform device we're adding * * This is part 2 of platform_device_register(), though may be called * separately _iff_ pdev was allocated by platform_device_alloc(). */ int platform_device_add(struct platform_device *pdev) { int i, ret; if (!pdev) return -EINVAL; if (!pdev->dev.parent) pdev->dev.parent = &platform_bus; - --[[linux-4.4.1/platform_bus(global)]] pdev->dev.bus = &platform_bus_type; - --[[linux-4.4.1/platform_bus_type(global)]] switch (pdev->id) { default: dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id); break; - --[[linux-4.4.1/dev_set_name()]] case PLATFORM_DEVID_NONE: dev_set_name(&pdev->dev, "%s", pdev->name); break; case PLATFORM_DEVID_AUTO: /* * Automatically allocated device ID. We mark it as such so * that we remember it must be freed, and we append a suffix * to avoid namespace collision with explicit IDs. */ ret = ida_simple_get(&platform_devid_ida, 0, 0, GFP_KERNEL); if (ret < 0) goto err_out; pdev->id = ret; pdev->id_auto = true; dev_set_name(&pdev->dev, "%s.%d.auto", pdev->name, pdev->id); break; - --[[linux-4.4.1/platform_devid_ida(global)]] --[[linux-4.4.1/ida_simple_get()]] } for (i = 0; i < pdev->num_resources; i++) { struct resource *p, *r = &pdev->resource[i]; - --[[linux-4.4.1/resource]] if (r->name == NULL) r->name = dev_name(&pdev->dev); - --[[linux-4.4.1/dev_name()]] p = r->parent; if (!p) { if (resource_type(r) == IORESOURCE_MEM) p = &iomem_resource; else if (resource_type(r) == IORESOURCE_IO) p = &ioport_resource; - --[[linux-4.4.1/resource_type()]] --[[linux-4.4.1/iomem_resource(global)]] --[[linux-4.4.1/ioport_resource(global)]] } if (p && insert_resource(p, r)) { dev_err(&pdev->dev, "failed to claim resource %d\n", i); ret = -EBUSY; goto failed; } - --[[linux-4.4.1/insert_resource()]] --[[linux-4.4.1/dev_err()]] } pr_debug("Registering platform device '%s'. Parent at %s\n", dev_name(&pdev->dev), dev_name(pdev->dev.parent)); - --[[linux-4.4.1/pr_debug()]] ret = device_add(&pdev->dev); if (ret == 0) return ret; - --[[linux-4.4.1/device_add()]] failed: if (pdev->id_auto) { ida_simple_remove(&platform_devid_ida, pdev->id); pdev->id = PLATFORM_DEVID_AUTO; } - --[[linux-4.4.1/ida_simple_remove()]] while (--i >= 0) { struct resource *r = &pdev->resource[i]; if (r->parent) release_resource(r); } - --[[linux-4.4.1/release_resource()]] err_out: return ret; } EXPORT_SYMBOL_GPL(platform_device_add); - --[[linux-4.4.1/EXPORT_SYMBOL_GPL()]] *コメント [#u852a839]