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