summaryrefslogtreecommitdiff
path: root/drivers/media/usb/em28xx/em28xx-dvb.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <m.chehab@samsung.com>2014-03-05 11:21:07 -0300
committerChanho Park <chanho61.park@samsung.com>2014-08-08 15:24:28 +0900
commit1e243672a6a25422baa274e4925af976178342b5 (patch)
treef127b2a78a6784338742c1d5b37a2b7715e08621 /drivers/media/usb/em28xx/em28xx-dvb.c
parenta9c6e74abaa2d9c0ba438c0151292d0e61026a8f (diff)
downloadlinux-3.10-1e243672a6a25422baa274e4925af976178342b5.tar.gz
linux-3.10-1e243672a6a25422baa274e4925af976178342b5.tar.bz2
linux-3.10-1e243672a6a25422baa274e4925af976178342b5.zip
upstream: [media] em28xx: Only deallocate struct em28xx after finishing all extensions
We can't free struct em28xx while one of the extensions is still using it. So, add a kref() to control it, freeing it only after the extensions fini calls. Reviewed-by: Frank Schäfer <fschaefer.oss@googlemail.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/usb/em28xx/em28xx-dvb.c')
-rw-r--r--drivers/media/usb/em28xx/em28xx-dvb.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c
index 5632d85ffb1..33e3207c862 100644
--- a/drivers/media/usb/em28xx/em28xx-dvb.c
+++ b/drivers/media/usb/em28xx/em28xx-dvb.c
@@ -1025,7 +1025,6 @@ static int em28xx_dvb_init(struct em28xx *dev)
em28xx_info("Binding DVB extension\n");
dvb = kzalloc(sizeof(struct em28xx_dvb), GFP_KERNEL);
-
if (dvb == NULL) {
em28xx_info("em28xx_dvb: memory allocation failed\n");
return -ENOMEM;
@@ -1486,6 +1485,9 @@ static int em28xx_dvb_init(struct em28xx *dev)
dvb->adapter.mfe_shared = mfe_shared;
em28xx_info("DVB extension successfully initialized\n");
+
+ kref_get(&dev->ref);
+
ret:
em28xx_set_mode(dev, EM28XX_SUSPEND);
mutex_unlock(&dev->lock);
@@ -1542,6 +1544,7 @@ static int em28xx_dvb_fini(struct em28xx *dev)
em28xx_unregister_dvb(dvb);
kfree(dvb);
dev->dvb = NULL;
+ kref_put(&dev->ref, em28xx_free_device);
}
return 0;