struct device *parent;
struct kobject *kobj;
struct class_interface *class_intf;
- int error = -EINVAL;
+ int error = -EINVAL, fw_ret;
struct kobject *glue_dir = NULL;
dev = get_device(dev);
*/
device_link_add_missing_supplier_links();
- if (fwnode_has_op(dev->fwnode, add_links)
- && fwnode_call_int_op(dev->fwnode, add_links, dev))
- device_link_wait_for_mandatory_supplier(dev, true);
+ if (fwnode_has_op(dev->fwnode, add_links)) {
+ fw_ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
+ if (fw_ret == -ENODEV)
+ device_link_wait_for_mandatory_supplier(dev);
+ else if (fw_ret)
+ device_link_wait_for_optional_supplier(dev);
+ }
bus_probe_device(dev);
if (parent)
* available suppliers.
*
* Return 0 if device links have been successfully created to all
- * the suppliers of this device or if the supplier information is
- * not known. Return an error if and only if the supplier
- * information is known but some of the suppliers are not yet
- * available to create device links to.
+ * the suppliers this device needs to create device links to or if
+ * the supplier information is not known.
+ *
+ * Return -ENODEV if and only if the suppliers needed for probing
+ * the device are not yet available to create device links to.
+ *
+ * Return -EAGAIN if there are suppliers that need to be linked to
+ * that are not yet available but none of those suppliers are
+ * necessary for probing this device.
*/
struct fwnode_operations {
struct fwnode_handle *(*get)(struct fwnode_handle *fwnode);