Don't use I2C_F_POLL when getting/setting limits.

Save/restore the correct values for LM77.
This commit is contained in:
jdc 2016-01-11 18:23:11 +00:00
parent cf0c3bdf9c
commit 4f839cd2f0
1 changed files with 28 additions and 20 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: lm75.c,v 1.28 2016/01/03 17:27:57 jdc Exp $ */ /* $NetBSD: lm75.c,v 1.29 2016/01/11 18:23:11 jdc Exp $ */
/* /*
* Copyright (c) 2003 Wasabi Systems, Inc. * Copyright (c) 2003 Wasabi Systems, Inc.
@ -36,7 +36,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.28 2016/01/03 17:27:57 jdc Exp $"); __KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.29 2016/01/11 18:23:11 jdc Exp $");
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
@ -206,16 +206,16 @@ lmtemp_attach(device_t parent, device_t self, void *aux)
iic_acquire_bus(sc->sc_tag, I2C_F_POLL); iic_acquire_bus(sc->sc_tag, I2C_F_POLL);
/* Read temperature limit(s) and remember initial value(s). */ /* Read temperature limit(s) and remember initial value(s). */
if (lmtemp_temp_read(sc, LM75_REG_TOS_SET_POINT, &sc->sc_smax, 1)
!= 0) {
aprint_error_dev(self, "unable to read Tos register\n");
iic_release_bus(sc->sc_tag, I2C_F_POLL);
return;
}
sc->sc_tmax = sc->sc_smax;
if (i == lmtemp_lm77) { if (i == lmtemp_lm77) {
if (lmtemp_temp_read(sc, LM77_REG_TCRIT_SET_POINT,
&sc->sc_scrit, 1) != 0) {
aprint_error_dev(self,
"unable to read low register\n");
iic_release_bus(sc->sc_tag, I2C_F_POLL);
return;
}
if (lmtemp_temp_read(sc, LM77_REG_TLOW_SET_POINT, if (lmtemp_temp_read(sc, LM77_REG_TLOW_SET_POINT,
&sc->sc_smax, 1) != 0) { &sc->sc_smin, 1) != 0) {
aprint_error_dev(self, aprint_error_dev(self,
"unable to read low register\n"); "unable to read low register\n");
iic_release_bus(sc->sc_tag, I2C_F_POLL); iic_release_bus(sc->sc_tag, I2C_F_POLL);
@ -228,7 +228,15 @@ lmtemp_attach(device_t parent, device_t self, void *aux)
iic_release_bus(sc->sc_tag, I2C_F_POLL); iic_release_bus(sc->sc_tag, I2C_F_POLL);
return; return;
} }
} else { /* LM75 or compatible */
if (lmtemp_temp_read(sc, LM75_REG_TOS_SET_POINT,
&sc->sc_smax, 1) != 0) {
aprint_error_dev(self, "unable to read Tos register\n");
iic_release_bus(sc->sc_tag, I2C_F_POLL);
return;
}
} }
sc->sc_tmax = sc->sc_smax;
if (i == lmtemp_lm75) if (i == lmtemp_lm75)
lmtemp_setup_sysctl(sc); lmtemp_setup_sysctl(sc);
@ -349,12 +357,12 @@ lmtemp_getlim_lm75(struct sysmon_envsys *sme, envsys_data_t *edata,
*props &= ~(PROP_CRITMAX); *props &= ~(PROP_CRITMAX);
iic_acquire_bus(sc->sc_tag, I2C_F_POLL); iic_acquire_bus(sc->sc_tag, 0);
if (lmtemp_temp_read(sc, LM75_REG_TOS_SET_POINT, &val, 0) == 0) { if (lmtemp_temp_read(sc, LM75_REG_TOS_SET_POINT, &val, 0) == 0) {
limits->sel_critmax = val; limits->sel_critmax = val;
*props |= PROP_CRITMAX; *props |= PROP_CRITMAX;
} }
iic_release_bus(sc->sc_tag, I2C_F_POLL); iic_release_bus(sc->sc_tag, 0);
} }
static void static void
@ -366,7 +374,7 @@ lmtemp_getlim_lm77(struct sysmon_envsys *sme, envsys_data_t *edata,
*props &= ~(PROP_CRITMAX | PROP_WARNMAX | PROP_WARNMIN); *props &= ~(PROP_CRITMAX | PROP_WARNMAX | PROP_WARNMIN);
iic_acquire_bus(sc->sc_tag, I2C_F_POLL); iic_acquire_bus(sc->sc_tag, 0);
if (lmtemp_temp_read(sc, LM77_REG_TCRIT_SET_POINT, &val, 0) == 0) { if (lmtemp_temp_read(sc, LM77_REG_TCRIT_SET_POINT, &val, 0) == 0) {
limits->sel_critmax = val; limits->sel_critmax = val;
*props |= PROP_CRITMAX; *props |= PROP_CRITMAX;
@ -379,7 +387,7 @@ lmtemp_getlim_lm77(struct sysmon_envsys *sme, envsys_data_t *edata,
limits->sel_warnmin = val; limits->sel_warnmin = val;
*props |= PROP_WARNMIN; *props |= PROP_WARNMIN;
} }
iic_release_bus(sc->sc_tag, I2C_F_POLL); iic_release_bus(sc->sc_tag, 0);
} }
static void static void
@ -394,11 +402,11 @@ lmtemp_setlim_lm75(struct sysmon_envsys *sme, envsys_data_t *edata,
limit = sc->sc_smax; limit = sc->sc_smax;
else else
limit = limits->sel_critmax; limit = limits->sel_critmax;
iic_acquire_bus(sc->sc_tag, I2C_F_POLL); iic_acquire_bus(sc->sc_tag, 0);
lmtemp_temp_write(sc, LM75_REG_THYST_SET_POINT, lmtemp_temp_write(sc, LM75_REG_THYST_SET_POINT,
limit - 5000000, 0); limit - 5000000, 0);
lmtemp_temp_write(sc, LM75_REG_TOS_SET_POINT, limit, 0); lmtemp_temp_write(sc, LM75_REG_TOS_SET_POINT, limit, 0);
iic_release_bus(sc->sc_tag, I2C_F_POLL); iic_release_bus(sc->sc_tag, 0);
/* Synchronise sysctl */ /* Synchronise sysctl */
sc->sc_tmax = (limit - 273150000) / 1000000; sc->sc_tmax = (limit - 273150000) / 1000000;
@ -412,10 +420,10 @@ lmtemp_setlim_lm77(struct sysmon_envsys *sme, envsys_data_t *edata,
struct lmtemp_softc *sc = sme->sme_cookie; struct lmtemp_softc *sc = sme->sme_cookie;
int32_t limit; int32_t limit;
iic_acquire_bus(sc->sc_tag, I2C_F_POLL); iic_acquire_bus(sc->sc_tag, 0);
if (*props & PROP_CRITMAX) { if (*props & PROP_CRITMAX) {
if (limits == NULL) /* Restore defaults */ if (limits == NULL) /* Restore defaults */
limit = sc->sc_smax; limit = sc->sc_scrit;
else else
limit = limits->sel_critmax; limit = limits->sel_critmax;
lmtemp_temp_write(sc, LM77_REG_TCRIT_SET_POINT, limit, 0); lmtemp_temp_write(sc, LM77_REG_TCRIT_SET_POINT, limit, 0);
@ -429,12 +437,12 @@ lmtemp_setlim_lm77(struct sysmon_envsys *sme, envsys_data_t *edata,
} }
if (*props & PROP_WARNMIN) { if (*props & PROP_WARNMIN) {
if (limits == NULL) /* Restore defaults */ if (limits == NULL) /* Restore defaults */
limit = sc->sc_smax; limit = sc->sc_smin;
else else
limit = limits->sel_warnmin; limit = limits->sel_warnmin;
lmtemp_temp_write(sc, LM77_REG_TLOW_SET_POINT, limit, 0); lmtemp_temp_write(sc, LM77_REG_TLOW_SET_POINT, limit, 0);
} }
iic_release_bus(sc->sc_tag, I2C_F_POLL); iic_release_bus(sc->sc_tag, 0);
} }
static uint32_t static uint32_t