diff mbox

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

Message ID 99bd97d0-363a-21d6-5966-427f92c59889@hanno.de (mailing list archive)
State New, archived
Headers show

Commit Message

Hanno Zulla June 13, 2018, 11:59 a.m. UTC
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.

Signed-off-by: Hanno Zulla <kontakt@hanno.de>
---
 drivers/hid/hid-betopff.c | 82 ++++++++++++++++-----------------------
 1 file changed, 34 insertions(+), 48 deletions(-)

Comments

Benjamin Tissoires July 4, 2018, 12:22 p.m. UTC | #1
On Wed, Jun 13, 2018 at 1:59 PM, Hanno Zulla <abos@hanno.de> 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@hanno.de>
> ---
>  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@163.com>\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@163.com>\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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hanno Zulla July 5, 2018, 8:46 a.m. UTC | #2
Hi,

Am 04.07.2018 um 14:22 schrieb Benjamin Tissoires:
> I'd rather have the removal of the init function in a separate patch.

Okay, will prepare a v2.

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

I do not own these devices. I made similar changes to hid-bigbenff and
hid-sony (which I could test myself) and figured that this change
should be okay for this driver, too.

Kind regards,

Hanno

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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@163.com>\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@163.com>\n");
 
 	return 0;
-err:
-	return ret;
 }
 
 static const struct hid_device_id betop_devices[] = {