summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGuillaume Roguez <guillaume.roguez@savoirfairelinux.com>2012-10-03 16:54:08 -0400
committerGuenter Roeck <linux@roeck-us.net>2012-12-05 13:55:54 -0500
commit0962e0f1a5634b63953db2c12edcff938f9d811d (patch)
tree698edc816261f42f0acd810f8f15a9fa70234e6f /drivers
parent46d784629202c5da9be8d727988e7083fb455bf8 (diff)
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: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hwmon/Kconfig7
-rw-r--r--drivers/hwmon/ads7828.c25
2 files changed, 23 insertions, 9 deletions
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index c4633de64465..9e3d977c106b 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -1106,11 +1106,12 @@ config SENSORS_ADS1015
1106 will be called ads1015. 1106 will be called ads1015.
1107 1107
1108config SENSORS_ADS7828 1108config SENSORS_ADS7828
1109 tristate "Texas Instruments ADS7828" 1109 tristate "Texas Instruments ADS7828 and compatibles"
1110 depends on I2C 1110 depends on I2C
1111 help 1111 help
1112 If you say yes here you get support for Texas Instruments ADS7828 1112 If you say yes here you get support for Texas Instruments ADS7828 and
1113 12-bit 8-channel ADC device. 1113 ADS7830 8-channel A/D converters. ADS7828 resolution is 12-bit, while
1114 it is 8-bit on ADS7830.
1114 1115
1115 This driver can also be built as a module. If so, the module 1116 This driver can also be built as a module. If so, the module
1116 will be called ads7828. 1117 will be called ads7828.
diff --git a/drivers/hwmon/ads7828.c b/drivers/hwmon/ads7828.c
index 42914fc1436d..409b5c16defb 100644
--- a/drivers/hwmon/ads7828.c
+++ b/drivers/hwmon/ads7828.c
@@ -1,11 +1,13 @@
1/* 1/*
2 * ads7828.c - lm_sensors driver for ads7828 12-bit 8-channel ADC 2 * ads7828.c - driver for TI ADS7828 8-channel A/D converter and compatibles
3 * (C) 2007 EADS Astrium 3 * (C) 2007 EADS Astrium
4 * 4 *
5 * This driver is based on the lm75 and other lm_sensors/hwmon drivers 5 * This driver is based on the lm75 and other lm_sensors/hwmon drivers
6 * 6 *
7 * Written by Steve Hardy <shardy@redhat.com> 7 * Written by Steve Hardy <shardy@redhat.com>
8 * 8 *
9 * ADS7830 support, by Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
10 *
9 * For further information, see the Documentation/hwmon/ads7828 file. 11 * For further information, see the Documentation/hwmon/ads7828 file.
10 * 12 *
11 * This program is free software; you can redistribute it and/or modify 13 * This program is free software; you can redistribute it and/or modify
@@ -43,6 +45,9 @@
43#define ADS7828_EXT_VREF_MV_MIN 50 /* External vref min value 0.05V */ 45#define ADS7828_EXT_VREF_MV_MIN 50 /* External vref min value 0.05V */
44#define ADS7828_EXT_VREF_MV_MAX 5250 /* External vref max value 5.25V */ 46#define ADS7828_EXT_VREF_MV_MAX 5250 /* External vref max value 5.25V */
45 47
48/* List of supported devices */
49enum ads7828_chips { ads7828, ads7830 };
50
46/* Client specific data */ 51/* Client specific data */
47struct ads7828_data { 52struct ads7828_data {
48 struct device *hwmon_dev; 53 struct device *hwmon_dev;
@@ -55,6 +60,7 @@ struct ads7828_data {
55 unsigned int vref_mv; /* voltage reference value */ 60 unsigned int vref_mv; /* voltage reference value */
56 u8 cmd_byte; /* Command byte without channel bits */ 61 u8 cmd_byte; /* Command byte without channel bits */
57 unsigned int lsb_resol; /* Resolution of the ADC sample LSB */ 62 unsigned int lsb_resol; /* Resolution of the ADC sample LSB */
63 s32 (*read_channel)(const struct i2c_client *client, u8 command);
58}; 64};
59 65
60/* Command byte C2,C1,C0 - see datasheet */ 66/* Command byte C2,C1,C0 - see datasheet */
@@ -78,8 +84,7 @@ static struct ads7828_data *ads7828_update_device(struct device *dev)
78 84
79 for (ch = 0; ch < ADS7828_NCH; ch++) { 85 for (ch = 0; ch < ADS7828_NCH; ch++) {
80 u8 cmd = ads7828_cmd_byte(data->cmd_byte, ch); 86 u8 cmd = ads7828_cmd_byte(data->cmd_byte, ch);
81 data->adc_input[ch] = 87 data->adc_input[ch] = data->read_channel(client, cmd);
82 i2c_smbus_read_word_swapped(client, cmd);
83 } 88 }
84 data->last_updated = jiffies; 89 data->last_updated = jiffies;
85 data->valid = true; 90 data->valid = true;
@@ -164,7 +169,14 @@ static int ads7828_probe(struct i2c_client *client,
164 else 169 else
165 data->vref_mv = ADS7828_INT_VREF_MV; 170 data->vref_mv = ADS7828_INT_VREF_MV;
166 171
167 data->lsb_resol = DIV_ROUND_CLOSEST(data->vref_mv * 1000, 4096); 172 /* ADS7828 uses 12-bit samples, while ADS7830 is 8-bit */
173 if (id->driver_data == ads7828) {
174 data->lsb_resol = DIV_ROUND_CLOSEST(data->vref_mv * 1000, 4096);
175 data->read_channel = i2c_smbus_read_word_swapped;
176 } else {
177 data->lsb_resol = DIV_ROUND_CLOSEST(data->vref_mv * 1000, 256);
178 data->read_channel = i2c_smbus_read_byte_data;
179 }
168 180
169 data->cmd_byte = data->ext_vref ? ADS7828_CMD_PD1 : ADS7828_CMD_PD3; 181 data->cmd_byte = data->ext_vref ? ADS7828_CMD_PD1 : ADS7828_CMD_PD3;
170 if (!data->diff_input) 182 if (!data->diff_input)
@@ -191,7 +203,8 @@ error:
191} 203}
192 204
193static const struct i2c_device_id ads7828_device_ids[] = { 205static const struct i2c_device_id ads7828_device_ids[] = {
194 { "ads7828", 0 }, 206 { "ads7828", ads7828 },
207 { "ads7830", ads7830 },
195 { } 208 { }
196}; 209};
197MODULE_DEVICE_TABLE(i2c, ads7828_device_ids); 210MODULE_DEVICE_TABLE(i2c, ads7828_device_ids);
@@ -210,4 +223,4 @@ module_i2c_driver(ads7828_driver);
210 223
211MODULE_LICENSE("GPL"); 224MODULE_LICENSE("GPL");
212MODULE_AUTHOR("Steve Hardy <shardy@redhat.com>"); 225MODULE_AUTHOR("Steve Hardy <shardy@redhat.com>");
213MODULE_DESCRIPTION("Driver for TI ADS7828 A/D converter"); 226MODULE_DESCRIPTION("Driver for TI ADS7828 A/D converter and compatibles");