hwmon: (lm85) Avoid forward declaration
Reorder functions to avoid forward declaration. Signed-off-by: Axel Lin <axel.lin@ingics.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
@@ -121,7 +121,6 @@ enum chips {
|
|||||||
#define EMC6D102_REG_EXTEND_ADC3 0x87
|
#define EMC6D102_REG_EXTEND_ADC3 0x87
|
||||||
#define EMC6D102_REG_EXTEND_ADC4 0x88
|
#define EMC6D102_REG_EXTEND_ADC4 0x88
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Conversions. Rounding and limit checking is only done on the TO_REG
|
* Conversions. Rounding and limit checking is only done on the TO_REG
|
||||||
* variants. Note that you should be a bit careful with which arguments
|
* variants. Note that you should be a bit careful with which arguments
|
||||||
@@ -334,44 +333,235 @@ struct lm85_data {
|
|||||||
struct lm85_zone zone[3];
|
struct lm85_zone zone[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info);
|
static int lm85_read_value(struct i2c_client *client, u8 reg)
|
||||||
static int lm85_probe(struct i2c_client *client,
|
{
|
||||||
const struct i2c_device_id *id);
|
int res;
|
||||||
static int lm85_remove(struct i2c_client *client);
|
|
||||||
|
|
||||||
static int lm85_read_value(struct i2c_client *client, u8 reg);
|
/* What size location is it? */
|
||||||
static void lm85_write_value(struct i2c_client *client, u8 reg, int value);
|
switch (reg) {
|
||||||
static struct lm85_data *lm85_update_device(struct device *dev);
|
case LM85_REG_FAN(0): /* Read WORD data */
|
||||||
|
case LM85_REG_FAN(1):
|
||||||
|
case LM85_REG_FAN(2):
|
||||||
|
case LM85_REG_FAN(3):
|
||||||
|
case LM85_REG_FAN_MIN(0):
|
||||||
|
case LM85_REG_FAN_MIN(1):
|
||||||
|
case LM85_REG_FAN_MIN(2):
|
||||||
|
case LM85_REG_FAN_MIN(3):
|
||||||
|
case LM85_REG_ALARM1: /* Read both bytes at once */
|
||||||
|
res = i2c_smbus_read_byte_data(client, reg) & 0xff;
|
||||||
|
res |= i2c_smbus_read_byte_data(client, reg + 1) << 8;
|
||||||
|
break;
|
||||||
|
default: /* Read BYTE data */
|
||||||
|
res = i2c_smbus_read_byte_data(client, reg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct i2c_device_id lm85_id[] = {
|
static void lm85_write_value(struct i2c_client *client, u8 reg, int value)
|
||||||
{ "adm1027", adm1027 },
|
{
|
||||||
{ "adt7463", adt7463 },
|
switch (reg) {
|
||||||
{ "adt7468", adt7468 },
|
case LM85_REG_FAN(0): /* Write WORD data */
|
||||||
{ "lm85", lm85 },
|
case LM85_REG_FAN(1):
|
||||||
{ "lm85b", lm85 },
|
case LM85_REG_FAN(2):
|
||||||
{ "lm85c", lm85 },
|
case LM85_REG_FAN(3):
|
||||||
{ "emc6d100", emc6d100 },
|
case LM85_REG_FAN_MIN(0):
|
||||||
{ "emc6d101", emc6d100 },
|
case LM85_REG_FAN_MIN(1):
|
||||||
{ "emc6d102", emc6d102 },
|
case LM85_REG_FAN_MIN(2):
|
||||||
{ "emc6d103", emc6d103 },
|
case LM85_REG_FAN_MIN(3):
|
||||||
{ "emc6d103s", emc6d103s },
|
/* NOTE: ALARM is read only, so not included here */
|
||||||
{ }
|
i2c_smbus_write_byte_data(client, reg, value & 0xff);
|
||||||
};
|
i2c_smbus_write_byte_data(client, reg + 1, value >> 8);
|
||||||
MODULE_DEVICE_TABLE(i2c, lm85_id);
|
break;
|
||||||
|
default: /* Write BYTE data */
|
||||||
|
i2c_smbus_write_byte_data(client, reg, value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct i2c_driver lm85_driver = {
|
static struct lm85_data *lm85_update_device(struct device *dev)
|
||||||
.class = I2C_CLASS_HWMON,
|
{
|
||||||
.driver = {
|
struct i2c_client *client = to_i2c_client(dev);
|
||||||
.name = "lm85",
|
struct lm85_data *data = i2c_get_clientdata(client);
|
||||||
},
|
int i;
|
||||||
.probe = lm85_probe,
|
|
||||||
.remove = lm85_remove,
|
|
||||||
.id_table = lm85_id,
|
|
||||||
.detect = lm85_detect,
|
|
||||||
.address_list = normal_i2c,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
|
|
||||||
|
if (!data->valid ||
|
||||||
|
time_after(jiffies, data->last_reading + LM85_DATA_INTERVAL)) {
|
||||||
|
/* Things that change quickly */
|
||||||
|
dev_dbg(&client->dev, "Reading sensor values\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Have to read extended bits first to "freeze" the
|
||||||
|
* more significant bits that are read later.
|
||||||
|
* There are 2 additional resolution bits per channel and we
|
||||||
|
* have room for 4, so we shift them to the left.
|
||||||
|
*/
|
||||||
|
if (data->type == adm1027 || data->type == adt7463 ||
|
||||||
|
data->type == adt7468) {
|
||||||
|
int ext1 = lm85_read_value(client,
|
||||||
|
ADM1027_REG_EXTEND_ADC1);
|
||||||
|
int ext2 = lm85_read_value(client,
|
||||||
|
ADM1027_REG_EXTEND_ADC2);
|
||||||
|
int val = (ext1 << 8) + ext2;
|
||||||
|
|
||||||
|
for (i = 0; i <= 4; i++)
|
||||||
|
data->in_ext[i] =
|
||||||
|
((val >> (i * 2)) & 0x03) << 2;
|
||||||
|
|
||||||
|
for (i = 0; i <= 2; i++)
|
||||||
|
data->temp_ext[i] =
|
||||||
|
(val >> ((i + 4) * 2)) & 0x0c;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->vid = lm85_read_value(client, LM85_REG_VID);
|
||||||
|
|
||||||
|
for (i = 0; i <= 3; ++i) {
|
||||||
|
data->in[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_IN(i));
|
||||||
|
data->fan[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_FAN(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data->has_vid5)
|
||||||
|
data->in[4] = lm85_read_value(client, LM85_REG_IN(4));
|
||||||
|
|
||||||
|
if (data->type == adt7468)
|
||||||
|
data->cfg5 = lm85_read_value(client, ADT7468_REG_CFG5);
|
||||||
|
|
||||||
|
for (i = 0; i <= 2; ++i) {
|
||||||
|
data->temp[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_TEMP(i));
|
||||||
|
data->pwm[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_PWM(i));
|
||||||
|
|
||||||
|
if (IS_ADT7468_OFF64(data))
|
||||||
|
data->temp[i] -= 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->alarms = lm85_read_value(client, LM85_REG_ALARM1);
|
||||||
|
|
||||||
|
if (data->type == emc6d100) {
|
||||||
|
/* Three more voltage sensors */
|
||||||
|
for (i = 5; i <= 7; ++i) {
|
||||||
|
data->in[i] = lm85_read_value(client,
|
||||||
|
EMC6D100_REG_IN(i));
|
||||||
|
}
|
||||||
|
/* More alarm bits */
|
||||||
|
data->alarms |= lm85_read_value(client,
|
||||||
|
EMC6D100_REG_ALARM3) << 16;
|
||||||
|
} else if (data->type == emc6d102 || data->type == emc6d103 ||
|
||||||
|
data->type == emc6d103s) {
|
||||||
|
/*
|
||||||
|
* Have to read LSB bits after the MSB ones because
|
||||||
|
* the reading of the MSB bits has frozen the
|
||||||
|
* LSBs (backward from the ADM1027).
|
||||||
|
*/
|
||||||
|
int ext1 = lm85_read_value(client,
|
||||||
|
EMC6D102_REG_EXTEND_ADC1);
|
||||||
|
int ext2 = lm85_read_value(client,
|
||||||
|
EMC6D102_REG_EXTEND_ADC2);
|
||||||
|
int ext3 = lm85_read_value(client,
|
||||||
|
EMC6D102_REG_EXTEND_ADC3);
|
||||||
|
int ext4 = lm85_read_value(client,
|
||||||
|
EMC6D102_REG_EXTEND_ADC4);
|
||||||
|
data->in_ext[0] = ext3 & 0x0f;
|
||||||
|
data->in_ext[1] = ext4 & 0x0f;
|
||||||
|
data->in_ext[2] = ext4 >> 4;
|
||||||
|
data->in_ext[3] = ext3 >> 4;
|
||||||
|
data->in_ext[4] = ext2 >> 4;
|
||||||
|
|
||||||
|
data->temp_ext[0] = ext1 & 0x0f;
|
||||||
|
data->temp_ext[1] = ext2 & 0x0f;
|
||||||
|
data->temp_ext[2] = ext1 >> 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->last_reading = jiffies;
|
||||||
|
} /* last_reading */
|
||||||
|
|
||||||
|
if (!data->valid ||
|
||||||
|
time_after(jiffies, data->last_config + LM85_CONFIG_INTERVAL)) {
|
||||||
|
/* Things that don't change often */
|
||||||
|
dev_dbg(&client->dev, "Reading config values\n");
|
||||||
|
|
||||||
|
for (i = 0; i <= 3; ++i) {
|
||||||
|
data->in_min[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_IN_MIN(i));
|
||||||
|
data->in_max[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_IN_MAX(i));
|
||||||
|
data->fan_min[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_FAN_MIN(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data->has_vid5) {
|
||||||
|
data->in_min[4] = lm85_read_value(client,
|
||||||
|
LM85_REG_IN_MIN(4));
|
||||||
|
data->in_max[4] = lm85_read_value(client,
|
||||||
|
LM85_REG_IN_MAX(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->type == emc6d100) {
|
||||||
|
for (i = 5; i <= 7; ++i) {
|
||||||
|
data->in_min[i] = lm85_read_value(client,
|
||||||
|
EMC6D100_REG_IN_MIN(i));
|
||||||
|
data->in_max[i] = lm85_read_value(client,
|
||||||
|
EMC6D100_REG_IN_MAX(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i <= 2; ++i) {
|
||||||
|
int val;
|
||||||
|
|
||||||
|
data->temp_min[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_TEMP_MIN(i));
|
||||||
|
data->temp_max[i] =
|
||||||
|
lm85_read_value(client, LM85_REG_TEMP_MAX(i));
|
||||||
|
|
||||||
|
data->autofan[i].config =
|
||||||
|
lm85_read_value(client, LM85_REG_AFAN_CONFIG(i));
|
||||||
|
val = lm85_read_value(client, LM85_REG_AFAN_RANGE(i));
|
||||||
|
data->pwm_freq[i] = val & 0x07;
|
||||||
|
data->zone[i].range = val >> 4;
|
||||||
|
data->autofan[i].min_pwm =
|
||||||
|
lm85_read_value(client, LM85_REG_AFAN_MINPWM(i));
|
||||||
|
data->zone[i].limit =
|
||||||
|
lm85_read_value(client, LM85_REG_AFAN_LIMIT(i));
|
||||||
|
data->zone[i].critical =
|
||||||
|
lm85_read_value(client, LM85_REG_AFAN_CRITICAL(i));
|
||||||
|
|
||||||
|
if (IS_ADT7468_OFF64(data)) {
|
||||||
|
data->temp_min[i] -= 64;
|
||||||
|
data->temp_max[i] -= 64;
|
||||||
|
data->zone[i].limit -= 64;
|
||||||
|
data->zone[i].critical -= 64;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->type != emc6d103s) {
|
||||||
|
i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
|
||||||
|
data->autofan[0].min_off = (i & 0x20) != 0;
|
||||||
|
data->autofan[1].min_off = (i & 0x40) != 0;
|
||||||
|
data->autofan[2].min_off = (i & 0x80) != 0;
|
||||||
|
|
||||||
|
i = lm85_read_value(client, LM85_REG_AFAN_HYST1);
|
||||||
|
data->zone[0].hyst = i >> 4;
|
||||||
|
data->zone[1].hyst = i & 0x0f;
|
||||||
|
|
||||||
|
i = lm85_read_value(client, LM85_REG_AFAN_HYST2);
|
||||||
|
data->zone[2].hyst = i >> 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->last_config = jiffies;
|
||||||
|
} /* last_config */
|
||||||
|
|
||||||
|
data->valid = 1;
|
||||||
|
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
/* 4 Fans */
|
/* 4 Fans */
|
||||||
static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
|
static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
|
||||||
@@ -1467,236 +1657,33 @@ static int lm85_remove(struct i2c_client *client)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct i2c_device_id lm85_id[] = {
|
||||||
|
{ "adm1027", adm1027 },
|
||||||
|
{ "adt7463", adt7463 },
|
||||||
|
{ "adt7468", adt7468 },
|
||||||
|
{ "lm85", lm85 },
|
||||||
|
{ "lm85b", lm85 },
|
||||||
|
{ "lm85c", lm85 },
|
||||||
|
{ "emc6d100", emc6d100 },
|
||||||
|
{ "emc6d101", emc6d100 },
|
||||||
|
{ "emc6d102", emc6d102 },
|
||||||
|
{ "emc6d103", emc6d103 },
|
||||||
|
{ "emc6d103s", emc6d103s },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(i2c, lm85_id);
|
||||||
|
|
||||||
static int lm85_read_value(struct i2c_client *client, u8 reg)
|
static struct i2c_driver lm85_driver = {
|
||||||
{
|
.class = I2C_CLASS_HWMON,
|
||||||
int res;
|
.driver = {
|
||||||
|
.name = "lm85",
|
||||||
/* What size location is it? */
|
},
|
||||||
switch (reg) {
|
.probe = lm85_probe,
|
||||||
case LM85_REG_FAN(0): /* Read WORD data */
|
.remove = lm85_remove,
|
||||||
case LM85_REG_FAN(1):
|
.id_table = lm85_id,
|
||||||
case LM85_REG_FAN(2):
|
.detect = lm85_detect,
|
||||||
case LM85_REG_FAN(3):
|
.address_list = normal_i2c,
|
||||||
case LM85_REG_FAN_MIN(0):
|
};
|
||||||
case LM85_REG_FAN_MIN(1):
|
|
||||||
case LM85_REG_FAN_MIN(2):
|
|
||||||
case LM85_REG_FAN_MIN(3):
|
|
||||||
case LM85_REG_ALARM1: /* Read both bytes at once */
|
|
||||||
res = i2c_smbus_read_byte_data(client, reg) & 0xff;
|
|
||||||
res |= i2c_smbus_read_byte_data(client, reg + 1) << 8;
|
|
||||||
break;
|
|
||||||
default: /* Read BYTE data */
|
|
||||||
res = i2c_smbus_read_byte_data(client, reg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lm85_write_value(struct i2c_client *client, u8 reg, int value)
|
|
||||||
{
|
|
||||||
switch (reg) {
|
|
||||||
case LM85_REG_FAN(0): /* Write WORD data */
|
|
||||||
case LM85_REG_FAN(1):
|
|
||||||
case LM85_REG_FAN(2):
|
|
||||||
case LM85_REG_FAN(3):
|
|
||||||
case LM85_REG_FAN_MIN(0):
|
|
||||||
case LM85_REG_FAN_MIN(1):
|
|
||||||
case LM85_REG_FAN_MIN(2):
|
|
||||||
case LM85_REG_FAN_MIN(3):
|
|
||||||
/* NOTE: ALARM is read only, so not included here */
|
|
||||||
i2c_smbus_write_byte_data(client, reg, value & 0xff);
|
|
||||||
i2c_smbus_write_byte_data(client, reg + 1, value >> 8);
|
|
||||||
break;
|
|
||||||
default: /* Write BYTE data */
|
|
||||||
i2c_smbus_write_byte_data(client, reg, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct lm85_data *lm85_update_device(struct device *dev)
|
|
||||||
{
|
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
|
||||||
struct lm85_data *data = i2c_get_clientdata(client);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
mutex_lock(&data->update_lock);
|
|
||||||
|
|
||||||
if (!data->valid ||
|
|
||||||
time_after(jiffies, data->last_reading + LM85_DATA_INTERVAL)) {
|
|
||||||
/* Things that change quickly */
|
|
||||||
dev_dbg(&client->dev, "Reading sensor values\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Have to read extended bits first to "freeze" the
|
|
||||||
* more significant bits that are read later.
|
|
||||||
* There are 2 additional resolution bits per channel and we
|
|
||||||
* have room for 4, so we shift them to the left.
|
|
||||||
*/
|
|
||||||
if (data->type == adm1027 || data->type == adt7463 ||
|
|
||||||
data->type == adt7468) {
|
|
||||||
int ext1 = lm85_read_value(client,
|
|
||||||
ADM1027_REG_EXTEND_ADC1);
|
|
||||||
int ext2 = lm85_read_value(client,
|
|
||||||
ADM1027_REG_EXTEND_ADC2);
|
|
||||||
int val = (ext1 << 8) + ext2;
|
|
||||||
|
|
||||||
for (i = 0; i <= 4; i++)
|
|
||||||
data->in_ext[i] =
|
|
||||||
((val >> (i * 2)) & 0x03) << 2;
|
|
||||||
|
|
||||||
for (i = 0; i <= 2; i++)
|
|
||||||
data->temp_ext[i] =
|
|
||||||
(val >> ((i + 4) * 2)) & 0x0c;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->vid = lm85_read_value(client, LM85_REG_VID);
|
|
||||||
|
|
||||||
for (i = 0; i <= 3; ++i) {
|
|
||||||
data->in[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_IN(i));
|
|
||||||
data->fan[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_FAN(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data->has_vid5)
|
|
||||||
data->in[4] = lm85_read_value(client, LM85_REG_IN(4));
|
|
||||||
|
|
||||||
if (data->type == adt7468)
|
|
||||||
data->cfg5 = lm85_read_value(client, ADT7468_REG_CFG5);
|
|
||||||
|
|
||||||
for (i = 0; i <= 2; ++i) {
|
|
||||||
data->temp[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_TEMP(i));
|
|
||||||
data->pwm[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_PWM(i));
|
|
||||||
|
|
||||||
if (IS_ADT7468_OFF64(data))
|
|
||||||
data->temp[i] -= 64;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->alarms = lm85_read_value(client, LM85_REG_ALARM1);
|
|
||||||
|
|
||||||
if (data->type == emc6d100) {
|
|
||||||
/* Three more voltage sensors */
|
|
||||||
for (i = 5; i <= 7; ++i) {
|
|
||||||
data->in[i] = lm85_read_value(client,
|
|
||||||
EMC6D100_REG_IN(i));
|
|
||||||
}
|
|
||||||
/* More alarm bits */
|
|
||||||
data->alarms |= lm85_read_value(client,
|
|
||||||
EMC6D100_REG_ALARM3) << 16;
|
|
||||||
} else if (data->type == emc6d102 || data->type == emc6d103 ||
|
|
||||||
data->type == emc6d103s) {
|
|
||||||
/*
|
|
||||||
* Have to read LSB bits after the MSB ones because
|
|
||||||
* the reading of the MSB bits has frozen the
|
|
||||||
* LSBs (backward from the ADM1027).
|
|
||||||
*/
|
|
||||||
int ext1 = lm85_read_value(client,
|
|
||||||
EMC6D102_REG_EXTEND_ADC1);
|
|
||||||
int ext2 = lm85_read_value(client,
|
|
||||||
EMC6D102_REG_EXTEND_ADC2);
|
|
||||||
int ext3 = lm85_read_value(client,
|
|
||||||
EMC6D102_REG_EXTEND_ADC3);
|
|
||||||
int ext4 = lm85_read_value(client,
|
|
||||||
EMC6D102_REG_EXTEND_ADC4);
|
|
||||||
data->in_ext[0] = ext3 & 0x0f;
|
|
||||||
data->in_ext[1] = ext4 & 0x0f;
|
|
||||||
data->in_ext[2] = ext4 >> 4;
|
|
||||||
data->in_ext[3] = ext3 >> 4;
|
|
||||||
data->in_ext[4] = ext2 >> 4;
|
|
||||||
|
|
||||||
data->temp_ext[0] = ext1 & 0x0f;
|
|
||||||
data->temp_ext[1] = ext2 & 0x0f;
|
|
||||||
data->temp_ext[2] = ext1 >> 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->last_reading = jiffies;
|
|
||||||
} /* last_reading */
|
|
||||||
|
|
||||||
if (!data->valid ||
|
|
||||||
time_after(jiffies, data->last_config + LM85_CONFIG_INTERVAL)) {
|
|
||||||
/* Things that don't change often */
|
|
||||||
dev_dbg(&client->dev, "Reading config values\n");
|
|
||||||
|
|
||||||
for (i = 0; i <= 3; ++i) {
|
|
||||||
data->in_min[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_IN_MIN(i));
|
|
||||||
data->in_max[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_IN_MAX(i));
|
|
||||||
data->fan_min[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_FAN_MIN(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data->has_vid5) {
|
|
||||||
data->in_min[4] = lm85_read_value(client,
|
|
||||||
LM85_REG_IN_MIN(4));
|
|
||||||
data->in_max[4] = lm85_read_value(client,
|
|
||||||
LM85_REG_IN_MAX(4));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->type == emc6d100) {
|
|
||||||
for (i = 5; i <= 7; ++i) {
|
|
||||||
data->in_min[i] = lm85_read_value(client,
|
|
||||||
EMC6D100_REG_IN_MIN(i));
|
|
||||||
data->in_max[i] = lm85_read_value(client,
|
|
||||||
EMC6D100_REG_IN_MAX(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i <= 2; ++i) {
|
|
||||||
int val;
|
|
||||||
|
|
||||||
data->temp_min[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_TEMP_MIN(i));
|
|
||||||
data->temp_max[i] =
|
|
||||||
lm85_read_value(client, LM85_REG_TEMP_MAX(i));
|
|
||||||
|
|
||||||
data->autofan[i].config =
|
|
||||||
lm85_read_value(client, LM85_REG_AFAN_CONFIG(i));
|
|
||||||
val = lm85_read_value(client, LM85_REG_AFAN_RANGE(i));
|
|
||||||
data->pwm_freq[i] = val & 0x07;
|
|
||||||
data->zone[i].range = val >> 4;
|
|
||||||
data->autofan[i].min_pwm =
|
|
||||||
lm85_read_value(client, LM85_REG_AFAN_MINPWM(i));
|
|
||||||
data->zone[i].limit =
|
|
||||||
lm85_read_value(client, LM85_REG_AFAN_LIMIT(i));
|
|
||||||
data->zone[i].critical =
|
|
||||||
lm85_read_value(client, LM85_REG_AFAN_CRITICAL(i));
|
|
||||||
|
|
||||||
if (IS_ADT7468_OFF64(data)) {
|
|
||||||
data->temp_min[i] -= 64;
|
|
||||||
data->temp_max[i] -= 64;
|
|
||||||
data->zone[i].limit -= 64;
|
|
||||||
data->zone[i].critical -= 64;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->type != emc6d103s) {
|
|
||||||
i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
|
|
||||||
data->autofan[0].min_off = (i & 0x20) != 0;
|
|
||||||
data->autofan[1].min_off = (i & 0x40) != 0;
|
|
||||||
data->autofan[2].min_off = (i & 0x80) != 0;
|
|
||||||
|
|
||||||
i = lm85_read_value(client, LM85_REG_AFAN_HYST1);
|
|
||||||
data->zone[0].hyst = i >> 4;
|
|
||||||
data->zone[1].hyst = i & 0x0f;
|
|
||||||
|
|
||||||
i = lm85_read_value(client, LM85_REG_AFAN_HYST2);
|
|
||||||
data->zone[2].hyst = i >> 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->last_config = jiffies;
|
|
||||||
} /* last_config */
|
|
||||||
|
|
||||||
data->valid = 1;
|
|
||||||
|
|
||||||
mutex_unlock(&data->update_lock);
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
module_i2c_driver(lm85_driver);
|
module_i2c_driver(lm85_driver);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user