Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
e2c77314
Commit
e2c77314
authored
Dec 10, 2007
by
Mauro Carvalho Chehab
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
V4L/DVB (6759): CodingStyle fixes
Signed-off-by:
Mauro Carvalho Chehab
<
mchehab@infradead.org
>
parent
543323bc
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
146 additions
and
146 deletions
+146
-146
drivers/media/video/videobuf-core.c
drivers/media/video/videobuf-core.c
+146
-146
No files found.
drivers/media/video/videobuf-core.c
View file @
e2c77314
...
...
@@ -22,29 +22,32 @@
#include <media/videobuf-core.h>
#define MAGIC_BUFFER 0x20070728
#define MAGIC_CHECK(is,should) if (unlikely((is) != (should))) \
{ printk(KERN_ERR "magic mismatch: %x (expected %x)\n",is,should); BUG(); }
#define MAGIC_CHECK(is, should) do { \
if (unlikely((is) != (should))) { \
printk(KERN_ERR "magic mismatch: %x (expected %x)\n", is, should); \
BUG(); } } while (0)
static
int
debug
=
0
;
static
int
debug
;
module_param
(
debug
,
int
,
0644
);
MODULE_DESCRIPTION
(
"helper module to manage video4linux buffers"
);
MODULE_AUTHOR
(
"Mauro Carvalho Chehab <mchehab@infradead.org>"
);
MODULE_LICENSE
(
"GPL"
);
#define dprintk(level, fmt, arg...) if (debug >= level) \
printk(KERN_DEBUG "vbuf: " fmt , ## arg)
#define dprintk(level, fmt, arg...) do { \
if (debug >= level) \
printk(KERN_DEBUG "vbuf: " fmt , ## arg); } while (0)
/* --------------------------------------------------------------------- */
#define CALL(q, f, arg...) \
(
(q->int_ops->f)
? q->int_ops->f(arg) : 0)
(
(q->int_ops->f)
? q->int_ops->f(arg) : 0)
void
*
videobuf_alloc
(
struct
videobuf_queue
*
q
)
void
*
videobuf_alloc
(
struct
videobuf_queue
*
q
)
{
struct
videobuf_buffer
*
vb
;
BUG_ON
(
q
->
msize
<
sizeof
(
*
vb
));
BUG_ON
(
q
->
msize
<
sizeof
(
*
vb
));
if
(
!
q
->
int_ops
||
!
q
->
int_ops
->
alloc
)
{
printk
(
KERN_ERR
"No specific ops defined!
\n
"
);
...
...
@@ -66,7 +69,7 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
int
retval
=
0
;
DECLARE_WAITQUEUE
(
wait
,
current
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
add_wait_queue
(
&
vb
->
done
,
&
wait
);
while
(
vb
->
state
==
VIDEOBUF_ACTIVE
||
vb
->
state
==
VIDEOBUF_QUEUED
)
{
if
(
non_blocking
)
{
...
...
@@ -75,11 +78,12 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
}
set_current_state
(
intr
?
TASK_INTERRUPTIBLE
:
TASK_UNINTERRUPTIBLE
);
if
(
vb
->
state
==
VIDEOBUF_ACTIVE
||
vb
->
state
==
VIDEOBUF_QUEUED
)
if
(
vb
->
state
==
VIDEOBUF_ACTIVE
||
vb
->
state
==
VIDEOBUF_QUEUED
)
schedule
();
set_current_state
(
TASK_RUNNING
);
if
(
intr
&&
signal_pending
(
current
))
{
dprintk
(
1
,
"buffer waiton: -EINTR
\n
"
);
dprintk
(
1
,
"buffer waiton: -EINTR
\n
"
);
retval
=
-
EINTR
;
break
;
}
...
...
@@ -88,27 +92,27 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
return
retval
;
}
int
videobuf_iolock
(
struct
videobuf_queue
*
q
,
struct
videobuf_buffer
*
vb
,
int
videobuf_iolock
(
struct
videobuf_queue
*
q
,
struct
videobuf_buffer
*
vb
,
struct
v4l2_framebuffer
*
fbuf
)
{
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
/* FIXME: This is required to avoid OOPS on some cases,
since mmap_mapper()
method should be called before _iolock.
/* FIXME: This is required to avoid OOPS on some cases,
since mmap_mapper()
method should be called before _iolock.
On some cases, the mmap_mapper() is called only after scheduling.
However, this way is just too dirty! Better to wait for some event.
*/
schedule_timeout
(
HZ
);
return
CALL
(
q
,
iolock
,
q
,
vb
,
fbuf
);
return
CALL
(
q
,
iolock
,
q
,
vb
,
fbuf
);
}
/* --------------------------------------------------------------------- */
void
videobuf_queue_core_init
(
struct
videobuf_queue
*
q
,
void
videobuf_queue_core_init
(
struct
videobuf_queue
*
q
,
struct
videobuf_queue_ops
*
ops
,
void
*
dev
,
spinlock_t
*
irqlock
,
...
...
@@ -118,7 +122,7 @@ void videobuf_queue_core_init(struct videobuf_queue* q,
void
*
priv
,
struct
videobuf_qtype_ops
*
int_ops
)
{
memset
(
q
,
0
,
sizeof
(
*
q
));
memset
(
q
,
0
,
sizeof
(
*
q
));
q
->
irqlock
=
irqlock
;
q
->
dev
=
dev
;
q
->
type
=
type
;
...
...
@@ -129,13 +133,13 @@ void videobuf_queue_core_init(struct videobuf_queue* q,
q
->
int_ops
=
int_ops
;
/* All buffer operations are mandatory */
BUG_ON
(
!
q
->
ops
->
buf_setup
);
BUG_ON
(
!
q
->
ops
->
buf_prepare
);
BUG_ON
(
!
q
->
ops
->
buf_queue
);
BUG_ON
(
!
q
->
ops
->
buf_release
);
BUG_ON
(
!
q
->
ops
->
buf_setup
);
BUG_ON
(
!
q
->
ops
->
buf_prepare
);
BUG_ON
(
!
q
->
ops
->
buf_queue
);
BUG_ON
(
!
q
->
ops
->
buf_release
);
/* Having implementations for abstract methods are mandatory */
BUG_ON
(
!
q
->
int_ops
);
BUG_ON
(
!
q
->
int_ops
);
mutex_init
(
&
q
->
lock
);
INIT_LIST_HEAD
(
&
q
->
stream
);
...
...
@@ -146,33 +150,33 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
{
int
i
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
if
(
q
->
streaming
)
{
dprintk
(
1
,
"busy: streaming active
\n
"
);
dprintk
(
1
,
"busy: streaming active
\n
"
);
return
1
;
}
if
(
q
->
reading
)
{
dprintk
(
1
,
"busy: pending read #1
\n
"
);
dprintk
(
1
,
"busy: pending read #1
\n
"
);
return
1
;
}
if
(
q
->
read_buf
)
{
dprintk
(
1
,
"busy: pending read #2
\n
"
);
dprintk
(
1
,
"busy: pending read #2
\n
"
);
return
1
;
}
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
if
(
q
->
bufs
[
i
]
->
map
)
{
dprintk
(
1
,
"busy: buffer #%d mapped
\n
"
,
i
);
dprintk
(
1
,
"busy: buffer #%d mapped
\n
"
,
i
);
return
1
;
}
if
(
q
->
bufs
[
i
]
->
state
==
VIDEOBUF_QUEUED
)
{
dprintk
(
1
,
"busy: buffer #%d queued
\n
"
,
i
);
dprintk
(
1
,
"busy: buffer #%d queued
\n
"
,
i
);
return
1
;
}
if
(
q
->
bufs
[
i
]
->
state
==
VIDEOBUF_ACTIVE
)
{
dprintk
(
1
,
"busy: buffer #%d avtive
\n
"
,
i
);
dprintk
(
1
,
"busy: buffer #%d avtive
\n
"
,
i
);
return
1
;
}
}
...
...
@@ -182,12 +186,12 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
/* Locking: Caller holds q->lock */
void
videobuf_queue_cancel
(
struct
videobuf_queue
*
q
)
{
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
i
;
/* remove queued buffers from list */
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
...
...
@@ -197,13 +201,13 @@ void videobuf_queue_cancel(struct videobuf_queue *q)
}
}
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
/* free all buffers + clear queue */
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
}
INIT_LIST_HEAD
(
&
q
->
stream
);
}
...
...
@@ -233,8 +237,8 @@ enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
static
void
videobuf_status
(
struct
videobuf_queue
*
q
,
struct
v4l2_buffer
*
b
,
struct
videobuf_buffer
*
vb
,
enum
v4l2_buf_type
type
)
{
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
b
->
index
=
vb
->
i
;
b
->
type
=
type
;
...
...
@@ -294,16 +298,16 @@ static int __videobuf_mmap_free(struct videobuf_queue *q)
if
(
!
q
)
return
0
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
rc
=
CALL
(
q
,
mmap_free
,
q
);
if
(
rc
<
0
)
rc
=
CALL
(
q
,
mmap_free
,
q
);
if
(
rc
<
0
)
return
rc
;
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
kfree
(
q
->
bufs
[
i
]);
q
->
bufs
[
i
]
=
NULL
;
}
...
...
@@ -328,7 +332,7 @@ static int __videobuf_mmap_setup(struct videobuf_queue *q,
unsigned
int
i
;
int
err
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
err
=
__videobuf_mmap_free
(
q
);
if
(
0
!=
err
)
...
...
@@ -359,7 +363,7 @@ static int __videobuf_mmap_setup(struct videobuf_queue *q,
if
(
!
i
)
return
-
ENOMEM
;
dprintk
(
1
,
"mmap setup: %d buffers, %d bytes each
\n
"
,
dprintk
(
1
,
"mmap setup: %d buffers, %d bytes each
\n
"
,
i
,
bsize
);
return
i
;
...
...
@@ -379,35 +383,35 @@ int videobuf_mmap_setup(struct videobuf_queue *q,
int
videobuf_reqbufs
(
struct
videobuf_queue
*
q
,
struct
v4l2_requestbuffers
*
req
)
{
unsigned
int
size
,
count
;
unsigned
int
size
,
count
;
int
retval
;
if
(
req
->
count
<
1
)
{
dprintk
(
1
,
"reqbufs: count invalid (%d)
\n
"
,
req
->
count
);
dprintk
(
1
,
"reqbufs: count invalid (%d)
\n
"
,
req
->
count
);
return
-
EINVAL
;
}
if
(
req
->
memory
!=
V4L2_MEMORY_MMAP
&&
req
->
memory
!=
V4L2_MEMORY_USERPTR
&&
req
->
memory
!=
V4L2_MEMORY_OVERLAY
)
{
dprintk
(
1
,
"reqbufs: memory type invalid
\n
"
);
dprintk
(
1
,
"reqbufs: memory type invalid
\n
"
);
return
-
EINVAL
;
}
mutex_lock
(
&
q
->
lock
);
if
(
req
->
type
!=
q
->
type
)
{
dprintk
(
1
,
"reqbufs: queue type invalid
\n
"
);
dprintk
(
1
,
"reqbufs: queue type invalid
\n
"
);
retval
=
-
EINVAL
;
goto
done
;
}
if
(
q
->
streaming
)
{
dprintk
(
1
,
"reqbufs: streaming already exists
\n
"
);
dprintk
(
1
,
"reqbufs: streaming already exists
\n
"
);
retval
=
-
EBUSY
;
goto
done
;
}
if
(
!
list_empty
(
&
q
->
stream
))
{
dprintk
(
1
,
"reqbufs: stream running
\n
"
);
dprintk
(
1
,
"reqbufs: stream running
\n
"
);
retval
=
-
EBUSY
;
goto
done
;
}
...
...
@@ -416,14 +420,14 @@ int videobuf_reqbufs(struct videobuf_queue *q,
if
(
count
>
VIDEO_MAX_FRAME
)
count
=
VIDEO_MAX_FRAME
;
size
=
0
;
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
size
=
PAGE_ALIGN
(
size
);
dprintk
(
1
,
"reqbufs: bufs=%d, size=0x%x [%d pages total]
\n
"
,
dprintk
(
1
,
"reqbufs: bufs=%d, size=0x%x [%d pages total]
\n
"
,
count
,
size
,
(
count
*
size
)
>>
PAGE_SHIFT
);
retval
=
__videobuf_mmap_setup
(
q
,
count
,
size
,
req
->
memory
);
retval
=
__videobuf_mmap_setup
(
q
,
count
,
size
,
req
->
memory
);
if
(
retval
<
0
)
{
dprintk
(
1
,
"reqbufs: mmap setup returned %d
\n
"
,
retval
);
dprintk
(
1
,
"reqbufs: mmap setup returned %d
\n
"
,
retval
);
goto
done
;
}
...
...
@@ -440,19 +444,19 @@ int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
mutex_lock
(
&
q
->
lock
);
if
(
unlikely
(
b
->
type
!=
q
->
type
))
{
dprintk
(
1
,
"querybuf: Wrong type.
\n
"
);
dprintk
(
1
,
"querybuf: Wrong type.
\n
"
);
goto
done
;
}
if
(
unlikely
(
b
->
index
<
0
||
b
->
index
>=
VIDEO_MAX_FRAME
))
{
dprintk
(
1
,
"querybuf: index out of range.
\n
"
);
dprintk
(
1
,
"querybuf: index out of range.
\n
"
);
goto
done
;
}
if
(
unlikely
(
NULL
==
q
->
bufs
[
b
->
index
]))
{
dprintk
(
1
,
"querybuf: buffer is null.
\n
"
);
dprintk
(
1
,
"querybuf: buffer is null.
\n
"
);
goto
done
;
}
videobuf_status
(
q
,
b
,
q
->
bufs
[
b
->
index
],
q
->
type
);
videobuf_status
(
q
,
b
,
q
->
bufs
[
b
->
index
],
q
->
type
);
ret
=
0
;
done:
...
...
@@ -465,10 +469,10 @@ int videobuf_qbuf(struct videobuf_queue *q,
{
struct
videobuf_buffer
*
buf
;
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
if
(
b
->
memory
==
V4L2_MEMORY_MMAP
)
down_read
(
&
current
->
mm
->
mmap_sem
);
...
...
@@ -476,36 +480,36 @@ int videobuf_qbuf(struct videobuf_queue *q,
mutex_lock
(
&
q
->
lock
);
retval
=
-
EBUSY
;
if
(
q
->
reading
)
{
dprintk
(
1
,
"qbuf: Reading running...
\n
"
);
dprintk
(
1
,
"qbuf: Reading running...
\n
"
);
goto
done
;
}
retval
=
-
EINVAL
;
if
(
b
->
type
!=
q
->
type
)
{
dprintk
(
1
,
"qbuf: Wrong type.
\n
"
);
dprintk
(
1
,
"qbuf: Wrong type.
\n
"
);
goto
done
;
}
if
(
b
->
index
<
0
||
b
->
index
>=
VIDEO_MAX_FRAME
)
{
dprintk
(
1
,
"qbuf: index out of range.
\n
"
);
dprintk
(
1
,
"qbuf: index out of range.
\n
"
);
goto
done
;
}
buf
=
q
->
bufs
[
b
->
index
];
if
(
NULL
==
buf
)
{
dprintk
(
1
,
"qbuf: buffer is null.
\n
"
);
dprintk
(
1
,
"qbuf: buffer is null.
\n
"
);
goto
done
;
}
MAGIC_CHECK
(
buf
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
buf
->
magic
,
MAGIC_BUFFER
);
if
(
buf
->
memory
!=
b
->
memory
)
{
dprintk
(
1
,
"qbuf: memory type is wrong.
\n
"
);
dprintk
(
1
,
"qbuf: memory type is wrong.
\n
"
);
goto
done
;
}
if
(
buf
->
state
!=
VIDEOBUF_NEEDS_INIT
&&
buf
->
state
!=
VIDEOBUF_IDLE
)
{
dprintk
(
1
,
"qbuf: buffer is already queued or active.
\n
"
);
dprintk
(
1
,
"qbuf: buffer is already queued or active.
\n
"
);
goto
done
;
}
if
(
b
->
flags
&
V4L2_BUF_FLAG_INPUT
)
{
if
(
b
->
input
>=
q
->
inputs
)
{
dprintk
(
1
,
"qbuf: wrong input.
\n
"
);
dprintk
(
1
,
"qbuf: wrong input.
\n
"
);
goto
done
;
}
buf
->
input
=
b
->
input
;
...
...
@@ -516,44 +520,46 @@ int videobuf_qbuf(struct videobuf_queue *q,
switch
(
b
->
memory
)
{
case
V4L2_MEMORY_MMAP
:
if
(
0
==
buf
->
baddr
)
{
dprintk
(
1
,
"qbuf: mmap requested but buffer addr is zero!
\n
"
);
dprintk
(
1
,
"qbuf: mmap requested "
"but buffer addr is zero!
\n
"
);
goto
done
;
}
break
;
case
V4L2_MEMORY_USERPTR
:
if
(
b
->
length
<
buf
->
bsize
)
{
dprintk
(
1
,
"qbuf: buffer length is not enough
\n
"
);
dprintk
(
1
,
"qbuf: buffer length is not enough
\n
"
);
goto
done
;
}
if
(
VIDEOBUF_NEEDS_INIT
!=
buf
->
state
&&
buf
->
baddr
!=
b
->
m
.
userptr
)
q
->
ops
->
buf_release
(
q
,
buf
);
if
(
VIDEOBUF_NEEDS_INIT
!=
buf
->
state
&&
buf
->
baddr
!=
b
->
m
.
userptr
)
q
->
ops
->
buf_release
(
q
,
buf
);
buf
->
baddr
=
b
->
m
.
userptr
;
break
;
case
V4L2_MEMORY_OVERLAY
:
buf
->
boff
=
b
->
m
.
offset
;
break
;
default:
dprintk
(
1
,
"qbuf: wrong memory type
\n
"
);
dprintk
(
1
,
"qbuf: wrong memory type
\n
"
);
goto
done
;
}
dprintk
(
1
,
"qbuf: requesting next field
\n
"
);
dprintk
(
1
,
"qbuf: requesting next field
\n
"
);
field
=
videobuf_next_field
(
q
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
buf
,
field
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
buf
,
field
);
if
(
0
!=
retval
)
{
dprintk
(
1
,
"qbuf: buffer_prepare returned %d
\n
"
,
retval
);
dprintk
(
1
,
"qbuf: buffer_prepare returned %d
\n
"
,
retval
);
goto
done
;
}
list_add_tail
(
&
buf
->
stream
,
&
q
->
stream
);
list_add_tail
(
&
buf
->
stream
,
&
q
->
stream
);
if
(
q
->
streaming
)
{
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
buf
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
}
dprintk
(
1
,
"qbuf: succeded
\n
"
);
dprintk
(
1
,
"qbuf: succeded
\n
"
);
retval
=
0
;
done:
...
...
@@ -571,49 +577,49 @@ int videobuf_dqbuf(struct videobuf_queue *q,
struct
videobuf_buffer
*
buf
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
mutex_lock
(
&
q
->
lock
);
retval
=
-
EBUSY
;
if
(
q
->
reading
)
{
dprintk
(
1
,
"dqbuf: Reading running...
\n
"
);
dprintk
(
1
,
"dqbuf: Reading running...
\n
"
);
goto
done
;
}
retval
=
-
EINVAL
;
if
(
b
->
type
!=
q
->
type
)
{
dprintk
(
1
,
"dqbuf: Wrong type.
\n
"
);
dprintk
(
1
,
"dqbuf: Wrong type.
\n
"
);
goto
done
;
}
if
(
list_empty
(
&
q
->
stream
))
{
dprintk
(
1
,
"dqbuf: stream running
\n
"
);
dprintk
(
1
,
"dqbuf: stream running
\n
"
);
goto
done
;
}
buf
=
list_entry
(
q
->
stream
.
next
,
struct
videobuf_buffer
,
stream
);
retval
=
videobuf_waiton
(
buf
,
nonblocking
,
1
);
if
(
retval
<
0
)
{
dprintk
(
1
,
"dqbuf: waiton returned %d
\n
"
,
retval
);
dprintk
(
1
,
"dqbuf: waiton returned %d
\n
"
,
retval
);
goto
done
;
}
switch
(
buf
->
state
)
{
case
VIDEOBUF_ERROR
:
dprintk
(
1
,
"dqbuf: state is error
\n
"
);
dprintk
(
1
,
"dqbuf: state is error
\n
"
);
retval
=
-
EIO
;
CALL
(
q
,
sync
,
q
,
buf
);
CALL
(
q
,
sync
,
q
,
buf
);
buf
->
state
=
VIDEOBUF_IDLE
;
break
;
case
VIDEOBUF_DONE
:
dprintk
(
1
,
"dqbuf: state is done
\n
"
);
CALL
(
q
,
sync
,
q
,
buf
);
dprintk
(
1
,
"dqbuf: state is done
\n
"
);
CALL
(
q
,
sync
,
q
,
buf
);
buf
->
state
=
VIDEOBUF_IDLE
;
break
;
default:
dprintk
(
1
,
"dqbuf: state invalid
\n
"
);
dprintk
(
1
,
"dqbuf: state invalid
\n
"
);
retval
=
-
EINVAL
;
goto
done
;
}
list_del
(
&
buf
->
stream
);
memset
(
b
,
0
,
sizeof
(
*
b
));
videobuf_status
(
q
,
b
,
buf
,
q
->
type
);
memset
(
b
,
0
,
sizeof
(
*
b
));
videobuf_status
(
q
,
b
,
buf
,
q
->
type
);
done:
mutex_unlock
(
&
q
->
lock
);
...
...
@@ -623,7 +629,7 @@ int videobuf_dqbuf(struct videobuf_queue *q,
int
videobuf_streamon
(
struct
videobuf_queue
*
q
)
{
struct
videobuf_buffer
*
buf
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
retval
;
mutex_lock
(
&
q
->
lock
);
...
...
@@ -635,12 +641,12 @@ int videobuf_streamon(struct videobuf_queue *q)
goto
done
;
q
->
streaming
=
1
;
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
list_for_each_entry
(
buf
,
&
q
->
stream
,
stream
)
if
(
buf
->
state
==
VIDEOBUF_PREPARED
)
q
->
ops
->
buf_queue
(
q
,
buf
);
q
->
ops
->
buf_queue
(
q
,
buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
done:
mutex_unlock
(
&
q
->
lock
);
...
...
@@ -676,10 +682,10 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
size_t
count
,
loff_t
*
ppos
)
{
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
/* setup stuff */
q
->
read_buf
=
videobuf_alloc
(
q
);
...
...
@@ -691,19 +697,19 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
q
->
read_buf
->
bsize
=
count
;
field
=
videobuf_next_field
(
q
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
if
(
0
!=
retval
)
goto
done
;
/* start capture & wait */
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
retval
=
videobuf_waiton
(
q
->
read_buf
,
0
,
0
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
retval
=
videobuf_waiton
(
q
->
read_buf
,
0
,
0
);
if
(
0
==
retval
)
{
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
if
(
VIDEOBUF_ERROR
==
q
->
read_buf
->
state
)
retval
=
-
EIO
;
else
...
...
@@ -712,7 +718,7 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
done:
/* cleanup */
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
return
retval
;
...
...
@@ -723,21 +729,21 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
int
nonblocking
)
{
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
unsigned
size
,
nbufs
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
mutex_lock
(
&
q
->
lock
);
nbufs
=
1
;
size
=
0
;
q
->
ops
->
buf_setup
(
q
,
&
nbufs
,
&
size
);
q
->
ops
->
buf_setup
(
q
,
&
nbufs
,
&
size
);
if
(
NULL
==
q
->
read_buf
&&
count
>=
size
&&
!
nonblocking
)
{
retval
=
videobuf_read_zerocopy
(
q
,
data
,
count
,
ppos
);
retval
=
videobuf_read_zerocopy
(
q
,
data
,
count
,
ppos
);
if
(
retval
>=
0
||
retval
==
-
EIO
)
/* ok, all done */
goto
done
;
...
...
@@ -749,25 +755,25 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
retval
=
-
ENOMEM
;
q
->
read_buf
=
videobuf_alloc
(
q
);
dprintk
(
1
,
"video alloc=0x%p
\n
"
,
q
->
read_buf
);
dprintk
(
1
,
"video alloc=0x%p
\n
"
,
q
->
read_buf
);
if
(
NULL
==
q
->
read_buf
)
goto
done
;
q
->
read_buf
->
memory
=
V4L2_MEMORY_USERPTR
;
q
->
read_buf
->
bsize
=
count
;
/* preferred size */
field
=
videobuf_next_field
(
q
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
if
(
0
!=
retval
)
{
kfree
(
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
goto
done
;
}
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
q
->
read_off
=
0
;
}
...
...
@@ -776,11 +782,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
if
(
0
!=
retval
)
goto
done
;
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
if
(
VIDEOBUF_ERROR
==
q
->
read_buf
->
state
)
{
/* catch I/O errors */
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
retval
=
-
EIO
;
...
...
@@ -788,14 +794,14 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
}
/* Copy to userspace */
retval
=
CALL
(
q
,
video_copy_to_user
,
q
,
data
,
count
,
nonblocking
);
if
(
retval
<
0
)
retval
=
CALL
(
q
,
video_copy_to_user
,
q
,
data
,
count
,
nonblocking
);
if
(
retval
<
0
)
goto
done
;
q
->
read_off
+=
retval
;
if
(
q
->
read_off
==
q
->
read_buf
->
size
)
{
/* all data copied, cleanup */
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
}
...
...
@@ -809,11 +815,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
int
__videobuf_read_start
(
struct
videobuf_queue
*
q
)
{
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
unsigned
int
count
=
0
,
size
=
0
;
int
err
,
i
;
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
if
(
count
<
2
)
count
=
2
;
if
(
count
>
VIDEO_MAX_FRAME
)
...
...
@@ -828,17 +834,17 @@ int __videobuf_read_start(struct videobuf_queue *q)
for
(
i
=
0
;
i
<
count
;
i
++
)
{
field
=
videobuf_next_field
(
q
);
err
=
q
->
ops
->
buf_prepare
(
q
,
q
->
bufs
[
i
],
field
);
err
=
q
->
ops
->
buf_prepare
(
q
,
q
->
bufs
[
i
],
field
);
if
(
err
)
return
err
;
list_add_tail
(
&
q
->
bufs
[
i
]
->
stream
,
&
q
->
stream
);
}
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
for
(
i
=
0
;
i
<
count
;
i
++
)
q
->
ops
->
buf_queue
(
q
,
q
->
bufs
[
i
]);
q
->
ops
->
buf_queue
(
q
,
q
->
bufs
[
i
]);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
q
->
reading
=
1
;
return
0
;
}
...
...
@@ -899,11 +905,11 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
int
vbihack
,
int
nonblocking
)
{
int
rc
,
retval
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
dprintk
(
2
,
"%s
\n
"
,
__FUNCTION__
);
dprintk
(
2
,
"%s
\n
"
,
__FUNCTION__
);
mutex_lock
(
&
q
->
lock
);
retval
=
-
EBUSY
;
if
(
q
->
streaming
)
...
...
@@ -932,7 +938,7 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
}
if
(
q
->
read_buf
->
state
==
VIDEOBUF_DONE
)
{
rc
=
CALL
(
q
,
copy_stream
,
q
,
data
+
retval
,
count
,
rc
=
CALL
(
q
,
copy_stream
,
q
,
data
+
retval
,
count
,
retval
,
vbihack
,
nonblocking
);
if
(
rc
<
0
)
{
retval
=
rc
;
...
...
@@ -953,10 +959,10 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
list_add_tail
(
&
q
->
read_buf
->
stream
,
&
q
->
stream
);
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
q
->
read_buf
=
NULL
;
}
if
(
retval
<
0
)
...
...
@@ -1012,10 +1018,10 @@ int videobuf_mmap_mapper(struct videobuf_queue *q,
{
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
mutex_lock
(
&
q
->
lock
);
retval
=
CALL
(
q
,
mmap_mapper
,
q
,
vma
);
retval
=
CALL
(
q
,
mmap_mapper
,
q
,
vma
);
mutex_unlock
(
&
q
->
lock
);
return
retval
;
...
...
@@ -1026,15 +1032,15 @@ int videobuf_cgmbuf(struct videobuf_queue *q,
struct
video_mbuf
*
mbuf
,
int
count
)
{
struct
v4l2_requestbuffers
req
;
int
rc
,
i
;
int
rc
,
i
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
memset
(
&
req
,
0
,
sizeof
(
req
));
memset
(
&
req
,
0
,
sizeof
(
req
));
req
.
type
=
q
->
type
;
req
.
count
=
count
;
req
.
memory
=
V4L2_MEMORY_MMAP
;
rc
=
videobuf_reqbufs
(
q
,
&
req
);
rc
=
videobuf_reqbufs
(
q
,
&
req
);
if
(
rc
<
0
)
return
rc
;
...
...
@@ -1079,9 +1085,3 @@ EXPORT_SYMBOL_GPL(videobuf_poll_stream);
EXPORT_SYMBOL_GPL
(
videobuf_mmap_setup
);
EXPORT_SYMBOL_GPL
(
videobuf_mmap_free
);
EXPORT_SYMBOL_GPL
(
videobuf_mmap_mapper
);
/*
* Local variables:
* c-basic-offset: 8
* End:
*/
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment