Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/ic Add support for the W83627HF: lm7x like, but with...
details: https://anonhg.NetBSD.org/src/rev/e835837499eb
branches: trunk
changeset: 495430:e835837499eb
user: bouyer <bouyer%NetBSD.org@localhost>
date: Thu Jul 27 21:49:22 2000 +0000
description:
Add support for the W83627HF: lm7x like, but with more sensors, and more
registers.
diffstat:
sys/dev/ic/nslm7x.c | 489 +++++++++++++++++++++++++++++++++++++-----------
sys/dev/ic/nslm7xvar.h | 42 +++-
2 files changed, 413 insertions(+), 118 deletions(-)
diffs (truncated from 683 to 300 lines):
diff -r 2075e790ac98 -r e835837499eb sys/dev/ic/nslm7x.c
--- a/sys/dev/ic/nslm7x.c Thu Jul 27 21:40:09 2000 +0000
+++ b/sys/dev/ic/nslm7x.c Thu Jul 27 21:49:22 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nslm7x.c,v 1.4 2000/06/24 00:37:19 thorpej Exp $ */
+/* $NetBSD: nslm7x.c,v 1.5 2000/07/27 21:49:22 bouyer Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
#endif
const struct envsys_range lm_ranges[] = { /* sc->sensors sub-intervals */
- /* for each unit type */
+ /* for each unit type */
{ 7, 7, ENVSYS_STEMP },
{ 8, 10, ENVSYS_SFANRPM },
{ 1, 0, ENVSYS_SVOLTS_AC }, /* None */
@@ -78,12 +78,33 @@
{ 1, 0, ENVSYS_SAMPS } /* None */
};
-
+
u_int8_t lm_readreg __P((struct lm_softc *, int));
void lm_writereg __P((struct lm_softc *, int, int));
+
+int lm_match __P((struct lm_softc *));
void lm_refresh_sensor_data __P((struct lm_softc *));
+
+int wb_match __P((struct lm_softc *));
+void wb_refresh_sensor_data __P((struct lm_softc *));
+
+int def_match __P((struct lm_softc *));
+void lm_common_match __P((struct lm_softc *));
+
int lm_gtredata __P((struct sysmon_envsys *, struct envsys_tre_data *));
int lm_streinfo __P((struct sysmon_envsys *, struct envsys_basic_info *));
+int wb_streinfo __P((struct sysmon_envsys *, struct envsys_basic_info *));
+
+struct lm_chip {
+ int (*chip_match) __P((struct lm_softc *));
+};
+
+struct lm_chip lm_chips[] = {
+ { lm_match},
+ { wb_match},
+ { def_match} /* Must be last */
+};
+
u_int8_t
lm_readreg(sc, reg)
@@ -147,17 +168,9 @@
{
int i;
- /* See if we have an LM78 or LM79 */
- i = lm_readreg(lmsc, LMD_CHIPID) & LM_ID_MASK;
- printf(": LM7");
- if (i == LM_ID_LM78)
- printf("8\n");
- else if (i == LM_ID_LM78J)
- printf("8J\n");
- else if (i == LM_ID_LM79)
- printf("9\n");
- else
- printf("? - Unknown chip ID (%x)\n", i);
+ for (i = 0; i < sizeof(lm_chips) / sizeof(lm_chips[0]); i++)
+ if (lm_chips[i].chip_match(lmsc))
+ break;
/* Start the monitoring loop */
lm_writereg(lmsc, LMD_CONFIG, 0x01);
@@ -166,45 +179,12 @@
timerclear(&lmsc->lastread);
/* Initialize sensors */
- for (i = 0; i < LM_NUM_SENSORS; ++i) {
+ for (i = 0; i < lmsc->numsensors; ++i) {
lmsc->sensors[i].sensor = lmsc->info[i].sensor = i;
lmsc->sensors[i].validflags = (ENVSYS_FVALID|ENVSYS_FCURVALID);
lmsc->info[i].validflags = ENVSYS_FVALID;
lmsc->sensors[i].warnflags = ENVSYS_WARN_OK;
}
-
- for (i = 0; i < 7; ++i) {
- lmsc->sensors[i].units = lmsc->info[i].units =
- ENVSYS_SVOLTS_DC;
-
- lmsc->info[i].desc[0] = 'I';
- lmsc->info[i].desc[1] = 'N';
- lmsc->info[i].desc[2] = i + '0';
- lmsc->info[i].desc[3] = 0;
- }
-
- /* default correction factors for resistors on higher voltage inputs */
- lmsc->info[0].rfact = lmsc->info[1].rfact =
- lmsc->info[2].rfact = 10000;
- lmsc->info[3].rfact = (int)(( 90.9 / 60.4) * 10000);
- lmsc->info[4].rfact = (int)(( 38.0 / 10.0) * 10000);
- lmsc->info[5].rfact = (int)((210.0 / 60.4) * 10000);
- lmsc->info[6].rfact = (int)(( 90.9 / 60.4) * 10000);
-
- lmsc->sensors[7].units = ENVSYS_STEMP;
- strcpy(lmsc->info[7].desc, "Temp");
-
- for (i = 8; i < 11; ++i) {
- lmsc->sensors[i].units = lmsc->info[i].units = ENVSYS_SFANRPM;
-
- lmsc->info[i].desc[0] = 'F';
- lmsc->info[i].desc[1] = 'a';
- lmsc->info[i].desc[2] = 'n';
- lmsc->info[i].desc[3] = ' ';
- lmsc->info[i].desc[4] = i - 7 + '0';
- lmsc->info[i].desc[5] = 0;
- }
-
/*
* Hook into the System Monitor.
*/
@@ -214,9 +194,9 @@
lmsc->sc_sysmon.sme_cookie = lmsc;
lmsc->sc_sysmon.sme_gtredata = lm_gtredata;
- lmsc->sc_sysmon.sme_streinfo = lm_streinfo;
+ /* sme_streinfo set in chip-specific attach */
- lmsc->sc_sysmon.sme_nsensors = LM_NUM_SENSORS;
+ lmsc->sc_sysmon.sme_nsensors = lmsc->numsensors;
lmsc->sc_sysmon.sme_envsys_version = 1000;
if (sysmon_envsys_register(&lmsc->sc_sysmon))
@@ -224,51 +204,239 @@
lmsc->sc_dev.dv_xname);
}
+int
+lm_match(sc)
+ struct lm_softc *sc;
+{
+ int i;
+
+ /* See if we have an LM78 or LM79 */
+ i = lm_readreg(sc, LMD_CHIPID) & LM_ID_MASK;
+ switch(i) {
+ case LM_ID_LM78:
+ printf(": LM78\n");
+ break;
+ case LM_ID_LM78J:
+ printf(": LM78J\n");
+ break;
+ case LM_ID_LM79:
+ printf(": LM79\n");
+ break;
+ default:
+ return 0;
+ }
+ lm_common_match(sc);
+ return 1;
+}
+
+int
+def_match(sc)
+ struct lm_softc *sc;
+{
+ int i;
+
+ i = lm_readreg(sc, LMD_CHIPID) & LM_ID_MASK;
+ printf(": Unknow chip (ID %d)\n", i);
+ lm_common_match(sc);
+ return 1;
+}
+
+void
+lm_common_match(sc)
+ struct lm_softc *sc;
+{
+ int i;
+ sc->numsensors = LM_NUM_SENSORS;
+ sc->refresh_sensor_data = lm_refresh_sensor_data;
+
+ for (i = 0; i < 7; ++i) {
+ sc->sensors[i].units = sc->info[i].units =
+ ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[i].desc, "IN %d", i);
+ }
+
+ /* default correction factors for resistors on higher voltage inputs */
+ sc->info[0].rfact = sc->info[1].rfact =
+ sc->info[2].rfact = 10000;
+ sc->info[3].rfact = (int)(( 90.9 / 60.4) * 10000);
+ sc->info[4].rfact = (int)(( 38.0 / 10.0) * 10000);
+ sc->info[5].rfact = (int)((210.0 / 60.4) * 10000);
+ sc->info[6].rfact = (int)(( 90.9 / 60.4) * 10000);
+
+ sc->sensors[7].units = ENVSYS_STEMP;
+ strcpy(sc->info[7].desc, "Temp");
+
+ for (i = 8; i < 11; ++i) {
+ sc->sensors[i].units = sc->info[i].units = ENVSYS_SFANRPM;
+ sprintf(sc->info[i].desc, "Fan %d", i - 7);
+ }
+ sc->sc_sysmon.sme_streinfo = lm_streinfo;
+}
+
+int
+wb_match(sc)
+ struct lm_softc *sc;
+{
+ int i, j;
+
+ /* See if we have a winbond */
+ i = lm_readreg(sc, LMD_CHIPID) & LM_ID_MASK;
+ lm_writereg(sc, WB_BANKSEL, WB_BANKSEL_HBAC);
+ j = lm_readreg(sc, WB_VENDID) << 8;
+ lm_writereg(sc, WB_BANKSEL, 0);
+ j |= lm_readreg(sc, WB_VENDID);
+ DPRINTF(("winbond vend id %d\n", j));
+ if (j != WB_VENDID_WINBOND)
+ return 0;
+ printf(": W83627HF (device ID %d)\n", i);
+ sc->numsensors = WB_NUM_SENSORS;
+ sc->refresh_sensor_data = wb_refresh_sensor_data;
+
+ sc->sensors[0].units = sc->info[0].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[0].desc, "VCORE A");
+ sc->info[0].rfact = 10000;
+ sc->sensors[1].units = sc->info[1].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[1].desc, "VCORE B");
+ sc->info[1].rfact = 10000;
+ sc->sensors[2].units = sc->info[2].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[2].desc, "+3.3V");
+ sc->info[2].rfact = 10000;
+ sc->sensors[3].units = sc->info[3].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[3].desc, "+5V");
+ sc->info[3].rfact = 16778;
+ sc->sensors[4].units = sc->info[4].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[4].desc, "+12V");
+ sc->info[4].rfact = 38000;
+ sc->sensors[5].units = sc->info[5].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[5].desc, "-12V");
+ sc->info[5].rfact = 10000;
+ sc->sensors[6].units = sc->info[6].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[6].desc, "-5V");
+ sc->info[6].rfact = 10000;
+ sc->sensors[7].units = sc->info[7].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[7].desc, "+5VSB");
+ sc->info[7].rfact = 15151;
+ sc->sensors[8].units = sc->info[8].units = ENVSYS_SVOLTS_DC;
+ sprintf(sc->info[8].desc, "VBAT");
+ sc->info[8].rfact = 10000;
+
+ sc->sensors[9].units = ENVSYS_STEMP;
+ strcpy(sc->info[9].desc, "Temp 1");
+ sc->sensors[10].units = ENVSYS_STEMP;
+ strcpy(sc->info[10].desc, "Temp 2");
+ sc->sensors[11].units = ENVSYS_STEMP;
+ strcpy(sc->info[11].desc, "Temp 3");
+
+ for (i = 12; i < 15; ++i) {
+ sc->sensors[i].units = sc->info[i].units = ENVSYS_SFANRPM;
+ sprintf(sc->info[i].desc, "Fan %d", i - 11);
+ }
+ sc->sc_sysmon.sme_streinfo = wb_streinfo;
+ return 1;
+}
int
lm_gtredata(sme, tred)
- struct sysmon_envsys *sme;
- struct envsys_tre_data *tred;
+ struct sysmon_envsys *sme;
+ struct envsys_tre_data *tred;
{
- static const struct timeval onepointfive = { 1, 500000 };
- struct timeval t;
- struct lm_softc *sc = sme->sme_cookie;
- int i, s;
+ static const struct timeval onepointfive = { 1, 500000 };
+ struct timeval t;
+ struct lm_softc *sc = sme->sme_cookie;
+ int i, s;
- /* read new values at most once every 1.5 seconds */
- timeradd(&sc->lastread, &onepointfive, &t);
- s = splclock();
- i = timercmp(&mono_time, &t, >);
- if (i) {
- sc->lastread.tv_sec = mono_time.tv_sec;
- sc->lastread.tv_usec = mono_time.tv_usec;
- }
- splx(s);
-
- if (i)
- lm_refresh_sensor_data(sc);
+ /* read new values at most once every 1.5 seconds */
+ timeradd(&sc->lastread, &onepointfive, &t);
+ s = splclock();
+ i = timercmp(&mono_time, &t, >);
Home |
Main Index |
Thread Index |
Old Index