static int __init eisa_probe()

in eisa-bus.c [309:398]


static int __init eisa_probe(struct eisa_root_device *root)
{
	int i, c;
	struct eisa_device *edev;
	char *enabled_str;

	dev_info(root->dev, "Probing EISA bus %d\n", root->bus_nr);

	/* First try to get hold of slot 0. If there is no device
	 * here, simply fail, unless root->force_probe is set. */

	edev = kzalloc(sizeof(*edev), GFP_KERNEL);
	if (!edev)
		return -ENOMEM;

	if (eisa_request_resources(root, edev, 0)) {
		dev_warn(root->dev,
			 "EISA: Cannot allocate resource for mainboard\n");
		kfree(edev);
		if (!root->force_probe)
			return -EBUSY;
		goto force_probe;
	}

	if (eisa_init_device(root, edev, 0)) {
		eisa_release_resources(edev);
		kfree(edev);
		if (!root->force_probe)
			return -ENODEV;
		goto force_probe;
	}

	dev_info(&edev->dev, "EISA: Mainboard %s detected\n", edev->id.sig);

	if (eisa_register_device(edev)) {
		dev_err(&edev->dev, "EISA: Failed to register %s\n",
			edev->id.sig);
		eisa_release_resources(edev);
		kfree(edev);
	}

 force_probe:

	for (c = 0, i = 1; i <= root->slots; i++) {
		edev = kzalloc(sizeof(*edev), GFP_KERNEL);
		if (!edev) {
			dev_err(root->dev, "EISA: Out of memory for slot %d\n",
				i);
			continue;
		}

		if (eisa_request_resources(root, edev, i)) {
			dev_warn(root->dev,
				 "Cannot allocate resource for EISA slot %d\n",
				 i);
			kfree(edev);
			continue;
		}

		if (eisa_init_device(root, edev, i)) {
			eisa_release_resources(edev);
			kfree(edev);
			continue;
		}

		if (edev->state == (EISA_CONFIG_ENABLED | EISA_CONFIG_FORCED))
			enabled_str = " (forced enabled)";
		else if (edev->state == EISA_CONFIG_FORCED)
			enabled_str = " (forced disabled)";
		else if (edev->state == 0)
			enabled_str = " (disabled)";
		else
			enabled_str = "";

		dev_info(&edev->dev, "EISA: slot %d: %s detected%s\n", i,
			 edev->id.sig, enabled_str);

		c++;

		if (eisa_register_device(edev)) {
			dev_err(&edev->dev, "EISA: Failed to register %s\n",
				edev->id.sig);
			eisa_release_resources(edev);
			kfree(edev);
		}
	}

	dev_info(root->dev, "EISA: Detected %d card%s\n", c, c == 1 ? "" : "s");
	return 0;
}