[media] rtl2832_sdr: refcount to rtl28xxu
[deliverable/linux.git] / 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;
 }
This page took 0.029948 seconds and 5 git commands to generate.