| From 765a1077c85e5f2efcc43582f80caf43a052e903 Mon Sep 17 00:00:00 2001 |
| From: Frank Praznik <frank.praznik@gmail.com> |
| Date: Wed, 8 Feb 2017 13:58:43 -0500 |
| Subject: HID: sony: Use LED_CORE_SUSPENDRESUME |
| |
| From: Frank Praznik <frank.praznik@gmail.com> |
| |
| commit 765a1077c85e5f2efcc43582f80caf43a052e903 upstream. |
| |
| The LED subsystem provides the LED_CORE_SUSPENDRESUME flag to handle |
| automatically turning off and restoring the state of device LEDs during |
| suspend/resume. Use this flag instead of saving and restoring the state |
| locally. |
| |
| Signed-off-by: Frank Praznik <frank.praznik@gmail.com> |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| Cc: Nathan Chancellor <natechancellor@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/hid/hid-sony.c | 45 +++++++++++++++------------------------------ |
| 1 file changed, 15 insertions(+), 30 deletions(-) |
| |
| --- a/drivers/hid/hid-sony.c |
| +++ b/drivers/hid/hid-sony.c |
| @@ -1056,7 +1056,6 @@ struct sony_sc { |
| u8 battery_charging; |
| u8 battery_capacity; |
| u8 led_state[MAX_LEDS]; |
| - u8 resume_led_state[MAX_LEDS]; |
| u8 led_delay_on[MAX_LEDS]; |
| u8 led_delay_off[MAX_LEDS]; |
| u8 led_count; |
| @@ -1793,6 +1792,7 @@ static int sony_leds_init(struct sony_sc |
| led->name = name; |
| led->brightness = sc->led_state[n]; |
| led->max_brightness = max_brightness[n]; |
| + led->flags = LED_CORE_SUSPENDRESUME; |
| led->brightness_get = sony_led_get_brightness; |
| led->brightness_set = sony_led_set_brightness; |
| |
| @@ -2509,47 +2509,32 @@ static void sony_remove(struct hid_devic |
| |
| static int sony_suspend(struct hid_device *hdev, pm_message_t message) |
| { |
| - /* |
| - * On suspend save the current LED state, |
| - * stop running force-feedback and blank the LEDS. |
| - */ |
| - if (SONY_LED_SUPPORT || SONY_FF_SUPPORT) { |
| - struct sony_sc *sc = hid_get_drvdata(hdev); |
| - |
| #ifdef CONFIG_SONY_FF |
| - sc->left = sc->right = 0; |
| -#endif |
| |
| - memcpy(sc->resume_led_state, sc->led_state, |
| - sizeof(sc->resume_led_state)); |
| - memset(sc->led_state, 0, sizeof(sc->led_state)); |
| + /* On suspend stop any running force-feedback events */ |
| + if (SONY_FF_SUPPORT) { |
| + struct sony_sc *sc = hid_get_drvdata(hdev); |
| |
| + sc->left = sc->right = 0; |
| sony_send_output_report(sc); |
| } |
| |
| +#endif |
| return 0; |
| } |
| |
| static int sony_resume(struct hid_device *hdev) |
| { |
| - /* Restore the state of controller LEDs on resume */ |
| - if (SONY_LED_SUPPORT) { |
| - struct sony_sc *sc = hid_get_drvdata(hdev); |
| - |
| - memcpy(sc->led_state, sc->resume_led_state, |
| - sizeof(sc->led_state)); |
| - |
| - /* |
| - * The Sixaxis and navigation controllers on USB need to be |
| - * reinitialized on resume or they won't behave properly. |
| - */ |
| - if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || |
| - (sc->quirks & NAVIGATION_CONTROLLER_USB)) { |
| - sixaxis_set_operational_usb(sc->hdev); |
| - sc->defer_initialization = 1; |
| - } |
| + struct sony_sc *sc = hid_get_drvdata(hdev); |
| |
| - sony_set_leds(sc); |
| + /* |
| + * The Sixaxis and navigation controllers on USB need to be |
| + * reinitialized on resume or they won't behave properly. |
| + */ |
| + if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || |
| + (sc->quirks & NAVIGATION_CONTROLLER_USB)) { |
| + sixaxis_set_operational_usb(sc->hdev); |
| + sc->defer_initialization = 1; |
| } |
| |
| return 0; |