Loading drivers/hwmon/ds1621.c +57 −66 Original line number Diff line number Diff line Loading @@ -81,34 +81,6 @@ struct ds1621_data { u8 conf; /* Register encoding, combined */ }; static int ds1621_probe(struct i2c_client *client, const struct i2c_device_id *id); static int ds1621_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); static void ds1621_init_client(struct i2c_client *client); static int ds1621_remove(struct i2c_client *client); static struct ds1621_data *ds1621_update_client(struct device *dev); static const struct i2c_device_id ds1621_id[] = { { "ds1621", ds1621 }, { "ds1625", ds1621 }, { } }; MODULE_DEVICE_TABLE(i2c, ds1621_id); /* This is the driver that will be inserted */ static struct i2c_driver ds1621_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "ds1621", }, .probe = ds1621_probe, .remove = ds1621_remove, .id_table = ds1621_id, .detect = ds1621_detect, .address_data = &addr_data, }; /* All registers are word-sized, except for the configuration register. DS1621 uses a high-byte first convention, which is exactly opposite to the SMBus standard. */ Loading Loading @@ -146,6 +118,45 @@ static void ds1621_init_client(struct i2c_client *client) i2c_smbus_write_byte(client, DS1621_COM_START); } static struct ds1621_data *ds1621_update_client(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct ds1621_data *data = i2c_get_clientdata(client); u8 new_conf; mutex_lock(&data->update_lock); if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) { int i; dev_dbg(&client->dev, "Starting ds1621 update\n"); data->conf = ds1621_read_value(client, DS1621_REG_CONF); for (i = 0; i < ARRAY_SIZE(data->temp); i++) data->temp[i] = ds1621_read_value(client, DS1621_REG_TEMP[i]); /* reset alarms if necessary */ new_conf = data->conf; if (data->temp[0] > data->temp[1]) /* input > min */ new_conf &= ~DS1621_ALARM_TEMP_LOW; if (data->temp[0] < data->temp[2]) /* input < max */ new_conf &= ~DS1621_ALARM_TEMP_HIGH; if (data->conf != new_conf) ds1621_write_value(client, DS1621_REG_CONF, new_conf); data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; } static ssize_t show_temp(struct device *dev, struct device_attribute *da, char *buf) { Loading Loading @@ -294,45 +305,25 @@ static int ds1621_remove(struct i2c_client *client) return 0; } static const struct i2c_device_id ds1621_id[] = { { "ds1621", ds1621 }, { "ds1625", ds1621 }, { } }; MODULE_DEVICE_TABLE(i2c, ds1621_id); static struct ds1621_data *ds1621_update_client(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct ds1621_data *data = i2c_get_clientdata(client); u8 new_conf; mutex_lock(&data->update_lock); if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) { int i; dev_dbg(&client->dev, "Starting ds1621 update\n"); data->conf = ds1621_read_value(client, DS1621_REG_CONF); for (i = 0; i < ARRAY_SIZE(data->temp); i++) data->temp[i] = ds1621_read_value(client, DS1621_REG_TEMP[i]); /* reset alarms if necessary */ new_conf = data->conf; if (data->temp[0] > data->temp[1]) /* input > min */ new_conf &= ~DS1621_ALARM_TEMP_LOW; if (data->temp[0] < data->temp[2]) /* input < max */ new_conf &= ~DS1621_ALARM_TEMP_HIGH; if (data->conf != new_conf) ds1621_write_value(client, DS1621_REG_CONF, new_conf); data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; } /* This is the driver that will be inserted */ static struct i2c_driver ds1621_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "ds1621", }, .probe = ds1621_probe, .remove = ds1621_remove, .id_table = ds1621_id, .detect = ds1621_detect, .address_data = &addr_data, }; static int __init ds1621_init(void) { Loading Loading
drivers/hwmon/ds1621.c +57 −66 Original line number Diff line number Diff line Loading @@ -81,34 +81,6 @@ struct ds1621_data { u8 conf; /* Register encoding, combined */ }; static int ds1621_probe(struct i2c_client *client, const struct i2c_device_id *id); static int ds1621_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); static void ds1621_init_client(struct i2c_client *client); static int ds1621_remove(struct i2c_client *client); static struct ds1621_data *ds1621_update_client(struct device *dev); static const struct i2c_device_id ds1621_id[] = { { "ds1621", ds1621 }, { "ds1625", ds1621 }, { } }; MODULE_DEVICE_TABLE(i2c, ds1621_id); /* This is the driver that will be inserted */ static struct i2c_driver ds1621_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "ds1621", }, .probe = ds1621_probe, .remove = ds1621_remove, .id_table = ds1621_id, .detect = ds1621_detect, .address_data = &addr_data, }; /* All registers are word-sized, except for the configuration register. DS1621 uses a high-byte first convention, which is exactly opposite to the SMBus standard. */ Loading Loading @@ -146,6 +118,45 @@ static void ds1621_init_client(struct i2c_client *client) i2c_smbus_write_byte(client, DS1621_COM_START); } static struct ds1621_data *ds1621_update_client(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct ds1621_data *data = i2c_get_clientdata(client); u8 new_conf; mutex_lock(&data->update_lock); if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) { int i; dev_dbg(&client->dev, "Starting ds1621 update\n"); data->conf = ds1621_read_value(client, DS1621_REG_CONF); for (i = 0; i < ARRAY_SIZE(data->temp); i++) data->temp[i] = ds1621_read_value(client, DS1621_REG_TEMP[i]); /* reset alarms if necessary */ new_conf = data->conf; if (data->temp[0] > data->temp[1]) /* input > min */ new_conf &= ~DS1621_ALARM_TEMP_LOW; if (data->temp[0] < data->temp[2]) /* input < max */ new_conf &= ~DS1621_ALARM_TEMP_HIGH; if (data->conf != new_conf) ds1621_write_value(client, DS1621_REG_CONF, new_conf); data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; } static ssize_t show_temp(struct device *dev, struct device_attribute *da, char *buf) { Loading Loading @@ -294,45 +305,25 @@ static int ds1621_remove(struct i2c_client *client) return 0; } static const struct i2c_device_id ds1621_id[] = { { "ds1621", ds1621 }, { "ds1625", ds1621 }, { } }; MODULE_DEVICE_TABLE(i2c, ds1621_id); static struct ds1621_data *ds1621_update_client(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct ds1621_data *data = i2c_get_clientdata(client); u8 new_conf; mutex_lock(&data->update_lock); if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) { int i; dev_dbg(&client->dev, "Starting ds1621 update\n"); data->conf = ds1621_read_value(client, DS1621_REG_CONF); for (i = 0; i < ARRAY_SIZE(data->temp); i++) data->temp[i] = ds1621_read_value(client, DS1621_REG_TEMP[i]); /* reset alarms if necessary */ new_conf = data->conf; if (data->temp[0] > data->temp[1]) /* input > min */ new_conf &= ~DS1621_ALARM_TEMP_LOW; if (data->temp[0] < data->temp[2]) /* input < max */ new_conf &= ~DS1621_ALARM_TEMP_HIGH; if (data->conf != new_conf) ds1621_write_value(client, DS1621_REG_CONF, new_conf); data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; } /* This is the driver that will be inserted */ static struct i2c_driver ds1621_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "ds1621", }, .probe = ds1621_probe, .remove = ds1621_remove, .id_table = ds1621_id, .detect = ds1621_detect, .address_data = &addr_data, }; static int __init ds1621_init(void) { Loading