Lines Matching +full:hw +full:- +full:timeout +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0-only
11 #include <linux/mfd/rohm-bd96801.h>
12 #include <linux/mfd/rohm-generic.h>
43 /* 1.1 mS */
54 * timeout values. SHORT time is meaningful only in window mode where feeding
57 * timeout time is a multiple of (2, 4, 8 or 16 times) the SHORT timeout.
70 return regmap_update_bits(w->regmap, BD96801_REG_WD_FEED, in bd96801_wdt_ping()
78 return regmap_update_bits(w->regmap, BD96801_REG_WD_CONF, in bd96801_wdt_start()
86 return regmap_update_bits(w->regmap, BD96801_REG_WD_CONF, in bd96801_wdt_stop()
111 return -EINVAL; in find_closest_fast()
130 return -EINVAL; in find_closest_slow_by_fast()
159 return -EINVAL; in find_closest_slow()
170 struct device *dev = w->dev; in bd96801_set_wdt_mode()
174 dev_err(dev, "Unsupported fast timeout %u uS [max %u]\n", in bd96801_set_wdt_mode()
177 return -EINVAL; in bd96801_set_wdt_mode()
181 dev_err(dev, "Unsupported slow timeout %u uS [max %u]\n", in bd96801_set_wdt_mode()
184 return -EINVAL; in bd96801_set_wdt_mode()
206 "can't support slow timeout %u uS using fast %u uS. [max slow %u uS]\n", in bd96801_set_wdt_mode()
211 w->wdt.min_hw_heartbeat_ms = min / 10; in bd96801_set_wdt_mode()
220 w->wdt.max_hw_heartbeat_ms = hw_margin / 10; in bd96801_set_wdt_mode()
226 ret = regmap_update_bits(w->regmap, BD96801_REG_WD_TMO, in bd96801_set_wdt_mode()
231 ret = regmap_update_bits(w->regmap, BD96801_REG_WD_CONF, in bd96801_set_wdt_mode()
244 * The BD96801 supports a somewhat peculiar QA-mode, which we do not in bd96801_set_heartbeat_from_hw()
245 * support in this driver. If the QA-mode is enabled then we just in bd96801_set_heartbeat_from_hw()
246 * warn and bail-out. in bd96801_set_heartbeat_from_hw()
249 dev_err(w->dev, "watchdog set to Q&A mode - exiting\n"); in bd96801_set_heartbeat_from_hw()
250 return -EINVAL; in bd96801_set_heartbeat_from_hw()
253 ret = regmap_read(w->regmap, BD96801_REG_WD_TMO, &val); in bd96801_set_heartbeat_from_hw()
261 w->wdt.max_hw_heartbeat_ms = (fast << sel) / USEC_PER_MSEC; in bd96801_set_heartbeat_from_hw()
264 w->wdt.min_hw_heartbeat_ms = fast / USEC_PER_MSEC; in bd96801_set_heartbeat_from_hw()
275 count = device_property_count_u32(w->dev->parent, "rohm,hw-timeout-ms"); in init_wdg_hw()
276 if (count < 0 && count != -EINVAL) in init_wdg_hw()
281 return -EINVAL; in init_wdg_hw()
283 ret = device_property_read_u32_array(w->dev->parent, in init_wdg_hw()
284 "rohm,hw-timeout-ms", in init_wdg_hw()
307 ret = device_property_match_string(w->dev->parent, "rohm,wdg-action", in init_wdg_hw()
310 ret = regmap_update_bits(w->regmap, BD96801_REG_WD_CONF, in init_wdg_hw()
316 ret = device_property_match_string(w->dev->parent, "rohm,wdg-action", in init_wdg_hw()
317 "intb-only"); in init_wdg_hw()
319 ret = regmap_update_bits(w->regmap, BD96801_REG_WD_CONF, in init_wdg_hw()
341 w = devm_kzalloc(&pdev->dev, sizeof(*w), GFP_KERNEL); in bd96801_wdt_probe()
343 return -ENOMEM; in bd96801_wdt_probe()
345 w->regmap = dev_get_regmap(pdev->dev.parent, NULL); in bd96801_wdt_probe()
346 w->dev = &pdev->dev; in bd96801_wdt_probe()
348 w->wdt.info = &bd96801_wdt_info; in bd96801_wdt_probe()
349 w->wdt.ops = &bd96801_wdt_ops; in bd96801_wdt_probe()
350 w->wdt.parent = pdev->dev.parent; in bd96801_wdt_probe()
351 w->wdt.timeout = DEFAULT_TIMEOUT; in bd96801_wdt_probe()
352 watchdog_set_drvdata(&w->wdt, w); in bd96801_wdt_probe()
354 ret = regmap_read(w->regmap, BD96801_REG_WD_CONF, &val); in bd96801_wdt_probe()
356 return dev_err_probe(&pdev->dev, ret, in bd96801_wdt_probe()
361 * In this case we just update the hw-timeout based on values set to in bd96801_wdt_probe()
362 * the timeout / mode registers and leave the hardware configs in bd96801_wdt_probe()
366 dev_dbg(&pdev->dev, "watchdog was running during probe\n"); in bd96801_wdt_probe()
371 set_bit(WDOG_HW_RUNNING, &w->wdt.status); in bd96801_wdt_probe()
379 dev_dbg(w->dev, "heartbeat set to %u - %u\n", in bd96801_wdt_probe()
380 w->wdt.min_hw_heartbeat_ms, w->wdt.max_hw_heartbeat_ms); in bd96801_wdt_probe()
382 watchdog_init_timeout(&w->wdt, 0, pdev->dev.parent); in bd96801_wdt_probe()
383 watchdog_set_nowayout(&w->wdt, nowayout); in bd96801_wdt_probe()
384 watchdog_stop_on_reboot(&w->wdt); in bd96801_wdt_probe()
386 irq = platform_get_irq_byname(pdev, "bd96801-wdg"); in bd96801_wdt_probe()
388 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, in bd96801_wdt_probe()
390 IRQF_ONESHOT, "bd96801-wdg", in bd96801_wdt_probe()
393 return dev_err_probe(&pdev->dev, ret, in bd96801_wdt_probe()
397 return devm_watchdog_register_device(&pdev->dev, &w->wdt); in bd96801_wdt_probe()
401 { "bd96801-wdt", },
408 .name = "bd96801-wdt"