diff options
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832_sdr.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/media/dvb-frontends/rtl2832_sdr.c b/drivers/media/dvb-frontends/rtl2832_sdr.c index 62e85a3b2234..3ff8806ca584 100644 --- a/drivers/media/dvb-frontends/rtl2832_sdr.c +++ b/drivers/media/dvb-frontends/rtl2832_sdr.c @@ -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; } |