Lines Matching full:wdt

57 static void mlxreg_wdt_check_card_reset(struct mlxreg_wdt *wdt)  in mlxreg_wdt_check_card_reset()  argument
63 if (wdt->reset_idx == -EINVAL) in mlxreg_wdt_check_card_reset()
66 if (!(wdt->wdd.info->options & WDIOF_CARDRESET)) in mlxreg_wdt_check_card_reset()
69 reg_data = &wdt->pdata->data[wdt->reset_idx]; in mlxreg_wdt_check_card_reset()
70 rc = regmap_read(wdt->regmap, reg_data->reg, &regval); in mlxreg_wdt_check_card_reset()
73 wdt->wdd.bootstatus = WDIOF_CARDRESET; in mlxreg_wdt_check_card_reset()
74 dev_info(wdt->wdd.parent, in mlxreg_wdt_check_card_reset()
82 struct mlxreg_wdt *wdt = watchdog_get_drvdata(wdd); in mlxreg_wdt_start() local
83 struct mlxreg_core_data *reg_data = &wdt->pdata->data[wdt->action_idx]; in mlxreg_wdt_start()
85 return regmap_update_bits(wdt->regmap, reg_data->reg, ~reg_data->mask, in mlxreg_wdt_start()
91 struct mlxreg_wdt *wdt = watchdog_get_drvdata(wdd); in mlxreg_wdt_stop() local
92 struct mlxreg_core_data *reg_data = &wdt->pdata->data[wdt->action_idx]; in mlxreg_wdt_stop()
94 return regmap_update_bits(wdt->regmap, reg_data->reg, ~reg_data->mask, in mlxreg_wdt_stop()
100 struct mlxreg_wdt *wdt = watchdog_get_drvdata(wdd); in mlxreg_wdt_ping() local
101 struct mlxreg_core_data *reg_data = &wdt->pdata->data[wdt->ping_idx]; in mlxreg_wdt_ping()
103 return regmap_update_bits_base(wdt->regmap, reg_data->reg, in mlxreg_wdt_ping()
111 struct mlxreg_wdt *wdt = watchdog_get_drvdata(wdd); in mlxreg_wdt_set_timeout() local
112 struct mlxreg_core_data *reg_data = &wdt->pdata->data[wdt->timeout_idx]; in mlxreg_wdt_set_timeout()
116 switch (wdt->wdt_type) { in mlxreg_wdt_set_timeout()
118 rc = regmap_read(wdt->regmap, reg_data->reg, &regval); in mlxreg_wdt_set_timeout()
126 rc = regmap_write(wdt->regmap, reg_data->reg, regval); in mlxreg_wdt_set_timeout()
130 rc = regmap_write(wdt->regmap, reg_data->reg, timeout); in mlxreg_wdt_set_timeout()
135 if (wdt->regmap_val_sz == 1) { in mlxreg_wdt_set_timeout()
137 rc = regmap_write(wdt->regmap, reg_data->reg, regval); in mlxreg_wdt_set_timeout()
140 rc = regmap_write(wdt->regmap, in mlxreg_wdt_set_timeout()
144 rc = regmap_write(wdt->regmap, reg_data->reg, timeout); in mlxreg_wdt_set_timeout()
169 struct mlxreg_wdt *wdt = watchdog_get_drvdata(wdd); in mlxreg_wdt_get_timeleft() local
170 struct mlxreg_core_data *reg_data = &wdt->pdata->data[wdt->tleft_idx]; in mlxreg_wdt_get_timeleft()
174 if (wdt->wdt_type == MLX_WDT_TYPE2) { in mlxreg_wdt_get_timeleft()
175 rc = regmap_read(wdt->regmap, reg_data->reg, &regval); in mlxreg_wdt_get_timeleft()
178 if (wdt->regmap_val_sz == 1) { in mlxreg_wdt_get_timeleft()
179 rc = regmap_read(wdt->regmap, reg_data->reg, &lsb); in mlxreg_wdt_get_timeleft()
181 rc = regmap_read(wdt->regmap, in mlxreg_wdt_get_timeleft()
186 rc = regmap_read(wdt->regmap, reg_data->reg, &regval); in mlxreg_wdt_get_timeleft()
214 .identity = "mlx-wdt-main",
220 .identity = "mlx-wdt-aux",
223 static void mlxreg_wdt_config(struct mlxreg_wdt *wdt, in mlxreg_wdt_config() argument
229 wdt->reset_idx = -EINVAL; in mlxreg_wdt_config()
232 wdt->action_idx = i; in mlxreg_wdt_config()
234 wdt->timeout_idx = i; in mlxreg_wdt_config()
236 wdt->tleft_idx = i; in mlxreg_wdt_config()
238 wdt->ping_idx = i; in mlxreg_wdt_config()
240 wdt->reset_idx = i; in mlxreg_wdt_config()
243 wdt->pdata = pdata; in mlxreg_wdt_config()
246 wdt->wdd.info = &mlxreg_wdt_main_info; in mlxreg_wdt_config()
248 wdt->wdd.info = &mlxreg_wdt_aux_info; in mlxreg_wdt_config()
250 wdt->wdt_type = pdata->version; in mlxreg_wdt_config()
251 switch (wdt->wdt_type) { in mlxreg_wdt_config()
253 wdt->wdd.ops = &mlxreg_wdt_ops_type1; in mlxreg_wdt_config()
254 wdt->wdd.max_timeout = MLXREG_WDT_MAX_TIMEOUT_TYPE1; in mlxreg_wdt_config()
257 wdt->wdd.ops = &mlxreg_wdt_ops_type2; in mlxreg_wdt_config()
258 wdt->wdd.max_timeout = MLXREG_WDT_MAX_TIMEOUT_TYPE2; in mlxreg_wdt_config()
261 wdt->wdd.ops = &mlxreg_wdt_ops_type2; in mlxreg_wdt_config()
262 wdt->wdd.max_timeout = MLXREG_WDT_MAX_TIMEOUT_TYPE3; in mlxreg_wdt_config()
268 wdt->wdd.min_timeout = MLXREG_WDT_MIN_TIMEOUT; in mlxreg_wdt_config()
271 static int mlxreg_wdt_init_timeout(struct mlxreg_wdt *wdt, in mlxreg_wdt_init_timeout() argument
276 timeout = pdata->data[wdt->timeout_idx].health_cntr; in mlxreg_wdt_init_timeout()
277 return mlxreg_wdt_set_timeout(&wdt->wdd, timeout); in mlxreg_wdt_init_timeout()
284 struct mlxreg_wdt *wdt; in mlxreg_wdt_probe() local
292 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); in mlxreg_wdt_probe()
293 if (!wdt) in mlxreg_wdt_probe()
296 wdt->wdd.parent = dev; in mlxreg_wdt_probe()
297 wdt->regmap = pdata->regmap; in mlxreg_wdt_probe()
298 rc = regmap_get_val_bytes(wdt->regmap); in mlxreg_wdt_probe()
302 wdt->regmap_val_sz = rc; in mlxreg_wdt_probe()
303 mlxreg_wdt_config(wdt, pdata); in mlxreg_wdt_probe()
306 watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT); in mlxreg_wdt_probe()
307 watchdog_stop_on_reboot(&wdt->wdd); in mlxreg_wdt_probe()
308 watchdog_stop_on_unregister(&wdt->wdd); in mlxreg_wdt_probe()
309 watchdog_set_drvdata(&wdt->wdd, wdt); in mlxreg_wdt_probe()
310 rc = mlxreg_wdt_init_timeout(wdt, pdata); in mlxreg_wdt_probe()
315 rc = mlxreg_wdt_start(&wdt->wdd); in mlxreg_wdt_probe()
318 set_bit(WDOG_HW_RUNNING, &wdt->wdd.status); in mlxreg_wdt_probe()
320 mlxreg_wdt_check_card_reset(wdt); in mlxreg_wdt_probe()
321 rc = devm_watchdog_register_device(dev, &wdt->wdd); in mlxreg_wdt_probe()
332 .name = "mlx-wdt",
341 MODULE_ALIAS("platform:mlx-wdt");