Lines Matching +full:timeout +full:- +full:minutes

1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/mfd/rohm-bd70528.h>
15 * Max time we can set is 1 hour, 59 minutes and 59 seconds
18 #define WDT_MAX_MS ((2 * 60 * 60 - 1) * 1000)
33 * bd70528_wdt_set - arm or disarm watchdog timer
52 ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp); in bd70528_wdt_set()
79 ret = regmap_write(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, in bd70528_wdt_set()
85 ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp); in bd70528_wdt_set()
87 dev_err(bd70528->chip.dev, in bd70528_wdt_set()
90 ret = -EIO; in bd70528_wdt_set()
98 * bd70528_wdt_lock - take WDT lock
110 mutex_lock(&bd70528->rtc_timer_lock); in bd70528_wdt_lock()
115 * bd70528_wdt_unlock - unlock WDT lock
127 mutex_unlock(&bd70528->rtc_timer_lock); in bd70528_wdt_unlock()
133 return bd70528_wdt_set(w->mfd, enable, NULL); in bd70528_wdt_set_locked()
140 bd70528_wdt_lock(w->mfd); in bd70528_wdt_change()
142 bd70528_wdt_unlock(w->mfd); in bd70528_wdt_change()
151 dev_dbg(w->dev, "WDT ping...\n"); in bd70528_wdt_start()
159 dev_dbg(w->dev, "WDT stopping...\n"); in bd70528_wdt_stop()
164 unsigned int timeout) in bd70528_wdt_set_timeout() argument
167 unsigned int minutes; in bd70528_wdt_set_timeout() local
172 seconds = timeout; in bd70528_wdt_set_timeout()
173 hours = timeout / (60 * 60); in bd70528_wdt_set_timeout()
174 /* Maximum timeout is 1h 59m 59s => hours is 1 or 0 */ in bd70528_wdt_set_timeout()
176 seconds -= (60 * 60); in bd70528_wdt_set_timeout()
177 minutes = seconds / 60; in bd70528_wdt_set_timeout()
180 bd70528_wdt_lock(w->mfd); in bd70528_wdt_set_timeout()
186 ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_HOUR, in bd70528_wdt_set_timeout()
189 dev_err(w->dev, "Failed to set WDT hours\n"); in bd70528_wdt_set_timeout()
192 ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_MINUTE, in bd70528_wdt_set_timeout()
193 BD70528_MASK_WDT_MINUTE, bin2bcd(minutes)); in bd70528_wdt_set_timeout()
195 dev_err(w->dev, "Failed to set WDT minutes\n"); in bd70528_wdt_set_timeout()
198 ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_SEC, in bd70528_wdt_set_timeout()
201 dev_err(w->dev, "Failed to set WDT seconds\n"); in bd70528_wdt_set_timeout()
203 dev_dbg(w->dev, "WDT tmo set to %u\n", timeout); in bd70528_wdt_set_timeout()
208 bd70528_wdt_unlock(w->mfd); in bd70528_wdt_set_timeout()
214 .identity = "bd70528-wdt",
231 bd70528 = dev_get_drvdata(pdev->dev.parent); in bd70528_wdt_probe()
233 dev_err(&pdev->dev, "No MFD driver data\n"); in bd70528_wdt_probe()
234 return -EINVAL; in bd70528_wdt_probe()
236 w = devm_kzalloc(&pdev->dev, sizeof(*w), GFP_KERNEL); in bd70528_wdt_probe()
238 return -ENOMEM; in bd70528_wdt_probe()
240 w->regmap = bd70528->regmap; in bd70528_wdt_probe()
241 w->mfd = bd70528; in bd70528_wdt_probe()
242 w->dev = &pdev->dev; in bd70528_wdt_probe()
244 w->wdt.info = &bd70528_wdt_info; in bd70528_wdt_probe()
245 w->wdt.ops = &bd70528_wdt_ops; in bd70528_wdt_probe()
246 w->wdt.min_hw_heartbeat_ms = WDT_MIN_MS; in bd70528_wdt_probe()
247 w->wdt.max_hw_heartbeat_ms = WDT_MAX_MS; in bd70528_wdt_probe()
248 w->wdt.parent = pdev->dev.parent; in bd70528_wdt_probe()
249 w->wdt.timeout = DEFAULT_TIMEOUT; in bd70528_wdt_probe()
250 watchdog_set_drvdata(&w->wdt, w); in bd70528_wdt_probe()
251 watchdog_init_timeout(&w->wdt, 0, pdev->dev.parent); in bd70528_wdt_probe()
253 ret = bd70528_wdt_set_timeout(&w->wdt, w->wdt.timeout); in bd70528_wdt_probe()
255 dev_err(&pdev->dev, "Failed to set the watchdog timeout\n"); in bd70528_wdt_probe()
259 bd70528_wdt_lock(w->mfd); in bd70528_wdt_probe()
260 ret = regmap_read(w->regmap, BD70528_REG_WDT_CTRL, &reg); in bd70528_wdt_probe()
261 bd70528_wdt_unlock(w->mfd); in bd70528_wdt_probe()
264 dev_err(&pdev->dev, "Failed to get the watchdog state\n"); in bd70528_wdt_probe()
268 dev_dbg(&pdev->dev, "watchdog was running during probe\n"); in bd70528_wdt_probe()
269 set_bit(WDOG_HW_RUNNING, &w->wdt.status); in bd70528_wdt_probe()
272 ret = devm_watchdog_register_device(&pdev->dev, &w->wdt); in bd70528_wdt_probe()
274 dev_err(&pdev->dev, "watchdog registration failed: %d\n", ret); in bd70528_wdt_probe()
281 .name = "bd70528-wdt"
291 MODULE_ALIAS("platform:bd70528-wdt");