Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3bbfa78 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging:
  hwmon: (pmbus) Improve auto-detection of temperature status register
  hwmon: (lm95241) Fix negative temperature results
  hwmon: (lm95241) Fix chip detection code
parents aa4c495e 22e6b231
Loading
Loading
Loading
Loading
+15 −7
Original line number Original line Diff line number Diff line
@@ -98,11 +98,16 @@ struct lm95241_data {
};
};


/* Conversions */
/* Conversions */
static int TempFromReg(u8 val_h, u8 val_l)
static int temp_from_reg_signed(u8 val_h, u8 val_l)
{
{
	if (val_h & 0x80)
	s16 val_hl = (val_h << 8) | val_l;
		return val_h - 0x100;
	return val_hl * 1000 / 256;
	return val_h * 1000 + val_l * 1000 / 256;
}

static int temp_from_reg_unsigned(u8 val_h, u8 val_l)
{
	u16 val_hl = (val_h << 8) | val_l;
	return val_hl * 1000 / 256;
}
}


static struct lm95241_data *lm95241_update_device(struct device *dev)
static struct lm95241_data *lm95241_update_device(struct device *dev)
@@ -135,10 +140,13 @@ static ssize_t show_input(struct device *dev, struct device_attribute *attr,
			  char *buf)
			  char *buf)
{
{
	struct lm95241_data *data = lm95241_update_device(dev);
	struct lm95241_data *data = lm95241_update_device(dev);
	int index = to_sensor_dev_attr(attr)->index;


	return snprintf(buf, PAGE_SIZE - 1, "%d\n",
	return snprintf(buf, PAGE_SIZE - 1, "%d\n",
		TempFromReg(data->temp[to_sensor_dev_attr(attr)->index],
			index == 0 || (data->config & (1 << (index / 2))) ?
			    data->temp[to_sensor_dev_attr(attr)->index + 1]));
		temp_from_reg_signed(data->temp[index], data->temp[index + 1]) :
		temp_from_reg_unsigned(data->temp[index],
				       data->temp[index + 1]));
}
}


static ssize_t show_type(struct device *dev, struct device_attribute *attr,
static ssize_t show_type(struct device *dev, struct device_attribute *attr,
@@ -339,7 +347,7 @@ static int lm95241_detect(struct i2c_client *new_client,
	if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID)
	if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID)
	     == MANUFACTURER_ID)
	     == MANUFACTURER_ID)
	    && (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID)
	    && (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID)
		>= DEFAULT_REVISION)) {
		== DEFAULT_REVISION)) {
		name = DEVNAME;
		name = DEVNAME;
	} else {
	} else {
		dev_dbg(&adapter->dev, "LM95241 detection failed at 0x%02x\n",
		dev_dbg(&adapter->dev, "LM95241 detection failed at 0x%02x\n",
+6 −5
Original line number Original line Diff line number Diff line
@@ -59,16 +59,17 @@ static void pmbus_find_sensor_groups(struct i2c_client *client,
		if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34))
		if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34))
			info->func[0] |= PMBUS_HAVE_STATUS_FAN34;
			info->func[0] |= PMBUS_HAVE_STATUS_FAN34;
	}
	}
	if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1)) {
	if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1))
		info->func[0] |= PMBUS_HAVE_TEMP;
		info->func[0] |= PMBUS_HAVE_TEMP;
		if (pmbus_check_byte_register(client, 0,
					      PMBUS_STATUS_TEMPERATURE))
			info->func[0] |= PMBUS_HAVE_STATUS_TEMP;
	}
	if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2))
	if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2))
		info->func[0] |= PMBUS_HAVE_TEMP2;
		info->func[0] |= PMBUS_HAVE_TEMP2;
	if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3))
	if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3))
		info->func[0] |= PMBUS_HAVE_TEMP3;
		info->func[0] |= PMBUS_HAVE_TEMP3;
	if (info->func[0] & (PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2
			     | PMBUS_HAVE_TEMP3)
	    && pmbus_check_byte_register(client, 0,
					 PMBUS_STATUS_TEMPERATURE))
			info->func[0] |= PMBUS_HAVE_STATUS_TEMP;


	/* Sensors detected on all pages */
	/* Sensors detected on all pages */
	for (page = 0; page < info->pages; page++) {
	for (page = 0; page < info->pages; page++) {