diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-13 21:37:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-13 21:37:28 -0400 |
commit | 91d85ea6786107aa2837bef3e957165ad7c8b823 (patch) | |
tree | c6100fd49a1c3d961998c3c89e706de4ceafb97e | |
parent | 17987783e51555da22890feb715a0c84d4ed36aa (diff) | |
parent | 66a89b2164e2d30661edbd1953eacf0594d8203a (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: (ibmaem) add missing kfree
hwmon: (pmbus/lm25066) Ignore byte writes to non-zero pages
hwmon: (pmbus) Virtualize pmbus_write_byte
-rw-r--r-- | drivers/hwmon/ibmaem.c | 15 | ||||
-rw-r--r-- | drivers/hwmon/pmbus/lm25066.c | 12 | ||||
-rw-r--r-- | drivers/hwmon/pmbus/pmbus.h | 1 | ||||
-rw-r--r-- | drivers/hwmon/pmbus/pmbus_core.c | 20 |
4 files changed, 42 insertions, 6 deletions
diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c index 1a409c5bc9bc..c316294c48b4 100644 --- a/drivers/hwmon/ibmaem.c +++ b/drivers/hwmon/ibmaem.c | |||
@@ -432,13 +432,15 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, | |||
432 | aem_send_message(ipmi); | 432 | aem_send_message(ipmi); |
433 | 433 | ||
434 | res = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); | 434 | res = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); |
435 | if (!res) | 435 | if (!res) { |
436 | return -ETIMEDOUT; | 436 | res = -ETIMEDOUT; |
437 | goto out; | ||
438 | } | ||
437 | 439 | ||
438 | if (ipmi->rx_result || ipmi->rx_msg_len != rs_size || | 440 | if (ipmi->rx_result || ipmi->rx_msg_len != rs_size || |
439 | memcmp(&rs_resp->id, &system_x_id, sizeof(system_x_id))) { | 441 | memcmp(&rs_resp->id, &system_x_id, sizeof(system_x_id))) { |
440 | kfree(rs_resp); | 442 | res = -ENOENT; |
441 | return -ENOENT; | 443 | goto out; |
442 | } | 444 | } |
443 | 445 | ||
444 | switch (size) { | 446 | switch (size) { |
@@ -463,8 +465,11 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, | |||
463 | break; | 465 | break; |
464 | } | 466 | } |
465 | } | 467 | } |
468 | res = 0; | ||
466 | 469 | ||
467 | return 0; | 470 | out: |
471 | kfree(rs_resp); | ||
472 | return res; | ||
468 | } | 473 | } |
469 | 474 | ||
470 | /* Update AEM energy registers */ | 475 | /* Update AEM energy registers */ |
diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c index d4bc114572de..ac254fba551b 100644 --- a/drivers/hwmon/pmbus/lm25066.c +++ b/drivers/hwmon/pmbus/lm25066.c | |||
@@ -161,6 +161,17 @@ static int lm25066_write_word_data(struct i2c_client *client, int page, int reg, | |||
161 | return ret; | 161 | return ret; |
162 | } | 162 | } |
163 | 163 | ||
164 | static int lm25066_write_byte(struct i2c_client *client, int page, u8 value) | ||
165 | { | ||
166 | if (page > 1) | ||
167 | return -EINVAL; | ||
168 | |||
169 | if (page == 0) | ||
170 | return pmbus_write_byte(client, 0, value); | ||
171 | |||
172 | return 0; | ||
173 | } | ||
174 | |||
164 | static int lm25066_probe(struct i2c_client *client, | 175 | static int lm25066_probe(struct i2c_client *client, |
165 | const struct i2c_device_id *id) | 176 | const struct i2c_device_id *id) |
166 | { | 177 | { |
@@ -204,6 +215,7 @@ static int lm25066_probe(struct i2c_client *client, | |||
204 | 215 | ||
205 | info->read_word_data = lm25066_read_word_data; | 216 | info->read_word_data = lm25066_read_word_data; |
206 | info->write_word_data = lm25066_write_word_data; | 217 | info->write_word_data = lm25066_write_word_data; |
218 | info->write_byte = lm25066_write_byte; | ||
207 | 219 | ||
208 | switch (id->driver_data) { | 220 | switch (id->driver_data) { |
209 | case lm25066: | 221 | case lm25066: |
diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h index 0808d986d75b..a6ae20ffef6b 100644 --- a/drivers/hwmon/pmbus/pmbus.h +++ b/drivers/hwmon/pmbus/pmbus.h | |||
@@ -325,6 +325,7 @@ struct pmbus_driver_info { | |||
325 | int (*read_word_data)(struct i2c_client *client, int page, int reg); | 325 | int (*read_word_data)(struct i2c_client *client, int page, int reg); |
326 | int (*write_word_data)(struct i2c_client *client, int page, int reg, | 326 | int (*write_word_data)(struct i2c_client *client, int page, int reg, |
327 | u16 word); | 327 | u16 word); |
328 | int (*write_byte)(struct i2c_client *client, int page, u8 value); | ||
328 | /* | 329 | /* |
329 | * The identify function determines supported PMBus functionality. | 330 | * The identify function determines supported PMBus functionality. |
330 | * This function is only necessary if a chip driver supports multiple | 331 | * This function is only necessary if a chip driver supports multiple |
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index 5c1b6cf31701..a561c3a0e916 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c | |||
@@ -182,6 +182,24 @@ int pmbus_write_byte(struct i2c_client *client, int page, u8 value) | |||
182 | } | 182 | } |
183 | EXPORT_SYMBOL_GPL(pmbus_write_byte); | 183 | EXPORT_SYMBOL_GPL(pmbus_write_byte); |
184 | 184 | ||
185 | /* | ||
186 | * _pmbus_write_byte() is similar to pmbus_write_byte(), but checks if | ||
187 | * a device specific mapping funcion exists and calls it if necessary. | ||
188 | */ | ||
189 | static int _pmbus_write_byte(struct i2c_client *client, int page, u8 value) | ||
190 | { | ||
191 | struct pmbus_data *data = i2c_get_clientdata(client); | ||
192 | const struct pmbus_driver_info *info = data->info; | ||
193 | int status; | ||
194 | |||
195 | if (info->write_byte) { | ||
196 | status = info->write_byte(client, page, value); | ||
197 | if (status != -ENODATA) | ||
198 | return status; | ||
199 | } | ||
200 | return pmbus_write_byte(client, page, value); | ||
201 | } | ||
202 | |||
185 | int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word) | 203 | int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word) |
186 | { | 204 | { |
187 | int rv; | 205 | int rv; |
@@ -281,7 +299,7 @@ static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg) | |||
281 | 299 | ||
282 | static void pmbus_clear_fault_page(struct i2c_client *client, int page) | 300 | static void pmbus_clear_fault_page(struct i2c_client *client, int page) |
283 | { | 301 | { |
284 | pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); | 302 | _pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); |
285 | } | 303 | } |
286 | 304 | ||
287 | void pmbus_clear_faults(struct i2c_client *client) | 305 | void pmbus_clear_faults(struct i2c_client *client) |