diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c index fe63d53d56db..fe675b937b35 100644 --- a/drivers/input/touchscreen/sur40.c +++ b/drivers/input/touchscreen/sur40.c @@ -730,6 +730,8 @@ static int sur40_probe(struct usb_interface *interface, if (error) { dev_err(&interface->dev, "Unable to register polled input device."); + input_free_device(input); + input = NULL; goto err_free_buffer; } @@ -786,9 +788,8 @@ static int sur40_probe(struct usb_interface *interface, if (sur40->hdl.error) { dev_err(&interface->dev, "Unable to register video controls."); - v4l2_ctrl_handler_free(&sur40->hdl); error = sur40->hdl.error; - goto err_unreg_v4l2; + goto err_unreg_ctrl; } error = video_register_device(&sur40->vdev, VFL_TYPE_TOUCH, -1); @@ -806,12 +807,15 @@ static int sur40_probe(struct usb_interface *interface, err_unreg_video: video_unregister_device(&sur40->vdev); +err_unreg_ctrl: + v4l2_ctrl_handler_free(&sur40->hdl); err_unreg_v4l2: v4l2_device_unregister(&sur40->v4l2); err_free_buffer: kfree(sur40->bulk_in_buffer); err_free_input: - input_free_device(input); + if (input) + input_unregister_device(input); err_free_dev: kfree(sur40);