From: Hans de Goede Date: Fri, 19 Feb 2010 07:41:40 +0000 (-0300) Subject: V4L/DVB: gspca_main: some input error handling fixes X-Git-Tag: v2.6.34-rc1~280^2~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=10ee2402004d03b31555aad7badf7e499fa686d3;p=profile%2Fcommon%2Fkernel-common.git V4L/DVB: gspca_main: some input error handling fixes 2 small changes to input device error handling: 1) Make it fatal when we fail to create an input device (it is either this or add checks for gspca_dev->input_dev being NULL in a lot of places) 2) Since we allow gspca_input_create_urb() to fail everywhere we call it, and thus never check its return value, make it void. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index d9a934b..a156dd4 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c @@ -184,8 +184,7 @@ static int gspca_input_connect(struct gspca_dev *dev) } else { dev->input_dev = input_dev; } - } else - err = -EINVAL; + } return err; } @@ -243,9 +242,8 @@ error: return ret; } -static int gspca_input_create_urb(struct gspca_dev *gspca_dev) +static void gspca_input_create_urb(struct gspca_dev *gspca_dev) { - int ret = -EINVAL; struct usb_interface *intf; struct usb_host_interface *intf_desc; struct usb_endpoint_descriptor *ep; @@ -259,12 +257,11 @@ static int gspca_input_create_urb(struct gspca_dev *gspca_dev) if (usb_endpoint_dir_in(ep) && usb_endpoint_xfer_int(ep)) { - ret = alloc_and_submit_int_urb(gspca_dev, ep); + alloc_and_submit_int_urb(gspca_dev, ep); break; } } } - return ret; } static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev) @@ -2289,6 +2286,10 @@ int gspca_dev_probe(struct usb_interface *intf, goto out; gspca_set_default_mode(gspca_dev); + ret = gspca_input_connect(gspca_dev); + if (ret) + goto out; + mutex_init(&gspca_dev->usb_lock); mutex_init(&gspca_dev->read_lock); mutex_init(&gspca_dev->queue_lock); @@ -2310,12 +2311,12 @@ int gspca_dev_probe(struct usb_interface *intf, usb_set_intfdata(intf, gspca_dev); PDEBUG(D_PROBE, "%s created", video_device_node_name(&gspca_dev->vdev)); - ret = gspca_input_connect(gspca_dev); - if (ret == 0) - ret = gspca_input_create_urb(gspca_dev); + gspca_input_create_urb(gspca_dev); return 0; out: + if (gspca_dev->input_dev) + input_unregister_device(gspca_dev->input_dev); kfree(gspca_dev->usb_buf); kfree(gspca_dev); return ret;