Commit c61529f6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull driver core fixes from Greg KH:
 "Here are a number of small driver core fixes for 5.7-rc5 to resolve a
  bunch of reported issues with the current tree.

  Biggest here are the reverts and patches from John Stultz to resolve a
  bunch of deferred probe regressions we have been seeing in 5.7-rc
  right now.

  Along with those are some other smaller fixes:

   - coredump crash fix

   - devlink fix for when permissive mode was enabled

   - amba and platform device dma_parms fixes

   - component error silenced for when deferred probe happens

  All of these have been in linux-next for a while with no reported
  issues"

* tag 'driver-core-5.7-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core:
  regulator: Revert "Use driver_deferred_probe_timeout for regulator_init_complete_work"
  driver core: Ensure wait_for_device_probe() waits until the deferred_probe_timeout fires
  driver core: Use dev_warn() instead of dev_WARN() for deferred_probe_timeout warnings
  driver core: Revert default driver_deferred_probe_timeout value to 0
  component: Silence bind error on -EPROBE_DEFER
  driver core: Fix handling of fw_devlink=permissive
  coredump: fix crash when umh is disabled
  amba: Initialize dma_parms for amba devices
  driver core: platform: Initialize dma_parms for platform devices
parents e7a1c733 2a15483b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -645,6 +645,7 @@ static void amba_device_initialize(struct amba_device *dev, const char *name)
	dev->dev.release = amba_device_release;
	dev->dev.bus = &amba_bustype;
	dev->dev.dma_mask = &dev->dev.coherent_dma_mask;
	dev->dev.dma_parms = &dev->dma_parms;
	dev->res.name = dev_name(&dev->dev);
}

+5 −3
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ static int try_to_bring_up_master(struct master *master,
	ret = master->ops->bind(master->dev);
	if (ret < 0) {
		devres_release_group(master->dev, NULL);
		if (ret != -EPROBE_DEFER)
			dev_info(master->dev, "master bind failed: %d\n", ret);
		return ret;
	}
@@ -611,6 +612,7 @@ static int component_bind(struct component *component, struct master *master,
		devres_release_group(component->dev, NULL);
		devres_release_group(master->dev, NULL);

		if (ret != -EPROBE_DEFER)
			dev_err(master->dev, "failed to bind %s (ops %ps): %d\n",
				dev_name(component->dev), component->ops, ret);
	}
+6 −1
Original line number Diff line number Diff line
@@ -2370,6 +2370,11 @@ u32 fw_devlink_get_flags(void)
	return fw_devlink_flags;
}

static bool fw_devlink_is_permissive(void)
{
	return fw_devlink_flags == DL_FLAG_SYNC_STATE_ONLY;
}

/**
 * device_add - add device to device hierarchy.
 * @dev: device.
@@ -2524,7 +2529,7 @@ int device_add(struct 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)
		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);
+8 −12
Original line number Diff line number Diff line
@@ -224,17 +224,9 @@ static int deferred_devs_show(struct seq_file *s, void *data)
}
DEFINE_SHOW_ATTRIBUTE(deferred_devs);

#ifdef CONFIG_MODULES
/*
 * In the case of modules, set the default probe timeout to
 * 30 seconds to give userland some time to load needed modules
 */
int driver_deferred_probe_timeout = 30;
#else
/* In the case of !modules, no probe timeout needed */
int driver_deferred_probe_timeout = -1;
#endif
int driver_deferred_probe_timeout;
EXPORT_SYMBOL_GPL(driver_deferred_probe_timeout);
static DECLARE_WAIT_QUEUE_HEAD(probe_timeout_waitqueue);

static int __init deferred_probe_timeout_setup(char *str)
{
@@ -266,8 +258,8 @@ int driver_deferred_probe_check_state(struct device *dev)
		return -ENODEV;
	}

	if (!driver_deferred_probe_timeout) {
		dev_WARN(dev, "deferred probe timeout, ignoring dependency");
	if (!driver_deferred_probe_timeout && initcalls_done) {
		dev_warn(dev, "deferred probe timeout, ignoring dependency");
		return -ETIMEDOUT;
	}

@@ -284,6 +276,7 @@ static void deferred_probe_timeout_work_func(struct work_struct *work)

	list_for_each_entry_safe(private, p, &deferred_probe_pending_list, deferred_probe)
		dev_info(private->device, "deferred probe pending");
	wake_up(&probe_timeout_waitqueue);
}
static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func);

@@ -658,6 +651,9 @@ int driver_probe_done(void)
 */
void wait_for_device_probe(void)
{
	/* wait for probe timeout */
	wait_event(probe_timeout_waitqueue, !driver_deferred_probe_timeout);

	/* wait for the deferred probe workqueue to finish */
	flush_work(&deferred_probe_work);

+2 −0
Original line number Diff line number Diff line
@@ -380,6 +380,8 @@ struct platform_object {
 */
static void setup_pdev_dma_masks(struct platform_device *pdev)
{
	pdev->dev.dma_parms = &pdev->dma_parms;

	if (!pdev->dev.coherent_dma_mask)
		pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
	if (!pdev->dev.dma_mask) {
Loading