summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2014-09-30 13:48:34 -0400
committerSebastian Reichel <sre@kernel.org>2014-11-16 21:07:10 -0500
commitf59a42d4e177564b9892112af7a4e73d0c91f9b4 (patch)
treea89118ebc730e4a4b053d2de76dee1a563eefa18
parentfcf01c51f0f5565a184638b7d055e590aad6c0f8 (diff)
power/reset: keystone: Register with kernel restart handler
Register with kernel restart handler instead of setting arm_pm_restart directly. Move notifier registration to the end of the probe function to avoid having to implement error handling. Cc: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> Cc: Santosh Shilimkar <santosh.shilimkar@ti.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Tested-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r--drivers/power/reset/keystone-reset.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/power/reset/keystone-reset.c b/drivers/power/reset/keystone-reset.c
index 408a18fd91cb..4b6b12e74477 100644
--- a/drivers/power/reset/keystone-reset.c
+++ b/drivers/power/reset/keystone-reset.c
@@ -12,9 +12,9 @@
12 12
13#include <linux/io.h> 13#include <linux/io.h>
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/notifier.h>
15#include <linux/reboot.h> 16#include <linux/reboot.h>
16#include <linux/regmap.h> 17#include <linux/regmap.h>
17#include <asm/system_misc.h>
18#include <linux/mfd/syscon.h> 18#include <linux/mfd/syscon.h>
19#include <linux/of_platform.h> 19#include <linux/of_platform.h>
20 20
@@ -52,7 +52,8 @@ static inline int rsctrl_enable_rspll_write(void)
52 RSCTRL_KEY_MASK, RSCTRL_KEY); 52 RSCTRL_KEY_MASK, RSCTRL_KEY);
53} 53}
54 54
55static void rsctrl_restart(enum reboot_mode mode, const char *cmd) 55static int rsctrl_restart_handler(struct notifier_block *this,
56 unsigned long mode, void *cmd)
56{ 57{
57 /* enable write access to RSTCTRL */ 58 /* enable write access to RSTCTRL */
58 rsctrl_enable_rspll_write(); 59 rsctrl_enable_rspll_write();
@@ -60,8 +61,15 @@ static void rsctrl_restart(enum reboot_mode mode, const char *cmd)
60 /* reset the SOC */ 61 /* reset the SOC */
61 regmap_update_bits(pllctrl_regs, rspll_offset + RSCTRL_RG, 62 regmap_update_bits(pllctrl_regs, rspll_offset + RSCTRL_RG,
62 RSCTRL_RESET_MASK, 0); 63 RSCTRL_RESET_MASK, 0);
64
65 return NOTIFY_DONE;
63} 66}
64 67
68static struct notifier_block rsctrl_restart_nb = {
69 .notifier_call = rsctrl_restart_handler,
70 .priority = 128,
71};
72
65static struct of_device_id rsctrl_of_match[] = { 73static struct of_device_id rsctrl_of_match[] = {
66 {.compatible = "ti,keystone-reset", }, 74 {.compatible = "ti,keystone-reset", },
67 {}, 75 {},
@@ -114,8 +122,6 @@ static int rsctrl_probe(struct platform_device *pdev)
114 if (ret) 122 if (ret)
115 return ret; 123 return ret;
116 124
117 arm_pm_restart = rsctrl_restart;
118
119 /* disable a reset isolation for all module clocks */ 125 /* disable a reset isolation for all module clocks */
120 ret = regmap_write(pllctrl_regs, rspll_offset + RSISO_RG, 0); 126 ret = regmap_write(pllctrl_regs, rspll_offset + RSISO_RG, 0);
121 if (ret) 127 if (ret)
@@ -147,7 +153,11 @@ static int rsctrl_probe(struct platform_device *pdev)
147 return ret; 153 return ret;
148 } 154 }
149 155
150 return 0; 156 ret = register_restart_handler(&rsctrl_restart_nb);
157 if (ret)
158 dev_err(dev, "cannot register restart handler (err=%d)\n", ret);
159
160 return ret;
151} 161}
152 162
153static struct platform_driver rsctrl_driver = { 163static struct platform_driver rsctrl_driver = {