Module Name: src Committed By: christos Date: Sat Dec 30 03:18:26 UTC 2017
Modified Files: src/sys/dev/i2c: am2315.c si70xx.c Log Message: fixes from Brad Spenser To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/dev/i2c/am2315.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/i2c/si70xx.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/am2315.c diff -u src/sys/dev/i2c/am2315.c:1.1 src/sys/dev/i2c/am2315.c:1.2 --- src/sys/dev/i2c/am2315.c:1.1 Thu Dec 28 18:23:47 2017 +++ src/sys/dev/i2c/am2315.c Fri Dec 29 22:18:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: am2315.c,v 1.1 2017/12/28 23:23:47 christos Exp $ */ +/* $NetBSD: am2315.c,v 1.2 2017/12/30 03:18:26 christos Exp $ */ /* * Copyright (c) 2017 Brad Spencer <b...@anduin.eldar.org> @@ -17,7 +17,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: am2315.c,v 1.1 2017/12/28 23:23:47 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: am2315.c,v 1.2 2017/12/30 03:18:26 christos Exp $"); /* * Driver for the Aosong AM2315 @@ -153,16 +153,16 @@ am2315_poke_m(i2c_tag_t tag, i2c_addr_t if (debug) printf("%s: poke 1: %d\n", name, error); - if (error != 0) + if (error) delay(2800); error = am2315_cmd(tag, addr, AM2315_READ_REGISTERS, AM2315_REGISTER_STATUS, 1, buf, __arraycount(buf)); if (debug) - printf("%s: poke 2: %d %02x %02x %02x %02x%02x\n", name, error, - buf[0], buf[1], buf[2], buf[3], buf[4]); + printf("%s: poke 2: %d %02x %02x %02x %02x%02x\n", name, error, + buf[0], buf[1], buf[2], buf[3], buf[4]); - if (error != 0) + if (error) delay(2800); return error; } @@ -204,6 +204,7 @@ am2315_match(device_t parent, cfdata_t m return 0; } + iic_release_bus(ia->ia_tag, 0); return 1; } @@ -299,7 +300,7 @@ am2315_attach(device_t parent, device_t && crc == readcrc; error = am2315_read_regs(sc, AM2315_REGISTER_VERSION, 1, buf, 5); - if (error != 0) + if (error) aprint_error_dev(self, "read chipver: %d\n", error); readcrc = buf[4] << 8 | buf[3]; crc = am2315_crc(buf, 3); @@ -309,7 +310,7 @@ am2315_attach(device_t parent, device_t && crc == readcrc; error = am2315_read_regs(sc, AM2315_REGISTER_ID_PT_24_31, 2, buf, 6); - if (error != 0) + if (error) aprint_error_dev(self, "read id 1: %d\n", error); readcrc = buf[5] << 8 | buf[4]; crc = am2315_crc(buf, 4); @@ -319,7 +320,7 @@ am2315_attach(device_t parent, device_t && crc == readcrc; error = am2315_read_regs(sc, AM2315_REGISTER_ID_PT_8_15, 2, buf, 6); - if (error != 0) + if (error) aprint_error_dev(self, "read id 2: %d\n", error); readcrc = buf[5] << 8 | buf[4]; crc = am2315_crc(buf, 4); @@ -392,7 +393,7 @@ am2315_refresh(struct sysmon_envsys * sm mutex_enter(&sc->sc_mutex); error = iic_acquire_bus(sc->sc_tag, 0); - if (error == 0) { + if (error) { DPRINTF(sc, 2, ("%s: Could not acquire i2c bus: %d\n", device_xname(sc->sc_dev), error)); goto out; @@ -415,8 +416,8 @@ am2315_refresh(struct sysmon_envsys * sm am2315_poke(sc); if ((error = am2315_read_regs(sc, thecommand, 2, buf, 6)) != 0) - aprint_error_dev(sc->sc_dev, - "Read sensor %d error: %d\n", edata->sensor, error); + DPRINTF(sc, 2, ("%s: Read sensor %d error: %d\n", + device_xname(sc->sc_dev),edata->sensor, error)); readcrc = buf[5] << 8 | buf[4]; crc = am2315_crc(buf, 4); Index: src/sys/dev/i2c/si70xx.c diff -u src/sys/dev/i2c/si70xx.c:1.2 src/sys/dev/i2c/si70xx.c:1.3 --- src/sys/dev/i2c/si70xx.c:1.2 Thu Dec 28 21:19:45 2017 +++ src/sys/dev/i2c/si70xx.c Fri Dec 29 22:18:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: si70xx.c,v 1.2 2017/12/29 02:19:45 christos Exp $ */ +/* $NetBSD: si70xx.c,v 1.3 2017/12/30 03:18:26 christos Exp $ */ /* * Copyright (c) 2017 Brad Spencer <b...@anduin.eldar.org> @@ -17,7 +17,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: si70xx.c,v 1.2 2017/12/29 02:19:45 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: si70xx.c,v 1.3 2017/12/30 03:18:26 christos Exp $"); /* Driver for the Silicon Labs SI7013/SI7020/SI7021 @@ -202,12 +202,10 @@ si70xx_verify_sysctl_heatervalue(SYSCTLF return error; } -static int -si70xx_cmd(i2c_tag_t tag, i2c_addr_t addr, uint8_t *cmd, - uint8_t clen, uint8_t *buf, size_t blen) +static uint8_t +si70xx_dir(uint8_t cmd, size_t len) { - uint8_t dir; - switch (cmd[0]) { + switch (cmd) { case SI70XX_READ_USER_REG_1: case SI70XX_READ_HEATER_REG: case SI70XX_READ_ID_PT1A: @@ -216,22 +214,33 @@ si70xx_cmd(i2c_tag_t tag, i2c_addr_t add case SI70XX_READ_ID_PT2B: case SI70XX_READ_FW_VERA: case SI70XX_READ_FW_VERB: - dir = I2C_OP_READ_WITH_STOP; - break; + return I2C_OP_READ_WITH_STOP; case SI70XX_WRITE_USER_REG_1: case SI70XX_WRITE_HEATER_REG: case SI70XX_RESET: - dir = I2C_OP_WRITE_WITH_STOP; - break; + return I2C_OP_WRITE_WITH_STOP; case SI70XX_MEASURE_RH_NOHOLD: case SI70XX_MEASURE_TEMP_NOHOLD: - dir = blen == 0 ? I2C_OP_READ : I2C_OP_READ_WITH_STOP; - break; + return len == 0 ? I2C_OP_READ : I2C_OP_READ_WITH_STOP; default: - panic("%s: bad command %#x\n", __func__, cmd[0]); + panic("%s: bad command %#x\n", __func__, cmd); + return 0; } +} + +static int +si70xx_cmd(i2c_tag_t tag, i2c_addr_t addr, uint8_t *cmd, + uint8_t clen, uint8_t *buf, size_t blen) +{ + uint8_t dir; + if (clen == 0) + dir = blen == 0 ? I2C_OP_READ : I2C_OP_READ_WITH_STOP; + else + dir = si70xx_dir(cmd[0], blen); + + if (dir == I2C_OP_READ || dir == I2C_OP_READ_WITH_STOP) + memset(buf, 0, blen); - memset(buf, 0, blen); return iic_exec(tag, dir, addr, cmd, clen, buf, blen, 0); } @@ -359,7 +368,7 @@ si70xx_set_heatervalue(struct si70xx_sc DPRINTF(sc, 2, ("%s:%s: heater values after: %#x\n", device_xname(sc->sc_dev), __func__, heaterregister)); - error = si70xx_cmd1(sc, SI70XX_WRITE_USER_REG_1, &heaterregister, 1); + error = si70xx_cmd1(sc, SI70XX_WRITE_HEATER_REG, &heaterregister, 1); if (error) { DPRINTF(sc, 2, ("%s: Failed to write heater register: %d\n", device_xname(sc->sc_dev), error)); @@ -610,7 +619,7 @@ si70xx_attach(device_t parent, device_t #ifdef HAVE_I2C_EXECV sc->sc_clockstretch = 2048; #endif - sc->sc_readattempts = 15; + sc->sc_readattempts = 25; sc->sc_ignorecrc = false; sc->sc_sme = NULL; @@ -877,9 +886,7 @@ si70xx_exec(struct si70xx_sc *sc, uint8_ break; DPRINTF(sc, 2, ("%s: Failed to read NO HOLD RH" " %d %d\n", device_xname(sc->sc_dev), 2, error)); - if (aint < 10) { - delay(1000); - } + delay(1000); } #endif @@ -933,11 +940,11 @@ si70xx_refresh(struct sysmon_envsys * sm } switch (edata->sensor) { case SI70XX_HUMIDITY_SENSOR: - error = si70xx_exec(sc, SI70XX_MEASURE_RH_HOLD, edata); + error = si70xx_exec(sc, SI70XX_MEASURE_RH_NOHOLD, edata); break; case SI70XX_TEMP_SENSOR: - error = si70xx_exec(sc, SI70XX_MEASURE_TEMP_HOLD, edata); + error = si70xx_exec(sc, SI70XX_MEASURE_TEMP_NOHOLD, edata); break; default: error = EINVAL;