2 * Samsung S5P/EXYNOS4 SoC series camera interface (camera capture) driver
4 * Copyright (C) 2010 - 2011 Samsung Electronics Co., Ltd.
5 * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/types.h>
15 #include <linux/errno.h>
16 #include <linux/bug.h>
17 #include <linux/interrupt.h>
18 #include <linux/device.h>
19 #include <linux/platform_device.h>
20 #include <linux/pm_runtime.h>
21 #include <linux/list.h>
22 #include <linux/slab.h>
23 #include <linux/clk.h>
24 #include <linux/i2c.h>
26 #include <linux/videodev2.h>
27 #include <media/v4l2-device.h>
28 #include <media/v4l2-ioctl.h>
29 #include <media/v4l2-mem2mem.h>
30 #include <media/videobuf2-core.h>
31 #include <media/videobuf2-dma-contig.h>
33 #include "fimc-core.h"
35 static struct v4l2_subdev
*fimc_subdev_register(struct fimc_dev
*fimc
,
36 struct s5p_fimc_isp_info
*isp_info
)
38 struct i2c_adapter
*i2c_adap
;
39 struct fimc_vid_cap
*vid_cap
= &fimc
->vid_cap
;
40 struct v4l2_subdev
*sd
= NULL
;
42 i2c_adap
= i2c_get_adapter(isp_info
->i2c_bus_num
);
44 return ERR_PTR(-ENOMEM
);
46 sd
= v4l2_i2c_new_subdev_board(&vid_cap
->v4l2_dev
, i2c_adap
,
47 isp_info
->board_info
, NULL
);
49 v4l2_err(&vid_cap
->v4l2_dev
, "failed to acquire subdev\n");
53 v4l2_info(&vid_cap
->v4l2_dev
, "subdevice %s registered successfuly\n",
54 isp_info
->board_info
->type
);
59 static void fimc_subdev_unregister(struct fimc_dev
*fimc
)
61 struct fimc_vid_cap
*vid_cap
= &fimc
->vid_cap
;
62 struct i2c_client
*client
;
64 if (vid_cap
->input_index
< 0)
65 return; /* Subdevice already released or not registered. */
68 v4l2_device_unregister_subdev(vid_cap
->sd
);
69 client
= v4l2_get_subdevdata(vid_cap
->sd
);
70 i2c_unregister_device(client
);
71 i2c_put_adapter(client
->adapter
);
75 vid_cap
->input_index
= -1;
79 * fimc_subdev_attach - attach v4l2_subdev to camera host interface
81 * @fimc: FIMC device information
82 * @index: index to the array of available subdevices,
83 * -1 for full array search or non negative value
84 * to select specific subdevice
86 static int fimc_subdev_attach(struct fimc_dev
*fimc
, int index
)
88 struct fimc_vid_cap
*vid_cap
= &fimc
->vid_cap
;
89 struct s5p_platform_fimc
*pdata
= fimc
->pdata
;
90 struct s5p_fimc_isp_info
*isp_info
;
91 struct v4l2_subdev
*sd
;
94 for (i
= 0; i
< pdata
->num_clients
; ++i
) {
95 isp_info
= &pdata
->isp_info
[i
];
97 if (index
>= 0 && i
!= index
)
100 sd
= fimc_subdev_register(fimc
, isp_info
);
101 if (!IS_ERR_OR_NULL(sd
)) {
103 vid_cap
->input_index
= i
;
109 vid_cap
->input_index
= -1;
111 v4l2_err(&vid_cap
->v4l2_dev
, "fimc%d: sensor attach failed\n",
116 static int fimc_isp_subdev_init(struct fimc_dev
*fimc
, unsigned int index
)
118 struct s5p_fimc_isp_info
*isp_info
;
119 struct s5p_platform_fimc
*pdata
= fimc
->pdata
;
122 if (index
>= pdata
->num_clients
)
125 isp_info
= &pdata
->isp_info
[index
];
127 if (isp_info
->clk_frequency
)
128 clk_set_rate(fimc
->clock
[CLK_CAM
], isp_info
->clk_frequency
);
130 ret
= clk_enable(fimc
->clock
[CLK_CAM
]);
134 ret
= fimc_subdev_attach(fimc
, index
);
138 ret
= fimc_hw_set_camera_polarity(fimc
, isp_info
);
142 ret
= v4l2_subdev_call(fimc
->vid_cap
.sd
, core
, s_power
, 1);
146 /* enabling power failed so unregister subdev */
147 fimc_subdev_unregister(fimc
);
149 v4l2_err(&fimc
->vid_cap
.v4l2_dev
, "ISP initialization failed: %d\n",
155 static void fimc_capture_state_cleanup(struct fimc_dev
*fimc
)
157 struct fimc_vid_cap
*cap
= &fimc
->vid_cap
;
158 struct fimc_vid_buffer
*buf
;
161 spin_lock_irqsave(&fimc
->slock
, flags
);
162 fimc
->state
&= ~(1 << ST_CAPT_RUN
| 1 << ST_CAPT_PEND
|
163 1 << ST_CAPT_SHUT
| 1 << ST_CAPT_STREAM
);
165 fimc
->vid_cap
.active_buf_cnt
= 0;
167 /* Release buffers that were enqueued in the driver by videobuf2. */
168 while (!list_empty(&cap
->pending_buf_q
)) {
169 buf
= pending_queue_pop(cap
);
170 vb2_buffer_done(&buf
->vb
, VB2_BUF_STATE_ERROR
);
173 while (!list_empty(&cap
->active_buf_q
)) {
174 buf
= active_queue_pop(cap
);
175 vb2_buffer_done(&buf
->vb
, VB2_BUF_STATE_ERROR
);
178 spin_unlock_irqrestore(&fimc
->slock
, flags
);
181 static int fimc_stop_capture(struct fimc_dev
*fimc
)
183 struct fimc_vid_cap
*cap
= &fimc
->vid_cap
;
186 if (!fimc_capture_active(fimc
))
189 spin_lock_irqsave(&fimc
->slock
, flags
);
190 set_bit(ST_CAPT_SHUT
, &fimc
->state
);
191 fimc_deactivate_capture(fimc
);
192 spin_unlock_irqrestore(&fimc
->slock
, flags
);
194 wait_event_timeout(fimc
->irq_queue
,
195 !test_bit(ST_CAPT_SHUT
, &fimc
->state
),
196 FIMC_SHUTDOWN_TIMEOUT
);
198 v4l2_subdev_call(cap
->sd
, video
, s_stream
, 0);
200 fimc_capture_state_cleanup(fimc
);
201 dbg("state: 0x%lx", fimc
->state
);
206 static int start_streaming(struct vb2_queue
*q
, unsigned int count
)
208 struct fimc_ctx
*ctx
= q
->drv_priv
;
209 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
210 struct s5p_fimc_isp_info
*isp_info
;
216 ret
= v4l2_subdev_call(fimc
->vid_cap
.sd
, video
, s_stream
, 1);
217 if (ret
&& ret
!= -ENOIOCTLCMD
)
220 ret
= fimc_prepare_config(ctx
, ctx
->state
);
224 isp_info
= &fimc
->pdata
->isp_info
[fimc
->vid_cap
.input_index
];
225 fimc_hw_set_camera_type(fimc
, isp_info
);
226 fimc_hw_set_camera_source(fimc
, isp_info
);
227 fimc_hw_set_camera_offset(fimc
, &ctx
->s_frame
);
229 if (ctx
->state
& FIMC_PARAMS
) {
230 ret
= fimc_set_scaler_info(ctx
);
232 err("Scaler setup error");
235 fimc_hw_set_input_path(ctx
);
236 fimc_hw_set_prescaler(ctx
);
237 fimc_hw_set_mainscaler(ctx
);
238 fimc_hw_set_target_format(ctx
);
239 fimc_hw_set_rotation(ctx
);
240 fimc_hw_set_effect(ctx
);
243 fimc_hw_set_output_path(ctx
);
244 fimc_hw_set_out_dma(ctx
);
246 INIT_LIST_HEAD(&fimc
->vid_cap
.pending_buf_q
);
247 INIT_LIST_HEAD(&fimc
->vid_cap
.active_buf_q
);
248 fimc
->vid_cap
.frame_count
= 0;
249 fimc
->vid_cap
.buf_index
= 0;
251 set_bit(ST_CAPT_PEND
, &fimc
->state
);
253 min_bufs
= fimc
->vid_cap
.reqbufs_count
> 1 ? 2 : 1;
255 if (fimc
->vid_cap
.active_buf_cnt
>= min_bufs
)
256 fimc_activate_capture(ctx
);
260 fimc_capture_state_cleanup(fimc
);
264 static int stop_streaming(struct vb2_queue
*q
)
266 struct fimc_ctx
*ctx
= q
->drv_priv
;
267 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
269 if (!fimc_capture_active(fimc
))
272 return fimc_stop_capture(fimc
);
275 int fimc_capture_suspend(struct fimc_dev
*fimc
)
280 int fimc_capture_resume(struct fimc_dev
*fimc
)
285 static unsigned int get_plane_size(struct fimc_frame
*fr
, unsigned int plane
)
287 if (!fr
|| plane
>= fr
->fmt
->memplanes
)
289 return fr
->f_width
* fr
->f_height
* fr
->fmt
->depth
[plane
] / 8;
292 static int queue_setup(struct vb2_queue
*vq
, unsigned int *num_buffers
,
293 unsigned int *num_planes
, unsigned int sizes
[],
296 struct fimc_ctx
*ctx
= vq
->drv_priv
;
297 struct fimc_fmt
*fmt
= ctx
->d_frame
.fmt
;
303 *num_planes
= fmt
->memplanes
;
305 for (i
= 0; i
< fmt
->memplanes
; i
++) {
306 sizes
[i
] = get_plane_size(&ctx
->d_frame
, i
);
307 allocators
[i
] = ctx
->fimc_dev
->alloc_ctx
;
313 static int buffer_prepare(struct vb2_buffer
*vb
)
315 struct vb2_queue
*vq
= vb
->vb2_queue
;
316 struct fimc_ctx
*ctx
= vq
->drv_priv
;
317 struct v4l2_device
*v4l2_dev
= &ctx
->fimc_dev
->m2m
.v4l2_dev
;
320 if (!ctx
->d_frame
.fmt
|| vq
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
323 for (i
= 0; i
< ctx
->d_frame
.fmt
->memplanes
; i
++) {
324 unsigned long size
= get_plane_size(&ctx
->d_frame
, i
);
326 if (vb2_plane_size(vb
, i
) < size
) {
327 v4l2_err(v4l2_dev
, "User buffer too small (%ld < %ld)\n",
328 vb2_plane_size(vb
, i
), size
);
332 vb2_set_plane_payload(vb
, i
, size
);
338 static void buffer_queue(struct vb2_buffer
*vb
)
340 struct fimc_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
341 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
342 struct fimc_vid_buffer
*buf
343 = container_of(vb
, struct fimc_vid_buffer
, vb
);
344 struct fimc_vid_cap
*vid_cap
= &fimc
->vid_cap
;
348 spin_lock_irqsave(&fimc
->slock
, flags
);
349 fimc_prepare_addr(ctx
, &buf
->vb
, &ctx
->d_frame
, &buf
->paddr
);
351 if (!test_bit(ST_CAPT_STREAM
, &fimc
->state
)
352 && vid_cap
->active_buf_cnt
< FIMC_MAX_OUT_BUFS
) {
353 /* Setup the buffer directly for processing. */
354 int buf_id
= (vid_cap
->reqbufs_count
== 1) ? -1 :
357 fimc_hw_set_output_addr(fimc
, &buf
->paddr
, buf_id
);
358 buf
->index
= vid_cap
->buf_index
;
359 active_queue_add(vid_cap
, buf
);
361 if (++vid_cap
->buf_index
>= FIMC_MAX_OUT_BUFS
)
362 vid_cap
->buf_index
= 0;
364 fimc_pending_queue_add(vid_cap
, buf
);
367 min_bufs
= vid_cap
->reqbufs_count
> 1 ? 2 : 1;
369 if (vb2_is_streaming(&vid_cap
->vbq
) &&
370 vid_cap
->active_buf_cnt
>= min_bufs
&&
371 !test_and_set_bit(ST_CAPT_STREAM
, &fimc
->state
))
372 fimc_activate_capture(ctx
);
374 spin_unlock_irqrestore(&fimc
->slock
, flags
);
377 static void fimc_lock(struct vb2_queue
*vq
)
379 struct fimc_ctx
*ctx
= vb2_get_drv_priv(vq
);
380 mutex_lock(&ctx
->fimc_dev
->lock
);
383 static void fimc_unlock(struct vb2_queue
*vq
)
385 struct fimc_ctx
*ctx
= vb2_get_drv_priv(vq
);
386 mutex_unlock(&ctx
->fimc_dev
->lock
);
389 static struct vb2_ops fimc_capture_qops
= {
390 .queue_setup
= queue_setup
,
391 .buf_prepare
= buffer_prepare
,
392 .buf_queue
= buffer_queue
,
393 .wait_prepare
= fimc_unlock
,
394 .wait_finish
= fimc_lock
,
395 .start_streaming
= start_streaming
,
396 .stop_streaming
= stop_streaming
,
399 static int fimc_capture_open(struct file
*file
)
401 struct fimc_dev
*fimc
= video_drvdata(file
);
404 dbg("pid: %d, state: 0x%lx", task_pid_nr(current
), fimc
->state
);
406 /* Return if the corresponding video mem2mem node is already opened. */
407 if (fimc_m2m_active(fimc
))
410 ret
= pm_runtime_get_sync(&fimc
->pdev
->dev
);
414 if (++fimc
->vid_cap
.refcnt
== 1) {
415 ret
= fimc_isp_subdev_init(fimc
, 0);
417 pm_runtime_put_sync(&fimc
->pdev
->dev
);
418 fimc
->vid_cap
.refcnt
--;
423 file
->private_data
= fimc
->vid_cap
.ctx
;
428 static int fimc_capture_close(struct file
*file
)
430 struct fimc_dev
*fimc
= video_drvdata(file
);
432 dbg("pid: %d, state: 0x%lx", task_pid_nr(current
), fimc
->state
);
434 if (--fimc
->vid_cap
.refcnt
== 0) {
435 fimc_stop_capture(fimc
);
436 vb2_queue_release(&fimc
->vid_cap
.vbq
);
438 v4l2_err(&fimc
->vid_cap
.v4l2_dev
, "releasing ISP\n");
440 v4l2_subdev_call(fimc
->vid_cap
.sd
, core
, s_power
, 0);
441 clk_disable(fimc
->clock
[CLK_CAM
]);
442 fimc_subdev_unregister(fimc
);
445 pm_runtime_put(&fimc
->pdev
->dev
);
450 static unsigned int fimc_capture_poll(struct file
*file
,
451 struct poll_table_struct
*wait
)
453 struct fimc_ctx
*ctx
= file
->private_data
;
454 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
456 return vb2_poll(&fimc
->vid_cap
.vbq
, file
, wait
);
459 static int fimc_capture_mmap(struct file
*file
, struct vm_area_struct
*vma
)
461 struct fimc_ctx
*ctx
= file
->private_data
;
462 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
464 return vb2_mmap(&fimc
->vid_cap
.vbq
, vma
);
467 /* video device file operations */
468 static const struct v4l2_file_operations fimc_capture_fops
= {
469 .owner
= THIS_MODULE
,
470 .open
= fimc_capture_open
,
471 .release
= fimc_capture_close
,
472 .poll
= fimc_capture_poll
,
473 .unlocked_ioctl
= video_ioctl2
,
474 .mmap
= fimc_capture_mmap
,
477 static int fimc_vidioc_querycap_capture(struct file
*file
, void *priv
,
478 struct v4l2_capability
*cap
)
480 struct fimc_ctx
*ctx
= file
->private_data
;
481 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
483 strncpy(cap
->driver
, fimc
->pdev
->name
, sizeof(cap
->driver
) - 1);
484 strncpy(cap
->card
, fimc
->pdev
->name
, sizeof(cap
->card
) - 1);
485 cap
->bus_info
[0] = 0;
486 cap
->capabilities
= V4L2_CAP_STREAMING
| V4L2_CAP_VIDEO_CAPTURE
|
487 V4L2_CAP_VIDEO_CAPTURE_MPLANE
;
492 /* Synchronize formats of the camera interface input and attached sensor. */
493 static int sync_capture_fmt(struct fimc_ctx
*ctx
)
495 struct fimc_frame
*frame
= &ctx
->s_frame
;
496 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
497 struct v4l2_mbus_framefmt
*fmt
= &fimc
->vid_cap
.fmt
;
500 fmt
->width
= ctx
->d_frame
.o_width
;
501 fmt
->height
= ctx
->d_frame
.o_height
;
503 ret
= v4l2_subdev_call(fimc
->vid_cap
.sd
, video
, s_mbus_fmt
, fmt
);
504 if (ret
== -ENOIOCTLCMD
) {
505 err("s_mbus_fmt failed");
508 dbg("w: %d, h: %d, code= %d", fmt
->width
, fmt
->height
, fmt
->code
);
510 frame
->fmt
= find_mbus_format(fmt
, FMT_FLAGS_CAM
);
512 err("fimc source format not found\n");
516 frame
->f_width
= fmt
->width
;
517 frame
->f_height
= fmt
->height
;
518 frame
->width
= fmt
->width
;
519 frame
->height
= fmt
->height
;
520 frame
->o_width
= fmt
->width
;
521 frame
->o_height
= fmt
->height
;
528 static int fimc_cap_s_fmt_mplane(struct file
*file
, void *priv
,
529 struct v4l2_format
*f
)
531 struct fimc_ctx
*ctx
= priv
;
532 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
533 struct fimc_frame
*frame
;
534 struct v4l2_pix_format_mplane
*pix
;
538 if (f
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
541 ret
= fimc_vidioc_try_fmt_mplane(file
, priv
, f
);
545 if (vb2_is_busy(&fimc
->vid_cap
.vbq
) || fimc_capture_active(fimc
))
548 frame
= &ctx
->d_frame
;
550 pix
= &f
->fmt
.pix_mp
;
551 frame
->fmt
= find_format(f
, FMT_FLAGS_M2M
| FMT_FLAGS_CAM
);
553 err("fimc target format not found\n");
557 for (i
= 0; i
< frame
->fmt
->colplanes
; i
++) {
559 (pix
->width
* pix
->height
* frame
->fmt
->depth
[i
]) >> 3;
562 /* Output DMA frame pixel size and offsets. */
563 frame
->f_width
= pix
->plane_fmt
[0].bytesperline
* 8
564 / frame
->fmt
->depth
[0];
565 frame
->f_height
= pix
->height
;
566 frame
->width
= pix
->width
;
567 frame
->height
= pix
->height
;
568 frame
->o_width
= pix
->width
;
569 frame
->o_height
= pix
->height
;
573 ctx
->state
|= (FIMC_PARAMS
| FIMC_DST_FMT
);
575 ret
= sync_capture_fmt(ctx
);
579 static int fimc_cap_enum_input(struct file
*file
, void *priv
,
580 struct v4l2_input
*i
)
582 struct fimc_ctx
*ctx
= priv
;
583 struct s5p_platform_fimc
*pldata
= ctx
->fimc_dev
->pdata
;
584 struct s5p_fimc_isp_info
*isp_info
;
586 if (i
->index
>= pldata
->num_clients
)
589 isp_info
= &pldata
->isp_info
[i
->index
];
591 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
592 strncpy(i
->name
, isp_info
->board_info
->type
, 32);
596 static int fimc_cap_s_input(struct file
*file
, void *priv
,
599 struct fimc_ctx
*ctx
= priv
;
600 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
601 struct s5p_platform_fimc
*pdata
= fimc
->pdata
;
603 if (fimc_capture_active(ctx
->fimc_dev
))
606 if (i
>= pdata
->num_clients
)
610 if (fimc
->vid_cap
.sd
) {
611 int ret
= v4l2_subdev_call(fimc
->vid_cap
.sd
, core
, s_power
, 0);
613 err("s_power failed: %d", ret
);
615 clk_disable(fimc
->clock
[CLK_CAM
]);
618 /* Release the attached sensor subdevice. */
619 fimc_subdev_unregister(fimc
);
621 return fimc_isp_subdev_init(fimc
, i
);
624 static int fimc_cap_g_input(struct file
*file
, void *priv
,
627 struct fimc_ctx
*ctx
= priv
;
628 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
630 *i
= cap
->input_index
;
634 static int fimc_cap_streamon(struct file
*file
, void *priv
,
635 enum v4l2_buf_type type
)
637 struct fimc_ctx
*ctx
= priv
;
638 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
640 if (fimc_capture_active(fimc
) || !fimc
->vid_cap
.sd
)
643 if (!(ctx
->state
& FIMC_DST_FMT
)) {
644 v4l2_err(&fimc
->vid_cap
.v4l2_dev
, "Format is not set\n");
648 return vb2_streamon(&fimc
->vid_cap
.vbq
, type
);
651 static int fimc_cap_streamoff(struct file
*file
, void *priv
,
652 enum v4l2_buf_type type
)
654 struct fimc_ctx
*ctx
= priv
;
655 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
657 return vb2_streamoff(&fimc
->vid_cap
.vbq
, type
);
660 static int fimc_cap_reqbufs(struct file
*file
, void *priv
,
661 struct v4l2_requestbuffers
*reqbufs
)
663 struct fimc_ctx
*ctx
= priv
;
664 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
668 ret
= vb2_reqbufs(&cap
->vbq
, reqbufs
);
670 cap
->reqbufs_count
= reqbufs
->count
;
675 static int fimc_cap_querybuf(struct file
*file
, void *priv
,
676 struct v4l2_buffer
*buf
)
678 struct fimc_ctx
*ctx
= priv
;
679 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
681 return vb2_querybuf(&cap
->vbq
, buf
);
684 static int fimc_cap_qbuf(struct file
*file
, void *priv
,
685 struct v4l2_buffer
*buf
)
687 struct fimc_ctx
*ctx
= priv
;
688 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
689 return vb2_qbuf(&cap
->vbq
, buf
);
692 static int fimc_cap_dqbuf(struct file
*file
, void *priv
,
693 struct v4l2_buffer
*buf
)
695 struct fimc_ctx
*ctx
= priv
;
696 return vb2_dqbuf(&ctx
->fimc_dev
->vid_cap
.vbq
, buf
,
697 file
->f_flags
& O_NONBLOCK
);
700 static int fimc_cap_s_ctrl(struct file
*file
, void *priv
,
701 struct v4l2_control
*ctrl
)
703 struct fimc_ctx
*ctx
= priv
;
706 /* Allow any controls but 90/270 rotation while streaming */
707 if (!fimc_capture_active(ctx
->fimc_dev
) ||
708 ctrl
->id
!= V4L2_CID_ROTATE
||
709 (ctrl
->value
!= 90 && ctrl
->value
!= 270)) {
710 ret
= check_ctrl_val(ctx
, ctrl
);
712 ret
= fimc_s_ctrl(ctx
, ctrl
);
714 ctx
->state
|= FIMC_PARAMS
;
718 ret
= v4l2_subdev_call(ctx
->fimc_dev
->vid_cap
.sd
,
723 static int fimc_cap_cropcap(struct file
*file
, void *fh
,
724 struct v4l2_cropcap
*cr
)
726 struct fimc_frame
*f
;
727 struct fimc_ctx
*ctx
= fh
;
729 if (cr
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
736 cr
->bounds
.width
= f
->o_width
;
737 cr
->bounds
.height
= f
->o_height
;
738 cr
->defrect
= cr
->bounds
;
743 static int fimc_cap_g_crop(struct file
*file
, void *fh
, struct v4l2_crop
*cr
)
745 struct fimc_frame
*f
;
746 struct fimc_ctx
*ctx
= file
->private_data
;
750 cr
->c
.left
= f
->offs_h
;
751 cr
->c
.top
= f
->offs_v
;
752 cr
->c
.width
= f
->width
;
753 cr
->c
.height
= f
->height
;
758 static int fimc_cap_s_crop(struct file
*file
, void *fh
,
759 struct v4l2_crop
*cr
)
761 struct fimc_frame
*f
;
762 struct fimc_ctx
*ctx
= file
->private_data
;
763 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
766 if (fimc_capture_active(fimc
))
769 ret
= fimc_try_crop(ctx
, cr
);
773 if (!(ctx
->state
& FIMC_DST_FMT
)) {
774 v4l2_err(&fimc
->vid_cap
.v4l2_dev
,
775 "Capture color format not set\n");
776 return -EINVAL
; /* TODO: make sure this is the right value */
780 /* Check for the pixel scaling ratio when cropping input image. */
781 ret
= fimc_check_scaler_ratio(cr
->c
.width
, cr
->c
.height
,
782 ctx
->d_frame
.width
, ctx
->d_frame
.height
,
785 v4l2_err(&fimc
->vid_cap
.v4l2_dev
, "Out of the scaler range\n");
789 f
->offs_h
= cr
->c
.left
;
790 f
->offs_v
= cr
->c
.top
;
791 f
->width
= cr
->c
.width
;
792 f
->height
= cr
->c
.height
;
798 static const struct v4l2_ioctl_ops fimc_capture_ioctl_ops
= {
799 .vidioc_querycap
= fimc_vidioc_querycap_capture
,
801 .vidioc_enum_fmt_vid_cap_mplane
= fimc_vidioc_enum_fmt_mplane
,
802 .vidioc_try_fmt_vid_cap_mplane
= fimc_vidioc_try_fmt_mplane
,
803 .vidioc_s_fmt_vid_cap_mplane
= fimc_cap_s_fmt_mplane
,
804 .vidioc_g_fmt_vid_cap_mplane
= fimc_vidioc_g_fmt_mplane
,
806 .vidioc_reqbufs
= fimc_cap_reqbufs
,
807 .vidioc_querybuf
= fimc_cap_querybuf
,
809 .vidioc_qbuf
= fimc_cap_qbuf
,
810 .vidioc_dqbuf
= fimc_cap_dqbuf
,
812 .vidioc_streamon
= fimc_cap_streamon
,
813 .vidioc_streamoff
= fimc_cap_streamoff
,
815 .vidioc_queryctrl
= fimc_vidioc_queryctrl
,
816 .vidioc_g_ctrl
= fimc_vidioc_g_ctrl
,
817 .vidioc_s_ctrl
= fimc_cap_s_ctrl
,
819 .vidioc_g_crop
= fimc_cap_g_crop
,
820 .vidioc_s_crop
= fimc_cap_s_crop
,
821 .vidioc_cropcap
= fimc_cap_cropcap
,
823 .vidioc_enum_input
= fimc_cap_enum_input
,
824 .vidioc_s_input
= fimc_cap_s_input
,
825 .vidioc_g_input
= fimc_cap_g_input
,
828 /* fimc->lock must be already initialized */
829 int fimc_register_capture_device(struct fimc_dev
*fimc
)
831 struct v4l2_device
*v4l2_dev
= &fimc
->vid_cap
.v4l2_dev
;
832 struct video_device
*vfd
;
833 struct fimc_vid_cap
*vid_cap
;
834 struct fimc_ctx
*ctx
;
835 struct v4l2_format f
;
836 struct fimc_frame
*fr
;
840 ctx
= kzalloc(sizeof *ctx
, GFP_KERNEL
);
844 ctx
->fimc_dev
= fimc
;
845 ctx
->in_path
= FIMC_CAMERA
;
846 ctx
->out_path
= FIMC_DMA
;
847 ctx
->state
= FIMC_CTX_CAP
;
849 /* Default format of the output frames */
850 f
.fmt
.pix
.pixelformat
= V4L2_PIX_FMT_RGB32
;
852 fr
->fmt
= find_format(&f
, FMT_FLAGS_M2M
);
853 fr
->width
= fr
->f_width
= fr
->o_width
= 640;
854 fr
->height
= fr
->f_height
= fr
->o_height
= 480;
856 if (!v4l2_dev
->name
[0])
857 snprintf(v4l2_dev
->name
, sizeof(v4l2_dev
->name
),
858 "%s.capture", dev_name(&fimc
->pdev
->dev
));
860 ret
= v4l2_device_register(NULL
, v4l2_dev
);
864 vfd
= video_device_alloc();
866 v4l2_err(v4l2_dev
, "Failed to allocate video device\n");
870 snprintf(vfd
->name
, sizeof(vfd
->name
), "%s:cap",
871 dev_name(&fimc
->pdev
->dev
));
873 vfd
->fops
= &fimc_capture_fops
;
874 vfd
->ioctl_ops
= &fimc_capture_ioctl_ops
;
876 vfd
->release
= video_device_release
;
877 vfd
->lock
= &fimc
->lock
;
878 video_set_drvdata(vfd
, fimc
);
880 vid_cap
= &fimc
->vid_cap
;
882 vid_cap
->active_buf_cnt
= 0;
883 vid_cap
->reqbufs_count
= 0;
885 /* Default color format for image sensor */
886 vid_cap
->fmt
.code
= V4L2_MBUS_FMT_YUYV8_2X8
;
888 INIT_LIST_HEAD(&vid_cap
->pending_buf_q
);
889 INIT_LIST_HEAD(&vid_cap
->active_buf_q
);
890 spin_lock_init(&ctx
->slock
);
893 q
= &fimc
->vid_cap
.vbq
;
894 memset(q
, 0, sizeof(*q
));
895 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
896 q
->io_modes
= VB2_MMAP
| VB2_USERPTR
;
897 q
->drv_priv
= fimc
->vid_cap
.ctx
;
898 q
->ops
= &fimc_capture_qops
;
899 q
->mem_ops
= &vb2_dma_contig_memops
;
900 q
->buf_struct_size
= sizeof(struct fimc_vid_buffer
);
904 ret
= video_register_device(vfd
, VFL_TYPE_GRABBER
, -1);
906 v4l2_err(v4l2_dev
, "Failed to register video device\n");
911 "FIMC capture driver registered as /dev/video%d\n",
917 video_device_release(vfd
);
919 v4l2_device_unregister(v4l2_dev
);
922 dev_err(&fimc
->pdev
->dev
, "failed to install\n");
926 void fimc_unregister_capture_device(struct fimc_dev
*fimc
)
928 struct fimc_vid_cap
*capture
= &fimc
->vid_cap
;
931 video_unregister_device(capture
->vfd
);