Re: [PATCH 1/1] HID: hid-betopff.c: Use devm_kzalloc, move _init() code into _probe().

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jun 13, 2018 at 1:59 PM, Hanno Zulla <abos@xxxxxxxx> wrote:
> The use of kfree() can be avoided when using devm_kzalloc(). Also,
> the original _init() function didn't properly return error codes
> and the whole error handling can be simplified once the _init()
> function is moved into the _probe() function.

I'd rather have the removal of the init function in a separate patch.

Just out of curiosity, do you own one of those devices? Or did you do
just compile-tested the changes?

Cheers,
Benjamin

>
> Signed-off-by: Hanno Zulla <kontakt@xxxxxxxx>
> ---
>  drivers/hid/hid-betopff.c | 82 ++++++++++++++++-----------------------
>  1 file changed, 34 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/hid/hid-betopff.c b/drivers/hid/hid-betopff.c
> index 69cfc8dc6af1..04ea55a4250d 100644
> --- a/drivers/hid/hid-betopff.c
> +++ b/drivers/hid/hid-betopff.c
> @@ -55,24 +55,40 @@ static int hid_betopff_play(struct input_dev *dev, void *data,
>         return 0;
>  }
>
> -static int betopff_init(struct hid_device *hid)
> +static int betop_probe(struct hid_device *hdev, const struct hid_device_id *id)
>  {
>         struct betopff_device *betopff;
>         struct hid_report *report;
> -       struct hid_input *hidinput =
> -                       list_first_entry(&hid->inputs, struct hid_input, list);
> -       struct list_head *report_list =
> -                       &hid->report_enum[HID_OUTPUT_REPORT].report_list;
> -       struct input_dev *dev = hidinput->input;
> +       struct hid_input *hidinput;
> +       struct list_head *report_list;
>         int field_count = 0;
>         int error;
>         int i, j;
>
> +       betopff = devm_kzalloc(&hdev->dev, sizeof(*betopff), GFP_KERNEL);
> +       if (!betopff)
> +               return -ENOMEM;
> +
> +       if (id->driver_data)
> +               hdev->quirks |= HID_QUIRK_MULTI_INPUT;
> +
> +       error = hid_parse(hdev);
> +       if (error) {
> +               hid_err(hdev, "parse failed\n");
> +               return error;
> +       }
> +
> +       error = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_FF);
> +       if (error) {
> +               hid_err(hdev, "hw start failed\n");
> +               return error;
> +       }
> +
> +       report_list = &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
>         if (list_empty(report_list)) {
> -               hid_err(hid, "no output reports found\n");
> +               hid_err(hdev, "no output reports found\n");
>                 return -ENODEV;
>         }
> -
>         report = list_first_entry(report_list, struct hid_report, list);
>         /*
>          * Actually there are 4 fields for 4 Bytes as below:
> @@ -90,55 +106,25 @@ static int betopff_init(struct hid_device *hid)
>         }
>
>         if (field_count < 4) {
> -               hid_err(hid, "not enough fields in the report: %d\n",
> -                               field_count);
> +               hid_err(hdev, "not enough fields in the report: %d\n",
> +                       field_count);
>                 return -ENODEV;
>         }
>
> -       betopff = kzalloc(sizeof(*betopff), GFP_KERNEL);
> -       if (!betopff)
> -               return -ENOMEM;
> -
> -       set_bit(FF_RUMBLE, dev->ffbit);
> -
> -       error = input_ff_create_memless(dev, betopff, hid_betopff_play);
> -       if (error) {
> -               kfree(betopff);
> -               return error;
> -       }
> -
> +       hidinput = list_first_entry(&hdev->inputs, struct hid_input, list);
> +       set_bit(FF_RUMBLE, hidinput->input->ffbit);
>         betopff->report = report;
> -       hid_hw_request(hid, betopff->report, HID_REQ_SET_REPORT);
>
> -       hid_info(hid, "Force feedback for betop devices by huangbo <huangbobupt@xxxxxxx>\n");
> -
> -       return 0;
> -}
> -
> -static int betop_probe(struct hid_device *hdev, const struct hid_device_id *id)
> -{
> -       int ret;
> -
> -       if (id->driver_data)
> -               hdev->quirks |= HID_QUIRK_MULTI_INPUT;
> -
> -       ret = hid_parse(hdev);
> -       if (ret) {
> -               hid_err(hdev, "parse failed\n");
> -               goto err;
> -       }
> +       error = input_ff_create_memless(hidinput->input,
> +               betopff, hid_betopff_play);
> +       if (error)
> +               return error;
>
> -       ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_FF);
> -       if (ret) {
> -               hid_err(hdev, "hw start failed\n");
> -               goto err;
> -       }
> +       hid_hw_request(hdev, betopff->report, HID_REQ_SET_REPORT);
>
> -       betopff_init(hdev);
> +       hid_info(hdev, "Force feedback for betop devices by huangbo <huangbobupt@xxxxxxx>\n");
>
>         return 0;
> -err:
> -       return ret;
>  }
>
>  static const struct hid_device_id betop_devices[] = {
> --
> 2.17.1
>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux