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

Input: elan_i2c - fix firmware update on newer ICs

The argument to iap page type command depends on the firmware page size.

Fixes: bfd9b92bc8f9 ("Input: elan_i2c - handle firmware updated on newer ICs")
Signed-off-by: Jingle Wu <jingle.wu@emc.com.tw>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

jingle.wu and committed by
Dmitry Torokhov
ae3d6083 676650d0

+9 -8
+1 -1
drivers/input/mouse/elan_i2c.h
··· 78 78 int (*iap_reset)(struct i2c_client *client); 79 79 80 80 int (*prepare_fw_update)(struct i2c_client *client, u16 ic_type, 81 - u8 iap_version); 81 + u8 iap_version, u16 fw_page_size); 82 82 int (*write_fw_block)(struct i2c_client *client, u16 fw_page_size, 83 83 const u8 *page, u16 checksum, int idx); 84 84 int (*finish_fw_update)(struct i2c_client *client,
+2 -1
drivers/input/mouse/elan_i2c_core.c
··· 497 497 u16 sw_checksum = 0, fw_checksum = 0; 498 498 499 499 error = data->ops->prepare_fw_update(client, data->ic_type, 500 - data->iap_version); 500 + data->iap_version, 501 + data->fw_page_size); 501 502 if (error) 502 503 return error; 503 504
+5 -5
drivers/input/mouse/elan_i2c_i2c.c
··· 517 517 return 0; 518 518 } 519 519 520 - static int elan_read_write_iap_type(struct i2c_client *client) 520 + static int elan_read_write_iap_type(struct i2c_client *client, u16 fw_page_size) 521 521 { 522 522 int error; 523 523 u16 constant; ··· 526 526 527 527 do { 528 528 error = elan_i2c_write_cmd(client, ETP_I2C_IAP_TYPE_CMD, 529 - ETP_I2C_IAP_TYPE_REG); 529 + fw_page_size / 2); 530 530 if (error) { 531 531 dev_err(&client->dev, 532 532 "cannot write iap type: %d\n", error); ··· 543 543 constant = le16_to_cpup((__le16 *)val); 544 544 dev_dbg(&client->dev, "iap type reg: 0x%04x\n", constant); 545 545 546 - if (constant == ETP_I2C_IAP_TYPE_REG) 546 + if (constant == fw_page_size / 2) 547 547 return 0; 548 548 549 549 } while (--retry > 0); ··· 553 553 } 554 554 555 555 static int elan_i2c_prepare_fw_update(struct i2c_client *client, u16 ic_type, 556 - u8 iap_version) 556 + u8 iap_version, u16 fw_page_size) 557 557 { 558 558 struct device *dev = &client->dev; 559 559 int error; ··· 594 594 } 595 595 596 596 if (ic_type >= 0x0D && iap_version >= 1) { 597 - error = elan_read_write_iap_type(client); 597 + error = elan_read_write_iap_type(client, fw_page_size); 598 598 if (error) 599 599 return error; 600 600 }
+1 -1
drivers/input/mouse/elan_i2c_smbus.c
··· 340 340 } 341 341 342 342 static int elan_smbus_prepare_fw_update(struct i2c_client *client, u16 ic_type, 343 - u8 iap_version) 343 + u8 iap_version, u16 fw_page_size) 344 344 { 345 345 struct device *dev = &client->dev; 346 346 int len;