aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/pci
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2014-11-18 07:51:01 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-11-25 05:55:32 -0500
commit0c3a14c177aa85afb991e7c2be3921aa9a52a893 (patch)
treede833b66ee640393292bc404e16c8f43a49ae89c /drivers/media/pci
parente5ae8fa739f8a1d5c292c5b13fa33ac64166e5a0 (diff)
[media] vb2-dma-sg: add allocation context to dma-sg
Require that dma-sg also uses an allocation context. This is in preparation for adding prepare/finish memops to sync the memory between DMA and CPU. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Acked-by: Pawel Osciak <pawel@osciak.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/pci')
-rw-r--r--drivers/media/pci/cx23885/cx23885-417.c1
-rw-r--r--drivers/media/pci/cx23885/cx23885-core.c10
-rw-r--r--drivers/media/pci/cx23885/cx23885-dvb.c1
-rw-r--r--drivers/media/pci/cx23885/cx23885-vbi.c1
-rw-r--r--drivers/media/pci/cx23885/cx23885-video.c1
-rw-r--r--drivers/media/pci/cx23885/cx23885.h1
-rw-r--r--drivers/media/pci/saa7134/saa7134-core.c18
-rw-r--r--drivers/media/pci/saa7134/saa7134-ts.c1
-rw-r--r--drivers/media/pci/saa7134/saa7134-vbi.c1
-rw-r--r--drivers/media/pci/saa7134/saa7134-video.c1
-rw-r--r--drivers/media/pci/saa7134/saa7134.h1
-rw-r--r--drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c10
-rw-r--r--drivers/media/pci/solo6x10/solo6x10.h1
-rw-r--r--drivers/media/pci/tw68/tw68-core.c15
-rw-r--r--drivers/media/pci/tw68/tw68-video.c1
-rw-r--r--drivers/media/pci/tw68/tw68.h1
16 files changed, 56 insertions, 9 deletions
diff --git a/drivers/media/pci/cx23885/cx23885-417.c b/drivers/media/pci/cx23885/cx23885-417.c
index 3948db386fb5..d72a3ec348ef 100644
--- a/drivers/media/pci/cx23885/cx23885-417.c
+++ b/drivers/media/pci/cx23885/cx23885-417.c
@@ -1148,6 +1148,7 @@ static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
1148 dev->ts1.ts_packet_count = mpeglines; 1148 dev->ts1.ts_packet_count = mpeglines;
1149 *num_planes = 1; 1149 *num_planes = 1;
1150 sizes[0] = mpeglinesize * mpeglines; 1150 sizes[0] = mpeglinesize * mpeglines;
1151 alloc_ctxs[0] = dev->alloc_ctx;
1151 *num_buffers = mpegbufs; 1152 *num_buffers = mpegbufs;
1152 return 0; 1153 return 0;
1153} 1154}
diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c
index 331eddac7222..d452b5c076e6 100644
--- a/drivers/media/pci/cx23885/cx23885-core.c
+++ b/drivers/media/pci/cx23885/cx23885-core.c
@@ -1997,9 +1997,14 @@ static int cx23885_initdev(struct pci_dev *pci_dev,
1997 if (!pci_dma_supported(pci_dev, 0xffffffff)) { 1997 if (!pci_dma_supported(pci_dev, 0xffffffff)) {
1998 printk("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name); 1998 printk("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
1999 err = -EIO; 1999 err = -EIO;
2000 goto fail_irq; 2000 goto fail_context;
2001 } 2001 }
2002 2002
2003 dev->alloc_ctx = vb2_dma_sg_init_ctx(&pci_dev->dev);
2004 if (IS_ERR(dev->alloc_ctx)) {
2005 err = PTR_ERR(dev->alloc_ctx);
2006 goto fail_context;
2007 }
2003 err = request_irq(pci_dev->irq, cx23885_irq, 2008 err = request_irq(pci_dev->irq, cx23885_irq,
2004 IRQF_SHARED, dev->name, dev); 2009 IRQF_SHARED, dev->name, dev);
2005 if (err < 0) { 2010 if (err < 0) {
@@ -2028,6 +2033,8 @@ static int cx23885_initdev(struct pci_dev *pci_dev,
2028 return 0; 2033 return 0;
2029 2034
2030fail_irq: 2035fail_irq:
2036 vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
2037fail_context:
2031 cx23885_dev_unregister(dev); 2038 cx23885_dev_unregister(dev);
2032fail_ctrl: 2039fail_ctrl:
2033 v4l2_ctrl_handler_free(hdl); 2040 v4l2_ctrl_handler_free(hdl);
@@ -2053,6 +2060,7 @@ static void cx23885_finidev(struct pci_dev *pci_dev)
2053 free_irq(pci_dev->irq, dev); 2060 free_irq(pci_dev->irq, dev);
2054 2061
2055 cx23885_dev_unregister(dev); 2062 cx23885_dev_unregister(dev);
2063 vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
2056 v4l2_ctrl_handler_free(&dev->ctrl_handler); 2064 v4l2_ctrl_handler_free(&dev->ctrl_handler);
2057 v4l2_device_unregister(v4l2_dev); 2065 v4l2_device_unregister(v4l2_dev);
2058 kfree(dev); 2066 kfree(dev);
diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c
index 1ed92eeb46d1..44fafba65c6f 100644
--- a/drivers/media/pci/cx23885/cx23885-dvb.c
+++ b/drivers/media/pci/cx23885/cx23885-dvb.c
@@ -102,6 +102,7 @@ static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
102 port->ts_packet_count = 32; 102 port->ts_packet_count = 32;
103 *num_planes = 1; 103 *num_planes = 1;
104 sizes[0] = port->ts_packet_size * port->ts_packet_count; 104 sizes[0] = port->ts_packet_size * port->ts_packet_count;
105 alloc_ctxs[0] = port->dev->alloc_ctx;
105 *num_buffers = 32; 106 *num_buffers = 32;
106 return 0; 107 return 0;
107} 108}
diff --git a/drivers/media/pci/cx23885/cx23885-vbi.c b/drivers/media/pci/cx23885/cx23885-vbi.c
index a7c6ef8f3ea3..1d339a69f0c8 100644
--- a/drivers/media/pci/cx23885/cx23885-vbi.c
+++ b/drivers/media/pci/cx23885/cx23885-vbi.c
@@ -132,6 +132,7 @@ static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
132 lines = VBI_NTSC_LINE_COUNT; 132 lines = VBI_NTSC_LINE_COUNT;
133 *num_planes = 1; 133 *num_planes = 1;
134 sizes[0] = lines * VBI_LINE_LENGTH * 2; 134 sizes[0] = lines * VBI_LINE_LENGTH * 2;
135 alloc_ctxs[0] = dev->alloc_ctx;
135 return 0; 136 return 0;
136} 137}
137 138
diff --git a/drivers/media/pci/cx23885/cx23885-video.c b/drivers/media/pci/cx23885/cx23885-video.c
index 091f5dbe65a8..371eecfe7b32 100644
--- a/drivers/media/pci/cx23885/cx23885-video.c
+++ b/drivers/media/pci/cx23885/cx23885-video.c
@@ -323,6 +323,7 @@ static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
323 323
324 *num_planes = 1; 324 *num_planes = 1;
325 sizes[0] = (dev->fmt->depth * dev->width * dev->height) >> 3; 325 sizes[0] = (dev->fmt->depth * dev->width * dev->height) >> 3;
326 alloc_ctxs[0] = dev->alloc_ctx;
326 return 0; 327 return 0;
327} 328}
328 329
diff --git a/drivers/media/pci/cx23885/cx23885.h b/drivers/media/pci/cx23885/cx23885.h
index cf4efa461ce2..f55cd12da0fd 100644
--- a/drivers/media/pci/cx23885/cx23885.h
+++ b/drivers/media/pci/cx23885/cx23885.h
@@ -425,6 +425,7 @@ struct cx23885_dev {
425 struct vb2_queue vb2_vidq; 425 struct vb2_queue vb2_vidq;
426 struct cx23885_dmaqueue vbiq; 426 struct cx23885_dmaqueue vbiq;
427 struct vb2_queue vb2_vbiq; 427 struct vb2_queue vb2_vbiq;
428 void *alloc_ctx;
428 429
429 spinlock_t slock; 430 spinlock_t slock;
430 431
diff --git a/drivers/media/pci/saa7134/saa7134-core.c b/drivers/media/pci/saa7134/saa7134-core.c
index 236ed725f933..a349e964e0bc 100644
--- a/drivers/media/pci/saa7134/saa7134-core.c
+++ b/drivers/media/pci/saa7134/saa7134-core.c
@@ -1001,13 +1001,18 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
1001 saa7134_board_init1(dev); 1001 saa7134_board_init1(dev);
1002 saa7134_hwinit1(dev); 1002 saa7134_hwinit1(dev);
1003 1003
1004 dev->alloc_ctx = vb2_dma_sg_init_ctx(&pci_dev->dev);
1005 if (IS_ERR(dev->alloc_ctx)) {
1006 err = PTR_ERR(dev->alloc_ctx);
1007 goto fail3;
1008 }
1004 /* get irq */ 1009 /* get irq */
1005 err = request_irq(pci_dev->irq, saa7134_irq, 1010 err = request_irq(pci_dev->irq, saa7134_irq,
1006 IRQF_SHARED, dev->name, dev); 1011 IRQF_SHARED, dev->name, dev);
1007 if (err < 0) { 1012 if (err < 0) {
1008 printk(KERN_ERR "%s: can't get IRQ %d\n", 1013 printk(KERN_ERR "%s: can't get IRQ %d\n",
1009 dev->name,pci_dev->irq); 1014 dev->name,pci_dev->irq);
1010 goto fail3; 1015 goto fail4;
1011 } 1016 }
1012 1017
1013 /* wait a bit, register i2c bus */ 1018 /* wait a bit, register i2c bus */
@@ -1065,7 +1070,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
1065 if (err < 0) { 1070 if (err < 0) {
1066 printk(KERN_INFO "%s: can't register video device\n", 1071 printk(KERN_INFO "%s: can't register video device\n",
1067 dev->name); 1072 dev->name);
1068 goto fail4; 1073 goto fail5;
1069 } 1074 }
1070 printk(KERN_INFO "%s: registered device %s [v4l2]\n", 1075 printk(KERN_INFO "%s: registered device %s [v4l2]\n",
1071 dev->name, video_device_node_name(dev->video_dev)); 1076 dev->name, video_device_node_name(dev->video_dev));
@@ -1078,7 +1083,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
1078 err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI, 1083 err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
1079 vbi_nr[dev->nr]); 1084 vbi_nr[dev->nr]);
1080 if (err < 0) 1085 if (err < 0)
1081 goto fail4; 1086 goto fail5;
1082 printk(KERN_INFO "%s: registered device %s\n", 1087 printk(KERN_INFO "%s: registered device %s\n",
1083 dev->name, video_device_node_name(dev->vbi_dev)); 1088 dev->name, video_device_node_name(dev->vbi_dev));
1084 1089
@@ -1089,7 +1094,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
1089 err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO, 1094 err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
1090 radio_nr[dev->nr]); 1095 radio_nr[dev->nr]);
1091 if (err < 0) 1096 if (err < 0)
1092 goto fail4; 1097 goto fail5;
1093 printk(KERN_INFO "%s: registered device %s\n", 1098 printk(KERN_INFO "%s: registered device %s\n",
1094 dev->name, video_device_node_name(dev->radio_dev)); 1099 dev->name, video_device_node_name(dev->radio_dev));
1095 } 1100 }
@@ -1103,10 +1108,12 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
1103 request_submodules(dev); 1108 request_submodules(dev);
1104 return 0; 1109 return 0;
1105 1110
1106 fail4: 1111 fail5:
1107 saa7134_unregister_video(dev); 1112 saa7134_unregister_video(dev);
1108 saa7134_i2c_unregister(dev); 1113 saa7134_i2c_unregister(dev);
1109 free_irq(pci_dev->irq, dev); 1114 free_irq(pci_dev->irq, dev);
1115 fail4:
1116 vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
1110 fail3: 1117 fail3:
1111 saa7134_hwfini(dev); 1118 saa7134_hwfini(dev);
1112 iounmap(dev->lmmio); 1119 iounmap(dev->lmmio);
@@ -1173,6 +1180,7 @@ static void saa7134_finidev(struct pci_dev *pci_dev)
1173 1180
1174 /* release resources */ 1181 /* release resources */
1175 free_irq(pci_dev->irq, dev); 1182 free_irq(pci_dev->irq, dev);
1183 vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
1176 iounmap(dev->lmmio); 1184 iounmap(dev->lmmio);
1177 release_mem_region(pci_resource_start(pci_dev,0), 1185 release_mem_region(pci_resource_start(pci_dev,0),
1178 pci_resource_len(pci_dev,0)); 1186 pci_resource_len(pci_dev,0));
diff --git a/drivers/media/pci/saa7134/saa7134-ts.c b/drivers/media/pci/saa7134/saa7134-ts.c
index bd25323bd947..8eff4a7d8ba3 100644
--- a/drivers/media/pci/saa7134/saa7134-ts.c
+++ b/drivers/media/pci/saa7134/saa7134-ts.c
@@ -142,6 +142,7 @@ int saa7134_ts_queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
142 *nbuffers = 3; 142 *nbuffers = 3;
143 *nplanes = 1; 143 *nplanes = 1;
144 sizes[0] = size; 144 sizes[0] = size;
145 alloc_ctxs[0] = dev->alloc_ctx;
145 return 0; 146 return 0;
146} 147}
147EXPORT_SYMBOL_GPL(saa7134_ts_queue_setup); 148EXPORT_SYMBOL_GPL(saa7134_ts_queue_setup);
diff --git a/drivers/media/pci/saa7134/saa7134-vbi.c b/drivers/media/pci/saa7134/saa7134-vbi.c
index 4f0b1012e4f3..e2cc684a7c12 100644
--- a/drivers/media/pci/saa7134/saa7134-vbi.c
+++ b/drivers/media/pci/saa7134/saa7134-vbi.c
@@ -156,6 +156,7 @@ static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
156 *nbuffers = saa7134_buffer_count(size, *nbuffers); 156 *nbuffers = saa7134_buffer_count(size, *nbuffers);
157 *nplanes = 1; 157 *nplanes = 1;
158 sizes[0] = size; 158 sizes[0] = size;
159 alloc_ctxs[0] = dev->alloc_ctx;
159 return 0; 160 return 0;
160} 161}
161 162
diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c
index fc4a427cb51f..ba029953db9d 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -932,6 +932,7 @@ static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
932 *nbuffers = saa7134_buffer_count(size, *nbuffers); 932 *nbuffers = saa7134_buffer_count(size, *nbuffers);
933 *nplanes = 1; 933 *nplanes = 1;
934 sizes[0] = size; 934 sizes[0] = size;
935 alloc_ctxs[0] = dev->alloc_ctx;
935 return 0; 936 return 0;
936} 937}
937 938
diff --git a/drivers/media/pci/saa7134/saa7134.h b/drivers/media/pci/saa7134/saa7134.h
index 1a82dd07205b..c644c7da6859 100644
--- a/drivers/media/pci/saa7134/saa7134.h
+++ b/drivers/media/pci/saa7134/saa7134.h
@@ -588,6 +588,7 @@ struct saa7134_dev {
588 588
589 589
590 /* video+ts+vbi capture */ 590 /* video+ts+vbi capture */
591 void *alloc_ctx;
591 struct saa7134_dmaqueue video_q; 592 struct saa7134_dmaqueue video_q;
592 struct vb2_queue video_vbq; 593 struct vb2_queue video_vbq;
593 struct saa7134_dmaqueue vbi_q; 594 struct saa7134_dmaqueue vbi_q;
diff --git a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c
index 30e09d935ce1..4f6bfba58065 100644
--- a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c
+++ b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c
@@ -718,7 +718,10 @@ static int solo_enc_queue_setup(struct vb2_queue *q,
718 unsigned int *num_planes, unsigned int sizes[], 718 unsigned int *num_planes, unsigned int sizes[],
719 void *alloc_ctxs[]) 719 void *alloc_ctxs[])
720{ 720{
721 struct solo_enc_dev *solo_enc = vb2_get_drv_priv(q);
722
721 sizes[0] = FRAME_BUF_SIZE; 723 sizes[0] = FRAME_BUF_SIZE;
724 alloc_ctxs[0] = solo_enc->alloc_ctx;
722 *num_planes = 1; 725 *num_planes = 1;
723 726
724 if (*num_buffers < MIN_VID_BUFFERS) 727 if (*num_buffers < MIN_VID_BUFFERS)
@@ -1266,6 +1269,11 @@ static struct solo_enc_dev *solo_enc_alloc(struct solo_dev *solo_dev,
1266 return ERR_PTR(-ENOMEM); 1269 return ERR_PTR(-ENOMEM);
1267 1270
1268 hdl = &solo_enc->hdl; 1271 hdl = &solo_enc->hdl;
1272 solo_enc->alloc_ctx = vb2_dma_sg_init_ctx(&solo_dev->pdev->dev);
1273 if (IS_ERR(solo_enc->alloc_ctx)) {
1274 ret = PTR_ERR(solo_enc->alloc_ctx);
1275 goto hdl_free;
1276 }
1269 v4l2_ctrl_handler_init(hdl, 10); 1277 v4l2_ctrl_handler_init(hdl, 10);
1270 v4l2_ctrl_new_std(hdl, &solo_ctrl_ops, 1278 v4l2_ctrl_new_std(hdl, &solo_ctrl_ops,
1271 V4L2_CID_BRIGHTNESS, 0, 255, 1, 128); 1279 V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
@@ -1369,6 +1377,7 @@ pci_free:
1369 solo_enc->desc_items, solo_enc->desc_dma); 1377 solo_enc->desc_items, solo_enc->desc_dma);
1370hdl_free: 1378hdl_free:
1371 v4l2_ctrl_handler_free(hdl); 1379 v4l2_ctrl_handler_free(hdl);
1380 vb2_dma_sg_cleanup_ctx(solo_enc->alloc_ctx);
1372 kfree(solo_enc); 1381 kfree(solo_enc);
1373 return ERR_PTR(ret); 1382 return ERR_PTR(ret);
1374} 1383}
@@ -1383,6 +1392,7 @@ static void solo_enc_free(struct solo_enc_dev *solo_enc)
1383 solo_enc->desc_items, solo_enc->desc_dma); 1392 solo_enc->desc_items, solo_enc->desc_dma);
1384 video_unregister_device(solo_enc->vfd); 1393 video_unregister_device(solo_enc->vfd);
1385 v4l2_ctrl_handler_free(&solo_enc->hdl); 1394 v4l2_ctrl_handler_free(&solo_enc->hdl);
1395 vb2_dma_sg_cleanup_ctx(solo_enc->alloc_ctx);
1386 kfree(solo_enc); 1396 kfree(solo_enc);
1387} 1397}
1388 1398
diff --git a/drivers/media/pci/solo6x10/solo6x10.h b/drivers/media/pci/solo6x10/solo6x10.h
index 72017b7f0a75..bd8edfa319b8 100644
--- a/drivers/media/pci/solo6x10/solo6x10.h
+++ b/drivers/media/pci/solo6x10/solo6x10.h
@@ -180,6 +180,7 @@ struct solo_enc_dev {
180 u32 sequence; 180 u32 sequence;
181 struct vb2_queue vidq; 181 struct vb2_queue vidq;
182 struct list_head vidq_active; 182 struct list_head vidq_active;
183 void *alloc_ctx;
183 int desc_count; 184 int desc_count;
184 int desc_nelts; 185 int desc_nelts;
185 struct solo_p2m_desc *desc_items; 186 struct solo_p2m_desc *desc_items;
diff --git a/drivers/media/pci/tw68/tw68-core.c b/drivers/media/pci/tw68/tw68-core.c
index 63f0b64057cb..c135165a8b26 100644
--- a/drivers/media/pci/tw68/tw68-core.c
+++ b/drivers/media/pci/tw68/tw68-core.c
@@ -304,13 +304,19 @@ static int tw68_initdev(struct pci_dev *pci_dev,
304 /* Then do any initialisation wanted before interrupts are on */ 304 /* Then do any initialisation wanted before interrupts are on */
305 tw68_hw_init1(dev); 305 tw68_hw_init1(dev);
306 306
307 dev->alloc_ctx = vb2_dma_sg_init_ctx(&pci_dev->dev);
308 if (IS_ERR(dev->alloc_ctx)) {
309 err = PTR_ERR(dev->alloc_ctx);
310 goto fail3;
311 }
312
307 /* get irq */ 313 /* get irq */
308 err = devm_request_irq(&pci_dev->dev, pci_dev->irq, tw68_irq, 314 err = devm_request_irq(&pci_dev->dev, pci_dev->irq, tw68_irq,
309 IRQF_SHARED, dev->name, dev); 315 IRQF_SHARED, dev->name, dev);
310 if (err < 0) { 316 if (err < 0) {
311 pr_err("%s: can't get IRQ %d\n", 317 pr_err("%s: can't get IRQ %d\n",
312 dev->name, pci_dev->irq); 318 dev->name, pci_dev->irq);
313 goto fail3; 319 goto fail4;
314 } 320 }
315 321
316 /* 322 /*
@@ -324,7 +330,7 @@ static int tw68_initdev(struct pci_dev *pci_dev,
324 if (err < 0) { 330 if (err < 0) {
325 pr_err("%s: can't register video device\n", 331 pr_err("%s: can't register video device\n",
326 dev->name); 332 dev->name);
327 goto fail4; 333 goto fail5;
328 } 334 }
329 tw_setl(TW68_INTMASK, dev->pci_irqmask); 335 tw_setl(TW68_INTMASK, dev->pci_irqmask);
330 336
@@ -333,8 +339,10 @@ static int tw68_initdev(struct pci_dev *pci_dev,
333 339
334 return 0; 340 return 0;
335 341
336fail4: 342fail5:
337 video_unregister_device(&dev->vdev); 343 video_unregister_device(&dev->vdev);
344fail4:
345 vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
338fail3: 346fail3:
339 iounmap(dev->lmmio); 347 iounmap(dev->lmmio);
340fail2: 348fail2:
@@ -358,6 +366,7 @@ static void tw68_finidev(struct pci_dev *pci_dev)
358 /* unregister */ 366 /* unregister */
359 video_unregister_device(&dev->vdev); 367 video_unregister_device(&dev->vdev);
360 v4l2_ctrl_handler_free(&dev->hdl); 368 v4l2_ctrl_handler_free(&dev->hdl);
369 vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
361 370
362 /* release resources */ 371 /* release resources */
363 iounmap(dev->lmmio); 372 iounmap(dev->lmmio);
diff --git a/drivers/media/pci/tw68/tw68-video.c b/drivers/media/pci/tw68/tw68-video.c
index 5c94ac7c88d9..50dcce6251f6 100644
--- a/drivers/media/pci/tw68/tw68-video.c
+++ b/drivers/media/pci/tw68/tw68-video.c
@@ -384,6 +384,7 @@ static int tw68_queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt,
384 unsigned tot_bufs = q->num_buffers + *num_buffers; 384 unsigned tot_bufs = q->num_buffers + *num_buffers;
385 385
386 sizes[0] = (dev->fmt->depth * dev->width * dev->height) >> 3; 386 sizes[0] = (dev->fmt->depth * dev->width * dev->height) >> 3;
387 alloc_ctxs[0] = dev->alloc_ctx;
387 /* 388 /*
388 * We allow create_bufs, but only if the sizeimage is the same as the 389 * We allow create_bufs, but only if the sizeimage is the same as the
389 * current sizeimage. The tw68_buffer_count calculation becomes quite 390 * current sizeimage. The tw68_buffer_count calculation becomes quite
diff --git a/drivers/media/pci/tw68/tw68.h b/drivers/media/pci/tw68/tw68.h
index 2c8abe26b13b..7a7501bd165f 100644
--- a/drivers/media/pci/tw68/tw68.h
+++ b/drivers/media/pci/tw68/tw68.h
@@ -181,6 +181,7 @@ struct tw68_dev {
181 unsigned field; 181 unsigned field;
182 struct vb2_queue vidq; 182 struct vb2_queue vidq;
183 struct list_head active; 183 struct list_head active;
184 void *alloc_ctx;
184 185
185 /* various v4l controls */ 186 /* various v4l controls */
186 const struct tw68_tvnorm *tvnorm; /* video */ 187 const struct tw68_tvnorm *tvnorm; /* video */