提交 0962e0f1 编写于 作者: G Guillaume Roguez 提交者: Guenter Roeck

hwmon: (ads7828) add support for ADS7830

The ADS7830 device is almost the same as the ADS7828,
except that it does 8-bit sampling, instead of 12-bit.
This patch extends the ads7828 driver to support this chip.
Signed-off-by: NGuillaume Roguez <guillaume.roguez@savoirfairelinux.com>
Signed-off-by: NVivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: NGuenter Roeck <linux@roeck-us.net>
上级 46d78462
...@@ -7,9 +7,15 @@ Supported chips: ...@@ -7,9 +7,15 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website: Datasheet: Publicly available at the Texas Instruments website:
http://focus.ti.com/lit/ds/symlink/ads7828.pdf http://focus.ti.com/lit/ds/symlink/ads7828.pdf
* Texas Instruments ADS7830
Prefix: 'ads7830'
Datasheet: Publicly available at the Texas Instruments website:
http://focus.ti.com/lit/ds/symlink/ads7830.pdf
Authors: Authors:
Steve Hardy <shardy@redhat.com> Steve Hardy <shardy@redhat.com>
Vivien Didelot <vivien.didelot@savoirfairelinux.com> Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
Platform data Platform data
------------- -------------
...@@ -35,9 +41,10 @@ in include/linux/platform_data/ads7828.h). The structure fields are: ...@@ -35,9 +41,10 @@ in include/linux/platform_data/ads7828.h). The structure fields are:
Description Description
----------- -----------
This driver implements support for the Texas Instruments ADS7828. This driver implements support for the Texas Instruments ADS7828 and ADS7830.
This device is a 12-bit 8-channel A-D converter. The ADS7828 device is a 12-bit 8-channel A/D converter, while the ADS7830 does
8-bit sampling.
It can operate in single ended mode (8 +ve inputs) or in differential mode, It can operate in single ended mode (8 +ve inputs) or in differential mode,
where 4 differential pairs can be measured. where 4 differential pairs can be measured.
......
...@@ -1106,11 +1106,12 @@ config SENSORS_ADS1015 ...@@ -1106,11 +1106,12 @@ config SENSORS_ADS1015
will be called ads1015. will be called ads1015.
config SENSORS_ADS7828 config SENSORS_ADS7828
tristate "Texas Instruments ADS7828" tristate "Texas Instruments ADS7828 and compatibles"
depends on I2C depends on I2C
help help
If you say yes here you get support for Texas Instruments ADS7828 If you say yes here you get support for Texas Instruments ADS7828 and
12-bit 8-channel ADC device. ADS7830 8-channel A/D converters. ADS7828 resolution is 12-bit, while
it is 8-bit on ADS7830.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called ads7828. will be called ads7828.
......
/* /*
* ads7828.c - lm_sensors driver for ads7828 12-bit 8-channel ADC * ads7828.c - driver for TI ADS7828 8-channel A/D converter and compatibles
* (C) 2007 EADS Astrium * (C) 2007 EADS Astrium
* *
* This driver is based on the lm75 and other lm_sensors/hwmon drivers * This driver is based on the lm75 and other lm_sensors/hwmon drivers
* *
* Written by Steve Hardy <shardy@redhat.com> * Written by Steve Hardy <shardy@redhat.com>
* *
* ADS7830 support, by Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
*
* For further information, see the Documentation/hwmon/ads7828 file. * For further information, see the Documentation/hwmon/ads7828 file.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -43,6 +45,9 @@ ...@@ -43,6 +45,9 @@
#define ADS7828_EXT_VREF_MV_MIN 50 /* External vref min value 0.05V */ #define ADS7828_EXT_VREF_MV_MIN 50 /* External vref min value 0.05V */
#define ADS7828_EXT_VREF_MV_MAX 5250 /* External vref max value 5.25V */ #define ADS7828_EXT_VREF_MV_MAX 5250 /* External vref max value 5.25V */
/* List of supported devices */
enum ads7828_chips { ads7828, ads7830 };
/* Client specific data */ /* Client specific data */
struct ads7828_data { struct ads7828_data {
struct device *hwmon_dev; struct device *hwmon_dev;
...@@ -55,6 +60,7 @@ struct ads7828_data { ...@@ -55,6 +60,7 @@ struct ads7828_data {
unsigned int vref_mv; /* voltage reference value */ unsigned int vref_mv; /* voltage reference value */
u8 cmd_byte; /* Command byte without channel bits */ u8 cmd_byte; /* Command byte without channel bits */
unsigned int lsb_resol; /* Resolution of the ADC sample LSB */ unsigned int lsb_resol; /* Resolution of the ADC sample LSB */
s32 (*read_channel)(const struct i2c_client *client, u8 command);
}; };
/* Command byte C2,C1,C0 - see datasheet */ /* Command byte C2,C1,C0 - see datasheet */
...@@ -78,8 +84,7 @@ static struct ads7828_data *ads7828_update_device(struct device *dev) ...@@ -78,8 +84,7 @@ static struct ads7828_data *ads7828_update_device(struct device *dev)
for (ch = 0; ch < ADS7828_NCH; ch++) { for (ch = 0; ch < ADS7828_NCH; ch++) {
u8 cmd = ads7828_cmd_byte(data->cmd_byte, ch); u8 cmd = ads7828_cmd_byte(data->cmd_byte, ch);
data->adc_input[ch] = data->adc_input[ch] = data->read_channel(client, cmd);
i2c_smbus_read_word_swapped(client, cmd);
} }
data->last_updated = jiffies; data->last_updated = jiffies;
data->valid = true; data->valid = true;
...@@ -164,7 +169,14 @@ static int ads7828_probe(struct i2c_client *client, ...@@ -164,7 +169,14 @@ static int ads7828_probe(struct i2c_client *client,
else else
data->vref_mv = ADS7828_INT_VREF_MV; data->vref_mv = ADS7828_INT_VREF_MV;
data->lsb_resol = DIV_ROUND_CLOSEST(data->vref_mv * 1000, 4096); /* ADS7828 uses 12-bit samples, while ADS7830 is 8-bit */
if (id->driver_data == ads7828) {
data->lsb_resol = DIV_ROUND_CLOSEST(data->vref_mv * 1000, 4096);
data->read_channel = i2c_smbus_read_word_swapped;
} else {
data->lsb_resol = DIV_ROUND_CLOSEST(data->vref_mv * 1000, 256);
data->read_channel = i2c_smbus_read_byte_data;
}
data->cmd_byte = data->ext_vref ? ADS7828_CMD_PD1 : ADS7828_CMD_PD3; data->cmd_byte = data->ext_vref ? ADS7828_CMD_PD1 : ADS7828_CMD_PD3;
if (!data->diff_input) if (!data->diff_input)
...@@ -191,7 +203,8 @@ static int ads7828_probe(struct i2c_client *client, ...@@ -191,7 +203,8 @@ static int ads7828_probe(struct i2c_client *client,
} }
static const struct i2c_device_id ads7828_device_ids[] = { static const struct i2c_device_id ads7828_device_ids[] = {
{ "ads7828", 0 }, { "ads7828", ads7828 },
{ "ads7830", ads7830 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, ads7828_device_ids); MODULE_DEVICE_TABLE(i2c, ads7828_device_ids);
...@@ -210,4 +223,4 @@ module_i2c_driver(ads7828_driver); ...@@ -210,4 +223,4 @@ module_i2c_driver(ads7828_driver);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steve Hardy <shardy@redhat.com>"); MODULE_AUTHOR("Steve Hardy <shardy@redhat.com>");
MODULE_DESCRIPTION("Driver for TI ADS7828 A/D converter"); MODULE_DESCRIPTION("Driver for TI ADS7828 A/D converter and compatibles");
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册