Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging
* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging: hwmon: (max6642): Better chip detection schema hwmon: (coretemp) Further relax temperature range checks hwmon: (coretemp) Fix TjMax detection for older CPUs hwmon: (coretemp) Relax target temperature range check hwmon: (max6642) Rename temp_fault sysfs attribute to temp2_fault
This commit is contained in:
@@ -296,7 +296,7 @@ static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
|
|||||||
* If the TjMax is not plausible, an assumption
|
* If the TjMax is not plausible, an assumption
|
||||||
* will be used
|
* will be used
|
||||||
*/
|
*/
|
||||||
if (val > 80 && val < 120) {
|
if (val) {
|
||||||
dev_info(dev, "TjMax is %d C.\n", val);
|
dev_info(dev, "TjMax is %d C.\n", val);
|
||||||
return val * 1000;
|
return val * 1000;
|
||||||
}
|
}
|
||||||
@@ -304,24 +304,9 @@ static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* An assumption is made for early CPUs and unreadable MSR.
|
* An assumption is made for early CPUs and unreadable MSR.
|
||||||
* NOTE: the given value may not be correct.
|
* NOTE: the calculated value may not be correct.
|
||||||
*/
|
*/
|
||||||
|
return adjust_tjmax(c, id, dev);
|
||||||
switch (c->x86_model) {
|
|
||||||
case 0xe:
|
|
||||||
case 0xf:
|
|
||||||
case 0x16:
|
|
||||||
case 0x1a:
|
|
||||||
dev_warn(dev, "TjMax is assumed as 100 C!\n");
|
|
||||||
return 100000;
|
|
||||||
case 0x17:
|
|
||||||
case 0x1c: /* Atom CPUs */
|
|
||||||
return adjust_tjmax(c, id, dev);
|
|
||||||
default:
|
|
||||||
dev_warn(dev, "CPU (model=0x%x) is not supported yet,"
|
|
||||||
" using default TjMax of 100C.\n", c->x86_model);
|
|
||||||
return 100000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __devinit get_ucode_rev_on_cpu(void *edx)
|
static void __devinit get_ucode_rev_on_cpu(void *edx)
|
||||||
@@ -341,7 +326,7 @@ static int get_pkg_tjmax(unsigned int cpu, struct device *dev)
|
|||||||
err = rdmsr_safe_on_cpu(cpu, MSR_IA32_TEMPERATURE_TARGET, &eax, &edx);
|
err = rdmsr_safe_on_cpu(cpu, MSR_IA32_TEMPERATURE_TARGET, &eax, &edx);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
val = (eax >> 16) & 0xff;
|
val = (eax >> 16) & 0xff;
|
||||||
if (val > 80 && val < 120)
|
if (val)
|
||||||
return val * 1000;
|
return val * 1000;
|
||||||
}
|
}
|
||||||
dev_warn(dev, "Unable to read Pkg-TjMax from CPU:%u\n", cpu);
|
dev_warn(dev, "Unable to read Pkg-TjMax from CPU:%u\n", cpu);
|
||||||
|
@@ -136,15 +136,29 @@ static int max6642_detect(struct i2c_client *client,
|
|||||||
if (man_id != 0x4D)
|
if (man_id != 0x4D)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* sanity check */
|
||||||
|
if (i2c_smbus_read_byte_data(client, 0x04) != 0x4D
|
||||||
|
|| i2c_smbus_read_byte_data(client, 0x06) != 0x4D
|
||||||
|
|| i2c_smbus_read_byte_data(client, 0xff) != 0x4D)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We read the config and status register, the 4 lower bits in the
|
* We read the config and status register, the 4 lower bits in the
|
||||||
* config register should be zero and bit 5, 3, 1 and 0 should be
|
* config register should be zero and bit 5, 3, 1 and 0 should be
|
||||||
* zero in the status register.
|
* zero in the status register.
|
||||||
*/
|
*/
|
||||||
reg_config = i2c_smbus_read_byte_data(client, MAX6642_REG_R_CONFIG);
|
reg_config = i2c_smbus_read_byte_data(client, MAX6642_REG_R_CONFIG);
|
||||||
|
if ((reg_config & 0x0f) != 0x00)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* in between, another round of sanity checks */
|
||||||
|
if (i2c_smbus_read_byte_data(client, 0x04) != reg_config
|
||||||
|
|| i2c_smbus_read_byte_data(client, 0x06) != reg_config
|
||||||
|
|| i2c_smbus_read_byte_data(client, 0xff) != reg_config)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
reg_status = i2c_smbus_read_byte_data(client, MAX6642_REG_R_STATUS);
|
reg_status = i2c_smbus_read_byte_data(client, MAX6642_REG_R_STATUS);
|
||||||
if (((reg_config & 0x0f) != 0x00) ||
|
if ((reg_status & 0x2b) != 0x00)
|
||||||
((reg_status & 0x2b) != 0x00))
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
strlcpy(info->type, "max6642", I2C_NAME_SIZE);
|
strlcpy(info->type, "max6642", I2C_NAME_SIZE);
|
||||||
@@ -246,7 +260,7 @@ static SENSOR_DEVICE_ATTR_2(temp1_max, S_IWUSR | S_IRUGO, show_temp_max,
|
|||||||
set_temp_max, 0, MAX6642_REG_W_LOCAL_HIGH);
|
set_temp_max, 0, MAX6642_REG_W_LOCAL_HIGH);
|
||||||
static SENSOR_DEVICE_ATTR_2(temp2_max, S_IWUSR | S_IRUGO, show_temp_max,
|
static SENSOR_DEVICE_ATTR_2(temp2_max, S_IWUSR | S_IRUGO, show_temp_max,
|
||||||
set_temp_max, 1, MAX6642_REG_W_REMOTE_HIGH);
|
set_temp_max, 1, MAX6642_REG_W_REMOTE_HIGH);
|
||||||
static SENSOR_DEVICE_ATTR(temp_fault, S_IRUGO, show_alarm, NULL, 2);
|
static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 2);
|
||||||
static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6);
|
static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6);
|
||||||
static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4);
|
static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4);
|
||||||
|
|
||||||
@@ -256,7 +270,7 @@ static struct attribute *max6642_attributes[] = {
|
|||||||
&sensor_dev_attr_temp1_max.dev_attr.attr,
|
&sensor_dev_attr_temp1_max.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp2_max.dev_attr.attr,
|
&sensor_dev_attr_temp2_max.dev_attr.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp_fault.dev_attr.attr,
|
&sensor_dev_attr_temp2_fault.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
|
||||||
NULL
|
NULL
|
||||||
|
Reference in New Issue
Block a user