Loading drivers/hwmon/adm1029.c +78 −93 Original line number Diff line number Diff line Loading @@ -105,40 +105,6 @@ static const u8 ADM1029_REG_FAN_DIV[] = { ADM1029_REG_FAN2_CONFIG, }; /* * Functions declaration */ static int adm1029_probe(struct i2c_client *client, const struct i2c_device_id *id); static int adm1029_detect(struct i2c_client *client, struct i2c_board_info *info); static int adm1029_remove(struct i2c_client *client); static struct adm1029_data *adm1029_update_device(struct device *dev); static int adm1029_init_client(struct i2c_client *client); /* * Driver data (common to all clients) */ static const struct i2c_device_id adm1029_id[] = { { "adm1029", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, adm1029_id); static struct i2c_driver adm1029_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "adm1029", }, .probe = adm1029_probe, .remove = adm1029_remove, .id_table = adm1029_id, .detect = adm1029_detect, .address_list = normal_i2c, }; /* * Client data (each client gets its own) */ Loading @@ -155,6 +121,50 @@ struct adm1029_data { u8 fan_div[ARRAY_SIZE(ADM1029_REG_FAN_DIV)]; }; /* * function that update the status of the chips (temperature for example) */ static struct adm1029_data *adm1029_update_device(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct adm1029_data *data = i2c_get_clientdata(client); mutex_lock(&data->update_lock); /* * Use the "cache" Luke, don't recheck values * if there are already checked not a long time later */ if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { int nr; dev_dbg(&client->dev, "Updating adm1029 data\n"); for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_TEMP); nr++) { data->temp[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_TEMP[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN); nr++) { data->fan[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN_DIV); nr++) { data->fan_div[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN_DIV[nr]); } data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; } /* * Sysfs stuff */ Loading Loading @@ -340,6 +350,24 @@ static int adm1029_detect(struct i2c_client *client, return 0; } static int adm1029_init_client(struct i2c_client *client) { u8 config; config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { i2c_smbus_write_byte_data(client, ADM1029_REG_CONFIG, config | 0x10); } /* recheck config */ config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { dev_err(&client->dev, "Initialization failed!\n"); return 0; } return 1; } static int adm1029_probe(struct i2c_client *client, const struct i2c_device_id *id) { Loading Loading @@ -379,23 +407,6 @@ static int adm1029_probe(struct i2c_client *client, return err; } static int adm1029_init_client(struct i2c_client *client) { u8 config; config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { i2c_smbus_write_byte_data(client, ADM1029_REG_CONFIG, config | 0x10); } /* recheck config */ config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { dev_err(&client->dev, "Initialization failed!\n"); return 0; } return 1; } static int adm1029_remove(struct i2c_client *client) { struct adm1029_data *data = i2c_get_clientdata(client); Loading @@ -406,49 +417,23 @@ static int adm1029_remove(struct i2c_client *client) return 0; } /* * function that update the status of the chips (temperature for example) */ static struct adm1029_data *adm1029_update_device(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct adm1029_data *data = i2c_get_clientdata(client); mutex_lock(&data->update_lock); /* * Use the "cache" Luke, don't recheck values * if there are already checked not a long time later */ if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { int nr; dev_dbg(&client->dev, "Updating adm1029 data\n"); for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_TEMP); nr++) { data->temp[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_TEMP[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN); nr++) { data->fan[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN_DIV); nr++) { data->fan_div[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN_DIV[nr]); } data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); static const struct i2c_device_id adm1029_id[] = { { "adm1029", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, adm1029_id); return data; } static struct i2c_driver adm1029_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "adm1029", }, .probe = adm1029_probe, .remove = adm1029_remove, .id_table = adm1029_id, .detect = adm1029_detect, .address_list = normal_i2c, }; module_i2c_driver(adm1029_driver); Loading Loading
drivers/hwmon/adm1029.c +78 −93 Original line number Diff line number Diff line Loading @@ -105,40 +105,6 @@ static const u8 ADM1029_REG_FAN_DIV[] = { ADM1029_REG_FAN2_CONFIG, }; /* * Functions declaration */ static int adm1029_probe(struct i2c_client *client, const struct i2c_device_id *id); static int adm1029_detect(struct i2c_client *client, struct i2c_board_info *info); static int adm1029_remove(struct i2c_client *client); static struct adm1029_data *adm1029_update_device(struct device *dev); static int adm1029_init_client(struct i2c_client *client); /* * Driver data (common to all clients) */ static const struct i2c_device_id adm1029_id[] = { { "adm1029", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, adm1029_id); static struct i2c_driver adm1029_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "adm1029", }, .probe = adm1029_probe, .remove = adm1029_remove, .id_table = adm1029_id, .detect = adm1029_detect, .address_list = normal_i2c, }; /* * Client data (each client gets its own) */ Loading @@ -155,6 +121,50 @@ struct adm1029_data { u8 fan_div[ARRAY_SIZE(ADM1029_REG_FAN_DIV)]; }; /* * function that update the status of the chips (temperature for example) */ static struct adm1029_data *adm1029_update_device(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct adm1029_data *data = i2c_get_clientdata(client); mutex_lock(&data->update_lock); /* * Use the "cache" Luke, don't recheck values * if there are already checked not a long time later */ if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { int nr; dev_dbg(&client->dev, "Updating adm1029 data\n"); for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_TEMP); nr++) { data->temp[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_TEMP[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN); nr++) { data->fan[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN_DIV); nr++) { data->fan_div[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN_DIV[nr]); } data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; } /* * Sysfs stuff */ Loading Loading @@ -340,6 +350,24 @@ static int adm1029_detect(struct i2c_client *client, return 0; } static int adm1029_init_client(struct i2c_client *client) { u8 config; config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { i2c_smbus_write_byte_data(client, ADM1029_REG_CONFIG, config | 0x10); } /* recheck config */ config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { dev_err(&client->dev, "Initialization failed!\n"); return 0; } return 1; } static int adm1029_probe(struct i2c_client *client, const struct i2c_device_id *id) { Loading Loading @@ -379,23 +407,6 @@ static int adm1029_probe(struct i2c_client *client, return err; } static int adm1029_init_client(struct i2c_client *client) { u8 config; config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { i2c_smbus_write_byte_data(client, ADM1029_REG_CONFIG, config | 0x10); } /* recheck config */ config = i2c_smbus_read_byte_data(client, ADM1029_REG_CONFIG); if ((config & 0x10) == 0) { dev_err(&client->dev, "Initialization failed!\n"); return 0; } return 1; } static int adm1029_remove(struct i2c_client *client) { struct adm1029_data *data = i2c_get_clientdata(client); Loading @@ -406,49 +417,23 @@ static int adm1029_remove(struct i2c_client *client) return 0; } /* * function that update the status of the chips (temperature for example) */ static struct adm1029_data *adm1029_update_device(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct adm1029_data *data = i2c_get_clientdata(client); mutex_lock(&data->update_lock); /* * Use the "cache" Luke, don't recheck values * if there are already checked not a long time later */ if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { int nr; dev_dbg(&client->dev, "Updating adm1029 data\n"); for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_TEMP); nr++) { data->temp[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_TEMP[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN); nr++) { data->fan[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN[nr]); } for (nr = 0; nr < ARRAY_SIZE(ADM1029_REG_FAN_DIV); nr++) { data->fan_div[nr] = i2c_smbus_read_byte_data(client, ADM1029_REG_FAN_DIV[nr]); } data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); static const struct i2c_device_id adm1029_id[] = { { "adm1029", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, adm1029_id); return data; } static struct i2c_driver adm1029_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "adm1029", }, .probe = adm1029_probe, .remove = adm1029_remove, .id_table = adm1029_id, .detect = adm1029_detect, .address_list = normal_i2c, }; module_i2c_driver(adm1029_driver); Loading