mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-19 20:34:20 +08:00
amba: Retry adding deferred devices at late_initcall
If amba bus devices defer when adding, the amba bus code simply retries adding the devices every 5 seconds. This doesn't work well as it completely unsynchronized with starting the init process which can happen in less than 5 secs. Add a retry during late_initcall. If the amba devices are added, then deferred probe takes over. If the dependencies have not probed at this point, then there's no improvement over previous behavior. To completely solve this, we'd need to retry after every successful probe as deferred probe does. The list_empty() check now happens outside the mutex, but the mutex wasn't necessary in the first place. This needed to use deferred probe instead of fragile initcall ordering on 32-bit VExpress systems where the apb_pclk has a number of probe dependencies (vexpress-sysregs, vexpress-config). Cc: John Stultz <john.stultz@linaro.org> Cc: Saravana Kannan <saravanak@google.com> Cc: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> Cc: Geert Uytterhoeven <geert+renesas@glider.be> Cc: Russell King <linux@armlinux.org.uk> Tested-by: Sudeep Holla <sudeep.holla@arm.com> Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
6aec54a649
commit
039599c92d
@ -505,7 +505,7 @@ static DECLARE_DELAYED_WORK(deferred_retry_work, amba_deferred_retry_func);
|
||||
|
||||
#define DEFERRED_DEVICE_TIMEOUT (msecs_to_jiffies(5 * 1000))
|
||||
|
||||
static void amba_deferred_retry_func(struct work_struct *dummy)
|
||||
static int amba_deferred_retry(void)
|
||||
{
|
||||
struct deferred_device *ddev, *tmp;
|
||||
|
||||
@ -521,11 +521,19 @@ static void amba_deferred_retry_func(struct work_struct *dummy)
|
||||
kfree(ddev);
|
||||
}
|
||||
|
||||
mutex_unlock(&deferred_devices_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall(amba_deferred_retry);
|
||||
|
||||
static void amba_deferred_retry_func(struct work_struct *dummy)
|
||||
{
|
||||
amba_deferred_retry();
|
||||
|
||||
if (!list_empty(&deferred_devices))
|
||||
schedule_delayed_work(&deferred_retry_work,
|
||||
DEFERRED_DEVICE_TIMEOUT);
|
||||
|
||||
mutex_unlock(&deferred_devices_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user