Module Name: src Committed By: thorpej Date: Thu Jan 2 19:24:48 UTC 2020
Modified Files: src/sys/dev/i2c: m41st84.c Log Message: - Use todr_gettime_ymdhms / todr_settime_ymdhms. - Correctly propagate errors up the stack. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/dev/i2c/m41st84.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/i2c/m41st84.c diff -u src/sys/dev/i2c/m41st84.c:1.25 src/sys/dev/i2c/m41st84.c:1.26 --- src/sys/dev/i2c/m41st84.c:1.25 Thu Jan 2 16:28:02 2020 +++ src/sys/dev/i2c/m41st84.c Thu Jan 2 19:24:48 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: m41st84.c,v 1.25 2020/01/02 16:28:02 thorpej Exp $ */ +/* $NetBSD: m41st84.c,v 1.26 2020/01/02 19:24:48 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: m41st84.c,v 1.25 2020/01/02 16:28:02 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: m41st84.c,v 1.26 2020/01/02 19:24:48 thorpej Exp $"); #include "opt_strtc.h" @@ -93,10 +93,11 @@ const struct cdevsw strtc_cdevsw = { }; #endif -static int strtc_clock_read(struct strtc_softc *, struct clock_ymdhms *); -static int strtc_clock_write(struct strtc_softc *, struct clock_ymdhms *); -static int strtc_gettime(struct todr_chip_handle *, struct timeval *); -static int strtc_settime(struct todr_chip_handle *, struct timeval *); +static int strtc_clock_read(struct strtc_softc *sc, struct clock_ymdhms *); +static int strtc_gettime_ymdhms(struct todr_chip_handle *, + struct clock_ymdhms *); +static int strtc_settime_ymdhms(struct todr_chip_handle *, + struct clock_ymdhms *); static int strtc_match(device_t parent, cfdata_t cf, void *arg) @@ -132,8 +133,10 @@ strtc_attach(device_t parent, device_t s sc->sc_dev = self; sc->sc_open = 0; sc->sc_todr.cookie = sc; - sc->sc_todr.todr_gettime = strtc_gettime; - sc->sc_todr.todr_settime = strtc_settime; + sc->sc_todr.todr_gettime = NULL; + sc->sc_todr.todr_settime = NULL; + sc->sc_todr.todr_gettime_ymdhms = strtc_gettime_ymdhms; + sc->sc_todr.todr_settime_ymdhms = strtc_settime_ymdhms; sc->sc_todr.todr_setwen = NULL; todr_attach(&sc->sc_todr); @@ -249,13 +252,13 @@ strtc_write(dev_t dev, struct uio *uio, #endif /* STRTC_NO_USERRAM */ static int -strtc_gettime(struct todr_chip_handle *ch, struct timeval *tv) +strtc_gettime_ymdhms(struct todr_chip_handle *ch, struct clock_ymdhms *dt) { struct strtc_softc *sc = ch->cookie; - struct clock_ymdhms dt, check; - int retries; + struct clock_ymdhms check; + int retries, error; - memset(&dt, 0, sizeof(dt)); + memset(dt, 0, sizeof(*dt)); memset(&check, 0, sizeof(check)); /* @@ -264,26 +267,11 @@ strtc_gettime(struct todr_chip_handle *c */ retries = 5; do { - strtc_clock_read(sc, &dt); - strtc_clock_read(sc, &check); - } while (memcmp(&dt, &check, sizeof(check)) != 0 && --retries); - - tv->tv_sec = clock_ymdhms_to_secs(&dt); - tv->tv_usec = 0; - - return (0); -} - -static int -strtc_settime(struct todr_chip_handle *ch, struct timeval *tv) -{ - struct strtc_softc *sc = ch->cookie; - struct clock_ymdhms dt; - - clock_secs_to_ymdhms(tv->tv_sec, &dt); - - if (strtc_clock_write(sc, &dt) == 0) - return (-1); + if ((error = strtc_clock_read(sc, dt)) == 0) + error = strtc_clock_read(sc, &check); + if (error) + return error; + } while (memcmp(dt, &check, sizeof(check)) != 0 && --retries); return (0); } @@ -292,12 +280,12 @@ static int strtc_clock_read(struct strtc_softc *sc, struct clock_ymdhms *dt) { u_int8_t bcd[M41ST84_REG_DATE_BYTES], cmdbuf[2]; - int i; + int i, error; - if (iic_acquire_bus(sc->sc_tag, 0)) { + if ((error = iic_acquire_bus(sc->sc_tag, 0)) != 0) { aprint_error_dev(sc->sc_dev, "strtc_clock_read: failed to acquire I2C bus\n"); - return (0); + return (error); } /* @@ -306,21 +294,21 @@ strtc_clock_read(struct strtc_softc *sc, * a chance to run again. */ cmdbuf[0] = M41ST84_REG_AL_HOUR; - if (iic_exec(sc->sc_tag, I2C_OP_READ, sc->sc_address, - cmdbuf, 1, &cmdbuf[1], 1, 0)) { + if ((error = iic_exec(sc->sc_tag, I2C_OP_READ, sc->sc_address, + cmdbuf, 1, &cmdbuf[1], 1, 0)) != 0) { iic_release_bus(sc->sc_tag, 0); aprint_error_dev(sc->sc_dev, "strtc_clock_read: failed to read HT\n"); - return (0); + return (error); } if (cmdbuf[1] & M41ST84_AL_HOUR_HT) { cmdbuf[1] &= ~M41ST84_AL_HOUR_HT; - if (iic_exec(sc->sc_tag, I2C_OP_WRITE, sc->sc_address, - cmdbuf, 1, &cmdbuf[1], 1, 0)) { + if ((error = iic_exec(sc->sc_tag, I2C_OP_WRITE, sc->sc_address, + cmdbuf, 1, &cmdbuf[1], 1, 0)) != 0) { iic_release_bus(sc->sc_tag, 0); aprint_error_dev(sc->sc_dev, "strtc_clock_read: failed to reset HT\n"); - return (0); + return (error); } } @@ -328,14 +316,14 @@ strtc_clock_read(struct strtc_softc *sc, for (i = M41ST84_REG_CSEC; i < M41ST84_REG_DATE_BYTES; i++) { cmdbuf[0] = i; - if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, + if ((error = iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_address, cmdbuf, 1, - &bcd[i], 1, 0)) { + &bcd[i], 1, 0)) != 0) { iic_release_bus(sc->sc_tag, 0); aprint_error_dev(sc->sc_dev, "strtc_clock_read: failed to read rtc " "at 0x%x\n", i); - return (0); + return (error); } } @@ -352,16 +340,18 @@ strtc_clock_read(struct strtc_softc *sc, dt->dt_mon = bcdtobin(bcd[M41ST84_REG_MONTH] & M41ST84_MONTH_MASK); /* XXX: Should be an MD way to specify EPOCH used by BIOS/Firmware */ + /* XXX: Wait, isn't that what rtc_offset in todr_gettime() is for? */ dt->dt_year = bcdtobin(bcd[M41ST84_REG_YEAR]) + POSIX_BASE_YEAR; - return (1); + return (0); } static int -strtc_clock_write(struct strtc_softc *sc, struct clock_ymdhms *dt) +strtc_settime_ymdhms(struct todr_chip_handle *ch, struct clock_ymdhms *dt) { + struct strtc_softc *sc = ch->cookie; uint8_t bcd[M41ST84_REG_DATE_BYTES], cmdbuf[2]; - int i; + int i, error; /* * Convert our time representation into something the M41ST84 @@ -376,22 +366,22 @@ strtc_clock_write(struct strtc_softc *sc bcd[M41ST84_REG_MONTH] = bintobcd(dt->dt_mon); bcd[M41ST84_REG_YEAR] = bintobcd((dt->dt_year - POSIX_BASE_YEAR) % 100); - if (iic_acquire_bus(sc->sc_tag, 0)) { + if ((error = iic_acquire_bus(sc->sc_tag, 0)) != 0) { aprint_error_dev(sc->sc_dev, "strtc_clock_write: failed to acquire I2C bus\n"); - return (0); + return (error); } /* Stop the clock */ cmdbuf[0] = M41ST84_REG_SEC; cmdbuf[1] = M41ST84_SEC_ST; - if (iic_exec(sc->sc_tag, I2C_OP_WRITE, sc->sc_address, - cmdbuf, 1, &cmdbuf[1], 1, 0)) { + if ((error = iic_exec(sc->sc_tag, I2C_OP_WRITE, sc->sc_address, + cmdbuf, 1, &cmdbuf[1], 1, 0)) != 0) { iic_release_bus(sc->sc_tag, 0); aprint_error_dev(sc->sc_dev, "strtc_clock_write: failed to Hold Clock\n"); - return (0); + return (error); } /* @@ -400,21 +390,21 @@ strtc_clock_write(struct strtc_softc *sc * a chance to run again. */ cmdbuf[0] = M41ST84_REG_AL_HOUR; - if (iic_exec(sc->sc_tag, I2C_OP_READ, sc->sc_address, - cmdbuf, 1, &cmdbuf[1], 1, 0)) { + if ((error = iic_exec(sc->sc_tag, I2C_OP_READ, sc->sc_address, + cmdbuf, 1, &cmdbuf[1], 1, 0)) != 0) { iic_release_bus(sc->sc_tag, 0); aprint_error_dev(sc->sc_dev, "strtc_clock_write: failed to read HT\n"); - return (0); + return (error); } if (cmdbuf[1] & M41ST84_AL_HOUR_HT) { cmdbuf[1] &= ~M41ST84_AL_HOUR_HT; - if (iic_exec(sc->sc_tag, I2C_OP_WRITE, sc->sc_address, - cmdbuf, 1, &cmdbuf[1], 1, 0)) { + if ((error = iic_exec(sc->sc_tag, I2C_OP_WRITE, sc->sc_address, + cmdbuf, 1, &cmdbuf[1], 1, 0)) != 0) { iic_release_bus(sc->sc_tag, 0); aprint_error_dev(sc->sc_dev, "strtc_clock_write: failed to reset HT\n"); - return (0); + return (error); } } @@ -424,21 +414,21 @@ strtc_clock_write(struct strtc_softc *sc */ for (i = M41ST84_REG_DATE_BYTES - 1; i >= 0; i--) { cmdbuf[0] = i; - if (iic_exec(sc->sc_tag, + if ((error = iic_exec(sc->sc_tag, i ? I2C_OP_WRITE : I2C_OP_WRITE_WITH_STOP, - sc->sc_address, cmdbuf, 1, &bcd[i], 1, 0)) { + sc->sc_address, cmdbuf, 1, &bcd[i], 1, 0)) != 0) { iic_release_bus(sc->sc_tag, 0); aprint_error_dev(sc->sc_dev, "strtc_clock_write: failed to write rtc " " at 0x%x\n", i); /* XXX: Clock Hold is likely still asserted! */ - return (0); + return (error); } } iic_release_bus(sc->sc_tag, 0); - return (1); + return (0); } #ifndef STRTC_NO_WATCHDOG