Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+42 -6
+10 -5
drivers/hwmon/ibmaem.c
··· 432 432 aem_send_message(ipmi); 433 433 434 434 res = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); 435 - if (!res) 436 - return -ETIMEDOUT; 435 + if (!res) { 436 + res = -ETIMEDOUT; 437 + goto out; 438 + } 437 439 438 440 if (ipmi->rx_result || ipmi->rx_msg_len != rs_size || 439 441 memcmp(&rs_resp->id, &system_x_id, sizeof(system_x_id))) { 440 - kfree(rs_resp); 441 - return -ENOENT; 442 + res = -ENOENT; 443 + goto out; 442 444 } 443 445 444 446 switch (size) { ··· 465 463 break; 466 464 } 467 465 } 466 + res = 0; 468 467 469 - return 0; 468 + out: 469 + kfree(rs_resp); 470 + return res; 470 471 } 471 472 472 473 /* Update AEM energy registers */
+12
drivers/hwmon/pmbus/lm25066.c
··· 161 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 175 static int lm25066_probe(struct i2c_client *client, 165 176 const struct i2c_device_id *id) 166 177 { ··· 215 204 216 205 info->read_word_data = lm25066_read_word_data; 217 206 info->write_word_data = lm25066_write_word_data; 207 + info->write_byte = lm25066_write_byte; 218 208 219 209 switch (id->driver_data) { 220 210 case lm25066:
+1
drivers/hwmon/pmbus/pmbus.h
··· 325 325 int (*read_word_data)(struct i2c_client *client, int page, int reg); 326 326 int (*write_word_data)(struct i2c_client *client, int page, int reg, 327 327 u16 word); 328 + int (*write_byte)(struct i2c_client *client, int page, u8 value); 328 329 /* 329 330 * The identify function determines supported PMBus functionality. 330 331 * This function is only necessary if a chip driver supports multiple
+19 -1
drivers/hwmon/pmbus/pmbus_core.c
··· 182 182 } 183 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 203 int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word) 186 204 { 187 205 int rv; ··· 299 281 300 282 static void pmbus_clear_fault_page(struct i2c_client *client, int page) 301 283 { 302 - pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); 284 + _pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); 303 285 } 304 286 305 287 void pmbus_clear_faults(struct i2c_client *client)