diff options
Diffstat (limited to 'drivers/watchdog/stpmic1_wdt.c')
-rw-r--r-- | drivers/watchdog/stpmic1_wdt.c | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/drivers/watchdog/stpmic1_wdt.c b/drivers/watchdog/stpmic1_wdt.c index 9b7a586387..4a0519690a 100644 --- a/drivers/watchdog/stpmic1_wdt.c +++ b/drivers/watchdog/stpmic1_wdt.c @@ -11,25 +11,19 @@ #include <linux/iopoll.h> #include <poweroff.h> #include <mfd/syscon.h> +#include <linux/regmap.h> #include <restart.h> #include <reset_source.h> -#define RESTART_SR 0x05 -#define MAIN_CR 0x10 -#define WCHDG_CR 0x1B -#define WCHDG_TIMER_CR 0x1C +#include <linux/mfd/stpmic1.h> -/* Restart Status Register (RESTART_SR) */ +/* Restart Status Register (RREQ_STATE_SR) */ #define R_RST BIT(0) #define R_SWOFF BIT(1) #define R_WDG BIT(2) #define R_PKEYLKP BIT(3) #define R_VINOK_FA BIT(4) -/* Main PMIC Control Register (MAIN_CR) */ -#define SWOFF BIT(0) -#define RREQ_EN BIT(1) - /* Watchdog Control Register (WCHDG_CR) */ #define WDT_START BIT(0) #define WDT_PING BIT(1) @@ -106,8 +100,9 @@ static void __noreturn stpmic1_restart_handler(struct restart_handler *rst) { struct stpmic1_wdt *wdt = container_of(rst, struct stpmic1_wdt, restart); - regmap_write_bits(wdt->regmap, MAIN_CR, - SWOFF | RREQ_EN, SWOFF | RREQ_EN); + regmap_write_bits(wdt->regmap, SWOFF_PWRCTRL_CR, + SOFTWARE_SWITCH_OFF_ENABLED | RESTART_REQUEST_ENABLED, + SOFTWARE_SWITCH_OFF_ENABLED | RESTART_REQUEST_ENABLED); mdelay(1000); hang(); @@ -119,8 +114,9 @@ static void __noreturn stpmic1_poweroff(struct poweroff_handler *handler) shutdown_barebox(); - regmap_write_bits(wdt->regmap, MAIN_CR, - SWOFF | RREQ_EN, SWOFF); + regmap_write_bits(wdt->regmap, SWOFF_PWRCTRL_CR, + SOFTWARE_SWITCH_OFF_ENABLED | RESTART_REQUEST_ENABLED, + SOFTWARE_SWITCH_OFF_ENABLED); mdelay(1000); hang(); @@ -142,7 +138,7 @@ static int stpmic1_set_reset_reason(struct regmap *map) int ret; int i, instance = 0; - ret = regmap_read(map, RESTART_SR, ®); + ret = regmap_read(map, RREQ_STATE_SR, ®); if (ret) return ret; @@ -156,13 +152,13 @@ static int stpmic1_set_reset_reason(struct regmap *map) reset_source_set_prinst(type, 400, instance); - pr_info("STPMIC1 reset reason %s (RESTART_SR: 0x%08x)\n", - reset_source_name(), reg); + pr_info("STPMIC1 reset reason %s (RREQ_STATE_SR: 0x%08x)\n", + reset_source_to_string(type), reg); return 0; } -static int stpmic1_wdt_probe(struct device_d *dev) +static int stpmic1_wdt_probe(struct device *dev) { struct stpmic1_wdt *wdt; struct watchdog *wdd; @@ -179,9 +175,6 @@ static int stpmic1_wdt_probe(struct device_d *dev) wdd->set_timeout = stpmic1_wdt_set_timeout; wdd->timeout_max = PMIC_WDT_MAX_TIMEOUT; - /* have the watchdog reset, not power-off the system */ - regmap_write_bits(wdt->regmap, MAIN_CR, RREQ_EN, RREQ_EN); - ret = watchdog_register(wdd); if (ret) { dev_err(dev, "Failed to register watchdog device\n"); @@ -204,7 +197,7 @@ static int stpmic1_wdt_probe(struct device_d *dev) if (ret) dev_warn(dev, "Cannot register poweroff handler\n"); - stpmic1_set_reset_reason(wdt->regmap); + ret = stpmic1_set_reset_reason(wdt->regmap); if (ret) dev_warn(dev, "Cannot query reset reason\n"); @@ -216,8 +209,9 @@ static __maybe_unused const struct of_device_id stpmic1_wdt_of_match[] = { { .compatible = "st,stpmic1-wdt" }, { /* sentinel */ } }; +MODULE_DEVICE_TABLE(of, stpmic1_wdt_of_match); -static struct driver_d stpmic1_wdt_driver = { +static struct driver stpmic1_wdt_driver = { .name = "stpmic1-wdt", .probe = stpmic1_wdt_probe, .of_compatible = DRV_OF_COMPAT(stpmic1_wdt_of_match), |