Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/i2c - Use todr_gettime_ymdhms / todr_settime_ymdhms.



details:   https://anonhg.NetBSD.org/src/rev/fc3828ede5df
branches:  trunk
changeset: 968109:fc3828ede5df
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Thu Jan 02 19:24:48 2020 +0000

description:
- Use todr_gettime_ymdhms / todr_settime_ymdhms.
- Correctly propagate errors up the stack.

diffstat:

 sys/dev/i2c/m41st84.c |  114 ++++++++++++++++++++++---------------------------
 1 files changed, 52 insertions(+), 62 deletions(-)

diffs (263 lines):

diff -r 364e175cf88d -r fc3828ede5df sys/dev/i2c/m41st84.c
--- a/sys/dev/i2c/m41st84.c     Thu Jan 02 19:20:01 2020 +0000
+++ b/sys/dev/i2c/m41st84.c     Thu Jan 02 19:24:48 2020 +0000
@@ -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 @@
 };
 #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 @@
        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 @@
 #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 @@
         */
        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 @@
 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 @@
         * 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 @@
        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 @@
        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 @@
        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 @@
         * 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 @@
         */
        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



Home | Main Index | Thread Index | Old Index