aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/ads7871.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/hwmon/ads7871.c
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'drivers/hwmon/ads7871.c')
-rw-r--r--drivers/hwmon/ads7871.c78
1 files changed, 40 insertions, 38 deletions
diff --git a/drivers/hwmon/ads7871.c b/drivers/hwmon/ads7871.c
index a79875986f9..52319340e18 100644
--- a/drivers/hwmon/ads7871.c
+++ b/drivers/hwmon/ads7871.c
@@ -34,11 +34,9 @@
34#define REG_SER_CONTROL 24 /*Serial Interface Control Register*/ 34#define REG_SER_CONTROL 24 /*Serial Interface Control Register*/
35#define REG_ID 31 /*ID Register*/ 35#define REG_ID 31 /*ID Register*/
36 36
37/* 37/*From figure 17 in the datasheet
38 * From figure 17 in the datasheet 38* These bits get ORed with the address to form
39 * These bits get ORed with the address to form 39* the instruction byte */
40 * the instruction byte
41 */
42/*Instruction Bit masks*/ 40/*Instruction Bit masks*/
43#define INST_MODE_bm (1<<7) 41#define INST_MODE_bm (1<<7)
44#define INST_READ_bm (1<<6) 42#define INST_READ_bm (1<<6)
@@ -107,10 +105,8 @@ static ssize_t show_voltage(struct device *dev,
107 uint8_t channel, mux_cnv; 105 uint8_t channel, mux_cnv;
108 106
109 channel = attr->index; 107 channel = attr->index;
110 /* 108 /*TODO: add support for conversions
111 * TODO: add support for conversions 109 *other than single ended with a gain of 1*/
112 * other than single ended with a gain of 1
113 */
114 /*MUX_M3_bm forces single ended*/ 110 /*MUX_M3_bm forces single ended*/
115 /*This is also where the gain of the PGA would be set*/ 111 /*This is also where the gain of the PGA would be set*/
116 ads7871_write_reg8(spi, REG_GAIN_MUX, 112 ads7871_write_reg8(spi, REG_GAIN_MUX,
@@ -118,10 +114,8 @@ static ssize_t show_voltage(struct device *dev,
118 114
119 ret = ads7871_read_reg8(spi, REG_GAIN_MUX); 115 ret = ads7871_read_reg8(spi, REG_GAIN_MUX);
120 mux_cnv = ((ret & MUX_CNV_bm)>>MUX_CNV_bv); 116 mux_cnv = ((ret & MUX_CNV_bm)>>MUX_CNV_bv);
121 /* 117 /*on 400MHz arm9 platform the conversion
122 * on 400MHz arm9 platform the conversion 118 *is already done when we do this test*/
123 * is already done when we do this test
124 */
125 while ((i < 2) && mux_cnv) { 119 while ((i < 2) && mux_cnv) {
126 i++; 120 i++;
127 ret = ads7871_read_reg8(spi, REG_GAIN_MUX); 121 ret = ads7871_read_reg8(spi, REG_GAIN_MUX);
@@ -139,12 +133,6 @@ static ssize_t show_voltage(struct device *dev,
139 } 133 }
140} 134}
141 135
142static ssize_t ads7871_show_name(struct device *dev,
143 struct device_attribute *devattr, char *buf)
144{
145 return sprintf(buf, "%s\n", to_spi_device(dev)->modalias);
146}
147
148static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_voltage, NULL, 0); 136static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_voltage, NULL, 0);
149static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_voltage, NULL, 1); 137static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_voltage, NULL, 1);
150static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_voltage, NULL, 2); 138static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_voltage, NULL, 2);
@@ -154,8 +142,6 @@ static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_voltage, NULL, 5);
154static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_voltage, NULL, 6); 142static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_voltage, NULL, 6);
155static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_voltage, NULL, 7); 143static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_voltage, NULL, 7);
156 144
157static DEVICE_ATTR(name, S_IRUGO, ads7871_show_name, NULL);
158
159static struct attribute *ads7871_attributes[] = { 145static struct attribute *ads7871_attributes[] = {
160 &sensor_dev_attr_in0_input.dev_attr.attr, 146 &sensor_dev_attr_in0_input.dev_attr.attr,
161 &sensor_dev_attr_in1_input.dev_attr.attr, 147 &sensor_dev_attr_in1_input.dev_attr.attr,
@@ -165,7 +151,6 @@ static struct attribute *ads7871_attributes[] = {
165 &sensor_dev_attr_in5_input.dev_attr.attr, 151 &sensor_dev_attr_in5_input.dev_attr.attr,
166 &sensor_dev_attr_in6_input.dev_attr.attr, 152 &sensor_dev_attr_in6_input.dev_attr.attr,
167 &sensor_dev_attr_in7_input.dev_attr.attr, 153 &sensor_dev_attr_in7_input.dev_attr.attr,
168 &dev_attr_name.attr,
169 NULL 154 NULL
170}; 155};
171 156
@@ -173,7 +158,7 @@ static const struct attribute_group ads7871_group = {
173 .attrs = ads7871_attributes, 158 .attrs = ads7871_attributes,
174}; 159};
175 160
176static int ads7871_probe(struct spi_device *spi) 161static int __devinit ads7871_probe(struct spi_device *spi)
177{ 162{
178 int ret, err; 163 int ret, err;
179 uint8_t val; 164 uint8_t val;
@@ -194,21 +179,22 @@ static int ads7871_probe(struct spi_device *spi)
194 ret = ads7871_read_reg8(spi, REG_OSC_CONTROL); 179 ret = ads7871_read_reg8(spi, REG_OSC_CONTROL);
195 180
196 dev_dbg(&spi->dev, "REG_OSC_CONTROL write:%x, read:%x\n", val, ret); 181 dev_dbg(&spi->dev, "REG_OSC_CONTROL write:%x, read:%x\n", val, ret);
197 /* 182 /*because there is no other error checking on an SPI bus
198 * because there is no other error checking on an SPI bus 183 we need to make sure we really have a chip*/
199 * we need to make sure we really have a chip 184 if (val != ret) {
200 */ 185 err = -ENODEV;
201 if (val != ret) 186 goto exit;
202 return -ENODEV; 187 }
203 188
204 pdata = devm_kzalloc(&spi->dev, sizeof(struct ads7871_data), 189 pdata = kzalloc(sizeof(struct ads7871_data), GFP_KERNEL);
205 GFP_KERNEL); 190 if (!pdata) {
206 if (!pdata) 191 err = -ENOMEM;
207 return -ENOMEM; 192 goto exit;
193 }
208 194
209 err = sysfs_create_group(&spi->dev.kobj, &ads7871_group); 195 err = sysfs_create_group(&spi->dev.kobj, &ads7871_group);
210 if (err < 0) 196 if (err < 0)
211 return err; 197 goto error_free;
212 198
213 spi_set_drvdata(spi, pdata); 199 spi_set_drvdata(spi, pdata);
214 200
@@ -222,29 +208,45 @@ static int ads7871_probe(struct spi_device *spi)
222 208
223error_remove: 209error_remove:
224 sysfs_remove_group(&spi->dev.kobj, &ads7871_group); 210 sysfs_remove_group(&spi->dev.kobj, &ads7871_group);
211error_free:
212 kfree(pdata);
213exit:
225 return err; 214 return err;
226} 215}
227 216
228static int ads7871_remove(struct spi_device *spi) 217static int __devexit ads7871_remove(struct spi_device *spi)
229{ 218{
230 struct ads7871_data *pdata = spi_get_drvdata(spi); 219 struct ads7871_data *pdata = spi_get_drvdata(spi);
231 220
232 hwmon_device_unregister(pdata->hwmon_dev); 221 hwmon_device_unregister(pdata->hwmon_dev);
233 sysfs_remove_group(&spi->dev.kobj, &ads7871_group); 222 sysfs_remove_group(&spi->dev.kobj, &ads7871_group);
223 kfree(pdata);
234 return 0; 224 return 0;
235} 225}
236 226
237static struct spi_driver ads7871_driver = { 227static struct spi_driver ads7871_driver = {
238 .driver = { 228 .driver = {
239 .name = DEVICE_NAME, 229 .name = DEVICE_NAME,
230 .bus = &spi_bus_type,
240 .owner = THIS_MODULE, 231 .owner = THIS_MODULE,
241 }, 232 },
242 233
243 .probe = ads7871_probe, 234 .probe = ads7871_probe,
244 .remove = ads7871_remove, 235 .remove = __devexit_p(ads7871_remove),
245}; 236};
246 237
247module_spi_driver(ads7871_driver); 238static int __init ads7871_init(void)
239{
240 return spi_register_driver(&ads7871_driver);
241}
242
243static void __exit ads7871_exit(void)
244{
245 spi_unregister_driver(&ads7871_driver);
246}
247
248module_init(ads7871_init);
249module_exit(ads7871_exit);
248 250
249MODULE_AUTHOR("Paul Thomas <pthomas8589@gmail.com>"); 251MODULE_AUTHOR("Paul Thomas <pthomas8589@gmail.com>");
250MODULE_DESCRIPTION("TI ADS7871 A/D driver"); 252MODULE_DESCRIPTION("TI ADS7871 A/D driver");