platform/x86: huawei-wmi: fix return value calculation
authorBarnabás Pőcze <pobrn@protonmail.com>
Wed, 5 Oct 2022 15:00:45 +0000 (15:00 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:31:56 +0000 (13:31 +0100)
[ Upstream commit 0b9a1dcdb6a2c841899389bf2dd7a3e0e2aa0e99 ]

Previously, `huawei_wmi_input_setup()` returned the result of
logical or-ing the return values of two functions that return negative
errno-style error codes and one that returns `acpi_status`. If this
returned value was non-zero, then it was propagated from the platform
driver's probe function. That function should return a negative
errno-style error code, so the result of the logical or that
`huawei_wmi_input_setup()` returned was not appropriate.

Fix that by checking each function separately and returning the
error code unmodified.

Fixes: 1ac9abeb2e5b ("platform/x86: huawei-wmi: Move to platform driver")
Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
Link: https://lore.kernel.org/r/20221005150032.173198-2-pobrn@protonmail.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/platform/x86/huawei-wmi.c

index 5873c26..b85050e 100644 (file)
@@ -760,6 +760,9 @@ static int huawei_wmi_input_setup(struct device *dev,
                const char *guid,
                struct input_dev **idev)
 {
+       acpi_status status;
+       int err;
+
        *idev = devm_input_allocate_device(dev);
        if (!*idev)
                return -ENOMEM;
@@ -769,10 +772,19 @@ static int huawei_wmi_input_setup(struct device *dev,
        (*idev)->id.bustype = BUS_HOST;
        (*idev)->dev.parent = dev;
 
-       return sparse_keymap_setup(*idev, huawei_wmi_keymap, NULL) ||
-               input_register_device(*idev) ||
-               wmi_install_notify_handler(guid, huawei_wmi_input_notify,
-                               *idev);
+       err = sparse_keymap_setup(*idev, huawei_wmi_keymap, NULL);
+       if (err)
+               return err;
+
+       err = input_register_device(*idev);
+       if (err)
+               return err;
+
+       status = wmi_install_notify_handler(guid, huawei_wmi_input_notify, *idev);
+       if (ACPI_FAILURE(status))
+               return -EIO;
+
+       return 0;
 }
 
 static void huawei_wmi_input_exit(struct device *dev, const char *guid)