diff options
Diffstat (limited to 'drivers/hwmon/lm95241.c')
| -rw-r--r-- | drivers/hwmon/lm95241.c | 51 | 
1 files changed, 33 insertions, 18 deletions
| diff --git a/drivers/hwmon/lm95241.c b/drivers/hwmon/lm95241.c index 1a6dfb6df1e7..513901d592a9 100644 --- a/drivers/hwmon/lm95241.c +++ b/drivers/hwmon/lm95241.c @@ -74,8 +74,9 @@ static const unsigned short normal_i2c[] = {  #define TT_OFF 0  #define TT_ON 1  #define TT_MASK 7 -#define MANUFACTURER_ID 0x01 -#define DEFAULT_REVISION 0xA4 +#define NATSEMI_MAN_ID	0x01 +#define LM95231_CHIP_ID	0xA1 +#define LM95241_CHIP_ID	0xA4  static const u8 lm95241_reg_address[] = {  	LM95241_REG_R_LOCAL_TEMPH, @@ -98,11 +99,16 @@ struct lm95241_data {  };  /* 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) -		return val_h - 0x100; -	return val_h * 1000 + val_l * 1000 / 256; +	s16 val_hl = (val_h << 8) | val_l; +	return val_hl * 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) @@ -135,10 +141,13 @@ static ssize_t show_input(struct device *dev, struct device_attribute *attr,  			  char *buf)  {  	struct lm95241_data *data = lm95241_update_device(dev); +	int index = to_sensor_dev_attr(attr)->index;  	return snprintf(buf, PAGE_SIZE - 1, "%d\n", -		TempFromReg(data->temp[to_sensor_dev_attr(attr)->index], -			    data->temp[to_sensor_dev_attr(attr)->index + 1])); +			index == 0 || (data->config & (1 << (index / 2))) ? +		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, @@ -330,20 +339,25 @@ static int lm95241_detect(struct i2c_client *new_client,  			  struct i2c_board_info *info)  {  	struct i2c_adapter *adapter = new_client->adapter; -	int address = new_client->addr;  	const char *name; +	int mfg_id, chip_id;  	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))  		return -ENODEV; -	if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID) -	     == MANUFACTURER_ID) -	    && (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID) -		>= DEFAULT_REVISION)) { -		name = DEVNAME; -	} else { -		dev_dbg(&adapter->dev, "LM95241 detection failed at 0x%02x\n", -			address); +	mfg_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID); +	if (mfg_id != NATSEMI_MAN_ID) +		return -ENODEV; + +	chip_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID); +	switch (chip_id) { +	case LM95231_CHIP_ID: +		name = "lm95231"; +		break; +	case LM95241_CHIP_ID: +		name = "lm95241"; +		break; +	default:  		return -ENODEV;  	} @@ -423,7 +437,8 @@ static int lm95241_remove(struct i2c_client *client)  /* Driver data (common to all clients) */  static const struct i2c_device_id lm95241_id[] = { -	{ DEVNAME, 0 }, +	{ "lm95231", 0 }, +	{ "lm95241", 0 },  	{ }  };  MODULE_DEVICE_TABLE(i2c, lm95241_id); | 
