diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2012-05-08 14:51:24 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-05-20 08:15:10 -0400 |
commit | 97d974226575227ebafdf3ab009f0212d8a7e223 (patch) | |
tree | 15776cc9f7081d54367b0d2e2e33a32070e0be59 /drivers/media/video/s5p-fimc/fimc-capture.c | |
parent | 41df5bf088a10e54c0613ec4d7350b74d5ab8252 (diff) |
[media] s5p-fimc: Move m2m node driver into separate file
Virtually no functional changes, just code reordering. This let us to
clearly separate all logical functions available in the driver: fimc
capture, mem-to-mem, and later fimc-lite capture, ISP features, etc.
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/s5p-fimc/fimc-capture.c')
-rw-r--r-- | drivers/media/video/s5p-fimc/fimc-capture.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c index be5e4e237297..0051d8161c6c 100644 --- a/drivers/media/video/s5p-fimc/fimc-capture.c +++ b/drivers/media/video/s5p-fimc/fimc-capture.c | |||
@@ -139,7 +139,7 @@ static int fimc_stop_capture(struct fimc_dev *fimc, bool suspend) | |||
139 | * spinlock held. It updates the camera pixel crop, rotation and | 139 | * spinlock held. It updates the camera pixel crop, rotation and |
140 | * image flip in H/W. | 140 | * image flip in H/W. |
141 | */ | 141 | */ |
142 | int fimc_capture_config_update(struct fimc_ctx *ctx) | 142 | static int fimc_capture_config_update(struct fimc_ctx *ctx) |
143 | { | 143 | { |
144 | struct fimc_dev *fimc = ctx->fimc_dev; | 144 | struct fimc_dev *fimc = ctx->fimc_dev; |
145 | int ret; | 145 | int ret; |
@@ -166,6 +166,70 @@ int fimc_capture_config_update(struct fimc_ctx *ctx) | |||
166 | return ret; | 166 | return ret; |
167 | } | 167 | } |
168 | 168 | ||
169 | void fimc_capture_irq_handler(struct fimc_dev *fimc, int deq_buf) | ||
170 | { | ||
171 | struct fimc_vid_cap *cap = &fimc->vid_cap; | ||
172 | struct fimc_vid_buffer *v_buf; | ||
173 | struct timeval *tv; | ||
174 | struct timespec ts; | ||
175 | |||
176 | if (test_and_clear_bit(ST_CAPT_SHUT, &fimc->state)) { | ||
177 | wake_up(&fimc->irq_queue); | ||
178 | goto done; | ||
179 | } | ||
180 | |||
181 | if (!list_empty(&cap->active_buf_q) && | ||
182 | test_bit(ST_CAPT_RUN, &fimc->state) && deq_buf) { | ||
183 | ktime_get_real_ts(&ts); | ||
184 | |||
185 | v_buf = fimc_active_queue_pop(cap); | ||
186 | |||
187 | tv = &v_buf->vb.v4l2_buf.timestamp; | ||
188 | tv->tv_sec = ts.tv_sec; | ||
189 | tv->tv_usec = ts.tv_nsec / NSEC_PER_USEC; | ||
190 | v_buf->vb.v4l2_buf.sequence = cap->frame_count++; | ||
191 | |||
192 | vb2_buffer_done(&v_buf->vb, VB2_BUF_STATE_DONE); | ||
193 | } | ||
194 | |||
195 | if (!list_empty(&cap->pending_buf_q)) { | ||
196 | |||
197 | v_buf = fimc_pending_queue_pop(cap); | ||
198 | fimc_hw_set_output_addr(fimc, &v_buf->paddr, cap->buf_index); | ||
199 | v_buf->index = cap->buf_index; | ||
200 | |||
201 | /* Move the buffer to the capture active queue */ | ||
202 | fimc_active_queue_add(cap, v_buf); | ||
203 | |||
204 | dbg("next frame: %d, done frame: %d", | ||
205 | fimc_hw_get_frame_index(fimc), v_buf->index); | ||
206 | |||
207 | if (++cap->buf_index >= FIMC_MAX_OUT_BUFS) | ||
208 | cap->buf_index = 0; | ||
209 | } | ||
210 | |||
211 | if (cap->active_buf_cnt == 0) { | ||
212 | if (deq_buf) | ||
213 | clear_bit(ST_CAPT_RUN, &fimc->state); | ||
214 | |||
215 | if (++cap->buf_index >= FIMC_MAX_OUT_BUFS) | ||
216 | cap->buf_index = 0; | ||
217 | } else { | ||
218 | set_bit(ST_CAPT_RUN, &fimc->state); | ||
219 | } | ||
220 | |||
221 | fimc_capture_config_update(cap->ctx); | ||
222 | done: | ||
223 | if (cap->active_buf_cnt == 1) { | ||
224 | fimc_deactivate_capture(fimc); | ||
225 | clear_bit(ST_CAPT_STREAM, &fimc->state); | ||
226 | } | ||
227 | |||
228 | dbg("frame: %d, active_buf_cnt: %d", | ||
229 | fimc_hw_get_frame_index(fimc), cap->active_buf_cnt); | ||
230 | } | ||
231 | |||
232 | |||
169 | static int start_streaming(struct vb2_queue *q, unsigned int count) | 233 | static int start_streaming(struct vb2_queue *q, unsigned int count) |
170 | { | 234 | { |
171 | struct fimc_ctx *ctx = q->drv_priv; | 235 | struct fimc_ctx *ctx = q->drv_priv; |
@@ -1245,7 +1309,7 @@ void fimc_sensor_notify(struct v4l2_subdev *sd, unsigned int notification, | |||
1245 | struct fimc_vid_buffer, list); | 1309 | struct fimc_vid_buffer, list); |
1246 | vb2_set_plane_payload(&buf->vb, 0, *((u32 *)arg)); | 1310 | vb2_set_plane_payload(&buf->vb, 0, *((u32 *)arg)); |
1247 | } | 1311 | } |
1248 | fimc_capture_irq_handler(fimc, true); | 1312 | fimc_capture_irq_handler(fimc, 1); |
1249 | fimc_deactivate_capture(fimc); | 1313 | fimc_deactivate_capture(fimc); |
1250 | spin_unlock_irqrestore(&fimc->slock, irq_flags); | 1314 | spin_unlock_irqrestore(&fimc->slock, irq_flags); |
1251 | } | 1315 | } |