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

Input: elan_i2c - switch to using cleanup functions

Start using __free() and guard() primitives to simplify the code
and error handling. This makes the code more compact and error
handling more robust by ensuring that locks are released in all
code paths when control leaves critical section and all allocated
memory is freed.

Link: https://lore.kernel.org/r/ZsrBC7qDbOvAaI-W@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+121 -121
+116 -112
drivers/input/mouse/elan_i2c_core.c
··· 541 541 542 542 dev_dbg(&client->dev, "Starting firmware update....\n"); 543 543 544 - disable_irq(client->irq); 544 + guard(disable_irq)(&client->irq); 545 + 545 546 data->in_fw_update = true; 546 547 547 548 retval = __elan_update_firmware(data, fw); ··· 556 555 } 557 556 558 557 data->in_fw_update = false; 559 - enable_irq(client->irq); 560 558 561 559 return retval; 562 560 } ··· 621 621 const char *buf, size_t count) 622 622 { 623 623 struct elan_tp_data *data = dev_get_drvdata(dev); 624 - const struct firmware *fw; 625 - char *fw_name; 626 624 int error; 627 625 const u8 *fw_signature; 628 626 static const u8 signature[] = {0xAA, 0x55, 0xCC, 0x33, 0xFF, 0xFF}; ··· 629 631 return -EINVAL; 630 632 631 633 /* Look for a firmware with the product id appended. */ 632 - fw_name = kasprintf(GFP_KERNEL, ETP_FW_NAME, data->product_id); 634 + const char *fw_name __free(kfree) = 635 + kasprintf(GFP_KERNEL, ETP_FW_NAME, data->product_id); 633 636 if (!fw_name) { 634 637 dev_err(dev, "failed to allocate memory for firmware name\n"); 635 638 return -ENOMEM; 636 639 } 637 640 638 641 dev_info(dev, "requesting fw '%s'\n", fw_name); 642 + const struct firmware *fw __free(firmware) = NULL; 639 643 error = request_firmware(&fw, fw_name, dev); 640 - kfree(fw_name); 641 644 if (error) { 642 645 dev_err(dev, "failed to request firmware: %d\n", error); 643 646 return error; ··· 650 651 dev_err(dev, "signature mismatch (expected %*ph, got %*ph)\n", 651 652 (int)sizeof(signature), signature, 652 653 (int)sizeof(signature), fw_signature); 653 - error = -EBADF; 654 - goto out_release_fw; 654 + return -EBADF; 655 655 } 656 656 657 - error = mutex_lock_interruptible(&data->sysfs_mutex); 658 - if (error) 659 - goto out_release_fw; 657 + scoped_cond_guard(mutex_intr, return -EINTR, &data->sysfs_mutex) { 658 + error = elan_update_firmware(data, fw); 659 + if (error) 660 + return error; 661 + } 660 662 661 - error = elan_update_firmware(data, fw); 662 - 663 - mutex_unlock(&data->sysfs_mutex); 664 - 665 - out_release_fw: 666 - release_firmware(fw); 667 - return error ?: count; 663 + return count; 668 664 } 669 665 670 - static ssize_t calibrate_store(struct device *dev, 671 - struct device_attribute *attr, 672 - const char *buf, size_t count) 666 + static int elan_calibrate(struct elan_tp_data *data) 673 667 { 674 - struct i2c_client *client = to_i2c_client(dev); 675 - struct elan_tp_data *data = i2c_get_clientdata(client); 668 + struct i2c_client *client = data->client; 669 + struct device *dev = &client->dev; 676 670 int tries = 20; 677 671 int retval; 678 672 int error; 679 673 u8 val[ETP_CALIBRATE_MAX_LEN]; 680 674 681 - retval = mutex_lock_interruptible(&data->sysfs_mutex); 682 - if (retval) 683 - return retval; 684 - 685 - disable_irq(client->irq); 675 + guard(disable_irq)(&client->irq); 686 676 687 677 data->mode |= ETP_ENABLE_CALIBRATE; 688 678 retval = data->ops->set_mode(client, data->mode); 689 679 if (retval) { 680 + data->mode &= ~ETP_ENABLE_CALIBRATE; 690 681 dev_err(dev, "failed to enable calibration mode: %d\n", 691 682 retval); 692 - goto out; 683 + return retval; 693 684 } 694 685 695 686 retval = data->ops->calibrate(client); ··· 717 728 if (!retval) 718 729 retval = error; 719 730 } 720 - out: 721 - enable_irq(client->irq); 722 - mutex_unlock(&data->sysfs_mutex); 723 - return retval ?: count; 731 + return retval; 732 + } 733 + 734 + static ssize_t calibrate_store(struct device *dev, 735 + struct device_attribute *attr, 736 + const char *buf, size_t count) 737 + { 738 + struct i2c_client *client = to_i2c_client(dev); 739 + struct elan_tp_data *data = i2c_get_clientdata(client); 740 + int error; 741 + 742 + scoped_cond_guard(mutex_intr, return -EINTR, &data->sysfs_mutex) { 743 + error = elan_calibrate(data); 744 + if (error) 745 + return error; 746 + } 747 + 748 + return count; 724 749 } 725 750 726 751 static ssize_t elan_sysfs_read_mode(struct device *dev, ··· 746 743 int error; 747 744 enum tp_mode mode; 748 745 749 - error = mutex_lock_interruptible(&data->sysfs_mutex); 750 - if (error) 751 - return error; 752 - 753 - error = data->ops->iap_get_mode(data->client, &mode); 754 - 755 - mutex_unlock(&data->sysfs_mutex); 756 - 757 - if (error) 758 - return error; 746 + scoped_cond_guard(mutex_intr, return -EINTR, &data->sysfs_mutex) { 747 + error = data->ops->iap_get_mode(data->client, &mode); 748 + if (error) 749 + return error; 750 + } 759 751 760 752 return sysfs_emit(buf, "%d\n", (int)mode); 761 753 } ··· 781 783 .attrs = elan_sysfs_entries, 782 784 }; 783 785 784 - static ssize_t acquire_store(struct device *dev, struct device_attribute *attr, 785 - const char *buf, size_t count) 786 + static int elan_acquire_baseline(struct elan_tp_data *data) 786 787 { 787 - struct i2c_client *client = to_i2c_client(dev); 788 - struct elan_tp_data *data = i2c_get_clientdata(client); 789 - int error; 788 + struct i2c_client *client = data->client; 789 + struct device *dev = &client->dev; 790 790 int retval; 791 + int error; 791 792 792 - retval = mutex_lock_interruptible(&data->sysfs_mutex); 793 - if (retval) 794 - return retval; 795 - 796 - disable_irq(client->irq); 793 + guard(disable_irq)(&client->irq); 797 794 798 795 data->baseline_ready = false; 799 796 800 797 data->mode |= ETP_ENABLE_CALIBRATE; 801 - retval = data->ops->set_mode(data->client, data->mode); 798 + retval = data->ops->set_mode(client, data->mode); 802 799 if (retval) { 800 + data->mode &= ~ETP_ENABLE_CALIBRATE; 803 801 dev_err(dev, "Failed to enable calibration mode to get baseline: %d\n", 804 802 retval); 805 - goto out; 803 + return retval; 806 804 } 807 805 808 806 msleep(250); 809 807 810 - retval = data->ops->get_baseline_data(data->client, true, 808 + retval = data->ops->get_baseline_data(client, true, 811 809 &data->max_baseline); 812 810 if (retval) { 813 - dev_err(dev, "Failed to read max baseline form device: %d\n", 811 + dev_err(dev, "Failed to read max baseline from device: %d\n", 814 812 retval); 815 813 goto out_disable_calibrate; 816 814 } 817 815 818 - retval = data->ops->get_baseline_data(data->client, false, 816 + retval = data->ops->get_baseline_data(client, false, 819 817 &data->min_baseline); 820 818 if (retval) { 821 - dev_err(dev, "Failed to read min baseline form device: %d\n", 819 + dev_err(dev, "Failed to read min baseline from device: %d\n", 822 820 retval); 823 821 goto out_disable_calibrate; 824 822 } ··· 823 829 824 830 out_disable_calibrate: 825 831 data->mode &= ~ETP_ENABLE_CALIBRATE; 826 - error = data->ops->set_mode(data->client, data->mode); 832 + error = data->ops->set_mode(client, data->mode); 827 833 if (error) { 828 834 dev_err(dev, "Failed to disable calibration mode after acquiring baseline: %d\n", 829 835 error); 830 836 if (!retval) 831 837 retval = error; 832 838 } 833 - out: 834 - enable_irq(client->irq); 835 - mutex_unlock(&data->sysfs_mutex); 836 - return retval ?: count; 839 + 840 + return retval; 841 + } 842 + 843 + static ssize_t acquire_store(struct device *dev, struct device_attribute *attr, 844 + const char *buf, size_t count) 845 + { 846 + struct i2c_client *client = to_i2c_client(dev); 847 + struct elan_tp_data *data = i2c_get_clientdata(client); 848 + int error; 849 + 850 + scoped_cond_guard(mutex_intr, return -EINTR, &data->sysfs_mutex) { 851 + error = elan_acquire_baseline(data); 852 + if (error) 853 + return error; 854 + } 855 + 856 + return count; 837 857 } 838 858 839 859 static ssize_t min_show(struct device *dev, ··· 855 847 { 856 848 struct i2c_client *client = to_i2c_client(dev); 857 849 struct elan_tp_data *data = i2c_get_clientdata(client); 858 - int retval; 859 850 860 - retval = mutex_lock_interruptible(&data->sysfs_mutex); 861 - if (retval) 862 - return retval; 851 + scoped_guard(mutex_intr, &data->sysfs_mutex) { 852 + if (!data->baseline_ready) 853 + return -ENODATA; 863 854 864 - if (!data->baseline_ready) { 865 - retval = -ENODATA; 866 - goto out; 855 + return sysfs_emit(buf, "%d", data->min_baseline); 867 856 } 868 857 869 - retval = sysfs_emit(buf, "%d", data->min_baseline); 870 - 871 - out: 872 - mutex_unlock(&data->sysfs_mutex); 873 - return retval; 858 + return -EINTR; 874 859 } 875 860 876 861 static ssize_t max_show(struct device *dev, ··· 871 870 { 872 871 struct i2c_client *client = to_i2c_client(dev); 873 872 struct elan_tp_data *data = i2c_get_clientdata(client); 874 - int retval; 875 873 876 - retval = mutex_lock_interruptible(&data->sysfs_mutex); 877 - if (retval) 878 - return retval; 874 + scoped_guard(mutex_intr, &data->sysfs_mutex) { 875 + if (!data->baseline_ready) 876 + return -ENODATA; 879 877 880 - if (!data->baseline_ready) { 881 - retval = -ENODATA; 882 - goto out; 878 + return sysfs_emit(buf, "%d", data->max_baseline); 883 879 } 884 880 885 - retval = sysfs_emit(buf, "%d", data->max_baseline); 886 - 887 - out: 888 - mutex_unlock(&data->sysfs_mutex); 889 - return retval; 881 + return -EINTR; 890 882 } 891 - 892 883 893 884 static DEVICE_ATTR_WO(acquire); 894 885 static DEVICE_ATTR_RO(min); ··· 1316 1323 return 0; 1317 1324 } 1318 1325 1326 + static int __elan_suspend(struct elan_tp_data *data) 1327 + { 1328 + struct i2c_client *client = data->client; 1329 + int error; 1330 + 1331 + if (device_may_wakeup(&client->dev)) 1332 + return elan_sleep(data); 1333 + 1334 + /* Touchpad is not a wakeup source */ 1335 + error = elan_set_power(data, false); 1336 + if (error) 1337 + return error; 1338 + 1339 + error = regulator_disable(data->vcc); 1340 + if (error) { 1341 + dev_err(&client->dev, 1342 + "failed to disable regulator when suspending: %d\n", 1343 + error); 1344 + /* Attempt to power the chip back up */ 1345 + elan_set_power(data, true); 1346 + return error; 1347 + } 1348 + 1349 + return 0; 1350 + } 1351 + 1319 1352 static int elan_suspend(struct device *dev) 1320 1353 { 1321 1354 struct i2c_client *client = to_i2c_client(dev); 1322 1355 struct elan_tp_data *data = i2c_get_clientdata(client); 1323 - int ret; 1356 + int error; 1324 1357 1325 1358 /* 1326 1359 * We are taking the mutex to make sure sysfs operations are 1327 1360 * complete before we attempt to bring the device into low[er] 1328 1361 * power mode. 1329 1362 */ 1330 - ret = mutex_lock_interruptible(&data->sysfs_mutex); 1331 - if (ret) 1332 - return ret; 1363 + scoped_cond_guard(mutex_intr, return -EINTR, &data->sysfs_mutex) { 1364 + disable_irq(client->irq); 1333 1365 1334 - disable_irq(client->irq); 1335 - 1336 - if (device_may_wakeup(dev)) { 1337 - ret = elan_sleep(data); 1338 - } else { 1339 - ret = elan_set_power(data, false); 1340 - if (ret) 1341 - goto err; 1342 - 1343 - ret = regulator_disable(data->vcc); 1344 - if (ret) { 1345 - dev_err(dev, "error %d disabling regulator\n", ret); 1346 - /* Attempt to power the chip back up */ 1347 - elan_set_power(data, true); 1366 + error = __elan_suspend(data); 1367 + if (error) { 1368 + enable_irq(client->irq); 1369 + return error; 1348 1370 } 1349 1371 } 1350 1372 1351 - err: 1352 - if (ret) 1353 - enable_irq(client->irq); 1354 - mutex_unlock(&data->sysfs_mutex); 1355 - return ret; 1373 + return 0; 1356 1374 } 1357 1375 1358 1376 static int elan_resume(struct device *dev)
+5 -9
drivers/input/mouse/elan_i2c_i2c.c
··· 628 628 const u8 *page, u16 checksum, int idx) 629 629 { 630 630 struct device *dev = &client->dev; 631 - u8 *page_store; 632 631 u8 val[3]; 633 632 u16 result; 634 633 int ret, error; 635 634 636 - page_store = kmalloc(fw_page_size + 4, GFP_KERNEL); 635 + u8 *page_store __free(kfree) = kmalloc(fw_page_size + 4, GFP_KERNEL); 637 636 if (!page_store) 638 637 return -ENOMEM; 639 638 ··· 646 647 if (ret != fw_page_size + 4) { 647 648 error = ret < 0 ? ret : -EIO; 648 649 dev_err(dev, "Failed to write page %d: %d\n", idx, error); 649 - goto exit; 650 + return error; 650 651 } 651 652 652 653 /* Wait for F/W to update one page ROM data. */ ··· 655 656 error = elan_i2c_read_cmd(client, ETP_I2C_IAP_CTRL_CMD, val); 656 657 if (error) { 657 658 dev_err(dev, "Failed to read IAP write result: %d\n", error); 658 - goto exit; 659 + return error; 659 660 } 660 661 661 662 result = le16_to_cpup((__le16 *)val); 662 663 if (result & (ETP_FW_IAP_PAGE_ERR | ETP_FW_IAP_INTF_ERR)) { 663 664 dev_err(dev, "IAP reports failed write: %04hx\n", 664 665 result); 665 - error = -EIO; 666 - goto exit; 666 + return -EIO; 667 667 } 668 668 669 - exit: 670 - kfree(page_store); 671 - return error; 669 + return 0; 672 670 } 673 671 674 672 static int elan_i2c_finish_fw_update(struct i2c_client *client,