Hi Emiliano,
On Tue, Mar 08, 2011 at 05:04:20AM -0500, Emiliano Carnati wrote:
Hi Dirk,
thanks for your work!
I've used your code in my system and it works fine, except for a small
bug when the
code checks for the end of conversion flag (it should be negated)
If this is really a bug, there should be two patches - one for the bug
fix,
the other for ads1115 support.
I've extended it to work with ADS1115 (the 16 bit version) and below
there
is the "patch of patch v4"
Couple of comments below.
I hope it would be useful for someone else.
Thanks again
Emiliano.
<<<<<< start of patch >>>>>>
diff --git a/drivers/hwmon/ads1015.c b/drivers/hwmon/ads1015.c
index 4572024..6025a90 100644
--- a/drivers/hwmon/ads1015.c
+++ b/drivers/hwmon/ads1015.c
@@ -53,6 +53,12 @@ struct ads1015_data {
struct mutex update_lock; /* mutex protect updates */
struct attribute *attr_table[ADS1015_CONFIG_CHANNELS + 1];
struct attribute_group attr_group;
+ int id;
+};
+
+enum ads1015_num_id {
+ ADS1015 = 0,
+ ADS1115,
};
We commonly use lowercase here.
static s32 ads1015_read_reg(struct i2c_client *client, unsigned int reg)
@@ -78,6 +84,7 @@ static int ads1015_read_value(struct i2c_client
*client, unsigned int channel,
unsigned int k;
struct ads1015_data *data = i2c_get_clientdata(client);
int res;
+ int msec;
mutex_lock(&data->update_lock);
@@ -89,6 +96,14 @@ static int ads1015_read_value(struct i2c_client
*client, unsigned int channel,
pga = (config >> 9) & 0x0007;
fullscale = fullscale_table[pga];
+ /* for ADS1115, get the conversion time */
+ if(data->id == ADS1115)
+ {
+ msec = (config >> 5) & 0x0007;
+ msec = 128 >> msec;
+ }
+ else
+ msec = 1;
Please follow Linux coding style.
(Location of { }, and use { } in both branches of if/else)
/* set channel and start single conversion */
config &= ~(0x0007 << 12);
config |= (1 << 15) | (1 << 8) | (channel & 0x0007) << 12;
@@ -98,12 +113,12 @@ static int ads1015_read_value(struct i2c_client
*client, unsigned int channel,
if (res < 0)
goto err_unlock;
for (k = 0; k < 5; ++k) {
- schedule_timeout(msecs_to_jiffies(1));
+ schedule_timeout(msecs_to_jiffies(msec));
res = ads1015_read_reg(client, ADS1015_CONFIG);
if (res < 0)
goto err_unlock;
config = res;
- if (config & (1 << 15))
+ if (~(config) & (1 << 15))
Again, please follow Linux coding style (no unnecessary () )
break;
}
if (k == 5) {
@@ -118,7 +133,10 @@ static int ads1015_read_value(struct i2c_client
*client, unsigned int channel,
mutex_unlock(&data->update_lock);
- *value = DIV_ROUND_CLOSEST(conversion * fullscale, 0x7ff0);
+ if(data->id == ADS1115)
+ *value = DIV_ROUND_CLOSEST(conversion * fullscale, 0x7fff);
+ else
+ *value = DIV_ROUND_CLOSEST(conversion * fullscale, 0x7ff0);
return 0;
@@ -133,7 +151,7 @@ static ssize_t show_in(struct device *dev, struct
device_attribute *da,
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct i2c_client *client = to_i2c_client(dev);
- int in;
+ int in = 0;
int res;
res = ads1015_read_value(client, attr->index, &in);
@@ -239,7 +257,9 @@ static int ads1015_probe(struct i2c_client *client,
err = PTR_ERR(data->hwmon_dev);
goto exit_remove;
}
-
+
+ data->id = id->driver_data;
+
return 0;
exit_remove:
@@ -251,7 +271,8 @@ exit:
}
static const struct i2c_device_id ads1015_id[] = {
- { "ads1015", 0 },
+ { "ads1015", ADS1015 },
+ { "ads1115", ADS1115 },
{ }
};
MODULE_DEVICE_TABLE(i2c, ads1015_id);
<<<<<< end of patch >>>>>>
-----------------------------
Emiliano Carnati
_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors