aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/gl518sm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/gl518sm.c')
-rw-r--r--drivers/hwmon/gl518sm.c49
1 files changed, 19 insertions, 30 deletions
diff --git a/drivers/hwmon/gl518sm.c b/drivers/hwmon/gl518sm.c
index bb58d9866a37..842252eccdaa 100644
--- a/drivers/hwmon/gl518sm.c
+++ b/drivers/hwmon/gl518sm.c
@@ -30,10 +30,6 @@
30 * We did not keep that part of the original driver in the Linux 2.6 30 * We did not keep that part of the original driver in the Linux 2.6
31 * version, since it was making the driver significantly more complex 31 * version, since it was making the driver significantly more complex
32 * with no real benefit. 32 * with no real benefit.
33 *
34 * History:
35 * 2004-01-28 Original port. (Hong-Gunn Chew)
36 * 2004-01-31 Code review and approval. (Jean Delvare)
37 */ 33 */
38 34
39#include <linux/module.h> 35#include <linux/module.h>
@@ -129,7 +125,6 @@ struct gl518_data {
129 u8 voltage_in[4]; /* Register values; [0] = VDD */ 125 u8 voltage_in[4]; /* Register values; [0] = VDD */
130 u8 voltage_min[4]; /* Register values; [0] = VDD */ 126 u8 voltage_min[4]; /* Register values; [0] = VDD */
131 u8 voltage_max[4]; /* Register values; [0] = VDD */ 127 u8 voltage_max[4]; /* Register values; [0] = VDD */
132 u8 iter_voltage_in[4]; /* Register values; [0] = VDD */
133 u8 fan_in[2]; 128 u8 fan_in[2];
134 u8 fan_min[2]; 129 u8 fan_min[2];
135 u8 fan_div[2]; /* Register encoding, shifted right */ 130 u8 fan_div[2]; /* Register encoding, shifted right */
@@ -138,7 +133,7 @@ struct gl518_data {
138 u8 temp_max; /* Register values */ 133 u8 temp_max; /* Register values */
139 u8 temp_hyst; /* Register values */ 134 u8 temp_hyst; /* Register values */
140 u8 alarms; /* Register value */ 135 u8 alarms; /* Register value */
141 u8 alarm_mask; /* Register value */ 136 u8 alarm_mask;
142 u8 beep_mask; /* Register value */ 137 u8 beep_mask; /* Register value */
143 u8 beep_enable; /* Boolean */ 138 u8 beep_enable; /* Boolean */
144}; 139};
@@ -156,7 +151,6 @@ static struct i2c_driver gl518_driver = {
156 .driver = { 151 .driver = {
157 .name = "gl518sm", 152 .name = "gl518sm",
158 }, 153 },
159 .id = I2C_DRIVERID_GL518,
160 .attach_adapter = gl518_attach_adapter, 154 .attach_adapter = gl518_attach_adapter,
161 .detach_client = gl518_detach_client, 155 .detach_client = gl518_detach_client,
162}; 156};
@@ -391,7 +385,7 @@ static int gl518_attach_adapter(struct i2c_adapter *adapter)
391static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) 385static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
392{ 386{
393 int i; 387 int i;
394 struct i2c_client *new_client; 388 struct i2c_client *client;
395 struct gl518_data *data; 389 struct gl518_data *data;
396 int err = 0; 390 int err = 0;
397 391
@@ -408,25 +402,24 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
408 goto exit; 402 goto exit;
409 } 403 }
410 404
411 new_client = &data->client; 405 client = &data->client;
412 i2c_set_clientdata(new_client, data); 406 i2c_set_clientdata(client, data);
413 407
414 new_client->addr = address; 408 client->addr = address;
415 new_client->adapter = adapter; 409 client->adapter = adapter;
416 new_client->driver = &gl518_driver; 410 client->driver = &gl518_driver;
417 new_client->flags = 0;
418 411
419 /* Now, we do the remaining detection. */ 412 /* Now, we do the remaining detection. */
420 413
421 if (kind < 0) { 414 if (kind < 0) {
422 if ((gl518_read_value(new_client, GL518_REG_CHIP_ID) != 0x80) 415 if ((gl518_read_value(client, GL518_REG_CHIP_ID) != 0x80)
423 || (gl518_read_value(new_client, GL518_REG_CONF) & 0x80)) 416 || (gl518_read_value(client, GL518_REG_CONF) & 0x80))
424 goto exit_free; 417 goto exit_free;
425 } 418 }
426 419
427 /* Determine the chip type. */ 420 /* Determine the chip type. */
428 if (kind <= 0) { 421 if (kind <= 0) {
429 i = gl518_read_value(new_client, GL518_REG_REVISION); 422 i = gl518_read_value(client, GL518_REG_REVISION);
430 if (i == 0x00) { 423 if (i == 0x00) {
431 kind = gl518sm_r00; 424 kind = gl518sm_r00;
432 } else if (i == 0x80) { 425 } else if (i == 0x80) {
@@ -442,25 +435,24 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
442 } 435 }
443 436
444 /* Fill in the remaining client fields */ 437 /* Fill in the remaining client fields */
445 strlcpy(new_client->name, "gl518sm", I2C_NAME_SIZE); 438 strlcpy(client->name, "gl518sm", I2C_NAME_SIZE);
446 data->type = kind; 439 data->type = kind;
447 data->valid = 0;
448 mutex_init(&data->update_lock); 440 mutex_init(&data->update_lock);
449 441
450 /* Tell the I2C layer a new client has arrived */ 442 /* Tell the I2C layer a new client has arrived */
451 if ((err = i2c_attach_client(new_client))) 443 if ((err = i2c_attach_client(client)))
452 goto exit_free; 444 goto exit_free;
453 445
454 /* Initialize the GL518SM chip */ 446 /* Initialize the GL518SM chip */
455 data->alarm_mask = 0xff; 447 data->alarm_mask = 0xff;
456 data->voltage_in[0]=data->voltage_in[1]=data->voltage_in[2]=0; 448 data->voltage_in[0]=data->voltage_in[1]=data->voltage_in[2]=0;
457 gl518_init_client((struct i2c_client *) new_client); 449 gl518_init_client(client);
458 450
459 /* Register sysfs hooks */ 451 /* Register sysfs hooks */
460 if ((err = sysfs_create_group(&new_client->dev.kobj, &gl518_group))) 452 if ((err = sysfs_create_group(&client->dev.kobj, &gl518_group)))
461 goto exit_detach; 453 goto exit_detach;
462 454
463 data->hwmon_dev = hwmon_device_register(&new_client->dev); 455 data->hwmon_dev = hwmon_device_register(&client->dev);
464 if (IS_ERR(data->hwmon_dev)) { 456 if (IS_ERR(data->hwmon_dev)) {
465 err = PTR_ERR(data->hwmon_dev); 457 err = PTR_ERR(data->hwmon_dev);
466 goto exit_remove_files; 458 goto exit_remove_files;
@@ -469,9 +461,9 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
469 return 0; 461 return 0;
470 462
471exit_remove_files: 463exit_remove_files:
472 sysfs_remove_group(&new_client->dev.kobj, &gl518_group); 464 sysfs_remove_group(&client->dev.kobj, &gl518_group);
473exit_detach: 465exit_detach:
474 i2c_detach_client(new_client); 466 i2c_detach_client(client);
475exit_free: 467exit_free:
476 kfree(data); 468 kfree(data);
477exit: 469exit:
@@ -512,9 +504,9 @@ static int gl518_detach_client(struct i2c_client *client)
512 return 0; 504 return 0;
513} 505}
514 506
515/* Registers 0x07 to 0x0c are word-sized, others are byte-sized 507/* Registers 0x07 to 0x0c are word-sized, others are byte-sized
516 GL518 uses a high-byte first convention, which is exactly opposite to 508 GL518 uses a high-byte first convention, which is exactly opposite to
517 the usual practice. */ 509 the SMBus standard. */
518static int gl518_read_value(struct i2c_client *client, u8 reg) 510static int gl518_read_value(struct i2c_client *client, u8 reg)
519{ 511{
520 if ((reg >= 0x07) && (reg <= 0x0c)) 512 if ((reg >= 0x07) && (reg <= 0x0c))
@@ -523,9 +515,6 @@ static int gl518_read_value(struct i2c_client *client, u8 reg)
523 return i2c_smbus_read_byte_data(client, reg); 515 return i2c_smbus_read_byte_data(client, reg);
524} 516}
525 517
526/* Registers 0x07 to 0x0c are word-sized, others are byte-sized
527 GL518 uses a high-byte first convention, which is exactly opposite to
528 the usual practice. */
529static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value) 518static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value)
530{ 519{
531 if ((reg >= 0x07) && (reg <= 0x0c)) 520 if ((reg >= 0x07) && (reg <= 0x0c))