|
@@ -71,40 +71,6 @@ static int temp_to_reg(int val)
|
|
return (val < 0 ? val+0x100*1000 : val) / 1000;
|
|
return (val < 0 ? val+0x100*1000 : val) / 1000;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Functions declaration
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static int max1619_probe(struct i2c_client *client,
|
|
|
|
- const struct i2c_device_id *id);
|
|
|
|
-static int max1619_detect(struct i2c_client *client,
|
|
|
|
- struct i2c_board_info *info);
|
|
|
|
-static void max1619_init_client(struct i2c_client *client);
|
|
|
|
-static int max1619_remove(struct i2c_client *client);
|
|
|
|
-static struct max1619_data *max1619_update_device(struct device *dev);
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Driver data (common to all clients)
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static const struct i2c_device_id max1619_id[] = {
|
|
|
|
- { "max1619", 0 },
|
|
|
|
- { }
|
|
|
|
-};
|
|
|
|
-MODULE_DEVICE_TABLE(i2c, max1619_id);
|
|
|
|
-
|
|
|
|
-static struct i2c_driver max1619_driver = {
|
|
|
|
- .class = I2C_CLASS_HWMON,
|
|
|
|
- .driver = {
|
|
|
|
- .name = "max1619",
|
|
|
|
- },
|
|
|
|
- .probe = max1619_probe,
|
|
|
|
- .remove = max1619_remove,
|
|
|
|
- .id_table = max1619_id,
|
|
|
|
- .detect = max1619_detect,
|
|
|
|
- .address_list = normal_i2c,
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Client data (each client gets its own)
|
|
* Client data (each client gets its own)
|
|
*/
|
|
*/
|
|
@@ -123,6 +89,44 @@ struct max1619_data {
|
|
u8 alarms;
|
|
u8 alarms;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct max1619_data *max1619_update_device(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ struct i2c_client *client = to_i2c_client(dev);
|
|
|
|
+ struct max1619_data *data = i2c_get_clientdata(client);
|
|
|
|
+ int config;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&data->update_lock);
|
|
|
|
+
|
|
|
|
+ if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) {
|
|
|
|
+ dev_dbg(&client->dev, "Updating max1619 data.\n");
|
|
|
|
+ data->temp_input1 = i2c_smbus_read_byte_data(client,
|
|
|
|
+ MAX1619_REG_R_LOCAL_TEMP);
|
|
|
|
+ data->temp_input2 = i2c_smbus_read_byte_data(client,
|
|
|
|
+ MAX1619_REG_R_REMOTE_TEMP);
|
|
|
|
+ data->temp_high2 = i2c_smbus_read_byte_data(client,
|
|
|
|
+ MAX1619_REG_R_REMOTE_HIGH);
|
|
|
|
+ data->temp_low2 = i2c_smbus_read_byte_data(client,
|
|
|
|
+ MAX1619_REG_R_REMOTE_LOW);
|
|
|
|
+ data->temp_crit2 = i2c_smbus_read_byte_data(client,
|
|
|
|
+ MAX1619_REG_R_REMOTE_CRIT);
|
|
|
|
+ data->temp_hyst2 = i2c_smbus_read_byte_data(client,
|
|
|
|
+ MAX1619_REG_R_TCRIT_HYST);
|
|
|
|
+ data->alarms = i2c_smbus_read_byte_data(client,
|
|
|
|
+ MAX1619_REG_R_STATUS);
|
|
|
|
+ /* If OVERT polarity is low, reverse alarm bit */
|
|
|
|
+ config = i2c_smbus_read_byte_data(client, MAX1619_REG_R_CONFIG);
|
|
|
|
+ if (!(config & 0x20))
|
|
|
|
+ data->alarms ^= 0x02;
|
|
|
|
+
|
|
|
|
+ data->last_updated = jiffies;
|
|
|
|
+ data->valid = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mutex_unlock(&data->update_lock);
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Sysfs stuff
|
|
* Sysfs stuff
|
|
*/
|
|
*/
|
|
@@ -216,10 +220,6 @@ static const struct attribute_group max1619_group = {
|
|
.attrs = max1619_attributes,
|
|
.attrs = max1619_attributes,
|
|
};
|
|
};
|
|
|
|
|
|
-/*
|
|
|
|
- * Real code
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
/* Return 0 if detection is successful, -ENODEV otherwise */
|
|
/* Return 0 if detection is successful, -ENODEV otherwise */
|
|
static int max1619_detect(struct i2c_client *client,
|
|
static int max1619_detect(struct i2c_client *client,
|
|
struct i2c_board_info *info)
|
|
struct i2c_board_info *info)
|
|
@@ -256,6 +256,21 @@ static int max1619_detect(struct i2c_client *client,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void max1619_init_client(struct i2c_client *client)
|
|
|
|
+{
|
|
|
|
+ u8 config;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Start the conversions.
|
|
|
|
+ */
|
|
|
|
+ i2c_smbus_write_byte_data(client, MAX1619_REG_W_CONVRATE,
|
|
|
|
+ 5); /* 2 Hz */
|
|
|
|
+ config = i2c_smbus_read_byte_data(client, MAX1619_REG_R_CONFIG);
|
|
|
|
+ if (config & 0x40)
|
|
|
|
+ i2c_smbus_write_byte_data(client, MAX1619_REG_W_CONFIG,
|
|
|
|
+ config & 0xBF); /* run */
|
|
|
|
+}
|
|
|
|
+
|
|
static int max1619_probe(struct i2c_client *new_client,
|
|
static int max1619_probe(struct i2c_client *new_client,
|
|
const struct i2c_device_id *id)
|
|
const struct i2c_device_id *id)
|
|
{
|
|
{
|
|
@@ -291,21 +306,6 @@ exit_remove_files:
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
-static void max1619_init_client(struct i2c_client *client)
|
|
|
|
-{
|
|
|
|
- u8 config;
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Start the conversions.
|
|
|
|
- */
|
|
|
|
- i2c_smbus_write_byte_data(client, MAX1619_REG_W_CONVRATE,
|
|
|
|
- 5); /* 2 Hz */
|
|
|
|
- config = i2c_smbus_read_byte_data(client, MAX1619_REG_R_CONFIG);
|
|
|
|
- if (config & 0x40)
|
|
|
|
- i2c_smbus_write_byte_data(client, MAX1619_REG_W_CONFIG,
|
|
|
|
- config & 0xBF); /* run */
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static int max1619_remove(struct i2c_client *client)
|
|
static int max1619_remove(struct i2c_client *client)
|
|
{
|
|
{
|
|
struct max1619_data *data = i2c_get_clientdata(client);
|
|
struct max1619_data *data = i2c_get_clientdata(client);
|
|
@@ -316,43 +316,23 @@ static int max1619_remove(struct i2c_client *client)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static struct max1619_data *max1619_update_device(struct device *dev)
|
|
|
|
-{
|
|
|
|
- struct i2c_client *client = to_i2c_client(dev);
|
|
|
|
- struct max1619_data *data = i2c_get_clientdata(client);
|
|
|
|
- int config;
|
|
|
|
-
|
|
|
|
- mutex_lock(&data->update_lock);
|
|
|
|
-
|
|
|
|
- if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) {
|
|
|
|
- dev_dbg(&client->dev, "Updating max1619 data.\n");
|
|
|
|
- data->temp_input1 = i2c_smbus_read_byte_data(client,
|
|
|
|
- MAX1619_REG_R_LOCAL_TEMP);
|
|
|
|
- data->temp_input2 = i2c_smbus_read_byte_data(client,
|
|
|
|
- MAX1619_REG_R_REMOTE_TEMP);
|
|
|
|
- data->temp_high2 = i2c_smbus_read_byte_data(client,
|
|
|
|
- MAX1619_REG_R_REMOTE_HIGH);
|
|
|
|
- data->temp_low2 = i2c_smbus_read_byte_data(client,
|
|
|
|
- MAX1619_REG_R_REMOTE_LOW);
|
|
|
|
- data->temp_crit2 = i2c_smbus_read_byte_data(client,
|
|
|
|
- MAX1619_REG_R_REMOTE_CRIT);
|
|
|
|
- data->temp_hyst2 = i2c_smbus_read_byte_data(client,
|
|
|
|
- MAX1619_REG_R_TCRIT_HYST);
|
|
|
|
- data->alarms = i2c_smbus_read_byte_data(client,
|
|
|
|
- MAX1619_REG_R_STATUS);
|
|
|
|
- /* If OVERT polarity is low, reverse alarm bit */
|
|
|
|
- config = i2c_smbus_read_byte_data(client, MAX1619_REG_R_CONFIG);
|
|
|
|
- if (!(config & 0x20))
|
|
|
|
- data->alarms ^= 0x02;
|
|
|
|
-
|
|
|
|
- data->last_updated = jiffies;
|
|
|
|
- data->valid = 1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- mutex_unlock(&data->update_lock);
|
|
|
|
|
|
+static const struct i2c_device_id max1619_id[] = {
|
|
|
|
+ { "max1619", 0 },
|
|
|
|
+ { }
|
|
|
|
+};
|
|
|
|
+MODULE_DEVICE_TABLE(i2c, max1619_id);
|
|
|
|
|
|
- return data;
|
|
|
|
-}
|
|
|
|
|
|
+static struct i2c_driver max1619_driver = {
|
|
|
|
+ .class = I2C_CLASS_HWMON,
|
|
|
|
+ .driver = {
|
|
|
|
+ .name = "max1619",
|
|
|
|
+ },
|
|
|
|
+ .probe = max1619_probe,
|
|
|
|
+ .remove = max1619_remove,
|
|
|
|
+ .id_table = max1619_id,
|
|
|
|
+ .detect = max1619_detect,
|
|
|
|
+ .address_list = normal_i2c,
|
|
|
|
+};
|
|
|
|
|
|
module_i2c_driver(max1619_driver);
|
|
module_i2c_driver(max1619_driver);
|
|
|
|
|