- struct sysfs_device *sysfs_device;
- struct sysfs_class_device *class_dev_parent;
- struct timespec tspec;
- int loop;
-
- /* Figure out where the device symlink is at. For char devices this will
- * always be in the class_dev->path. But for block devices, it's different.
- * The main block device will have the device symlink in it's path, but
- * all partitions have the symlink in its parent directory.
- * But we need to watch out for block devices that do not have parents, yet
- * look like a partition (fd0, loop0, etc.) They all do not have a device
- * symlink yet. We do sit and spin on waiting for them right now, we should
- * possibly have a whitelist for these devices here...
- */
- class_dev_parent = sysfs_get_classdev_parent(class_dev);
- if (class_dev_parent)
- dbg("Really a partition");
-
- tspec.tv_sec = 0;
- tspec.tv_nsec = 10000000; /* sleep 10 millisec */
- loop = 10;
- while (loop--) {
- nanosleep(&tspec, NULL);
- if (class_dev_parent)
- sysfs_device = sysfs_get_classdev_device(class_dev_parent);
- else
- sysfs_device = sysfs_get_classdev_device(class_dev);
-
- if (sysfs_device != NULL)
- goto device_found;
- }
- dbg("Timed out waiting for device symlink, continuing on anyway...");
-
-device_found:
- /* We have another issue with just the wait above - the sysfs part of
- * the kernel may not be quick enough to have created the link to the
- * device under the "bus" subsystem. Due to this, the sysfs_device->bus
- * will not contain the actual bus name :(
- *
- * Libsysfs now provides a new API sysfs_get_device_bus(), so use it
- * if needed
- */
- if (sysfs_device) {
-
- if (sysfs_device->bus[0] != '\0')
- goto bus_found;
-
- loop = 10;
- tspec.tv_nsec = 10000000;
- while (loop--) {
- nanosleep(&tspec, NULL);
- sysfs_get_device_bus(sysfs_device);
-
- if (sysfs_device->bus[0] != '\0')
- goto bus_found;
- }
- dbg("Timed out waiting to find the device bus, continuing on anyway\n");
- goto exit;
-bus_found:
- dbg("Device %s is registered with bus %s\n",
- sysfs_device->name, sysfs_device->bus);
- }
-exit:
- return sysfs_device;
-}
-
-int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *udev)
-{
- struct sysfs_device *sysfs_device = NULL;
- struct config_device *dev;
- struct perm_device *perm;
- char *pos;
-
- udev->mode = 0;
-
- /* find the sysfs_device associated with this class device */
- sysfs_device = get_sysfs_device(class_dev);
- if (sysfs_device) {
- dbg("sysfs_device->path='%s'", sysfs_device->path);
- dbg("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
- dbg("sysfs_device->bus='%s'", sysfs_device->bus);
- strfieldcpy(udev->bus_id, sysfs_device->bus_id);
- wait_for_device_to_initialize(sysfs_device);
- } else {
- dbg("class_dev->name = '%s'", class_dev->name);
- }
-
- strfieldcpy(udev->kernel_name, class_dev->name);
-
- /* get kernel number */
- pos = class_dev->name + strlen(class_dev->name);
- while (isdigit(*(pos-1)))
- pos--;
- strfieldcpy(udev->kernel_number, pos);
- dbg("kernel_number='%s'", udev->kernel_number);
-
- /* look for a matching rule to apply */
- list_for_each_entry(dev, &config_device_list, node) {
- dbg("process rule");
-