Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/i2c Add direct config support for a few devices



details:   https://anonhg.NetBSD.org/src/rev/be2fd0d1d149
branches:  trunk
changeset: 752508:be2fd0d1d149
user:      martin <martin%NetBSD.org@localhost>
date:      Sun Feb 28 11:36:27 2010 +0000

description:
Add direct config support for a few devices

diffstat:

 sys/dev/i2c/adm1021.c |  31 ++++++++++++++++++-----
 sys/dev/i2c/lm75.c    |  67 ++++++++++++++++++++++++++++++++++++++------------
 sys/dev/i2c/spdmem.c  |  18 ++++++++++---
 3 files changed, 89 insertions(+), 27 deletions(-)

diffs (220 lines):

diff -r 6a7b3fa2d519 -r be2fd0d1d149 sys/dev/i2c/adm1021.c
--- a/sys/dev/i2c/adm1021.c     Sun Feb 28 11:35:40 2010 +0000
+++ b/sys/dev/i2c/adm1021.c     Sun Feb 28 11:36:27 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: adm1021.c,v 1.3 2009/06/05 12:42:43 hubertf Exp $ */
+/*     $NetBSD: adm1021.c,v 1.4 2010/02/28 11:36:27 martin Exp $ */
 /*     $OpenBSD: adm1021.c,v 1.27 2007/06/24 05:34:35 dlg Exp $        */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adm1021.c,v 1.3 2009/06/05 12:42:43 hubertf Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adm1021.c,v 1.4 2010/02/28 11:36:27 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -62,18 +62,35 @@
 CFATTACH_DECL_NEW(admtemp, sizeof(struct admtemp_softc),
        admtemp_match, admtemp_attach, NULL, NULL);
 
+static const char * admtemp_compats[] = {
+       "i2c-max1617",
+       NULL
+};
 
 int
 admtemp_match(device_t parent, cfdata_t match, void *aux)
 {
        struct i2c_attach_args *ia = aux;
 
-       if (((ia->ia_addr >= 0x18) && (ia->ia_addr <= 0x1a)) ||
-           ((ia->ia_addr >= 0x29) && (ia->ia_addr <= 0x2b)) ||
-           ((ia->ia_addr >= 0x4c) && (ia->ia_addr <= 0x4e)))
-               return (1);
+       if (ia->ia_name == NULL) {
+               /*
+                * Indirect config - not much we can do!
+                * Check typical addresses.
+                */
+               if (((ia->ia_addr >= 0x18) && (ia->ia_addr <= 0x1a)) ||
+                   ((ia->ia_addr >= 0x29) && (ia->ia_addr <= 0x2b)) ||
+                   ((ia->ia_addr >= 0x4c) && (ia->ia_addr <= 0x4e)))
+                       return (1);
+       } else {
+               /*
+                * Direct config - match via the list of compatible
+                * hardware.
+                */
+               if (iic_compat_match(ia, admtemp_compats))
+                       return 1;
+       }
 
-       return (0);
+       return 0;
 }
 
 
diff -r 6a7b3fa2d519 -r be2fd0d1d149 sys/dev/i2c/lm75.c
--- a/sys/dev/i2c/lm75.c        Sun Feb 28 11:35:40 2010 +0000
+++ b/sys/dev/i2c/lm75.c        Sun Feb 28 11:36:27 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lm75.c,v 1.20 2009/01/09 17:20:31 briggs Exp $ */
+/*     $NetBSD: lm75.c,v 1.21 2010/02/28 11:36:27 martin Exp $ */
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.20 2009/01/09 17:20:31 briggs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.21 2010/02/28 11:36:27 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -71,6 +71,16 @@
 static uint32_t lmtemp_decode_ds75(const uint8_t *);
 static uint32_t lmtemp_decode_lm77(const uint8_t *);
 
+
+static const char * lmtemp_compats[] = {
+       "i2c-lm75",
+       /*
+        * see XXX in _attach() below: add code once non-lm75 matches are
+        * added here!
+        */
+       NULL
+};
+
 enum {
        lmtemp_lm75 = 0,
        lmtemp_ds75,
@@ -100,15 +110,28 @@
        struct i2c_attach_args *ia = aux;
        int i;
 
-       for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
-               if (lmtemptbl[i].lmtemp_type == cf->cf_flags)
-                       break;
-       if (lmtemptbl[i].lmtemp_type == -1)
-               return 0;
+       if (ia->ia_name == NULL) {
+               /*
+                * Indirect config - not much we can do!
+                */
+               for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
+                       if (lmtemptbl[i].lmtemp_type == cf->cf_flags)
+                               break;
+               if (lmtemptbl[i].lmtemp_type == -1)
+                       return 0;
 
-       if ((ia->ia_addr & lmtemptbl[i].lmtemp_addrmask) ==
-           lmtemptbl[i].lmtemp_addr)
-               return 1;
+               if ((ia->ia_addr & lmtemptbl[i].lmtemp_addrmask) ==
+                   lmtemptbl[i].lmtemp_addr)
+                       return 1;
+       } else {
+               /*
+                * Direct config - match via the list of compatible
+                * hardware.
+                */
+               if (iic_compat_match(ia, lmtemp_compats))
+                       return 1;
+       }
+
 
        return 0;
 }
@@ -120,16 +143,27 @@
        struct i2c_attach_args *ia = aux;
        int i;
 
-       for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
-               if (lmtemptbl[i].lmtemp_type ==
-                   device_cfdata(self)->cf_flags)
-                       break;
+       if (ia->ia_name == NULL) {
+               for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
+                       if (lmtemptbl[i].lmtemp_type ==
+                           device_cfdata(self)->cf_flags)
+                               break;
+       } else {
+               /* XXX - add code when adding other direct matches! */
+               i = 0;
+       }
 
        sc->sc_tag = ia->ia_tag;
        sc->sc_address = ia->ia_addr;
 
        aprint_naive(": Temperature Sensor\n");
-       aprint_normal(": %s Temperature Sensor\n", lmtemptbl[i].lmtemp_name);
+       if (ia->ia_name) {
+               aprint_normal(": %s %s Temperature Sensor\n", ia->ia_name,
+                       lmtemptbl[i].lmtemp_name);
+       } else {
+               aprint_normal(": %s Temperature Sensor\n",
+                       lmtemptbl[i].lmtemp_name);
+       }
 
        /* Set the configuration of the LM75 to defaults. */
        iic_acquire_bus(sc->sc_tag, I2C_F_POLL);
@@ -143,7 +177,8 @@
        sc->sc_sme = sysmon_envsys_create();
        /* Initialize sensor data. */
        sc->sc_sensor.units =  ENVSYS_STEMP;
-       (void)strlcpy(sc->sc_sensor.desc, device_xname(self),
+       (void)strlcpy(sc->sc_sensor.desc,
+           ia->ia_name? ia->ia_name : device_xname(self),
            sizeof(sc->sc_sensor.desc));
        if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor)) {
                sysmon_envsys_destroy(sc->sc_sme);
diff -r 6a7b3fa2d519 -r be2fd0d1d149 sys/dev/i2c/spdmem.c
--- a/sys/dev/i2c/spdmem.c      Sun Feb 28 11:35:40 2010 +0000
+++ b/sys/dev/i2c/spdmem.c      Sun Feb 28 11:36:27 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: spdmem.c,v 1.16 2010/02/23 00:13:06 pgoyette Exp $ */
+/* $NetBSD: spdmem.c,v 1.17 2010/02/28 11:36:27 martin Exp $ */
 
 /*
  * Copyright (c) 2007 Nicolas Joly
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.16 2010/02/23 00:13:06 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.17 2010/02/28 11:36:27 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -155,6 +155,7 @@
        }
        return (crc & 0xFFFF);
 }
+
 static int
 spdmem_match(device_t parent, cfdata_t match, void *aux)
 {
@@ -165,8 +166,17 @@
        int spd_len, spd_crc_cover;
        uint16_t crc_calc, crc_spd;
 
-       if ((ia->ia_addr & SPDMEM_ADDRMASK) != SPDMEM_ADDR)
-               return 0;
+       if (ia->ia_name) {
+               /* add other names as we find more firmware variations */
+               if (strcmp(ia->ia_name, "dimm-spd"))
+                       return 0;
+       }
+
+       /* only do this lame test when not using direct config */
+       if (ia->ia_name == NULL) {
+               if ((ia->ia_addr & SPDMEM_ADDRMASK) != SPDMEM_ADDR)
+                       return 0;
+       }
 
        sc.sc_tag = ia->ia_tag;
        sc.sc_addr = ia->ia_addr;



Home | Main Index | Thread Index | Old Index