Hi Frank

On Wed, Feb 19, 2014 at 7:09 PM, Frank Praznik <frank.praz...@oh.rr.com> wrote:
> Don't initialize force-feedback for devices that don't support it to avoid 
> calls
> to schedule_work() with an uninitialized work_struct.
>
> Move the cancel_work_sync() call out of sony_destroy_ff() since the state 
> worker
> is used for the LEDs even when force-feedback is disabled.
>
> Remove sony_destroy_ff() to avoid a compiler warning since it is no longer 
> used.
>
> Signed-off-by: Frank Praznik <frank.praz...@oh.rr.com>

Sorry, my comment might have been misleading. You have to add the "Cc:
<sta...@vger.kernel.org>" line underneath/above your "Signed-off-by".
This will send a notice to the stable guys once the patch is applied
in Linus' tree.

But that's also described in the file Greg posted.

Cheers
David

> ---
>
>  This is a bugfix for 3.14.
>
>  drivers/hid/hid-sony.c | 27 ++++++++++++---------------
>  1 file changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
> index 1235405..2f19b15 100644
> --- a/drivers/hid/hid-sony.c
> +++ b/drivers/hid/hid-sony.c
> @@ -42,6 +42,7 @@
>  #define DUALSHOCK4_CONTROLLER_BT  BIT(6)
>
>  #define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER_USB | BUZZ_CONTROLLER | 
> DUALSHOCK4_CONTROLLER_USB)
> +#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER_USB | DUALSHOCK4_CONTROLLER_USB)
>
>  #define MAX_LEDS 4
>
> @@ -499,6 +500,7 @@ struct sony_sc {
>         __u8 right;
>  #endif
>
> +       __u8 worker_initialized;
>         __u8 led_state[MAX_LEDS];
>         __u8 led_count;
>  };
> @@ -993,22 +995,11 @@ static int sony_init_ff(struct hid_device *hdev)
>         return input_ff_create_memless(input_dev, NULL, sony_play_effect);
>  }
>
> -static void sony_destroy_ff(struct hid_device *hdev)
> -{
> -       struct sony_sc *sc = hid_get_drvdata(hdev);
> -
> -       cancel_work_sync(&sc->state_worker);
> -}
> -
>  #else
>  static int sony_init_ff(struct hid_device *hdev)
>  {
>         return 0;
>  }
> -
> -static void sony_destroy_ff(struct hid_device *hdev)
> -{
> -}
>  #endif
>
>  static int sony_set_output_report(struct sony_sc *sc, int req_id, int 
> req_size)
> @@ -1077,6 +1068,8 @@ static int sony_probe(struct hid_device *hdev, const 
> struct hid_device_id *id)
>         if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
>                 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
>                 ret = sixaxis_set_operational_usb(hdev);
> +
> +               sc->worker_initialized = 1;
>                 INIT_WORK(&sc->state_worker, sixaxis_state_worker);
>         }
>         else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
> @@ -1087,6 +1080,7 @@ static int sony_probe(struct hid_device *hdev, const 
> struct hid_device_id *id)
>                 if (ret < 0)
>                         goto err_stop;
>
> +               sc->worker_initialized = 1;
>                 INIT_WORK(&sc->state_worker, dualshock4_state_worker);
>         } else {
>                 ret = 0;
> @@ -1101,9 +1095,11 @@ static int sony_probe(struct hid_device *hdev, const 
> struct hid_device_id *id)
>                         goto err_stop;
>         }
>
> -       ret = sony_init_ff(hdev);
> -       if (ret < 0)
> -               goto err_stop;
> +       if (sc->quirks & SONY_FF_SUPPORT) {
> +               ret = sony_init_ff(hdev);
> +               if (ret < 0)
> +                       goto err_stop;
> +       }
>
>         return 0;
>  err_stop:
> @@ -1120,7 +1116,8 @@ static void sony_remove(struct hid_device *hdev)
>         if (sc->quirks & SONY_LED_SUPPORT)
>                 sony_leds_remove(hdev);
>
> -       sony_destroy_ff(hdev);
> +       if (sc->worker_initialized)
> +               cancel_work_sync(&sc->state_worker);
>
>         hid_hw_stop(hdev);
>  }
> --
> 1.8.5.3
>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to