|
@@ -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. */
|
|
@@ -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)
|
|
|
{
|
|
@@ -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)
|
|
|
{
|