Skip to content

Commit

Permalink
drivers: Fix boot problem on SuperH
Browse files Browse the repository at this point in the history
SuperH images crash too eearly to display any console output. Bisect
points to commit 507fd01 ("drivers: move the early platform device
support to arch/sh"). An analysis of that patch suggests that
early_platform_cleanup() is now called at the wrong time. Restoring its
call point fixes the problem.

Cc: Bartosz Golaszewski <brgl@bgdev.pl>
Fixes: 507fd01 ("drivers: move the early platform device support to arch/sh")
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: Rob Landley <rob@landley.net>
Link: https://lore.kernel.org/r/20191203205852.15659-1-linux@roeck-us.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Guenter Roeck authored and Greg Kroah-Hartman committed Dec 10, 2019
1 parent 51ba8b3 commit eecd37e
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 9 deletions.
11 changes: 2 additions & 9 deletions arch/sh/drivers/platform_early.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,9 +325,9 @@ int __init sh_early_platform_driver_probe(char *class_str,
}

/**
* sh_early_platform_cleanup - clean up early platform code
* early_platform_cleanup - clean up early platform code
*/
static int __init sh_early_platform_cleanup(void)
void __init early_platform_cleanup(void)
{
struct platform_device *pd, *pd2;

Expand All @@ -337,11 +337,4 @@ static int __init sh_early_platform_cleanup(void)
list_del(&pd->dev.devres_head);
memset(&pd->dev.devres_head, 0, sizeof(pd->dev.devres_head));
}

return 0;
}
/*
* This must happen once after all early devices are probed but before probing
* real platform devices.
*/
subsys_initcall(sh_early_platform_cleanup);
4 changes: 4 additions & 0 deletions drivers/base/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -1325,10 +1325,14 @@ struct device *platform_find_device_by_driver(struct device *start,
}
EXPORT_SYMBOL_GPL(platform_find_device_by_driver);

void __weak __init early_platform_cleanup(void) { }

int __init platform_bus_init(void)
{
int error;

early_platform_cleanup();

error = device_register(&platform_bus);
if (error) {
put_device(&platform_bus);
Expand Down

0 comments on commit eecd37e

Please sign in to comment.