syscon_np = of_parse_phandle(np, "syscon", 0); if (!syscon_np) {
dev_err(dev, "no syscon property\n"); return -ENODEV;
}
ret = of_property_read_u32_index(np, "syscon", 1, ®); if (ret < 0) {
dev_err(dev, "no offset in syscon\n");
of_node_put(syscon_np); return ret;
}
/* allocate memory for watchdog struct */
wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); if (!wdt) {
of_node_put(syscon_np); return -ENOMEM;
}
/* set regmap and offset to know where to write */
wdt->feed_offset = reg;
wdt->regmap = syscon_node_to_regmap(syscon_np);
of_node_put(syscon_np); if (IS_ERR(wdt->regmap)) {
dev_err(dev, "cannot get parent's regmap\n"); return PTR_ERR(wdt->regmap);
}
/* * As this watchdog supports only a few values, ts4800_wdt_set_timeout * must be called to initialize timeout and feed_val with valid values. * Default to maximum timeout if none, or an invalid one, is provided in * device tree.
*/ if (!wdd->timeout)
wdd->timeout = wdd->max_timeout;
ts4800_wdt_set_timeout(wdd, wdd->timeout);
/* * The feed register is write-only, so it is not possible to determine * watchdog's state. Disable it to be in a known state.
*/
ts4800_wdt_stop(wdd);
ret = devm_watchdog_register_device(dev, wdd); if (ret) return ret;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.