Skip to content

Commit

Permalink
power: reset: corrections for simple syscon reboot driver
Browse files Browse the repository at this point in the history
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 <fkan@apm.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
[ sre: return err instead of 0 in syscon_reboot_probe() ]
Signed-off-by: Sebastian Reichel <sre@kernel.org>
  • Loading branch information
Feng Kan authored and Sebastian Reichel committed Oct 3, 2014
1 parent a7ba749 commit afaebbd
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 17 deletions.
3 changes: 2 additions & 1 deletion drivers/power/reset/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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.
27 changes: 11 additions & 16 deletions drivers/power/reset/syscon-reboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/of_device.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/notifier.h>
#include <linux/mfd/syscon.h>
#include <linux/regmap.h>
#include <linux/of_address.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/reboot.h>
#include <linux/regmap.h>

struct syscon_reboot_context {
struct regmap *map;
Expand All @@ -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;
Expand Down Expand Up @@ -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[] = {
Expand Down

0 comments on commit afaebbd

Please sign in to comment.