Skip to content

Commit

Permalink
[media] rtl2832_sdr: refcount to rtl28xxu
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Antti Palosaari authored and Mauro Carvalho Chehab committed Feb 3, 2015
1 parent 6a53fa2 commit d5eec23
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions drivers/media/dvb-frontends/rtl2832_sdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -1426,6 +1437,8 @@ static int rtl2832_sdr_probe(struct platform_device *pdev)
v4l2_ctrl_handler_free(&dev->hdl);
err_kfree:
kfree(dev);
err_module_put:
module_put(pdev->dev.parent->driver->owner);
err:
return ret;
}
Expand All @@ -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;
}
Expand Down

0 comments on commit d5eec23

Please sign in to comment.