Commit 5f5377ea authored by Saravana Kannan's avatar Saravana Kannan Committed by Greg Kroah-Hartman

driver core: Look for waiting consumers only for a fwnode's primary device

Commit 4dbe191c ("driver core: Add device links from fwnode only for
the primary device") skipped linking a fwnode's secondary device to
the suppliers listed in its fwnode.

However, a fwnode's secondary device can't be found using
get_dev_from_fwnode(). So, there's no point in trying to see if devices
waiting for suppliers might want to link to a fwnode's secondary device.

This commit removes that unnecessary step for devices that aren't a
fwnode's primary device and also moves the code to a more appropriate
part of the file.
Signed-off-by: default avatarSaravana Kannan <saravanak@google.com>
Link: https://lore.kernel.org/r/20200515053500.215929-3-saravanak@google.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 42926ac3
...@@ -1173,6 +1173,21 @@ static bool fw_devlink_is_permissive(void) ...@@ -1173,6 +1173,21 @@ static bool fw_devlink_is_permissive(void)
return fw_devlink_flags == DL_FLAG_SYNC_STATE_ONLY; return fw_devlink_flags == DL_FLAG_SYNC_STATE_ONLY;
} }
static void fw_devlink_link_device(struct device *dev)
{
int fw_ret;
device_link_add_missing_supplier_links();
if (fw_devlink_flags && fwnode_has_op(dev->fwnode, add_links)) {
fw_ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
if (fw_ret == -ENODEV && !fw_devlink_is_permissive())
device_link_wait_for_mandatory_supplier(dev);
else if (fw_ret)
device_link_wait_for_optional_supplier(dev);
}
}
/* Device links support end. */ /* Device links support end. */
int (*platform_notify)(struct device *dev) = NULL; int (*platform_notify)(struct device *dev) = NULL;
...@@ -2407,7 +2422,7 @@ int device_add(struct device *dev) ...@@ -2407,7 +2422,7 @@ int device_add(struct device *dev)
struct device *parent; struct device *parent;
struct kobject *kobj; struct kobject *kobj;
struct class_interface *class_intf; struct class_interface *class_intf;
int error = -EINVAL, fw_ret; int error = -EINVAL;
struct kobject *glue_dir = NULL; struct kobject *glue_dir = NULL;
bool is_fwnode_dev = false; bool is_fwnode_dev = false;
...@@ -2524,16 +2539,8 @@ int device_add(struct device *dev) ...@@ -2524,16 +2539,8 @@ int device_add(struct device *dev)
* waiting consumers can link to it before the driver is bound to the * waiting consumers can link to it before the driver is bound to the
* device and the driver sync_state callback is called for this device. * device and the driver sync_state callback is called for this device.
*/ */
device_link_add_missing_supplier_links(); if (is_fwnode_dev)
fw_devlink_link_device(dev);
if (fw_devlink_flags && is_fwnode_dev &&
fwnode_has_op(dev->fwnode, add_links)) {
fw_ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
if (fw_ret == -ENODEV && !fw_devlink_is_permissive())
device_link_wait_for_mandatory_supplier(dev);
else if (fw_ret)
device_link_wait_for_optional_supplier(dev);
}
bus_probe_device(dev); bus_probe_device(dev);
if (parent) if (parent)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment