aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/adm1025.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/adm1025.c')
-rw-r--r--drivers/hwmon/adm1025.c393
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
95static int in_scale[6] = { 2500, 2250, 3300, 5000, 12000, 3300 }; 96static 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) \ 156static ssize_t
157static ssize_t show_in##offset(struct device *dev, struct device_attribute *attr, char *buf) \ 157show_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]));
163static 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); \ 165static ssize_t
166 return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset], \ 166show_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;
169static 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} \ 174static ssize_t
175static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL); 175show_in_max(struct device *dev, struct device_attribute *attr, char *buf)
176show_in(0); 176{
177show_in(1); 177 int index = to_sensor_dev_attr(attr)->index;
178show_in(2); 178 struct adm1025_data *data = adm1025_update_device(dev);
179show_in(3); 179 return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[index],
180show_in(4); 180 in_scale[index]));
181show_in(5); 181}
182 182
183#define show_temp(offset) \ 183static ssize_t
184static ssize_t show_temp##offset(struct device *dev, struct device_attribute *attr, char *buf) \ 184show_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]));
189static 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); \ 191static ssize_t
192 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[offset-1])); \ 192show_temp_min(struct device *dev, struct device_attribute *attr, char *buf)
193} \ 193{
194static 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
199static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp##offset, NULL); 199static ssize_t
200show_temp(1); 200show_temp_max(struct device *dev, struct device_attribute *attr, char *buf)
201show_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
207static 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
223static 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) \
204static ssize_t set_in##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \ 240static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
205 size_t count) \ 241 show_in, NULL, offset); \
206{ \ 242static 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); \ 244static 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} \
218static 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} \
232static DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \
233 show_in##offset##_min, set_in##offset##_min); \
234static DEVICE_ATTR(in##offset##_max, S_IWUSR | S_IRUGO, \
235 show_in##offset##_max, set_in##offset##_max);
236set_in(0); 246set_in(0);
237set_in(1); 247set_in(1);
238set_in(2); 248set_in(2);
@@ -240,65 +250,91 @@ set_in(3);
240set_in(4); 250set_in(4);
241set_in(5); 251set_in(5);
242 252
253static 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
269static 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) \
244static ssize_t set_temp##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \ 286static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
245 size_t count) \ 287 show_temp, NULL, offset - 1); \
246{ \ 288static 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); \ 290static 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} \
258static 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} \
272static DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \
273 show_temp##offset##_min, set_temp##offset##_min); \
274static DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \
275 show_temp##offset##_max, set_temp##offset##_max);
276set_temp(1); 292set_temp(1);
277set_temp(2); 293set_temp(2);
278 294
279static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf) 295static ssize_t
296show_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}
284static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); 301static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
285 302
286static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf) 303static ssize_t
304show_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}
310static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
311static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
312static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
313static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
314static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
315static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
316static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 5);
317static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 4);
318static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_alarm, NULL, 14);
319
320static ssize_t
321show_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}
291static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); 326static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
292 327
293static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) 328static ssize_t
329show_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}
298static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) 334static 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
318static struct attribute *adm1025_attributes[] = { 354static 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
350static struct attribute *adm1025_attributes_opt[] = { 394static 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
357static const struct attribute_group adm1025_group_opt = { 402static 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 */
365static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) 410static 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
483exit_remove: 518exit_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);
486exit_detach: 521exit_detach:
487 i2c_detach_client(new_client); 522 i2c_detach_client(client);
488exit_free: 523exit_free:
489 kfree(data); 524 kfree(data);
490exit: 525exit:
@@ -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;