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, &regval);
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_write_bits(wdt->regmap, reg_data->reg, ~reg_data->mask,
110 struct mlxreg_wdt *wdt = watchdog_get_drvdata(wdd);
111 struct mlxreg_core_data *reg_data = &wdt->pdata->data[wdt->timeout_idx];
115 switch (wdt->wdt_type) {
117 rc = regmap_read(wdt->regmap, reg_data->reg, &regval);
125 rc = regmap_write(wdt->regmap, reg_data->reg, regval);
129 rc = regmap_write(wdt->regmap, reg_data->reg, timeout);
134 if (wdt->regmap_val_sz == 1) {
136 rc = regmap_write(wdt->regmap, reg_data->reg, regval);
139 rc = regmap_write(wdt->regmap,
143 rc = regmap_write(wdt->regmap, reg_data->reg, timeout);
168 struct mlxreg_wdt *wdt = watchdog_get_drvdata(wdd);
169 struct mlxreg_core_data *reg_data = &wdt->pdata->data[wdt->tleft_idx];
173 if (wdt->wdt_type == MLX_WDT_TYPE2) {
174 rc = regmap_read(wdt->regmap, reg_data->reg, &regval);
177 if (wdt->regmap_val_sz == 1) {
178 rc = regmap_read(wdt->regmap, reg_data->reg, &lsb);
180 rc = regmap_read(wdt->regmap,
185 rc = regmap_read(wdt->regmap, reg_data->reg, &regval);
213 .identity = "mlx-wdt-main",
219 .identity = "mlx-wdt-aux",
222 static void mlxreg_wdt_config(struct mlxreg_wdt *wdt,
228 wdt->reset_idx = -EINVAL;
231 wdt->action_idx = i;
233 wdt->timeout_idx = i;
235 wdt->tleft_idx = i;
237 wdt->ping_idx = i;
239 wdt->reset_idx = i;
242 wdt->pdata = pdata;
245 wdt->wdd.info = &mlxreg_wdt_main_info;
247 wdt->wdd.info = &mlxreg_wdt_aux_info;
249 wdt->wdt_type = pdata->version;
250 switch (wdt->wdt_type) {
252 wdt->wdd.ops = &mlxreg_wdt_ops_type1;
253 wdt->wdd.max_timeout = MLXREG_WDT_MAX_TIMEOUT_TYPE1;
256 wdt->wdd.ops = &mlxreg_wdt_ops_type2;
257 wdt->wdd.max_timeout = MLXREG_WDT_MAX_TIMEOUT_TYPE2;
260 wdt->wdd.ops = &mlxreg_wdt_ops_type2;
261 wdt->wdd.max_timeout = MLXREG_WDT_MAX_TIMEOUT_TYPE3;
267 wdt->wdd.min_timeout = MLXREG_WDT_MIN_TIMEOUT;
270 static int mlxreg_wdt_init_timeout(struct mlxreg_wdt *wdt,
275 timeout = pdata->data[wdt->timeout_idx].health_cntr;
276 return mlxreg_wdt_set_timeout(&wdt->wdd, timeout);
283 struct mlxreg_wdt *wdt;
291 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
292 if (!wdt)
295 wdt->wdd.parent = dev;
296 wdt->regmap = pdata->regmap;
297 rc = regmap_get_val_bytes(wdt->regmap);
301 wdt->regmap_val_sz = rc;
302 mlxreg_wdt_config(wdt, pdata);
305 watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT);
306 watchdog_stop_on_reboot(&wdt->wdd);
307 watchdog_stop_on_unregister(&wdt->wdd);
308 watchdog_set_drvdata(&wdt->wdd, wdt);
309 rc = mlxreg_wdt_init_timeout(wdt, pdata);
314 rc = mlxreg_wdt_start(&wdt->wdd);
317 set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
319 mlxreg_wdt_check_card_reset(wdt);
320 rc = devm_watchdog_register_device(dev, &wdt->wdd);
331 .name = "mlx-wdt",
340 MODULE_ALIAS("platform:mlx-wdt");