Module Name: src
Committed By: christos
Date: Mon Nov 2 21:37:44 UTC 2009
Modified Files:
src/sys/dev/i2c: dbcool.c dbcool_var.h
Log Message:
don't pull a 1.5K softc on the stack to do a chip ident. Idea from mrg.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/i2c/dbcool.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/i2c/dbcool_var.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/i2c/dbcool.c
diff -u src/sys/dev/i2c/dbcool.c:1.12 src/sys/dev/i2c/dbcool.c:1.13
--- src/sys/dev/i2c/dbcool.c:1.12 Mon Jun 1 16:08:44 2009
+++ src/sys/dev/i2c/dbcool.c Mon Nov 2 16:37:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: dbcool.c,v 1.12 2009/06/01 20:08:44 pgoyette Exp $ */
+/* $NetBSD: dbcool.c,v 1.13 2009/11/02 21:37:44 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -49,7 +49,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dbcool.c,v 1.12 2009/06/01 20:08:44 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dbcool.c,v 1.13 2009/11/02 21:37:44 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -588,17 +588,17 @@
dbcool_match(device_t parent, cfdata_t cf, void *aux)
{
struct i2c_attach_args *ia = aux;
- struct dbcool_softc sc;
- sc.sc_tag = ia->ia_tag;
- sc.sc_addr = ia->ia_addr;
- sc.sc_chip = NULL;
- sc.sc_readreg = dbcool_readreg;
- sc.sc_writereg = dbcool_writereg;
+ struct dbcool_chipset dc;
+ dc.dc_tag = ia->ia_tag;
+ dc.dc_addr = ia->ia_addr;
+ dc.dc_chip = NULL;
+ dc.dc_readreg = dbcool_readreg;
+ dc.dc_writereg = dbcool_writereg;
/* no probing if we attach to iic, but verify chip id and address */
if ((ia->ia_addr & DBCOOL_ADDRMASK) != DBCOOL_ADDR)
return 0;
- if (dbcool_chip_ident(&sc) >= 0)
+ if (dbcool_chip_ident(&dc) >= 0)
return 1;
return 0;
@@ -611,25 +611,25 @@
struct i2c_attach_args *args = aux;
uint8_t ver;
- sc->sc_addr = args->ia_addr;
- sc->sc_tag = args->ia_tag;
+ sc->sc_dc.dc_addr = args->ia_addr;
+ sc->sc_dc.dc_tag = args->ia_tag;
+ sc->sc_dc.dc_chip = NULL;
+ sc->sc_dc.dc_readreg = dbcool_readreg;
+ sc->sc_dc.dc_writereg = dbcool_writereg;
+ (void)dbcool_chip_ident(&sc->sc_dc);
sc->sc_dev = self;
- sc->sc_readreg = dbcool_readreg;
- sc->sc_writereg = dbcool_writereg;
- sc->sc_chip = NULL;
- (void)dbcool_chip_ident(sc);
aprint_naive("\n");
aprint_normal("\n");
- ver = sc->sc_readreg(sc, DBCOOL_REVISION_REG);
- if (sc->sc_chip->flags & DBCFLAG_4BIT_VER)
+ ver = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_REVISION_REG);
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_4BIT_VER)
aprint_normal_dev(self, "%s dBCool(tm) Controller "
- "(rev 0x%02x, stepping 0x%02x)\n", sc->sc_chip->name,
+ "(rev 0x%02x, stepping 0x%02x)\n", sc->sc_dc.dc_chip->name,
ver >> 4, ver & 0x0f);
else
aprint_normal_dev(self, "%s dBCool(tm) Controller "
- "(rev 0x%04x)\n", sc->sc_chip->name, ver);
+ "(rev 0x%04x)\n", sc->sc_dc.dc_chip->name, ver);
dbcool_setup(self);
@@ -653,20 +653,20 @@
struct dbcool_softc *sc = device_private(dev);
uint8_t reg, bit, cfg;
- if ((sc->sc_chip->flags && DBCFLAG_HAS_SHDN) == 0)
+ if ((sc->sc_dc.dc_chip->flags && DBCFLAG_HAS_SHDN) == 0)
return true;
- if (sc->sc_chip->flags && DBCFLAG_ADT7466) {
+ if (sc->sc_dc.dc_chip->flags && DBCFLAG_ADT7466) {
reg = DBCOOL_ADT7466_CONFIG2;
bit = DBCOOL_ADT7466_CFG2_SHDN;
} else {
reg = DBCOOL_CONFIG2_REG;
bit = DBCOOL_CFG2_SHDN;
}
- cfg = sc->sc_readreg(sc, reg);
+ cfg = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
sc->sc_suspend = cfg & bit;
cfg |= bit;
- sc->sc_writereg(sc, reg, cfg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, reg, cfg);
return true;
}
@@ -677,56 +677,55 @@
struct dbcool_softc *sc = device_private(dev);
uint8_t reg, bit, cfg;
- if ((sc->sc_chip->flags && DBCFLAG_HAS_SHDN) == 0)
+ if ((sc->sc_dc.dc_chip->flags && DBCFLAG_HAS_SHDN) == 0)
return true;
- if (sc->sc_chip->flags && DBCFLAG_ADT7466) {
+ if (sc->sc_dc.dc_chip->flags && DBCFLAG_ADT7466) {
reg = DBCOOL_ADT7466_CONFIG2;
bit = DBCOOL_ADT7466_CFG2_SHDN;
} else {
reg = DBCOOL_CONFIG2_REG;
bit = DBCOOL_CFG2_SHDN;
}
- cfg = sc->sc_readreg(sc, reg);
+ cfg = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
cfg &= ~sc->sc_suspend;
- sc->sc_writereg(sc, reg, cfg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, reg, cfg);
return true;
}
uint8_t
-dbcool_readreg(struct dbcool_softc *sc, uint8_t reg)
+dbcool_readreg(struct dbcool_chipset *dc, uint8_t reg)
{
uint8_t data = 0;
- if (iic_acquire_bus(sc->sc_tag, 0) != 0)
+ if (iic_acquire_bus(dc->dc_tag, 0) != 0)
return data;
- if ( sc->sc_chip == NULL || sc->sc_chip->flags & DBCFLAG_ADM1027) {
+ if (dc->dc_chip == NULL || dc->dc_chip->flags & DBCFLAG_ADM1027) {
/* ADM1027 doesn't support i2c read_byte protocol */
- if (iic_smbus_send_byte(sc->sc_tag, sc->sc_addr, reg, 0) != 0)
+ if (iic_smbus_send_byte(dc->dc_tag, dc->dc_addr, reg, 0) != 0)
goto bad;
- (void)iic_smbus_receive_byte(sc->sc_tag, sc->sc_addr, &data, 0);
+ (void)iic_smbus_receive_byte(dc->dc_tag, dc->dc_addr, &data, 0);
} else
- (void)iic_smbus_read_byte(sc->sc_tag, sc->sc_addr, reg, &data,
+ (void)iic_smbus_read_byte(dc->dc_tag, dc->dc_addr, reg, &data,
0);
bad:
- iic_release_bus(sc->sc_tag, 0);
+ iic_release_bus(dc->dc_tag, 0);
return data;
}
void
-dbcool_writereg(struct dbcool_softc *sc, uint8_t reg, uint8_t val)
+dbcool_writereg(struct dbcool_chipset *dc, uint8_t reg, uint8_t val)
{
- if (iic_acquire_bus(sc->sc_tag, 0) != 0)
+ if (iic_acquire_bus(dc->dc_tag, 0) != 0)
return;
- (void)iic_smbus_write_byte(sc->sc_tag, sc->sc_addr, reg, val, 0);
+ (void)iic_smbus_write_byte(dc->dc_tag, dc->dc_addr, reg, val, 0);
- iic_release_bus(sc->sc_tag, 0);
- return;
+ iic_release_bus(dc->dc_tag, 0);
}
static bool
@@ -734,15 +733,15 @@
{
uint8_t cfg_reg;
- if (sc->sc_chip->flags & DBCFLAG_ADM1030)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030)
return 0;
- if (sc->sc_chip->flags & DBCFLAG_ADT7466)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADT7466)
cfg_reg = DBCOOL_ADT7466_CONFIG1;
else
cfg_reg = DBCOOL_CONFIG1_REG;
- if (sc->sc_readreg(sc, cfg_reg) & DBCOOL_CFG1_LOCK)
+ if (sc->sc_dc.dc_readreg(&sc->sc_dc, cfg_reg) & DBCOOL_CFG1_LOCK)
return 1;
else
return 0;
@@ -754,35 +753,35 @@
uint8_t t1, t2, t3, val, ext = 0;
int temp;
- if (sc->sc_chip->flags & DBCFLAG_ADT7466) {
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADT7466) {
/*
* ADT7466 temps are in strange location
*/
- ext = sc->sc_readreg(sc, DBCOOL_ADT7466_CONFIG1);
- val = sc->sc_readreg(sc, reg);
+ ext = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_ADT7466_CONFIG1);
+ val = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
if (extres)
- ext = sc->sc_readreg(sc, reg + 1);
- } else if (sc->sc_chip->flags & DBCFLAG_ADM1030) {
+ ext = sc->sc_dc.dc_readreg(&sc->sc_dc, reg + 1);
+ } else if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030) {
/*
* ADM1030 temps are in their own special place, too
*/
if (extres) {
- ext = sc->sc_readreg(sc, DBCOOL_ADM1030_TEMP_EXTRES);
+ ext = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_ADM1030_TEMP_EXTRES);
if (reg == DBCOOL_ADM1030_L_TEMP)
ext >>= 6;
else
ext >>= 1;
ext &= 0x03;
}
- val = sc->sc_readreg(sc, reg);
+ val = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
} else if (extres) {
- ext = sc->sc_readreg(sc, DBCOOL_EXTRES2_REG);
+ ext = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_EXTRES2_REG);
/* Read all msb regs to unlatch them */
- t1 = sc->sc_readreg(sc, DBCOOL_12VIN);
- t1 = sc->sc_readreg(sc, DBCOOL_REMOTE1_TEMP);
- t2 = sc->sc_readreg(sc, DBCOOL_REMOTE2_TEMP);
- t3 = sc->sc_readreg(sc, DBCOOL_LOCAL_TEMP);
+ t1 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_12VIN);
+ t1 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_REMOTE1_TEMP);
+ t2 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_REMOTE2_TEMP);
+ t3 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_LOCAL_TEMP);
switch (reg) {
case DBCOOL_REMOTE1_TEMP:
val = t1;
@@ -803,7 +802,7 @@
ext &= 0x03;
}
else
- val = sc->sc_readreg(sc, reg);
+ val = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
/* Check for invalid temp values */
if ((sc->sc_temp_offset == 0 && val == 0x80) ||
@@ -831,30 +830,30 @@
int rpm;
uint8_t rpm_lo, rpm_hi;
- rpm_lo = sc->sc_readreg(sc, reg);
- if (sc->sc_chip->flags & DBCFLAG_ADM1030)
+ rpm_lo = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030)
rpm_hi = (rpm_lo == 0xff)?0xff:0x0;
else
- rpm_hi = sc->sc_readreg(sc, reg + 1);
+ rpm_hi = sc->sc_dc.dc_readreg(&sc->sc_dc, reg + 1);
rpm = (rpm_hi << 8) | rpm_lo;
if (rpm == 0xffff)
return 0; /* 0xffff indicates stalled/failed fan */
- return (sc->sc_chip->rpm_dividend / rpm);
+ return (sc->sc_dc.dc_chip->rpm_dividend / rpm);
}
/* Provide chip's supply voltage, in microvolts */
static int
dbcool_supply_voltage(struct dbcool_softc *sc)
{
- if (sc->sc_chip->flags & DBCFLAG_MULTI_VCC) {
- if (sc->sc_readreg(sc, DBCOOL_CONFIG1_REG) & DBCOOL_CFG1_Vcc)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_MULTI_VCC) {
+ if (sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_CONFIG1_REG) & DBCOOL_CFG1_Vcc)
return 5002500;
else
return 3300000;
- } else if (sc->sc_chip->flags & DBCFLAG_ADT7466) {
- if (sc->sc_readreg(sc, DBCOOL_ADT7466_CONFIG1) &
+ } else if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADT7466) {
+ if (sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_ADT7466_CONFIG1) &
DBCOOL_ADT7466_CFG1_Vcc)
return 5000000;
else
@@ -878,8 +877,8 @@
nom = sc->sc_supply_voltage;
/* ADT7466 voltages are in strange locations with only 8-bits */
- if (sc->sc_chip->flags & DBCFLAG_ADT7466)
- val = sc->sc_readreg(sc, reg);
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADT7466)
+ val = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
else
/*
* It's a "normal" dbCool chip - check for regs that
@@ -887,15 +886,15 @@
* read all the MSB registers to unlatch them.
*/
if (!extres)
- val = sc->sc_readreg(sc, reg);
+ val = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
else if (reg == DBCOOL_12VIN) {
- ext = sc->sc_readreg(sc, DBCOOL_EXTRES2_REG) && 0x03;
- val = sc->sc_readreg(sc, reg);
+ ext = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_EXTRES2_REG) && 0x03;
+ val = sc->sc_dc.dc_readreg(&sc->sc_dc, reg);
(void)dbcool_read_temp(sc, DBCOOL_LOCAL_TEMP, true);
} else if (reg == DBCOOL_VTT || reg == DBCOOL_IMON) {
- ext = sc->sc_readreg(sc, DBCOOL_EXTRES_VTT_IMON);
- v1 = sc->sc_readreg(sc, DBCOOL_IMON);
- v2 = sc->sc_readreg(sc, DBCOOL_VTT);
+ ext = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_EXTRES_VTT_IMON);
+ v1 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_IMON);
+ v2 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_VTT);
if (reg == DBCOOL_IMON) {
val = v1;
ext >>= 6;
@@ -904,11 +903,11 @@
ext >>= 4;
ext &= 0x0f;
} else {
- ext = sc->sc_readreg(sc, DBCOOL_EXTRES1_REG);
- v1 = sc->sc_readreg(sc, DBCOOL_25VIN);
- v2 = sc->sc_readreg(sc, DBCOOL_VCCP);
- v3 = sc->sc_readreg(sc, DBCOOL_VCC);
- v4 = sc->sc_readreg(sc, DBCOOL_5VIN);
+ ext = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_EXTRES1_REG);
+ v1 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_25VIN);
+ v2 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_VCCP);
+ v3 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_VCC);
+ v4 = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_5VIN);
switch (reg) {
case DBCOOL_25VIN:
@@ -968,10 +967,10 @@
chipreg = node.sysctl_num & 0xff;
if (sc->sc_temp_offset) {
- reg = sc->sc_readreg(sc, chipreg);
+ reg = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
reg -= sc->sc_temp_offset;
} else
- reg = (int8_t)sc->sc_readreg(sc, chipreg);
+ reg = (int8_t)sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
node.sysctl_data = ®
error = sysctl_lookup(SYSCTLFN_CALL(&node));
@@ -986,7 +985,7 @@
newreg = *(int *)node.sysctl_data;
newreg += sc->sc_temp_offset;
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
@@ -1002,7 +1001,7 @@
sc = (struct dbcool_softc *)node.sysctl_data;
chipreg = node.sysctl_num & 0xff;
- oldreg = (int8_t)sc->sc_readreg(sc, chipreg);
+ oldreg = (int8_t)sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
reg = (oldreg >> 1) & ~0x03;
node.sysctl_data = ®
@@ -1019,7 +1018,7 @@
newreg &= ~0x03;
newreg <<= 1;
newreg |= (oldreg & 0x07);
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
@@ -1035,7 +1034,7 @@
sc = (struct dbcool_softc *)node.sysctl_data;
chipreg = node.sysctl_num & 0xff;
- oldreg = (int8_t)sc->sc_readreg(sc, chipreg);
+ oldreg = (int8_t)sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
reg = oldreg & 0x07;
node.sysctl_data = ®
@@ -1061,7 +1060,7 @@
return EINVAL;
newreg |= (oldreg & ~0x07);
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
@@ -1077,9 +1076,9 @@
sc = (struct dbcool_softc *)node.sysctl_data;
chipreg = node.sysctl_num & 0xff;
- oldreg = sc->sc_readreg(sc, chipreg);
+ oldreg = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
reg = (uint32_t)oldreg;
- if (sc->sc_chip->flags & DBCFLAG_ADM1030)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030)
reg = ((reg & 0x0f) * 100) / 15;
else
reg = (reg * 100) / 255;
@@ -1093,12 +1092,12 @@
if (*(int *)node.sysctl_data < 0 || *(int *)node.sysctl_data > 100)
return EINVAL;
- if (sc->sc_chip->flags & DBCFLAG_ADM1030) {
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030) {
newreg = *(uint8_t *)(node.sysctl_data) * 15 / 100;
newreg |= oldreg & 0xf0;
} else
newreg = *(uint8_t *)(node.sysctl_data) * 255 / 100;
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
@@ -1114,10 +1113,10 @@
sc = (struct dbcool_softc *)node.sysctl_data;
chipreg = node.sysctl_num & 0xff;
- oldreg = sc->sc_readreg(sc, chipreg);
+ oldreg = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
- if (sc->sc_chip->flags & DBCFLAG_ADM1030) {
- if ((sc->sc_readreg(sc, DBCOOL_ADM1030_CFG2) & 1) == 0)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030) {
+ if ((sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_ADM1030_CFG2) & 1) == 0)
reg = 4;
else if ((oldreg & 0x80) == 0)
reg = 7;
@@ -1143,16 +1142,16 @@
if (i >= __arraycount(behavior))
return EINVAL;
- if (sc->sc_chip->flags & DBCFLAG_ADM1030) {
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030) {
/*
* ADM1030 splits fan controller behavior across two
* registers. We also do not support Auto-Filter mode
* nor do we support Manual-RPM-feedback.
*/
if (newreg == 4) {
- oldreg = sc->sc_readreg(sc, DBCOOL_ADM1030_CFG2);
+ oldreg = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_ADM1030_CFG2);
oldreg &= ~0x01;
- sc->sc_writereg(sc, DBCOOL_ADM1030_CFG2, oldreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, DBCOOL_ADM1030_CFG2, oldreg);
} else {
if (newreg == 0)
newreg = 4;
@@ -1164,13 +1163,13 @@
return EINVAL;
newreg <<= 5;
newreg |= (oldreg & 0x1f);
- sc->sc_writereg(sc, chipreg, newreg);
- oldreg = sc->sc_readreg(sc, DBCOOL_ADM1030_CFG2) | 1;
- sc->sc_writereg(sc, DBCOOL_ADM1030_CFG2, oldreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
+ oldreg = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_ADM1030_CFG2) | 1;
+ sc->sc_dc.dc_writereg(&sc->sc_dc, DBCOOL_ADM1030_CFG2, oldreg);
}
} else {
- newreg = (sc->sc_readreg(sc, chipreg) & 0x1f) | (i << 5);
- sc->sc_writereg(sc, chipreg, newreg);
+ newreg = (sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg) & 0x1f) | (i << 5);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
}
return 0;
}
@@ -1188,7 +1187,7 @@
sc = (struct dbcool_softc *)node.sysctl_data;
chipreg = node.sysctl_num & 0xff;
- reg = (sc->sc_readreg(sc, chipreg) >> 4) & 0x0f;
+ reg = (sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg) >> 4) & 0x0f;
node.sysctl_data = ®
error = sysctl_lookup(SYSCTLFN_CALL(&node));
@@ -1199,9 +1198,9 @@
if (*(int *)node.sysctl_data < 0 || *(int *)node.sysctl_data > 0x0f)
return EINVAL;
- newreg = (sc->sc_readreg(sc, chipreg) & 0x0f) |
+ newreg = (sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg) & 0x0f) |
(*(int *)node.sysctl_data << 4);
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
@@ -1223,14 +1222,14 @@
* Retrieve the nominal value for the voltage sensor
*/
sensor_index = (node.sysctl_num >> 8 ) & 0xff;
- nom = nominal_voltages[sc->sc_chip->table[sensor_index].nom_volt_index];
+ nom = nominal_voltages[sc->sc_dc.dc_chip->table[sensor_index].nom_volt_index];
if (nom < 0)
nom = dbcool_supply_voltage(sc);
/*
* Use int64_t for calculation to avoid overflow
*/
- val = sc->sc_readreg(sc, chipreg);
+ val = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
val *= nom;
val /= 0xc0; /* values are scaled so 0xc0 == nominal voltage */
reg = val;
@@ -1253,7 +1252,7 @@
return EINVAL;
newreg = newval;
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
@@ -1271,10 +1270,10 @@
/* If using offset mode, adjust, else treat as signed */
if (sc->sc_temp_offset) {
- reg = sc->sc_readreg(sc, chipreg);
+ reg = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
reg -= sc->sc_temp_offset;
} else
- reg = (int8_t)sc->sc_readreg(sc, chipreg);
+ reg = (int8_t)sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
node.sysctl_data = ®
error = sysctl_lookup(SYSCTLFN_CALL(&node));
@@ -1287,7 +1286,7 @@
if (newtemp < 0 || newtemp > 0xff)
return EINVAL;
- sc->sc_writereg(sc, chipreg, newtemp);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newtemp);
return 0;
}
@@ -1323,7 +1322,7 @@
if (newrpm == 0 || newrpm == -1)
newrpm = 0xffff;
else {
- if (sc->sc_chip->flags & DBCFLAG_ADM1030)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030)
dividend = 11250 * 60;
else
dividend = 90000 * 60;
@@ -1334,9 +1333,9 @@
/* Update the on-chip registers with new value */
newreg = newrpm & 0xff;
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
newreg = (newrpm >> 8) & 0xff;
- sc->sc_writereg(sc, chipreg + 1, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg + 1, newreg);
return 0;
}
@@ -1353,8 +1352,8 @@
chipreg = node.sysctl_num;
/* retrieve 5- or 6-bit value */
- newreg = sc->sc_readreg(sc, chipreg);
- if ((sc->sc_chip->flags & DBCFLAG_HAS_VID_SEL) &&
+ newreg = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
+ if ((sc->sc_dc.dc_chip->flags & DBCFLAG_HAS_VID_SEL) &&
(reg & 0x80))
reg = newreg & 0x3f;
else
@@ -1383,7 +1382,7 @@
chipreg = node.sysctl_num & 0x7f;
/* retrieve 4-bit value */
- newreg = sc->sc_readreg(sc, chipreg);
+ newreg = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
if ((node.sysctl_num & 0x80) == 0)
reg = newreg >> 4;
else
@@ -1409,7 +1408,7 @@
newreg &= 0xf0;
newreg |= newhyst;
}
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
@@ -1459,7 +1458,7 @@
sc = (struct dbcool_softc *)node.sysctl_data;
chipreg = sc->sc_user_reg;
- reg = sc->sc_readreg(sc, chipreg);
+ reg = sc->sc_dc.dc_readreg(&sc->sc_dc, chipreg);
node.sysctl_data = ®
error = sysctl_lookup(SYSCTLFN_CALL(&node));
@@ -1467,7 +1466,7 @@
return error;
newreg = *(int *)node.sysctl_data;
- sc->sc_writereg(sc, chipreg, newreg);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, chipreg, newreg);
return 0;
}
#endif /* DBCOOL_DEBUG */
@@ -1492,13 +1491,13 @@
* by default. On these models, config register 5 bit 0 can be set
* to 1 for compatability with other chips that report 2s complement.
*/
- if (sc->sc_chip->flags & DBCFLAG_ADT7466) {
- if (sc->sc_readreg(sc, DBCOOL_ADT7466_CONFIG1) & 0x80)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADT7466) {
+ if (sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_ADT7466_CONFIG1) & 0x80)
sc->sc_temp_offset = 64;
else
sc->sc_temp_offset = 0;
- } else if (sc->sc_chip->flags & DBCFLAG_TEMPOFFSET) {
- if (sc->sc_readreg(sc, DBCOOL_CONFIG5_REG) &
+ } else if (sc->sc_dc.dc_chip->flags & DBCFLAG_TEMPOFFSET) {
+ if (sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_CONFIG5_REG) &
DBCOOL_CFG5_TWOSCOMP)
sc->sc_temp_offset = 0;
else
@@ -1519,7 +1518,7 @@
CTLTYPE_NODE, device_xname(self), NULL,
NULL, 0, NULL, 0,
CTL_HW, CTL_CREATE, CTL_EOL);
- if (sc->sc_chip->flags & DBCFLAG_HAS_VID) {
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_HAS_VID) {
ret = sysctl_createv(NULL, 0, NULL,
(const struct sysctlnode **)&node,
CTLFLAG_READONLY, CTLTYPE_INT, "CPU_VID_bits", NULL,
@@ -1555,22 +1554,22 @@
goto out;
/* If supported, create sysctl tree for fan PWM controllers */
- if (sc->sc_chip->power != NULL)
+ if (sc->sc_dc.dc_chip->power != NULL)
dbcool_setup_controllers(sc, me, rw_flag, ro_flag);
/*
* Read and rewrite config register to activate device
*/
- if (sc->sc_chip->flags & DBCFLAG_ADM1030)
+ if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADM1030)
cfg_reg = DBCOOL_ADM1030_CFG1;
- else if (sc->sc_chip->flags & DBCFLAG_ADT7466)
+ else if (sc->sc_dc.dc_chip->flags & DBCFLAG_ADT7466)
cfg_reg = DBCOOL_ADT7466_CONFIG1;
else
cfg_reg = DBCOOL_CONFIG1_REG;
- cfg_val = sc->sc_readreg(sc, DBCOOL_CONFIG1_REG);
+ cfg_val = sc->sc_dc.dc_readreg(&sc->sc_dc, DBCOOL_CONFIG1_REG);
if ((cfg_val & DBCOOL_CFG1_START) == 0) {
cfg_val |= DBCOOL_CFG1_START;
- sc->sc_writereg(sc, cfg_reg, cfg_val);
+ sc->sc_dc.dc_writereg(&sc->sc_dc, cfg_reg, cfg_val);
}
if (dbcool_islocked(sc))
aprint_normal_dev(self, "configuration locked\n");
@@ -1602,13 +1601,13 @@
int sysctl_index, sysctl_num;
char name[SYSCTL_NAMELEN];
- for (i=0; sc->sc_chip->table[i].type != DBC_EOF; i++) {
+ for (i=0; sc->sc_dc.dc_chip->table[i].type != DBC_EOF; i++) {
if (i >= DBCOOL_MAXSENSORS &&
- sc->sc_chip->table[i].type != DBC_CTL) {
+ sc->sc_dc.dc_chip->table[i].type != DBC_CTL) {
aprint_normal_dev(sc->sc_dev, "chip table too big!\n");
break;
}
- switch (sc->sc_chip->table[i].type) {
+ switch (sc->sc_dc.dc_chip->table[i].type) {
case DBC_TEMP:
sc->sc_sensor[i].units = ENVSYS_STEMP;
error = dbcool_attach_sensor(sc, me, i,
@@ -1632,18 +1631,18 @@
sysctl_num = -1;
for (j = 0; j < i; j++) {
if (j > DBCOOL_MAXSENSORS ||
- sc->sc_chip->table[j].type != DBC_TEMP)
+ sc->sc_dc.dc_chip->table[j].type != DBC_TEMP)
continue;
- if (sc->sc_chip->table[j].name_index ==
- sc->sc_chip->table[i].name_index) {
+ if (sc->sc_dc.dc_chip->table[j].name_index ==
+ sc->sc_dc.dc_chip->table[i].name_index) {
sysctl_num = sc->sc_sysctl_num[j];
break;
}
}
if (sysctl_num == -1)
break;
- sysctl_index = sc->sc_chip->table[i].sysctl_index;
- sysctl_reg = sc->sc_chip->table[i].reg.val_reg;
+ sysctl_index = sc->sc_dc.dc_chip->table[i].sysctl_index;
+ sysctl_reg = sc->sc_dc.dc_chip->table[i].reg.val_reg;
strlcpy(name, dbc_sysctl_table[sysctl_index].name,
sizeof(name));
ret = sysctl_createv(NULL, 0, NULL,
@@ -1662,7 +1661,7 @@
default:
aprint_error_dev(sc->sc_dev,
"sensor_table index %d has bad type %d\n",
- i, sc->sc_chip->table[i].type);
+ i, sc->sc_dc.dc_chip->table[i].type);
break;
}
if (error)
@@ -1682,11 +1681,11 @@
int ret;
int error = 0;
- name_index = sc->sc_chip->table[idx].name_index;
+ name_index = sc->sc_dc.dc_chip->table[idx].name_index;
strlcpy(sc->sc_sensor[idx].desc, dbc_sensor_names[name_index],
sizeof(sc->sc_sensor[idx].desc));
- sc->sc_regs[idx] = &sc->sc_chip->table[idx].reg;
- sc->sc_nom_volt[idx] = sc->sc_chip->table[idx].nom_volt_index;
+ sc->sc_regs[idx] = &sc->sc_dc.dc_chip->table[idx].reg;
+ sc->sc_nom_volt[idx] = sc->sc_dc.dc_chip->table[idx].nom_volt_index;
sc->sc_sensor[idx].flags |= ENVSYS_FMONLIMITS;
@@ -1719,7 +1718,7 @@
node->sysctl_data = sc;
/* Fans do not have a high limit */
- if (sc->sc_chip->table[idx].type == DBC_FAN)
+ if (sc->sc_dc.dc_chip->table[idx].type == DBC_FAN)
return 0;
sysctl_reg = sc->sc_regs[idx]->hi_lim_reg;
@@ -1745,7 +1744,7 @@
struct sysctlnode *node = NULL;
char name[SYSCTL_NAMELEN];
- for (i = 0; sc->sc_chip->power[i].desc != NULL; i++) {
+ for (i = 0; sc->sc_dc.dc_chip->power[i].desc != NULL; i++) {
snprintf(name, sizeof(name), "fan_ctl_%d", i);
ret = sysctl_createv(NULL, 0, NULL, &me2,
rw_flag,
@@ -1755,9 +1754,9 @@
for (j = DBC_PWM_BEHAVIOR; j < DBC_PWM_LAST_PARAM; j++) {
if (j == DBC_PWM_MAX_DUTY &&
- (sc->sc_chip->flags & DBCFLAG_HAS_MAXDUTY) == 0)
+ (sc->sc_dc.dc_chip->flags & DBCFLAG_HAS_MAXDUTY) == 0)
continue;
- sysctl_reg = sc->sc_chip->power[i].power_regs[j];
+ sysctl_reg = sc->sc_dc.dc_chip->power[i].power_regs[j];
if (sysctl_reg == DBCOOL_NO_REG)
continue;
strlcpy(name, dbc_sysctl_table[j].name, sizeof(name));
@@ -1845,28 +1844,28 @@
}
int
-dbcool_chip_ident(struct dbcool_softc *sc)
+dbcool_chip_ident(struct dbcool_chipset *dc)
{
/* verify this is a supported dbCool chip */
uint8_t c_id, d_id, r_id;
int i;
- c_id = sc->sc_readreg(sc, DBCOOL_COMPANYID_REG);
- d_id = sc->sc_readreg(sc, DBCOOL_DEVICEID_REG);
- r_id = sc->sc_readreg(sc, DBCOOL_REVISION_REG);
+ c_id = dc->dc_readreg(dc, DBCOOL_COMPANYID_REG);
+ d_id = dc->dc_readreg(dc, DBCOOL_DEVICEID_REG);
+ r_id = dc->dc_readreg(dc, DBCOOL_REVISION_REG);
for (i = 0; chip_table[i].company != 0; i++)
if ((c_id == chip_table[i].company) &&
(d_id == chip_table[i].device ||
- chip_table[i].device == 0xff) &&
+ chip_table[i].device == 0xff) &&
(r_id == chip_table[i].rev ||
- chip_table[i].rev == 0xff)) {
- sc->sc_chip = &chip_table[i];
+ chip_table[i].rev == 0xff)) {
+ dc->dc_chip = &chip_table[i];
return i;
}
aprint_verbose("dbcool_chip_ident: addr 0x%02x c_id 0x%02x d_id 0x%02x"
- " r_id 0x%02x: No match.\n", sc->sc_addr, c_id, d_id,
+ " r_id 0x%02x: No match.\n", dc->dc_addr, c_id, d_id,
r_id);
return -1;
Index: src/sys/dev/i2c/dbcool_var.h
diff -u src/sys/dev/i2c/dbcool_var.h:1.5 src/sys/dev/i2c/dbcool_var.h:1.6
--- src/sys/dev/i2c/dbcool_var.h:1.5 Tue May 12 10:23:33 2009
+++ src/sys/dev/i2c/dbcool_var.h Mon Nov 2 16:37:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: dbcool_var.h,v 1.5 2009/05/12 14:23:33 cegger Exp $ */
+/* $NetBSD: dbcool_var.h,v 1.6 2009/11/02 21:37:44 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dbcool_var.h,v 1.5 2009/05/12 14:23:33 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dbcool_var.h,v 1.6 2009/11/02 21:37:44 christos Exp $");
#include <dev/i2c/i2cvar.h>
@@ -105,12 +105,18 @@
struct chip_id;
+struct dbcool_chipset {
+ i2c_tag_t dc_tag;
+ i2c_addr_t dc_addr;
+ void (*dc_writereg)(struct dbcool_chipset *, uint8_t, uint8_t);
+ uint8_t (*dc_readreg)(struct dbcool_chipset *, uint8_t);
+ struct chip_id *dc_chip;
+};
+
struct dbcool_softc {
device_t sc_dev;
- i2c_tag_t sc_tag;
- i2c_addr_t sc_addr;
- struct chip_id *sc_chip;
struct sysmon_envsys *sc_sme;
+ struct dbcool_chipset sc_dc;
envsys_data_t sc_sensor[DBCOOL_MAXSENSORS];
int sc_sysctl_num[DBCOOL_MAXSENSORS];
struct reg_list *sc_regs[DBCOOL_MAXSENSORS];
@@ -118,8 +124,6 @@
int sc_temp_offset;
int64_t sc_supply_voltage;
bool sc_suspend;
- void (*sc_writereg)(struct dbcool_softc *, uint8_t, uint8_t);
- uint8_t (*sc_readreg)(struct dbcool_softc *, uint8_t);
#ifdef DBCOOL_DEBUG
uint8_t sc_user_reg;
#endif
@@ -139,10 +143,10 @@
/*
* Expose some routines for the macppc's ki2c match/attach routines
*/
-uint8_t dbcool_readreg(struct dbcool_softc *, uint8_t);
-void dbcool_writereg(struct dbcool_softc *, uint8_t, uint8_t);
+uint8_t dbcool_readreg(struct dbcool_chipset *, uint8_t);
+void dbcool_writereg(struct dbcool_chipset *, uint8_t, uint8_t);
void dbcool_setup(device_t);
-int dbcool_chip_ident(struct dbcool_softc *);
+int dbcool_chip_ident(struct dbcool_chipset *);
bool dbcool_pmf_suspend(device_t PMF_FN_PROTO);
bool dbcool_pmf_resume(device_t PMF_FN_PROTO);