/* * The down-counter is refreshed and starts counting operation on * a write of the values 00h and FFh to the WDTRR register.
*/
writeb(0x0, priv->base + WDTRR);
writeb(0xFF, priv->base + WDTRR);
/* * Down counting starts after writing the sequence 00h -> FFh to the * WDTRR register. Hence, call the ping operation after loading the counter.
*/
rzv2h_wdt_ping(wdev);
if (!watchdog_active(wdev)) {
ret = clk_enable(priv->pclk); if (ret) return ret;
ret = clk_enable(priv->oscclk); if (ret) {
clk_disable(priv->pclk); return ret;
}
ret = reset_control_deassert(priv->rstc); if (ret) {
clk_disable(priv->oscclk);
clk_disable(priv->pclk); return ret;
}
} else { /* * Writing to the WDT Control Register (WDTCR) or WDT Reset * Control Register (WDTRCR) is possible once between the * release from the reset state and the first refresh operation. * Therefore, issue a reset if the watchdog is active.
*/
ret = reset_control_reset(priv->rstc); if (ret) return ret;
}
/* delay to handle clock halt after de-assert operation */
udelay(3);
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM;
priv->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->base)) return PTR_ERR(priv->base);
priv->pclk = devm_clk_get_prepared(dev, "pclk"); if (IS_ERR(priv->pclk)) return dev_err_probe(dev, PTR_ERR(priv->pclk), "no pclk");
priv->oscclk = devm_clk_get_prepared(dev, "oscclk"); if (IS_ERR(priv->oscclk)) return dev_err_probe(dev, PTR_ERR(priv->oscclk), "no oscclk");
priv->rstc = devm_reset_control_get_exclusive(dev, NULL); if (IS_ERR(priv->rstc)) return dev_err_probe(dev, PTR_ERR(priv->rstc), "failed to get cpg reset");
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.