Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 306496
b: refs/heads/master
c: 97d9742
h: refs/heads/master
v: v3
  • Loading branch information
Sylwester Nawrocki authored and Mauro Carvalho Chehab committed May 20, 2012
1 parent c9898e9 commit 262a3e8
Show file tree
Hide file tree
Showing 6 changed files with 895 additions and 858 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 41df5bf088a10e54c0613ec4d7350b74d5ab8252
refs/heads/master: 97d974226575227ebafdf3ab009f0212d8a7e223
2 changes: 1 addition & 1 deletion trunk/drivers/media/video/s5p-fimc/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
s5p-fimc-objs := fimc-core.o fimc-reg.o fimc-capture.o fimc-mdevice.o
s5p-fimc-objs := fimc-core.o fimc-reg.o fimc-m2m.o fimc-capture.o fimc-mdevice.o
s5p-csis-objs := mipi-csis.o

obj-$(CONFIG_VIDEO_S5P_MIPI_CSIS) += s5p-csis.o
Expand Down
68 changes: 66 additions & 2 deletions trunk/drivers/media/video/s5p-fimc/fimc-capture.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ static int fimc_stop_capture(struct fimc_dev *fimc, bool suspend)
* spinlock held. It updates the camera pixel crop, rotation and
* image flip in H/W.
*/
int fimc_capture_config_update(struct fimc_ctx *ctx)
static int fimc_capture_config_update(struct fimc_ctx *ctx)
{
struct fimc_dev *fimc = ctx->fimc_dev;
int ret;
Expand All @@ -166,6 +166,70 @@ int fimc_capture_config_update(struct fimc_ctx *ctx)
return ret;
}

void fimc_capture_irq_handler(struct fimc_dev *fimc, int deq_buf)
{
struct fimc_vid_cap *cap = &fimc->vid_cap;
struct fimc_vid_buffer *v_buf;
struct timeval *tv;
struct timespec ts;

if (test_and_clear_bit(ST_CAPT_SHUT, &fimc->state)) {
wake_up(&fimc->irq_queue);
goto done;
}

if (!list_empty(&cap->active_buf_q) &&
test_bit(ST_CAPT_RUN, &fimc->state) && deq_buf) {
ktime_get_real_ts(&ts);

v_buf = fimc_active_queue_pop(cap);

tv = &v_buf->vb.v4l2_buf.timestamp;
tv->tv_sec = ts.tv_sec;
tv->tv_usec = ts.tv_nsec / NSEC_PER_USEC;
v_buf->vb.v4l2_buf.sequence = cap->frame_count++;

vb2_buffer_done(&v_buf->vb, VB2_BUF_STATE_DONE);
}

if (!list_empty(&cap->pending_buf_q)) {

v_buf = fimc_pending_queue_pop(cap);
fimc_hw_set_output_addr(fimc, &v_buf->paddr, cap->buf_index);
v_buf->index = cap->buf_index;

/* Move the buffer to the capture active queue */
fimc_active_queue_add(cap, v_buf);

dbg("next frame: %d, done frame: %d",
fimc_hw_get_frame_index(fimc), v_buf->index);

if (++cap->buf_index >= FIMC_MAX_OUT_BUFS)
cap->buf_index = 0;
}

if (cap->active_buf_cnt == 0) {
if (deq_buf)
clear_bit(ST_CAPT_RUN, &fimc->state);

if (++cap->buf_index >= FIMC_MAX_OUT_BUFS)
cap->buf_index = 0;
} else {
set_bit(ST_CAPT_RUN, &fimc->state);
}

fimc_capture_config_update(cap->ctx);
done:
if (cap->active_buf_cnt == 1) {
fimc_deactivate_capture(fimc);
clear_bit(ST_CAPT_STREAM, &fimc->state);
}

dbg("frame: %d, active_buf_cnt: %d",
fimc_hw_get_frame_index(fimc), cap->active_buf_cnt);
}


static int start_streaming(struct vb2_queue *q, unsigned int count)
{
struct fimc_ctx *ctx = q->drv_priv;
Expand Down Expand Up @@ -1245,7 +1309,7 @@ void fimc_sensor_notify(struct v4l2_subdev *sd, unsigned int notification,
struct fimc_vid_buffer, list);
vb2_set_plane_payload(&buf->vb, 0, *((u32 *)arg));
}
fimc_capture_irq_handler(fimc, true);
fimc_capture_irq_handler(fimc, 1);
fimc_deactivate_capture(fimc);
spin_unlock_irqrestore(&fimc->slock, irq_flags);
}
Expand Down
Loading

0 comments on commit 262a3e8

Please sign in to comment.