diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-02 19:39:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-02 19:39:50 -0400 |
commit | 9508d80530add1281ac4d5032ab650eaf0b41aa4 (patch) | |
tree | 8615c6e0864d8917f4eda4d96e1af69c635ce4f6 | |
parent | 8aa7ad9018d7fa1e52d2ee350a2f62c5485d3fec (diff) | |
parent | 0e502ec889d33bfcb348e420d7e105bc61c45eb4 (diff) |
Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging
* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging:
hwmon: (pmbus) Auto-detect temp2 and temp3 registers/attributes
hwmon: (pmbus) Improve fan detection
hwmon: (adm1275) Free allocated memory if probe function fails
hwmon: (pmbus) Drop check for PMBus revision register in probe function
-rw-r--r-- | drivers/hwmon/adm1275.c | 16 | ||||
-rw-r--r-- | drivers/hwmon/pmbus.c | 10 | ||||
-rw-r--r-- | drivers/hwmon/pmbus_core.c | 11 |
3 files changed, 24 insertions, 13 deletions
diff --git a/drivers/hwmon/adm1275.c b/drivers/hwmon/adm1275.c index c2ee2048ab91..b9b7caf4a1d2 100644 --- a/drivers/hwmon/adm1275.c +++ b/drivers/hwmon/adm1275.c | |||
@@ -32,6 +32,7 @@ static int adm1275_probe(struct i2c_client *client, | |||
32 | const struct i2c_device_id *id) | 32 | const struct i2c_device_id *id) |
33 | { | 33 | { |
34 | int config; | 34 | int config; |
35 | int ret; | ||
35 | struct pmbus_driver_info *info; | 36 | struct pmbus_driver_info *info; |
36 | 37 | ||
37 | if (!i2c_check_functionality(client->adapter, | 38 | if (!i2c_check_functionality(client->adapter, |
@@ -43,8 +44,10 @@ static int adm1275_probe(struct i2c_client *client, | |||
43 | return -ENOMEM; | 44 | return -ENOMEM; |
44 | 45 | ||
45 | config = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG); | 46 | config = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG); |
46 | if (config < 0) | 47 | if (config < 0) { |
47 | return config; | 48 | ret = config; |
49 | goto err_mem; | ||
50 | } | ||
48 | 51 | ||
49 | info->pages = 1; | 52 | info->pages = 1; |
50 | info->direct[PSC_VOLTAGE_IN] = true; | 53 | info->direct[PSC_VOLTAGE_IN] = true; |
@@ -76,7 +79,14 @@ static int adm1275_probe(struct i2c_client *client, | |||
76 | else | 79 | else |
77 | info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT; | 80 | info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT; |
78 | 81 | ||
79 | return pmbus_do_probe(client, id, info); | 82 | ret = pmbus_do_probe(client, id, info); |
83 | if (ret) | ||
84 | goto err_mem; | ||
85 | return 0; | ||
86 | |||
87 | err_mem: | ||
88 | kfree(info); | ||
89 | return ret; | ||
80 | } | 90 | } |
81 | 91 | ||
82 | static int adm1275_remove(struct i2c_client *client) | 92 | static int adm1275_remove(struct i2c_client *client) |
diff --git a/drivers/hwmon/pmbus.c b/drivers/hwmon/pmbus.c index 98e2e28899e2..931d940923ae 100644 --- a/drivers/hwmon/pmbus.c +++ b/drivers/hwmon/pmbus.c | |||
@@ -47,12 +47,14 @@ static void pmbus_find_sensor_groups(struct i2c_client *client, | |||
47 | if (info->func[0] | 47 | if (info->func[0] |
48 | && pmbus_check_byte_register(client, 0, PMBUS_STATUS_INPUT)) | 48 | && pmbus_check_byte_register(client, 0, PMBUS_STATUS_INPUT)) |
49 | info->func[0] |= PMBUS_HAVE_STATUS_INPUT; | 49 | info->func[0] |= PMBUS_HAVE_STATUS_INPUT; |
50 | if (pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_1)) { | 50 | if (pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_12) && |
51 | pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_1)) { | ||
51 | info->func[0] |= PMBUS_HAVE_FAN12; | 52 | info->func[0] |= PMBUS_HAVE_FAN12; |
52 | if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_12)) | 53 | if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_12)) |
53 | info->func[0] |= PMBUS_HAVE_STATUS_FAN12; | 54 | info->func[0] |= PMBUS_HAVE_STATUS_FAN12; |
54 | } | 55 | } |
55 | if (pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_3)) { | 56 | if (pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_34) && |
57 | pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_3)) { | ||
56 | info->func[0] |= PMBUS_HAVE_FAN34; | 58 | info->func[0] |= PMBUS_HAVE_FAN34; |
57 | if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34)) | 59 | if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34)) |
58 | info->func[0] |= PMBUS_HAVE_STATUS_FAN34; | 60 | info->func[0] |= PMBUS_HAVE_STATUS_FAN34; |
@@ -63,6 +65,10 @@ static void pmbus_find_sensor_groups(struct i2c_client *client, | |||
63 | PMBUS_STATUS_TEMPERATURE)) | 65 | PMBUS_STATUS_TEMPERATURE)) |
64 | info->func[0] |= PMBUS_HAVE_STATUS_TEMP; | 66 | info->func[0] |= PMBUS_HAVE_STATUS_TEMP; |
65 | } | 67 | } |
68 | if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2)) | ||
69 | info->func[0] |= PMBUS_HAVE_TEMP2; | ||
70 | if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3)) | ||
71 | info->func[0] |= PMBUS_HAVE_TEMP3; | ||
66 | 72 | ||
67 | /* Sensors detected on all pages */ | 73 | /* Sensors detected on all pages */ |
68 | for (page = 0; page < info->pages; page++) { | 74 | for (page = 0; page < info->pages; page++) { |
diff --git a/drivers/hwmon/pmbus_core.c b/drivers/hwmon/pmbus_core.c index 354770ed3186..744672c1f26d 100644 --- a/drivers/hwmon/pmbus_core.c +++ b/drivers/hwmon/pmbus_core.c | |||
@@ -1430,14 +1430,9 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id, | |||
1430 | i2c_set_clientdata(client, data); | 1430 | i2c_set_clientdata(client, data); |
1431 | mutex_init(&data->update_lock); | 1431 | mutex_init(&data->update_lock); |
1432 | 1432 | ||
1433 | /* | 1433 | /* Bail out if PMBus status register does not exist. */ |
1434 | * Bail out if status register or PMBus revision register | 1434 | if (i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE) < 0) { |
1435 | * does not exist. | 1435 | dev_err(&client->dev, "PMBus status register not found\n"); |
1436 | */ | ||
1437 | if (i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE) < 0 | ||
1438 | || i2c_smbus_read_byte_data(client, PMBUS_REVISION) < 0) { | ||
1439 | dev_err(&client->dev, | ||
1440 | "Status or revision register not found\n"); | ||
1441 | ret = -ENODEV; | 1436 | ret = -ENODEV; |
1442 | goto out_data; | 1437 | goto out_data; |
1443 | } | 1438 | } |