New SNC resume function (sony_nc_handles_resume) for better event and handle re-initialization called by sony_nc_resume, now pushed downwards near sony_nc_add and sony_nc_cleanup for better readability and fewer function prototypes. Signed-off-by: Marco Chiappero <marco@xxxxxxxxxx> --- --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c @@ -1241,45 +1241,6 @@ static int sony_nc_function_setup(struct return 0; } -static int sony_nc_resume(struct acpi_device *device) -{ - struct sony_nc_value *item; - acpi_handle handle; - - for (item = sony_nc_values; item->name; item++) { - int ret; - - if (!item->valid) - continue; - ret = acpi_callsetfunc(sony_nc_acpi_handle, *item->acpiset, - item->value, NULL); - if (ret < 0) { - pr_err("%s: %d\n", __func__, ret); - break; - } - } - - if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "ECON", - &handle))) { - if (acpi_callsetfunc(sony_nc_acpi_handle, "ECON", 1, NULL)) - dprintk("ECON Method failed\n"); - } - - if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "SN00", - &handle))) { - dprintk("Doing SNC setup\n"); - sony_nc_function_setup(device); - } - - /* re-read rfkill state */ - sony_nc_rfkill_update(); - - /* restore kbd backlight states */ - sony_nc_kbd_backlight_resume(); - - return 0; -} - static void sony_nc_rfkill_cleanup(void) { int i; @@ -1824,6 +1785,45 @@ static int sony_nc_handles_cleanup(struc return 0; } +static int sony_nc_handles_resume(void) +{ + unsigned int i, result, bitmask; + + /* retrieve the implemented offsets mask */ + if (acpi_callsetfunc(sony_nc_acpi_handle, "SN00", 0x10, &bitmask)) + return -EIO; + + /* Enable all events, otherwise return */ + if (acpi_callsetfunc(sony_nc_acpi_handle, "SN02", bitmask, &result)) + return -EIO; + + for (i = 0; i < ARRAY_SIZE(handles->cap); i++) { + int unsigned handle = handles->cap[i]; + + if (!handle) + continue; + + dprintk("looking at handle 0x%.4x\n", handle); + + switch (handle) { + case 0x0137: /* kbd + als */ + sony_nc_kbd_backlight_resume(); + break; + case 0x0124: + case 0x0135: + /* re-read rfkill state */ + sony_nc_rfkill_update(); + break; + default: + continue; + } + + dprintk("handle 0x%.4x updated\n", handle); + } + + return 0; +} + static int sony_nc_add(struct acpi_device *device) { acpi_status status; @@ -1969,6 +1969,40 @@ static int sony_nc_remove(struct acpi_de return 0; } +static int sony_nc_resume(struct acpi_device *device) +{ + struct sony_nc_value *item; + acpi_handle handle; + + for (item = sony_nc_values; item->name; item++) { + int ret; + + if (!item->valid) + continue; + ret = acpi_callsetfunc(sony_nc_acpi_handle, *item->acpiset, + item->value, NULL); + if (ret < 0) { + pr_err("%s: %d\n", __func__, ret); + break; + } + } + + if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "ECON", + &handle))) { + if (acpi_callsetfunc(sony_nc_acpi_handle, "ECON", 1, NULL)) + dprintk("ECON Method failed\n"); + } + + if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "SN00", + &handle))) { + dprintk("Doing SNC setup\n"); + sony_nc_function_setup(device); + sony_nc_handles_resume(); + } + + return 0; +} + static const struct acpi_device_id sony_device_ids[] = { {SONY_NC_HID, 0}, {SONY_PIC_HID, 0}, -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html