+/*
+ * Note, we can have multiple files for different busses in here due
+ * to the mess that USB has for its device tree...
+ */
+static struct bus_file {
+ char *bus;
+ char *file;
+} bus_files[] = {
+ { .bus = "scsi", .file = "vendor" },
+ { .bus = "usb", .file = "idVendor" },
+ { .bus = "usb", .file = "iInterface" },
+ { .bus = "usb-serial", .file = "detach_state" },
+ { .bus = "ide", .file = "detach_state" },
+ { .bus = "pci", .file = "vendor" },
+ {}
+};
+
+#define SECONDS_TO_WAIT_FOR_FILE 10
+static void wait_for_device_to_initialize(struct sysfs_device *sysfs_device)
+{
+ /* sleep until we see the file for this specific bus type show up this
+ * is needed because we can easily out-run the kernel in looking for
+ * these files before the paticular subsystem has created them in the
+ * sysfs tree properly.
+ *
+ * And people thought that the /sbin/hotplug event system was going to
+ * be slow, poo on you for arguing that before even testing it...
+ */
+ struct bus_file *b = &bus_files[0];
+ struct sysfs_attribute *tmpattr;
+ int found = 0;
+ int loop = SECONDS_TO_WAIT_FOR_FILE;
+
+ while (1) {
+ if (b->bus == NULL) {
+ if (!found)
+ break;
+ /* sleep to give the kernel a chance to create the file */
+ sleep(1);
+ --loop;
+ if (loop == 0)
+ break;
+ b = &bus_files[0];
+ }
+ if (strcmp(sysfs_device->bus, b->bus) == 0) {
+ found = 1;
+ dbg("looking for file '%s' on bus '%s'", b->file, b->bus);
+ tmpattr = sysfs_get_device_attr(sysfs_device, b->file);
+ if (tmpattr) {
+ /* found it! */
+ goto exit;
+ }
+ dbg("can't find '%s' file", b->file);
+ }
+ ++b;
+ }
+ if (!found)
+ dbg("did not find bus type '%s' on list of bus_id_files, "
+ "contact greg@kroah.com", sysfs_device->bus);
+exit:
+ return; /* here to prevent compiler warning... */
+}
+
+static void fix_kernel_name(struct udevice *udev)
+{
+ char *temp = udev->kernel_name;
+
+ while (*temp != 0x00) {
+ /* Some block devices have a ! in their name,
+ * we need to change that to / */
+ if (*temp == '!')
+ *temp = '/';
+ ++temp;
+ }
+}