Message ID | 1411779438-23127-8-git-send-email-linux@roeck-us.net (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On Sat, Sep 27, 2014 at 2:57 AM, Guenter Roeck <linux@roeck-us.net> wrote: > Register with kernel restart handler instead of setting arm_pm_restart > directly. > > Cc: Anders Berg <anders.berg@lsi.com> > Signed-off-by: Guenter Roeck <linux@roeck-us.net> > --- > drivers/power/reset/axxia-reset.c | 19 ++++++++++++++----- > 1 file changed, 14 insertions(+), 5 deletions(-) > Works fine. Tested-by: Anders Berg <anders.berg@avagotech.com> /Anders > diff --git a/drivers/power/reset/axxia-reset.c b/drivers/power/reset/axxia-reset.c > index 3b1f8d6..2a772d9 100644 > --- a/drivers/power/reset/axxia-reset.c > +++ b/drivers/power/reset/axxia-reset.c > @@ -19,14 +19,12 @@ > #include <linux/kernel.h> > #include <linux/mfd/syscon.h> > #include <linux/module.h> > +#include <linux/notifier.h> > #include <linux/of.h> > #include <linux/platform_device.h> > #include <linux/reboot.h> > #include <linux/regmap.h> > > -#include <asm/system_misc.h> > - > - > #define SC_CRIT_WRITE_KEY 0x1000 > #define SC_LATCH_ON_RESET 0x1004 > #define SC_RESET_CONTROL 0x1008 > @@ -39,7 +37,8 @@ > > static struct regmap *syscon; > > -static void do_axxia_restart(enum reboot_mode reboot_mode, const char *cmd) > +static int axxia_restart_handler(struct notifier_block *this, > + unsigned long mode, void *cmd) > { > /* Access Key (0xab) */ > regmap_write(syscon, SC_CRIT_WRITE_KEY, 0xab); > @@ -50,11 +49,19 @@ static void do_axxia_restart(enum reboot_mode reboot_mode, const char *cmd) > /* Assert chip reset */ > regmap_update_bits(syscon, SC_RESET_CONTROL, > RSTCTL_RST_CHIP, RSTCTL_RST_CHIP); > + > + return NOTIFY_DONE; > } > > +static struct notifier_block axxia_restart_nb = { > + .notifier_call = axxia_restart_handler, > + .priority = 128, > +}; > + > static int axxia_reset_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > + int err; > > syscon = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon"); > if (IS_ERR(syscon)) { > @@ -62,7 +69,9 @@ static int axxia_reset_probe(struct platform_device *pdev) > return PTR_ERR(syscon); > } > > - arm_pm_restart = do_axxia_restart; > + err = register_restart_handler(&axxia_restart_nb); > + if (err) > + dev_err(dev, "cannot register restart handler (err=%d)\n", err); > > return 0; > } > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/power/reset/axxia-reset.c b/drivers/power/reset/axxia-reset.c index 3b1f8d6..2a772d9 100644 --- a/drivers/power/reset/axxia-reset.c +++ b/drivers/power/reset/axxia-reset.c @@ -19,14 +19,12 @@ #include <linux/kernel.h> #include <linux/mfd/syscon.h> #include <linux/module.h> +#include <linux/notifier.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/reboot.h> #include <linux/regmap.h> -#include <asm/system_misc.h> - - #define SC_CRIT_WRITE_KEY 0x1000 #define SC_LATCH_ON_RESET 0x1004 #define SC_RESET_CONTROL 0x1008 @@ -39,7 +37,8 @@ static struct regmap *syscon; -static void do_axxia_restart(enum reboot_mode reboot_mode, const char *cmd) +static int axxia_restart_handler(struct notifier_block *this, + unsigned long mode, void *cmd) { /* Access Key (0xab) */ regmap_write(syscon, SC_CRIT_WRITE_KEY, 0xab); @@ -50,11 +49,19 @@ static void do_axxia_restart(enum reboot_mode reboot_mode, const char *cmd) /* Assert chip reset */ regmap_update_bits(syscon, SC_RESET_CONTROL, RSTCTL_RST_CHIP, RSTCTL_RST_CHIP); + + return NOTIFY_DONE; } +static struct notifier_block axxia_restart_nb = { + .notifier_call = axxia_restart_handler, + .priority = 128, +}; + static int axxia_reset_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; + int err; syscon = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon"); if (IS_ERR(syscon)) { @@ -62,7 +69,9 @@ static int axxia_reset_probe(struct platform_device *pdev) return PTR_ERR(syscon); } - arm_pm_restart = do_axxia_restart; + err = register_restart_handler(&axxia_restart_nb); + if (err) + dev_err(dev, "cannot register restart handler (err=%d)\n", err); return 0; }
Register with kernel restart handler instead of setting arm_pm_restart directly. Cc: Anders Berg <anders.berg@lsi.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net> --- drivers/power/reset/axxia-reset.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)