Skip to content

Commit

Permalink
driver core: Allow fwnode_operations.add_links to differentiate errors
Browse files Browse the repository at this point in the history
When add_links() still has suppliers that it needs to link to in the
future, this patch allows it to differentiate between suppliers that are
needed for probing vs suppliers that are needed for sync_state()
correctness.

Signed-off-by: Saravana Kannan <saravanak@google.com>
Link: https://lore.kernel.org/r/20191028220027.251605-4-saravanak@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Saravana Kannan authored and Greg Kroah-Hartman committed Nov 2, 2019
1 parent bcbbcfd commit 0332450
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 8 deletions.
12 changes: 8 additions & 4 deletions drivers/base/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2297,7 +2297,7 @@ int device_add(struct device *dev)
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);
Expand Down Expand Up @@ -2413,9 +2413,13 @@ int device_add(struct 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)
Expand Down
13 changes: 9 additions & 4 deletions include/linux/fwnode.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,15 @@ struct fwnode_reference_args {
* 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);
Expand Down

0 comments on commit 0332450

Please sign in to comment.