The patch number 10983 was added via Hans Verkuil <hverk...@xs4all.nl>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        Linux Media Mailing List <linux-me...@vger.kernel.org>

------

From: Hans Verkuil  <hverk...@xs4all.nl>
v4l2-common: add missing i2c_unregister_device.


If the i2c sub-device cannot be found, then we must unregister the i2c_client.
Otherwise this will prevent a possible probe for a different device on that same
address.

Priority: normal

Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>


---

 linux/drivers/media/video/v4l2-common.c |   25 +++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff -r 9f0c05c08c3c -r 1fb21073575d linux/drivers/media/video/v4l2-common.c
--- a/linux/drivers/media/video/v4l2-common.c   Thu Mar 12 22:38:40 2009 +0100
+++ b/linux/drivers/media/video/v4l2-common.c   Thu Mar 12 22:56:15 2009 +0100
@@ -856,11 +856,11 @@ struct v4l2_subdev *v4l2_i2c_new_subdev(
           We need better support from the kernel so that we
           can easily wait for the load to finish. */
        if (client == NULL || client->driver == NULL)
-               return NULL;
+               goto error;
 
        /* Lock the module so we can safely get the v4l2_subdev pointer */
        if (!try_module_get(client->driver->driver.owner))
-               return NULL;
+               goto error;
        sd = i2c_get_clientdata(client);
 
        /* Register with the v4l2_device which increases the module's
@@ -869,8 +869,15 @@ struct v4l2_subdev *v4l2_i2c_new_subdev(
                sd = NULL;
        /* Decrease the module use count to match the first try_module_get. */
        module_put(client->driver->driver.owner);
+
+error:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
+       /* If we have a client but no subdev, then something went wrong and
+          we must unregister the client. */
+       if (client && sd == NULL)
+               i2c_unregister_device(client);
+#endif
        return sd;
-
 }
 EXPORT_SYMBOL_GPL(v4l2_i2c_new_subdev);
 
@@ -918,11 +925,11 @@ struct v4l2_subdev *v4l2_i2c_new_probed_
           We need better support from the kernel so that we
           can easily wait for the load to finish. */
        if (client == NULL || client->driver == NULL)
-               return NULL;
+               goto error;
 
        /* Lock the module so we can safely get the v4l2_subdev pointer */
        if (!try_module_get(client->driver->driver.owner))
-               return NULL;
+               goto error;
        sd = i2c_get_clientdata(client);
 
        /* Register with the v4l2_device which increases the module's
@@ -931,6 +938,14 @@ struct v4l2_subdev *v4l2_i2c_new_probed_
                sd = NULL;
        /* Decrease the module use count to match the first try_module_get. */
        module_put(client->driver->driver.owner);
+
+error:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
+       /* If we have a client but no subdev, then something went wrong and
+          we must unregister the client. */
+       if (client && sd == NULL)
+               i2c_unregister_device(client);
+#endif
        return sd;
 }
 EXPORT_SYMBOL_GPL(v4l2_i2c_new_probed_subdev);


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/1fb21073575d3fcca600b99564131749fe136757

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to