aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/s5p-fimc/fimc-capture.c
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2012-05-08 14:51:24 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-20 08:15:10 -0400
commit97d974226575227ebafdf3ab009f0212d8a7e223 (patch)
tree15776cc9f7081d54367b0d2e2e33a32070e0be59 /drivers/media/video/s5p-fimc/fimc-capture.c
parent41df5bf088a10e54c0613ec4d7350b74d5ab8252 (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.c68
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 */
142int fimc_capture_config_update(struct fimc_ctx *ctx) 142static 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
169void 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);
222done:
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
169static int start_streaming(struct vb2_queue *q, unsigned int count) 233static 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 }