diff options
Diffstat (limited to 'drivers/hwmon/adm1025.c')
-rw-r--r-- | drivers/hwmon/adm1025.c | 393 |
1 files changed, 214 insertions, 179 deletions
diff --git a/drivers/hwmon/adm1025.c b/drivers/hwmon/adm1025.c index 041ecb0bdf48..e96c3725203d 100644 --- a/drivers/hwmon/adm1025.c +++ b/drivers/hwmon/adm1025.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/jiffies.h> | 51 | #include <linux/jiffies.h> |
52 | #include <linux/i2c.h> | 52 | #include <linux/i2c.h> |
53 | #include <linux/hwmon.h> | 53 | #include <linux/hwmon.h> |
54 | #include <linux/hwmon-sysfs.h> | ||
54 | #include <linux/hwmon-vid.h> | 55 | #include <linux/hwmon-vid.h> |
55 | #include <linux/err.h> | 56 | #include <linux/err.h> |
56 | #include <linux/mutex.h> | 57 | #include <linux/mutex.h> |
@@ -74,7 +75,7 @@ I2C_CLIENT_INSMOD_2(adm1025, ne1619); | |||
74 | */ | 75 | */ |
75 | 76 | ||
76 | #define ADM1025_REG_MAN_ID 0x3E | 77 | #define ADM1025_REG_MAN_ID 0x3E |
77 | #define ADM1025_REG_CHIP_ID 0x3F | 78 | #define ADM1025_REG_CHIP_ID 0x3F |
78 | #define ADM1025_REG_CONFIG 0x40 | 79 | #define ADM1025_REG_CONFIG 0x40 |
79 | #define ADM1025_REG_STATUS1 0x41 | 80 | #define ADM1025_REG_STATUS1 0x41 |
80 | #define ADM1025_REG_STATUS2 0x42 | 81 | #define ADM1025_REG_STATUS2 0x42 |
@@ -92,7 +93,7 @@ I2C_CLIENT_INSMOD_2(adm1025, ne1619); | |||
92 | * The ADM1025 uses signed 8-bit values for temperatures. | 93 | * The ADM1025 uses signed 8-bit values for temperatures. |
93 | */ | 94 | */ |
94 | 95 | ||
95 | static int in_scale[6] = { 2500, 2250, 3300, 5000, 12000, 3300 }; | 96 | static const int in_scale[6] = { 2500, 2250, 3300, 5000, 12000, 3300 }; |
96 | 97 | ||
97 | #define IN_FROM_REG(reg,scale) (((reg) * (scale) + 96) / 192) | 98 | #define IN_FROM_REG(reg,scale) (((reg) * (scale) + 96) / 192) |
98 | #define IN_TO_REG(val,scale) ((val) <= 0 ? 0 : \ | 99 | #define IN_TO_REG(val,scale) ((val) <= 0 ? 0 : \ |
@@ -122,7 +123,6 @@ static struct i2c_driver adm1025_driver = { | |||
122 | .driver = { | 123 | .driver = { |
123 | .name = "adm1025", | 124 | .name = "adm1025", |
124 | }, | 125 | }, |
125 | .id = I2C_DRIVERID_ADM1025, | ||
126 | .attach_adapter = adm1025_attach_adapter, | 126 | .attach_adapter = adm1025_attach_adapter, |
127 | .detach_client = adm1025_detach_client, | 127 | .detach_client = adm1025_detach_client, |
128 | }; | 128 | }; |
@@ -153,86 +153,96 @@ struct adm1025_data { | |||
153 | * Sysfs stuff | 153 | * Sysfs stuff |
154 | */ | 154 | */ |
155 | 155 | ||
156 | #define show_in(offset) \ | 156 | static ssize_t |
157 | static ssize_t show_in##offset(struct device *dev, struct device_attribute *attr, char *buf) \ | 157 | show_in(struct device *dev, struct device_attribute *attr, char *buf) |
158 | { \ | 158 | { |
159 | struct adm1025_data *data = adm1025_update_device(dev); \ | 159 | int index = to_sensor_dev_attr(attr)->index; |
160 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in[offset], \ | 160 | struct adm1025_data *data = adm1025_update_device(dev); |
161 | in_scale[offset])); \ | 161 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in[index], |
162 | } \ | 162 | in_scale[index])); |
163 | static ssize_t show_in##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \ | 163 | } |
164 | { \ | 164 | |
165 | struct adm1025_data *data = adm1025_update_device(dev); \ | 165 | static ssize_t |
166 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset], \ | 166 | show_in_min(struct device *dev, struct device_attribute *attr, char *buf) |
167 | in_scale[offset])); \ | 167 | { |
168 | } \ | 168 | int index = to_sensor_dev_attr(attr)->index; |
169 | static ssize_t show_in##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \ | 169 | struct adm1025_data *data = adm1025_update_device(dev); |
170 | { \ | 170 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[index], |
171 | struct adm1025_data *data = adm1025_update_device(dev); \ | 171 | in_scale[index])); |
172 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[offset], \ | 172 | } |
173 | in_scale[offset])); \ | 173 | |
174 | } \ | 174 | static ssize_t |
175 | static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL); | 175 | show_in_max(struct device *dev, struct device_attribute *attr, char *buf) |
176 | show_in(0); | 176 | { |
177 | show_in(1); | 177 | int index = to_sensor_dev_attr(attr)->index; |
178 | show_in(2); | 178 | struct adm1025_data *data = adm1025_update_device(dev); |
179 | show_in(3); | 179 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[index], |
180 | show_in(4); | 180 | in_scale[index])); |
181 | show_in(5); | 181 | } |
182 | 182 | ||
183 | #define show_temp(offset) \ | 183 | static ssize_t |
184 | static ssize_t show_temp##offset(struct device *dev, struct device_attribute *attr, char *buf) \ | 184 | show_temp(struct device *dev, struct device_attribute *attr, char *buf) |
185 | { \ | 185 | { |
186 | struct adm1025_data *data = adm1025_update_device(dev); \ | 186 | int index = to_sensor_dev_attr(attr)->index; |
187 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[offset-1])); \ | 187 | struct adm1025_data *data = adm1025_update_device(dev); |
188 | } \ | 188 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[index])); |
189 | static ssize_t show_temp##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \ | 189 | } |
190 | { \ | 190 | |
191 | struct adm1025_data *data = adm1025_update_device(dev); \ | 191 | static ssize_t |
192 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[offset-1])); \ | 192 | show_temp_min(struct device *dev, struct device_attribute *attr, char *buf) |
193 | } \ | 193 | { |
194 | static ssize_t show_temp##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \ | 194 | int index = to_sensor_dev_attr(attr)->index; |
195 | { \ | 195 | struct adm1025_data *data = adm1025_update_device(dev); |
196 | struct adm1025_data *data = adm1025_update_device(dev); \ | 196 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[index])); |
197 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[offset-1])); \ | 197 | } |
198 | }\ | 198 | |
199 | static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp##offset, NULL); | 199 | static ssize_t |
200 | show_temp(1); | 200 | show_temp_max(struct device *dev, struct device_attribute *attr, char *buf) |
201 | show_temp(2); | 201 | { |
202 | int index = to_sensor_dev_attr(attr)->index; | ||
203 | struct adm1025_data *data = adm1025_update_device(dev); | ||
204 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index])); | ||
205 | } | ||
206 | |||
207 | static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, | ||
208 | const char *buf, size_t count) | ||
209 | { | ||
210 | int index = to_sensor_dev_attr(attr)->index; | ||
211 | struct i2c_client *client = to_i2c_client(dev); | ||
212 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
213 | long val = simple_strtol(buf, NULL, 10); | ||
214 | |||
215 | mutex_lock(&data->update_lock); | ||
216 | data->in_min[index] = IN_TO_REG(val, in_scale[index]); | ||
217 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(index), | ||
218 | data->in_min[index]); | ||
219 | mutex_unlock(&data->update_lock); | ||
220 | return count; | ||
221 | } | ||
222 | |||
223 | static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, | ||
224 | const char *buf, size_t count) | ||
225 | { | ||
226 | int index = to_sensor_dev_attr(attr)->index; | ||
227 | struct i2c_client *client = to_i2c_client(dev); | ||
228 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
229 | long val = simple_strtol(buf, NULL, 10); | ||
230 | |||
231 | mutex_lock(&data->update_lock); | ||
232 | data->in_max[index] = IN_TO_REG(val, in_scale[index]); | ||
233 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(index), | ||
234 | data->in_max[index]); | ||
235 | mutex_unlock(&data->update_lock); | ||
236 | return count; | ||
237 | } | ||
202 | 238 | ||
203 | #define set_in(offset) \ | 239 | #define set_in(offset) \ |
204 | static ssize_t set_in##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \ | 240 | static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ |
205 | size_t count) \ | 241 | show_in, NULL, offset); \ |
206 | { \ | 242 | static SENSOR_DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ |
207 | struct i2c_client *client = to_i2c_client(dev); \ | 243 | show_in_min, set_in_min, offset); \ |
208 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 244 | static SENSOR_DEVICE_ATTR(in##offset##_max, S_IWUSR | S_IRUGO, \ |
209 | long val = simple_strtol(buf, NULL, 10); \ | 245 | show_in_max, set_in_max, offset) |
210 | \ | ||
211 | mutex_lock(&data->update_lock); \ | ||
212 | data->in_min[offset] = IN_TO_REG(val, in_scale[offset]); \ | ||
213 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(offset), \ | ||
214 | data->in_min[offset]); \ | ||
215 | mutex_unlock(&data->update_lock); \ | ||
216 | return count; \ | ||
217 | } \ | ||
218 | static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ | ||
219 | size_t count) \ | ||
220 | { \ | ||
221 | struct i2c_client *client = to_i2c_client(dev); \ | ||
222 | struct adm1025_data *data = i2c_get_clientdata(client); \ | ||
223 | long val = simple_strtol(buf, NULL, 10); \ | ||
224 | \ | ||
225 | mutex_lock(&data->update_lock); \ | ||
226 | data->in_max[offset] = IN_TO_REG(val, in_scale[offset]); \ | ||
227 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(offset), \ | ||
228 | data->in_max[offset]); \ | ||
229 | mutex_unlock(&data->update_lock); \ | ||
230 | return count; \ | ||
231 | } \ | ||
232 | static DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ | ||
233 | show_in##offset##_min, set_in##offset##_min); \ | ||
234 | static DEVICE_ATTR(in##offset##_max, S_IWUSR | S_IRUGO, \ | ||
235 | show_in##offset##_max, set_in##offset##_max); | ||
236 | set_in(0); | 246 | set_in(0); |
237 | set_in(1); | 247 | set_in(1); |
238 | set_in(2); | 248 | set_in(2); |
@@ -240,65 +250,91 @@ set_in(3); | |||
240 | set_in(4); | 250 | set_in(4); |
241 | set_in(5); | 251 | set_in(5); |
242 | 252 | ||
253 | static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, | ||
254 | const char *buf, size_t count) | ||
255 | { | ||
256 | int index = to_sensor_dev_attr(attr)->index; | ||
257 | struct i2c_client *client = to_i2c_client(dev); | ||
258 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
259 | long val = simple_strtol(buf, NULL, 10); | ||
260 | |||
261 | mutex_lock(&data->update_lock); | ||
262 | data->temp_min[index] = TEMP_TO_REG(val); | ||
263 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(index), | ||
264 | data->temp_min[index]); | ||
265 | mutex_unlock(&data->update_lock); | ||
266 | return count; | ||
267 | } | ||
268 | |||
269 | static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, | ||
270 | const char *buf, size_t count) | ||
271 | { | ||
272 | int index = to_sensor_dev_attr(attr)->index; | ||
273 | struct i2c_client *client = to_i2c_client(dev); | ||
274 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
275 | long val = simple_strtol(buf, NULL, 10); | ||
276 | |||
277 | mutex_lock(&data->update_lock); | ||
278 | data->temp_max[index] = TEMP_TO_REG(val); | ||
279 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(index), | ||
280 | data->temp_max[index]); | ||
281 | mutex_unlock(&data->update_lock); | ||
282 | return count; | ||
283 | } | ||
284 | |||
243 | #define set_temp(offset) \ | 285 | #define set_temp(offset) \ |
244 | static ssize_t set_temp##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \ | 286 | static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ |
245 | size_t count) \ | 287 | show_temp, NULL, offset - 1); \ |
246 | { \ | 288 | static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ |
247 | struct i2c_client *client = to_i2c_client(dev); \ | 289 | show_temp_min, set_temp_min, offset - 1); \ |
248 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 290 | static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \ |
249 | long val = simple_strtol(buf, NULL, 10); \ | 291 | show_temp_max, set_temp_max, offset - 1) |
250 | \ | ||
251 | mutex_lock(&data->update_lock); \ | ||
252 | data->temp_min[offset-1] = TEMP_TO_REG(val); \ | ||
253 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(offset-1), \ | ||
254 | data->temp_min[offset-1]); \ | ||
255 | mutex_unlock(&data->update_lock); \ | ||
256 | return count; \ | ||
257 | } \ | ||
258 | static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ | ||
259 | size_t count) \ | ||
260 | { \ | ||
261 | struct i2c_client *client = to_i2c_client(dev); \ | ||
262 | struct adm1025_data *data = i2c_get_clientdata(client); \ | ||
263 | long val = simple_strtol(buf, NULL, 10); \ | ||
264 | \ | ||
265 | mutex_lock(&data->update_lock); \ | ||
266 | data->temp_max[offset-1] = TEMP_TO_REG(val); \ | ||
267 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(offset-1), \ | ||
268 | data->temp_max[offset-1]); \ | ||
269 | mutex_unlock(&data->update_lock); \ | ||
270 | return count; \ | ||
271 | } \ | ||
272 | static DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ | ||
273 | show_temp##offset##_min, set_temp##offset##_min); \ | ||
274 | static DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \ | ||
275 | show_temp##offset##_max, set_temp##offset##_max); | ||
276 | set_temp(1); | 292 | set_temp(1); |
277 | set_temp(2); | 293 | set_temp(2); |
278 | 294 | ||
279 | static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf) | 295 | static ssize_t |
296 | show_alarms(struct device *dev, struct device_attribute *attr, char *buf) | ||
280 | { | 297 | { |
281 | struct adm1025_data *data = adm1025_update_device(dev); | 298 | struct adm1025_data *data = adm1025_update_device(dev); |
282 | return sprintf(buf, "%u\n", data->alarms); | 299 | return sprintf(buf, "%u\n", data->alarms); |
283 | } | 300 | } |
284 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); | 301 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); |
285 | 302 | ||
286 | static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf) | 303 | static ssize_t |
304 | show_alarm(struct device *dev, struct device_attribute *attr, char *buf) | ||
305 | { | ||
306 | int bitnr = to_sensor_dev_attr(attr)->index; | ||
307 | struct adm1025_data *data = adm1025_update_device(dev); | ||
308 | return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); | ||
309 | } | ||
310 | static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); | ||
311 | static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); | ||
312 | static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); | ||
313 | static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); | ||
314 | static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8); | ||
315 | static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9); | ||
316 | static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 5); | ||
317 | static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 4); | ||
318 | static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_alarm, NULL, 14); | ||
319 | |||
320 | static ssize_t | ||
321 | show_vid(struct device *dev, struct device_attribute *attr, char *buf) | ||
287 | { | 322 | { |
288 | struct adm1025_data *data = adm1025_update_device(dev); | 323 | struct adm1025_data *data = adm1025_update_device(dev); |
289 | return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm)); | 324 | return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm)); |
290 | } | 325 | } |
291 | static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); | 326 | static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); |
292 | 327 | ||
293 | static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) | 328 | static ssize_t |
329 | show_vrm(struct device *dev, struct device_attribute *attr, char *buf) | ||
294 | { | 330 | { |
295 | struct adm1025_data *data = dev_get_drvdata(dev); | 331 | struct adm1025_data *data = dev_get_drvdata(dev); |
296 | return sprintf(buf, "%u\n", data->vrm); | 332 | return sprintf(buf, "%u\n", data->vrm); |
297 | } | 333 | } |
298 | static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 334 | static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, |
335 | const char *buf, size_t count) | ||
299 | { | 336 | { |
300 | struct i2c_client *client = to_i2c_client(dev); | 337 | struct adm1025_data *data = dev_get_drvdata(dev); |
301 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
302 | data->vrm = simple_strtoul(buf, NULL, 10); | 338 | data->vrm = simple_strtoul(buf, NULL, 10); |
303 | return count; | 339 | return count; |
304 | } | 340 | } |
@@ -316,27 +352,35 @@ static int adm1025_attach_adapter(struct i2c_adapter *adapter) | |||
316 | } | 352 | } |
317 | 353 | ||
318 | static struct attribute *adm1025_attributes[] = { | 354 | static struct attribute *adm1025_attributes[] = { |
319 | &dev_attr_in0_input.attr, | 355 | &sensor_dev_attr_in0_input.dev_attr.attr, |
320 | &dev_attr_in1_input.attr, | 356 | &sensor_dev_attr_in1_input.dev_attr.attr, |
321 | &dev_attr_in2_input.attr, | 357 | &sensor_dev_attr_in2_input.dev_attr.attr, |
322 | &dev_attr_in3_input.attr, | 358 | &sensor_dev_attr_in3_input.dev_attr.attr, |
323 | &dev_attr_in5_input.attr, | 359 | &sensor_dev_attr_in5_input.dev_attr.attr, |
324 | &dev_attr_in0_min.attr, | 360 | &sensor_dev_attr_in0_min.dev_attr.attr, |
325 | &dev_attr_in1_min.attr, | 361 | &sensor_dev_attr_in1_min.dev_attr.attr, |
326 | &dev_attr_in2_min.attr, | 362 | &sensor_dev_attr_in2_min.dev_attr.attr, |
327 | &dev_attr_in3_min.attr, | 363 | &sensor_dev_attr_in3_min.dev_attr.attr, |
328 | &dev_attr_in5_min.attr, | 364 | &sensor_dev_attr_in5_min.dev_attr.attr, |
329 | &dev_attr_in0_max.attr, | 365 | &sensor_dev_attr_in0_max.dev_attr.attr, |
330 | &dev_attr_in1_max.attr, | 366 | &sensor_dev_attr_in1_max.dev_attr.attr, |
331 | &dev_attr_in2_max.attr, | 367 | &sensor_dev_attr_in2_max.dev_attr.attr, |
332 | &dev_attr_in3_max.attr, | 368 | &sensor_dev_attr_in3_max.dev_attr.attr, |
333 | &dev_attr_in5_max.attr, | 369 | &sensor_dev_attr_in5_max.dev_attr.attr, |
334 | &dev_attr_temp1_input.attr, | 370 | &sensor_dev_attr_in0_alarm.dev_attr.attr, |
335 | &dev_attr_temp2_input.attr, | 371 | &sensor_dev_attr_in1_alarm.dev_attr.attr, |
336 | &dev_attr_temp1_min.attr, | 372 | &sensor_dev_attr_in2_alarm.dev_attr.attr, |
337 | &dev_attr_temp2_min.attr, | 373 | &sensor_dev_attr_in3_alarm.dev_attr.attr, |
338 | &dev_attr_temp1_max.attr, | 374 | &sensor_dev_attr_in5_alarm.dev_attr.attr, |
339 | &dev_attr_temp2_max.attr, | 375 | &sensor_dev_attr_temp1_input.dev_attr.attr, |
376 | &sensor_dev_attr_temp2_input.dev_attr.attr, | ||
377 | &sensor_dev_attr_temp1_min.dev_attr.attr, | ||
378 | &sensor_dev_attr_temp2_min.dev_attr.attr, | ||
379 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
380 | &sensor_dev_attr_temp2_max.dev_attr.attr, | ||
381 | &sensor_dev_attr_temp1_alarm.dev_attr.attr, | ||
382 | &sensor_dev_attr_temp2_alarm.dev_attr.attr, | ||
383 | &sensor_dev_attr_temp1_fault.dev_attr.attr, | ||
340 | &dev_attr_alarms.attr, | 384 | &dev_attr_alarms.attr, |
341 | &dev_attr_cpu0_vid.attr, | 385 | &dev_attr_cpu0_vid.attr, |
342 | &dev_attr_vrm.attr, | 386 | &dev_attr_vrm.attr, |
@@ -347,15 +391,16 @@ static const struct attribute_group adm1025_group = { | |||
347 | .attrs = adm1025_attributes, | 391 | .attrs = adm1025_attributes, |
348 | }; | 392 | }; |
349 | 393 | ||
350 | static struct attribute *adm1025_attributes_opt[] = { | 394 | static struct attribute *adm1025_attributes_in4[] = { |
351 | &dev_attr_in4_input.attr, | 395 | &sensor_dev_attr_in4_input.dev_attr.attr, |
352 | &dev_attr_in4_min.attr, | 396 | &sensor_dev_attr_in4_min.dev_attr.attr, |
353 | &dev_attr_in4_max.attr, | 397 | &sensor_dev_attr_in4_max.dev_attr.attr, |
398 | &sensor_dev_attr_in4_alarm.dev_attr.attr, | ||
354 | NULL | 399 | NULL |
355 | }; | 400 | }; |
356 | 401 | ||
357 | static const struct attribute_group adm1025_group_opt = { | 402 | static const struct attribute_group adm1025_group_in4 = { |
358 | .attrs = adm1025_attributes_opt, | 403 | .attrs = adm1025_attributes_in4, |
359 | }; | 404 | }; |
360 | 405 | ||
361 | /* | 406 | /* |
@@ -364,7 +409,7 @@ static const struct attribute_group adm1025_group_opt = { | |||
364 | */ | 409 | */ |
365 | static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | 410 | static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) |
366 | { | 411 | { |
367 | struct i2c_client *new_client; | 412 | struct i2c_client *client; |
368 | struct adm1025_data *data; | 413 | struct adm1025_data *data; |
369 | int err = 0; | 414 | int err = 0; |
370 | const char *name = ""; | 415 | const char *name = ""; |
@@ -378,14 +423,11 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | |||
378 | goto exit; | 423 | goto exit; |
379 | } | 424 | } |
380 | 425 | ||
381 | /* The common I2C client data is placed right before the | 426 | client = &data->client; |
382 | ADM1025-specific data. */ | 427 | i2c_set_clientdata(client, data); |
383 | new_client = &data->client; | 428 | client->addr = address; |
384 | i2c_set_clientdata(new_client, data); | 429 | client->adapter = adapter; |
385 | new_client->addr = address; | 430 | client->driver = &adm1025_driver; |
386 | new_client->adapter = adapter; | ||
387 | new_client->driver = &adm1025_driver; | ||
388 | new_client->flags = 0; | ||
389 | 431 | ||
390 | /* | 432 | /* |
391 | * Now we do the remaining detection. A negative kind means that | 433 | * Now we do the remaining detection. A negative kind means that |
@@ -397,12 +439,12 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | |||
397 | * requested, so both the detection and the identification steps | 439 | * requested, so both the detection and the identification steps |
398 | * are skipped. | 440 | * are skipped. |
399 | */ | 441 | */ |
400 | config = i2c_smbus_read_byte_data(new_client, ADM1025_REG_CONFIG); | 442 | config = i2c_smbus_read_byte_data(client, ADM1025_REG_CONFIG); |
401 | if (kind < 0) { /* detection */ | 443 | if (kind < 0) { /* detection */ |
402 | if ((config & 0x80) != 0x00 | 444 | if ((config & 0x80) != 0x00 |
403 | || (i2c_smbus_read_byte_data(new_client, | 445 | || (i2c_smbus_read_byte_data(client, |
404 | ADM1025_REG_STATUS1) & 0xC0) != 0x00 | 446 | ADM1025_REG_STATUS1) & 0xC0) != 0x00 |
405 | || (i2c_smbus_read_byte_data(new_client, | 447 | || (i2c_smbus_read_byte_data(client, |
406 | ADM1025_REG_STATUS2) & 0xBC) != 0x00) { | 448 | ADM1025_REG_STATUS2) & 0xBC) != 0x00) { |
407 | dev_dbg(&adapter->dev, | 449 | dev_dbg(&adapter->dev, |
408 | "ADM1025 detection failed at 0x%02x.\n", | 450 | "ADM1025 detection failed at 0x%02x.\n", |
@@ -414,11 +456,9 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | |||
414 | if (kind <= 0) { /* identification */ | 456 | if (kind <= 0) { /* identification */ |
415 | u8 man_id, chip_id; | 457 | u8 man_id, chip_id; |
416 | 458 | ||
417 | man_id = i2c_smbus_read_byte_data(new_client, | 459 | man_id = i2c_smbus_read_byte_data(client, ADM1025_REG_MAN_ID); |
418 | ADM1025_REG_MAN_ID); | 460 | chip_id = i2c_smbus_read_byte_data(client, ADM1025_REG_CHIP_ID); |
419 | chip_id = i2c_smbus_read_byte_data(new_client, | 461 | |
420 | ADM1025_REG_CHIP_ID); | ||
421 | |||
422 | if (man_id == 0x41) { /* Analog Devices */ | 462 | if (man_id == 0x41) { /* Analog Devices */ |
423 | if ((chip_id & 0xF0) == 0x20) { /* ADM1025/ADM1025A */ | 463 | if ((chip_id & 0xF0) == 0x20) { /* ADM1025/ADM1025A */ |
424 | kind = adm1025; | 464 | kind = adm1025; |
@@ -446,33 +486,28 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | |||
446 | } | 486 | } |
447 | 487 | ||
448 | /* We can fill in the remaining client fields */ | 488 | /* We can fill in the remaining client fields */ |
449 | strlcpy(new_client->name, name, I2C_NAME_SIZE); | 489 | strlcpy(client->name, name, I2C_NAME_SIZE); |
450 | data->valid = 0; | ||
451 | mutex_init(&data->update_lock); | 490 | mutex_init(&data->update_lock); |
452 | 491 | ||
453 | /* Tell the I2C layer a new client has arrived */ | 492 | /* Tell the I2C layer a new client has arrived */ |
454 | if ((err = i2c_attach_client(new_client))) | 493 | if ((err = i2c_attach_client(client))) |
455 | goto exit_free; | 494 | goto exit_free; |
456 | 495 | ||
457 | /* Initialize the ADM1025 chip */ | 496 | /* Initialize the ADM1025 chip */ |
458 | adm1025_init_client(new_client); | 497 | adm1025_init_client(client); |
459 | 498 | ||
460 | /* Register sysfs hooks */ | 499 | /* Register sysfs hooks */ |
461 | if ((err = sysfs_create_group(&new_client->dev.kobj, &adm1025_group))) | 500 | if ((err = sysfs_create_group(&client->dev.kobj, &adm1025_group))) |
462 | goto exit_detach; | 501 | goto exit_detach; |
463 | 502 | ||
464 | /* Pin 11 is either in4 (+12V) or VID4 */ | 503 | /* Pin 11 is either in4 (+12V) or VID4 */ |
465 | if (!(config & 0x20)) { | 504 | if (!(config & 0x20)) { |
466 | if ((err = device_create_file(&new_client->dev, | 505 | if ((err = sysfs_create_group(&client->dev.kobj, |
467 | &dev_attr_in4_input)) | 506 | &adm1025_group_in4))) |
468 | || (err = device_create_file(&new_client->dev, | ||
469 | &dev_attr_in4_min)) | ||
470 | || (err = device_create_file(&new_client->dev, | ||
471 | &dev_attr_in4_max))) | ||
472 | goto exit_remove; | 507 | goto exit_remove; |
473 | } | 508 | } |
474 | 509 | ||
475 | data->hwmon_dev = hwmon_device_register(&new_client->dev); | 510 | data->hwmon_dev = hwmon_device_register(&client->dev); |
476 | if (IS_ERR(data->hwmon_dev)) { | 511 | if (IS_ERR(data->hwmon_dev)) { |
477 | err = PTR_ERR(data->hwmon_dev); | 512 | err = PTR_ERR(data->hwmon_dev); |
478 | goto exit_remove; | 513 | goto exit_remove; |
@@ -481,10 +516,10 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | |||
481 | return 0; | 516 | return 0; |
482 | 517 | ||
483 | exit_remove: | 518 | exit_remove: |
484 | sysfs_remove_group(&new_client->dev.kobj, &adm1025_group); | 519 | sysfs_remove_group(&client->dev.kobj, &adm1025_group); |
485 | sysfs_remove_group(&new_client->dev.kobj, &adm1025_group_opt); | 520 | sysfs_remove_group(&client->dev.kobj, &adm1025_group_in4); |
486 | exit_detach: | 521 | exit_detach: |
487 | i2c_detach_client(new_client); | 522 | i2c_detach_client(client); |
488 | exit_free: | 523 | exit_free: |
489 | kfree(data); | 524 | kfree(data); |
490 | exit: | 525 | exit: |
@@ -540,7 +575,7 @@ static int adm1025_detach_client(struct i2c_client *client) | |||
540 | 575 | ||
541 | hwmon_device_unregister(data->hwmon_dev); | 576 | hwmon_device_unregister(data->hwmon_dev); |
542 | sysfs_remove_group(&client->dev.kobj, &adm1025_group); | 577 | sysfs_remove_group(&client->dev.kobj, &adm1025_group); |
543 | sysfs_remove_group(&client->dev.kobj, &adm1025_group_opt); | 578 | sysfs_remove_group(&client->dev.kobj, &adm1025_group_in4); |
544 | 579 | ||
545 | if ((err = i2c_detach_client(client))) | 580 | if ((err = i2c_detach_client(client))) |
546 | return err; | 581 | return err; |