/* Check status. */
ret = regmap_read(data->regmap, RX8111_REG_FLAG, ®val); if (ret) {
dev_dbg(data->dev, "Could not read flag register (%d)\n", ret); return ret;
}
if (FIELD_GET(RX8111_FLAG_XST_BIT, regval)) {
dev_dbg(data->dev, "Crystal oscillation stopped, time is not reliable\n"); return -EINVAL;
}
if (FIELD_GET(RX8111_FLAG_VLF_BIT, regval)) {
dev_dbg(data->dev, "Low voltage detected, time is not reliable\n"); return -EINVAL;
}
ret = regmap_field_read(data->regfields[RX8111_REGF_STOP], ®val); if (ret) {
dev_dbg(data->dev, "Could not read clock status (%d)\n", ret); return ret;
}
if (regval) {
dev_dbg(data->dev, "Clock stopped, time is not reliable\n"); return -EINVAL;
}
/* Read time. */
ret = regmap_bulk_read(data->regmap, RX8111_REG_SEC, buf,
ARRAY_SIZE(buf)); if (ret) {
dev_dbg(data->dev, "Could not bulk read time (%d)\n", ret); return ret;
}
ret = regmap_clear_bits(data->regmap, RX8111_REG_FLAG,
RX8111_FLAG_XST_BIT | RX8111_FLAG_VLF_BIT); if (ret) return ret;
/* Stop the clock. */
ret = regmap_field_write(data->regfields[RX8111_REGF_STOP], 1); if (ret) {
dev_dbg(data->dev, "Could not stop the clock (%d)\n", ret); return ret;
}
/* Set the time. */
ret = regmap_bulk_write(data->regmap, RX8111_REG_SEC, buf,
ARRAY_SIZE(buf)); if (ret) {
dev_dbg(data->dev, "Could not bulk write time (%d)\n", ret);
/* * We don't bother with trying to start the clock again. We * check for this in rx8111_read_time() (and thus force user to * call rx8111_set_time() to try again).
*/ return ret;
}
/* Start the clock. */
ret = regmap_field_write(data->regfields[RX8111_REGF_STOP], 0); if (ret) {
dev_dbg(data->dev, "Could not start the clock (%d)\n", ret); return ret;
}
data->regmap = devm_regmap_init_i2c(client, &rx8111_regmap_config); if (IS_ERR(data->regmap)) {
dev_dbg(data->dev, "Could not initialize regmap\n"); return PTR_ERR(data->regmap);
}
for (i = 0; i < RX8111_REGF_MAX; ++i) {
data->regfields[i] = devm_regmap_field_alloc(
data->dev, data->regmap, rx8111_regfields[i]); if (IS_ERR(data->regfields[i])) {
dev_dbg(data->dev, "Could not allocate register field %zu\n", i); return PTR_ERR(data->regfields[i]);
}
}
rtc = devm_rtc_allocate_device(data->dev); if (IS_ERR(rtc)) {
dev_dbg(data->dev, "Could not allocate rtc device\n"); return PTR_ERR(rtc);
}
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.