#define CFG_CR0182 0x10
#define CFG_CR1000 0x20
#define CFG_CR2700 0x30
+#define CFG_CRMASK 0x30
#define R1MS_SHIFT 0
#define R2MS_SHIFT 2
#define R1MS_MASK (0x01 << (R1MS_SHIFT))
struct lm95241_data {
struct i2c_client *client;
struct mutex update_lock;
- unsigned long last_updated, interval; /* in jiffies */
+ unsigned long last_updated; /* in jiffies */
+ unsigned long interval; /* in milli-seconds */
char valid; /* zero until following fields are valid */
/* registers values */
u8 temp[ARRAY_SIZE(lm95241_reg_address)];
mutex_lock(&data->update_lock);
- if (time_after(jiffies, data->last_updated + data->interval) ||
+ if (time_after(jiffies, data->last_updated
+ + msecs_to_jiffies(data->interval)) ||
!data->valid) {
int i;
{
struct lm95241_data *data = lm95241_update_device(dev);
- return snprintf(buf, PAGE_SIZE - 1, "%lu\n", 1000 * data->interval
- / HZ);
+ return snprintf(buf, PAGE_SIZE - 1, "%lu\n", data->interval);
}
static ssize_t set_interval(struct device *dev, struct device_attribute *attr,
{
struct lm95241_data *data = dev_get_drvdata(dev);
unsigned long val;
+ int convrate;
+ u8 config;
if (kstrtoul(buf, 10, &val) < 0)
return -EINVAL;
- data->interval = val * HZ / 1000;
+ mutex_lock(&data->update_lock);
+
+ config = data->config & ~CFG_CRMASK;
+
+ if (val < 130) {
+ convrate = 76;
+ config |= CFG_CR0076;
+ } else if (val < 590) {
+ convrate = 182;
+ config |= CFG_CR0182;
+ } else if (val < 1850) {
+ convrate = 1000;
+ config |= CFG_CR1000;
+ } else {
+ convrate = 2700;
+ config |= CFG_CR2700;
+ }
+
+ data->interval = convrate;
+ data->config = config;
+ i2c_smbus_write_byte_data(data->client, LM95241_REG_RW_CONFIG,
+ config);
+ mutex_unlock(&data->update_lock);
return count;
}
static void lm95241_init_client(struct i2c_client *client,
struct lm95241_data *data)
{
- data->interval = HZ; /* 1 sec default */
- data->config = CFG_CR0076;
+ data->interval = 1000;
+ data->config = CFG_CR1000;
data->trutherm = (TT_OFF << TT1_SHIFT) | (TT_OFF << TT2_SHIFT);
i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, data->config);