Linux网络驱动之Fixed-Link(28)
接前一篇文章:Linux网络驱动之Fixed-Link(27)三、深入了解上一回继续解析platform_device_add函数,没有讲完,本回继续往下讲解。为了便于理解和回顾,再次贴出其源码,在drivers/base/platform.c中,如下:/** * 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) { u32 i; int ret; if (!pdev) return -EINVAL; if (!pdev-dev.parent) pdev-dev.parent = platform_bus; pdev-dev.bus = platform_bus_type; switch (pdev-id) { default: dev_set_name(pdev-dev, "%s.%d", pdev-name, pdev-id); break; 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_alloc(platform_devid_ida, 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; } for (i = 0; i pdev-num_resources; i++) { struct resource *p, *r = pdev-resource[i]; if (r-name == NULL) r-name = dev_name(pdev-dev); p = r-parent; if (!p) { if (resource_type(r) == IORESOURCE_MEM) p = iomem_resource; else if (resource_type(r) == IORESOURCE_IO) p = ioport_resource; } if (p) { ret = insert_resource(p, r); if (ret) { dev_err(pdev-dev, "failed to claim resource %d: %pR\n", i, r); goto failed; } } } pr_debug("Registering platform device '%s'. Parent a