void adm1025_update_client(struct i2c_client *client) { struct adm1025_data *data = client->data; u8 i; down(&data->update_lock); if ( (jiffies - data->last_updated > (data->type == adm1025 ? HZ / 2 : HZ * 2)) || (jiffies < data->last_updated) || !data->valid) { #ifdef DEBUG printk("Starting adm1025 update\n"); #endif for (i = 0; i <= 5; i++) { data->in[i] = adm1025_read_value(client, ADM1025_REG_IN(i)); data->in_min[i] = adm1025_read_value(client, ADM1025_REG_IN_MIN(i)); data->in_max[i] = adm1025_read_value(client, ADM1025_REG_IN_MAX(i)); } data->temp = adm1025_read_value(client, ADM1025_REG_TEMP); data->rtemp = adm1025_read_value(client, ADM1025_REG_RTEMP); #ifdef DEBUG printk("The temp is %2x\n",data->temp); #endif data->temp_max = adm1025_read_value(client, ADM1025_REG_TEMP_HIGH); data->temp_min = adm1025_read_value(client, ADM1025_REG_TEMP_LOW); data->rtemp_max = adm1025_read_value(client, ADM1025_REG_RTEMP_HIGH); data->rtemp_min = adm1025_read_value(client, ADM1025_REG_RTEMP_LOW); i = adm1025_read_value(client, ADM1025_REG_VID); data->vid = i & 0x0f; data->vid |= (adm1025_read_value(client, ADM1025_REG_VID4) & 0x01) << 4; data->alarms = adm1025_read_value(client, ADM1025_REG_INT1_STAT) + (adm1025_read_value(client, ADM1025_REG_INT2_STAT) << 8); data->last_updated = jiffies; data->valid = 1; } up(&data->update_lock); }
static struct adm1025_data *adm1025_update_device(struct device *dev) { struct adm1025_data *data = dev_get_drvdata(dev); struct i2c_client *client = data->client; mutex_lock(&data->update_lock); if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { int i; dev_dbg(&client->dev, "Updating data.\n"); for (i = 0; i < 6; i++) { data->in[i] = i2c_smbus_read_byte_data(client, ADM1025_REG_IN(i)); data->in_min[i] = i2c_smbus_read_byte_data(client, ADM1025_REG_IN_MIN(i)); data->in_max[i] = i2c_smbus_read_byte_data(client, ADM1025_REG_IN_MAX(i)); } for (i = 0; i < 2; i++) { data->temp[i] = i2c_smbus_read_byte_data(client, ADM1025_REG_TEMP(i)); data->temp_min[i] = i2c_smbus_read_byte_data(client, ADM1025_REG_TEMP_LOW(i)); data->temp_max[i] = i2c_smbus_read_byte_data(client, ADM1025_REG_TEMP_HIGH(i)); } data->alarms = i2c_smbus_read_byte_data(client, ADM1025_REG_STATUS1) | (i2c_smbus_read_byte_data(client, ADM1025_REG_STATUS2) << 8); data->vid = (i2c_smbus_read_byte_data(client, ADM1025_REG_VID) & 0x0f) | ((i2c_smbus_read_byte_data(client, ADM1025_REG_VID4) & 0x01) << 4); data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; }