[media] rtl2832_sdr: refcount to rtl28xxu
authorAntti Palosaari <crope@iki.fi>
Wed, 17 Dec 2014 11:25:03 +0000 (08:25 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 3 Feb 2015 18:22:24 +0000 (16:22 -0200)
We are consumer of DVB frontend provided by rtl28xxu module. Due to
that we must use refcount to ensure none could remove rtl28xxu when
we are alive (or when we are streaming, if more fine-grained
refcounting is wanted).

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/dvb-frontends/rtl2832_sdr.c

index 62e85a3b2234c44fb7910ae118cd3eba2e1e5bcb..3ff8806ca584db9e66d9174543d7d96222b45a54 100644 (file)
@@ -1310,10 +1310,21 @@ static int rtl2832_sdr_probe(struct platform_device *pdev)
                ret = -EINVAL;
                goto err;
        }
+       if (!pdev->dev.parent->driver) {
+               dev_dbg(&pdev->dev, "No parent device\n");
+               ret = -EINVAL;
+               goto err;
+       }
+       /* try to refcount host drv since we are the consumer */
+       if (!try_module_get(pdev->dev.parent->driver->owner)) {
+               dev_err(&pdev->dev, "Refcount fail");
+               ret = -EINVAL;
+               goto err;
+       }
        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (dev == NULL) {
                ret = -ENOMEM;
-               goto err;
+               goto err_module_put;
        }
 
        /* setup the state */
@@ -1426,6 +1437,8 @@ err_v4l2_ctrl_handler_free:
        v4l2_ctrl_handler_free(&dev->hdl);
 err_kfree:
        kfree(dev);
+err_module_put:
+       module_put(pdev->dev.parent->driver->owner);
 err:
        return ret;
 }
@@ -1444,8 +1457,8 @@ static int rtl2832_sdr_remove(struct platform_device *pdev)
        video_unregister_device(&dev->vdev);
        mutex_unlock(&dev->v4l2_lock);
        mutex_unlock(&dev->vb_queue_lock);
-
        v4l2_device_put(&dev->v4l2_dev);
+       module_put(pdev->dev.parent->driver->owner);
 
        return 0;
 }