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