Skip to content

Commit 27361ff

Browse files
Hans Verkuilgregkh
authored andcommitted
carma-fpga: drop videobuf dependency
This driver abuses videobuf helper functions. This is a bad idea because: 1) this driver is completely unrelated to media drivers 2) the videobuf API is deprecated and will be removed eventually This patch replaces the videobuf functions with the normal DMA kernel API. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e976a72 commit 27361ff

File tree

2 files changed

+82
-19
lines changed

2 files changed

+82
-19
lines changed

drivers/misc/carma/Kconfig

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
config CARMA_FPGA
22
tristate "CARMA DATA-FPGA Access Driver"
3-
depends on FSL_SOC && PPC_83xx && MEDIA_SUPPORT && HAS_DMA && FSL_DMA
4-
select VIDEOBUF_DMA_SG
3+
depends on FSL_SOC && PPC_83xx && HAS_DMA && FSL_DMA
54
default n
65
help
76
Say Y here to include support for communicating with the data

drivers/misc/carma/carma-fpga.c

Lines changed: 81 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,14 @@
9898
#include <linux/seq_file.h>
9999
#include <linux/highmem.h>
100100
#include <linux/debugfs.h>
101+
#include <linux/vmalloc.h>
101102
#include <linux/kernel.h>
102103
#include <linux/module.h>
103104
#include <linux/poll.h>
104105
#include <linux/slab.h>
105106
#include <linux/kref.h>
106107
#include <linux/io.h>
107108

108-
#include <media/videobuf-dma-sg.h>
109-
110109
/* system controller registers */
111110
#define SYS_IRQ_SOURCE_CTL 0x24
112111
#define SYS_IRQ_OUTPUT_EN 0x28
@@ -142,7 +141,10 @@ struct fpga_info {
142141

143142
struct data_buf {
144143
struct list_head entry;
145-
struct videobuf_dmabuf vb;
144+
void *vaddr;
145+
struct scatterlist *sglist;
146+
int sglen;
147+
int nr_pages;
146148
size_t size;
147149
};
148150

@@ -207,6 +209,68 @@ static void fpga_device_release(struct kref *ref)
207209
* Data Buffer Allocation Helpers
208210
*/
209211

212+
static int carma_dma_init(struct data_buf *buf, int nr_pages)
213+
{
214+
struct page *pg;
215+
int i;
216+
217+
buf->vaddr = vmalloc_32(nr_pages << PAGE_SHIFT);
218+
if (NULL == buf->vaddr) {
219+
pr_debug("vmalloc_32(%d pages) failed\n", nr_pages);
220+
return -ENOMEM;
221+
}
222+
223+
pr_debug("vmalloc is at addr 0x%08lx, size=%d\n",
224+
(unsigned long)buf->vaddr,
225+
nr_pages << PAGE_SHIFT);
226+
227+
memset(buf->vaddr, 0, nr_pages << PAGE_SHIFT);
228+
buf->nr_pages = nr_pages;
229+
230+
buf->sglist = vzalloc(buf->nr_pages * sizeof(*buf->sglist));
231+
if (NULL == buf->sglist)
232+
goto vzalloc_err;
233+
234+
sg_init_table(buf->sglist, buf->nr_pages);
235+
for (i = 0; i < buf->nr_pages; i++) {
236+
pg = vmalloc_to_page(buf->vaddr + i * PAGE_SIZE);
237+
if (NULL == pg)
238+
goto vmalloc_to_page_err;
239+
sg_set_page(&buf->sglist[i], pg, PAGE_SIZE, 0);
240+
}
241+
return 0;
242+
243+
vmalloc_to_page_err:
244+
vfree(buf->sglist);
245+
buf->sglist = NULL;
246+
vzalloc_err:
247+
vfree(buf->vaddr);
248+
buf->vaddr = NULL;
249+
return -ENOMEM;
250+
}
251+
252+
static int carma_dma_map(struct device *dev, struct data_buf *buf)
253+
{
254+
buf->sglen = dma_map_sg(dev, buf->sglist,
255+
buf->nr_pages, DMA_FROM_DEVICE);
256+
257+
if (0 == buf->sglen) {
258+
pr_warn("%s: dma_map_sg failed\n", __func__);
259+
return -ENOMEM;
260+
}
261+
return 0;
262+
}
263+
264+
static int carma_dma_unmap(struct device *dev, struct data_buf *buf)
265+
{
266+
if (!buf->sglen)
267+
return 0;
268+
269+
dma_unmap_sg(dev, buf->sglist, buf->sglen, DMA_FROM_DEVICE);
270+
buf->sglen = 0;
271+
return 0;
272+
}
273+
210274
/**
211275
* data_free_buffer() - free a single data buffer and all allocated memory
212276
* @buf: the buffer to free
@@ -221,7 +285,8 @@ static void data_free_buffer(struct data_buf *buf)
221285
return;
222286

223287
/* free all memory */
224-
videobuf_dma_free(&buf->vb);
288+
vfree(buf->sglist);
289+
vfree(buf->vaddr);
225290
kfree(buf);
226291
}
227292

@@ -230,7 +295,7 @@ static void data_free_buffer(struct data_buf *buf)
230295
* @bytes: the number of bytes required
231296
*
232297
* This allocates all space needed for a data buffer. It must be mapped before
233-
* use in a DMA transaction using videobuf_dma_map().
298+
* use in a DMA transaction using carma_dma_map().
234299
*
235300
* Returns NULL on failure
236301
*/
@@ -252,9 +317,8 @@ static struct data_buf *data_alloc_buffer(const size_t bytes)
252317
INIT_LIST_HEAD(&buf->entry);
253318
buf->size = bytes;
254319

255-
/* allocate the videobuf */
256-
videobuf_dma_init(&buf->vb);
257-
ret = videobuf_dma_init_kernel(&buf->vb, DMA_FROM_DEVICE, nr_pages);
320+
/* allocate the buffer */
321+
ret = carma_dma_init(buf, nr_pages);
258322
if (ret)
259323
goto out_free_buf;
260324

@@ -285,13 +349,13 @@ static void data_free_buffers(struct fpga_device *priv)
285349

286350
list_for_each_entry_safe(buf, tmp, &priv->free, entry) {
287351
list_del_init(&buf->entry);
288-
videobuf_dma_unmap(priv->dev, &buf->vb);
352+
carma_dma_unmap(priv->dev, buf);
289353
data_free_buffer(buf);
290354
}
291355

292356
list_for_each_entry_safe(buf, tmp, &priv->used, entry) {
293357
list_del_init(&buf->entry);
294-
videobuf_dma_unmap(priv->dev, &buf->vb);
358+
carma_dma_unmap(priv->dev, buf);
295359
data_free_buffer(buf);
296360
}
297361

@@ -330,7 +394,7 @@ static int data_alloc_buffers(struct fpga_device *priv)
330394
break;
331395

332396
/* map it for DMA */
333-
ret = videobuf_dma_map(priv->dev, &buf->vb);
397+
ret = carma_dma_map(priv->dev, buf);
334398
if (ret) {
335399
data_free_buffer(buf);
336400
break;
@@ -634,8 +698,8 @@ static int data_submit_dma(struct fpga_device *priv, struct data_buf *buf)
634698
dma_addr_t dst, src;
635699
unsigned long dma_flags = 0;
636700

637-
dst_sg = buf->vb.sglist;
638-
dst_nents = buf->vb.sglen;
701+
dst_sg = buf->sglist;
702+
dst_nents = buf->sglen;
639703

640704
src_sg = priv->corl_table.sgl;
641705
src_nents = priv->corl_nents;
@@ -1134,7 +1198,7 @@ static ssize_t data_read(struct file *filp, char __user *ubuf, size_t count,
11341198
spin_unlock_irq(&priv->lock);
11351199

11361200
/* Buffers are always mapped: unmap it */
1137-
videobuf_dma_unmap(priv->dev, &dbuf->vb);
1201+
carma_dma_unmap(priv->dev, dbuf);
11381202

11391203
/* save the buffer for later */
11401204
reader->buf = dbuf;
@@ -1143,7 +1207,7 @@ static ssize_t data_read(struct file *filp, char __user *ubuf, size_t count,
11431207
have_buffer:
11441208
/* Get the number of bytes available */
11451209
avail = dbuf->size - reader->buf_start;
1146-
data = dbuf->vb.vaddr + reader->buf_start;
1210+
data = dbuf->vaddr + reader->buf_start;
11471211

11481212
/* Get the number of bytes we can transfer */
11491213
count = min(count, avail);
@@ -1171,7 +1235,7 @@ static ssize_t data_read(struct file *filp, char __user *ubuf, size_t count,
11711235
* If it fails, we pretend that the read never happed and return
11721236
* -EFAULT to userspace. The read will be retried.
11731237
*/
1174-
ret = videobuf_dma_map(priv->dev, &dbuf->vb);
1238+
ret = carma_dma_map(priv->dev, dbuf);
11751239
if (ret) {
11761240
dev_err(priv->dev, "unable to remap buffer for DMA\n");
11771241
return -EFAULT;
@@ -1203,7 +1267,7 @@ static ssize_t data_read(struct file *filp, char __user *ubuf, size_t count,
12031267
spin_unlock_irq(&priv->lock);
12041268

12051269
if (drop_buffer) {
1206-
videobuf_dma_unmap(priv->dev, &dbuf->vb);
1270+
carma_dma_unmap(priv->dev, dbuf);
12071271
data_free_buffer(dbuf);
12081272
}
12091273

0 commit comments

Comments
 (0)