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