From: Feng Kan Date: Thu, 2 Oct 2014 18:24:15 +0000 (-0700) Subject: power: reset: corrections for simple syscon reboot driver X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=afaebbdbd48ada5ead707d6a90ce4b604e1d77d4;p=linux-beck.git power: reset: corrections for simple syscon reboot driver This patch is to fix some bugs in reboot driver. Which includes auto selection of the MFD_SYSCON for the driver, use of container to locate restart handler, correction of the count down failure timer and ordering of the header file. Signed-off-by: Feng Kan Reviewed-by: Guenter Roeck [ sre: return err instead of 0 in syscon_reboot_probe() ] Signed-off-by: Sebastian Reichel --- diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig index addb26afae5a..3b451e162a98 100644 --- a/drivers/power/reset/Kconfig +++ b/drivers/power/reset/Kconfig @@ -120,6 +120,7 @@ config POWER_RESET_KEYSTONE config POWER_RESET_SYSCON bool "Generic SYSCON regmap reset driver" - depends on POWER_RESET && MFD_SYSCON && OF + depends on POWER_RESET && OF + select MFD_SYSCON help Reboot support for generic SYSCON mapped register reset. diff --git a/drivers/power/reset/syscon-reboot.c b/drivers/power/reset/syscon-reboot.c index 948e0ee32a4d..815b901822cf 100644 --- a/drivers/power/reset/syscon-reboot.c +++ b/drivers/power/reset/syscon-reboot.c @@ -14,14 +14,15 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ +#include #include -#include -#include -#include #include #include -#include +#include +#include +#include #include +#include struct syscon_reboot_context { struct regmap *map; @@ -30,21 +31,17 @@ struct syscon_reboot_context { struct notifier_block restart_handler; }; -static struct syscon_reboot_context *syscon_reboot_ctx; - static int syscon_restart_handle(struct notifier_block *this, unsigned long mode, void *cmd) { - struct syscon_reboot_context *ctx = syscon_reboot_ctx; - unsigned long timeout; + struct syscon_reboot_context *ctx = + container_of(this, struct syscon_reboot_context, + restart_handler); /* Issue the reboot */ - if (ctx->map) - regmap_write(ctx->map, ctx->offset, ctx->mask); + regmap_write(ctx->map, ctx->offset, ctx->mask); - timeout = jiffies + HZ; - while (time_before(jiffies, timeout)) - cpu_relax(); + mdelay(1000); pr_emerg("Unable to restart system\n"); return NOTIFY_DONE; @@ -76,9 +73,7 @@ static int syscon_reboot_probe(struct platform_device *pdev) if (err) dev_err(dev, "can't register restart notifier (err=%d)\n", err); - syscon_reboot_ctx = ctx; - - return 0; + return err; } static struct of_device_id syscon_reboot_of_match[] = {