[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]

 



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@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