2 * Samsung S5P SoC series camera interface (camera capture) driver
4 * Copyright (c) 2010 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/version.h>
15 #include <linux/types.h>
16 #include <linux/errno.h>
17 #include <linux/bug.h>
18 #include <linux/interrupt.h>
19 #include <linux/device.h>
20 #include <linux/platform_device.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 int fimc_stop_capture(struct fimc_dev
*fimc
)
158 struct fimc_vid_cap
*cap
;
159 struct fimc_vid_buffer
*buf
;
161 cap
= &fimc
->vid_cap
;
163 if (!fimc_capture_active(fimc
))
166 spin_lock_irqsave(&fimc
->slock
, flags
);
167 set_bit(ST_CAPT_SHUT
, &fimc
->state
);
168 fimc_deactivate_capture(fimc
);
169 spin_unlock_irqrestore(&fimc
->slock
, flags
);
171 wait_event_timeout(fimc
->irq_queue
,
172 !test_bit(ST_CAPT_SHUT
, &fimc
->state
),
173 FIMC_SHUTDOWN_TIMEOUT
);
175 v4l2_subdev_call(cap
->sd
, video
, s_stream
, 0);
177 spin_lock_irqsave(&fimc
->slock
, flags
);
178 fimc
->state
&= ~(1 << ST_CAPT_RUN
| 1 << ST_CAPT_PEND
|
179 1 << ST_CAPT_SHUT
| 1 << ST_CAPT_STREAM
);
181 fimc
->vid_cap
.active_buf_cnt
= 0;
183 /* Release buffers that were enqueued in the driver by videobuf2. */
184 while (!list_empty(&cap
->pending_buf_q
)) {
185 buf
= pending_queue_pop(cap
);
186 vb2_buffer_done(&buf
->vb
, VB2_BUF_STATE_ERROR
);
189 while (!list_empty(&cap
->active_buf_q
)) {
190 buf
= active_queue_pop(cap
);
191 vb2_buffer_done(&buf
->vb
, VB2_BUF_STATE_ERROR
);
194 spin_unlock_irqrestore(&fimc
->slock
, flags
);
196 dbg("state: 0x%lx", fimc
->state
);
200 static int start_streaming(struct vb2_queue
*q
)
202 struct fimc_ctx
*ctx
= q
->drv_priv
;
203 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
204 struct s5p_fimc_isp_info
*isp_info
;
209 ret
= v4l2_subdev_call(fimc
->vid_cap
.sd
, video
, s_stream
, 1);
210 if (ret
&& ret
!= -ENOIOCTLCMD
)
213 ret
= fimc_prepare_config(ctx
, ctx
->state
);
217 isp_info
= &fimc
->pdata
->isp_info
[fimc
->vid_cap
.input_index
];
218 fimc_hw_set_camera_type(fimc
, isp_info
);
219 fimc_hw_set_camera_source(fimc
, isp_info
);
220 fimc_hw_set_camera_offset(fimc
, &ctx
->s_frame
);
222 if (ctx
->state
& FIMC_PARAMS
) {
223 ret
= fimc_set_scaler_info(ctx
);
225 err("Scaler setup error");
228 fimc_hw_set_input_path(ctx
);
229 fimc_hw_set_prescaler(ctx
);
230 fimc_hw_set_mainscaler(ctx
);
231 fimc_hw_set_target_format(ctx
);
232 fimc_hw_set_rotation(ctx
);
233 fimc_hw_set_effect(ctx
);
236 fimc_hw_set_output_path(ctx
);
237 fimc_hw_set_out_dma(ctx
);
239 INIT_LIST_HEAD(&fimc
->vid_cap
.pending_buf_q
);
240 INIT_LIST_HEAD(&fimc
->vid_cap
.active_buf_q
);
241 fimc
->vid_cap
.active_buf_cnt
= 0;
242 fimc
->vid_cap
.frame_count
= 0;
243 fimc
->vid_cap
.buf_index
= 0;
245 set_bit(ST_CAPT_PEND
, &fimc
->state
);
250 static int stop_streaming(struct vb2_queue
*q
)
252 struct fimc_ctx
*ctx
= q
->drv_priv
;
253 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
255 if (!fimc_capture_active(fimc
))
258 return fimc_stop_capture(fimc
);
261 static unsigned int get_plane_size(struct fimc_frame
*fr
, unsigned int plane
)
263 if (!fr
|| plane
>= fr
->fmt
->memplanes
)
266 dbg("%s: w: %d. h: %d. depth[%d]: %d",
267 __func__
, fr
->width
, fr
->height
, plane
, fr
->fmt
->depth
[plane
]);
269 return fr
->f_width
* fr
->f_height
* fr
->fmt
->depth
[plane
] / 8;
273 static int queue_setup(struct vb2_queue
*vq
, unsigned int *num_buffers
,
274 unsigned int *num_planes
, unsigned long sizes
[],
277 struct fimc_ctx
*ctx
= vq
->drv_priv
;
278 struct fimc_fmt
*fmt
= ctx
->d_frame
.fmt
;
284 *num_planes
= fmt
->memplanes
;
286 dbg("%s, buffer count=%d, plane count=%d",
287 __func__
, *num_buffers
, *num_planes
);
289 for (i
= 0; i
< fmt
->memplanes
; i
++) {
290 sizes
[i
] = get_plane_size(&ctx
->d_frame
, i
);
291 dbg("plane: %u, plane_size: %lu", i
, sizes
[i
]);
292 allocators
[i
] = ctx
->fimc_dev
->alloc_ctx
;
298 static int buffer_init(struct vb2_buffer
*vb
)
304 static int buffer_prepare(struct vb2_buffer
*vb
)
306 struct vb2_queue
*vq
= vb
->vb2_queue
;
307 struct fimc_ctx
*ctx
= vq
->drv_priv
;
308 struct v4l2_device
*v4l2_dev
= &ctx
->fimc_dev
->m2m
.v4l2_dev
;
311 if (!ctx
->d_frame
.fmt
|| vq
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
314 for (i
= 0; i
< ctx
->d_frame
.fmt
->memplanes
; i
++) {
315 unsigned long size
= get_plane_size(&ctx
->d_frame
, i
);
317 if (vb2_plane_size(vb
, i
) < size
) {
318 v4l2_err(v4l2_dev
, "User buffer too small (%ld < %ld)\n",
319 vb2_plane_size(vb
, i
), size
);
323 vb2_set_plane_payload(vb
, i
, size
);
329 static void buffer_queue(struct vb2_buffer
*vb
)
331 struct fimc_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
332 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
333 struct fimc_vid_buffer
*buf
334 = container_of(vb
, struct fimc_vid_buffer
, vb
);
335 struct fimc_vid_cap
*vid_cap
= &fimc
->vid_cap
;
339 spin_lock_irqsave(&fimc
->slock
, flags
);
340 fimc_prepare_addr(ctx
, &buf
->vb
, &ctx
->d_frame
, &buf
->paddr
);
342 if (!test_bit(ST_CAPT_STREAM
, &fimc
->state
)
343 && vid_cap
->active_buf_cnt
< FIMC_MAX_OUT_BUFS
) {
344 /* Setup the buffer directly for processing. */
345 int buf_id
= (vid_cap
->reqbufs_count
== 1) ? -1 :
348 fimc_hw_set_output_addr(fimc
, &buf
->paddr
, buf_id
);
349 buf
->index
= vid_cap
->buf_index
;
350 active_queue_add(vid_cap
, buf
);
352 if (++vid_cap
->buf_index
>= FIMC_MAX_OUT_BUFS
)
353 vid_cap
->buf_index
= 0;
355 fimc_pending_queue_add(vid_cap
, buf
);
358 min_bufs
= vid_cap
->reqbufs_count
> 1 ? 2 : 1;
360 if (vid_cap
->active_buf_cnt
>= min_bufs
&&
361 !test_and_set_bit(ST_CAPT_STREAM
, &fimc
->state
))
362 fimc_activate_capture(ctx
);
364 spin_unlock_irqrestore(&fimc
->slock
, flags
);
367 static void fimc_lock(struct vb2_queue
*vq
)
369 struct fimc_ctx
*ctx
= vb2_get_drv_priv(vq
);
370 mutex_lock(&ctx
->fimc_dev
->lock
);
373 static void fimc_unlock(struct vb2_queue
*vq
)
375 struct fimc_ctx
*ctx
= vb2_get_drv_priv(vq
);
376 mutex_unlock(&ctx
->fimc_dev
->lock
);
379 static struct vb2_ops fimc_capture_qops
= {
380 .queue_setup
= queue_setup
,
381 .buf_prepare
= buffer_prepare
,
382 .buf_queue
= buffer_queue
,
383 .buf_init
= buffer_init
,
384 .wait_prepare
= fimc_unlock
,
385 .wait_finish
= fimc_lock
,
386 .start_streaming
= start_streaming
,
387 .stop_streaming
= stop_streaming
,
390 static int fimc_capture_open(struct file
*file
)
392 struct fimc_dev
*fimc
= video_drvdata(file
);
395 dbg("pid: %d, state: 0x%lx", task_pid_nr(current
), fimc
->state
);
397 /* Return if the corresponding video mem2mem node is already opened. */
398 if (fimc_m2m_active(fimc
))
401 if (++fimc
->vid_cap
.refcnt
== 1) {
402 ret
= fimc_isp_subdev_init(fimc
, 0);
404 fimc
->vid_cap
.refcnt
--;
409 file
->private_data
= fimc
->vid_cap
.ctx
;
414 static int fimc_capture_close(struct file
*file
)
416 struct fimc_dev
*fimc
= video_drvdata(file
);
418 dbg("pid: %d, state: 0x%lx", task_pid_nr(current
), fimc
->state
);
420 if (--fimc
->vid_cap
.refcnt
== 0) {
421 fimc_stop_capture(fimc
);
422 vb2_queue_release(&fimc
->vid_cap
.vbq
);
424 v4l2_err(&fimc
->vid_cap
.v4l2_dev
, "releasing ISP\n");
426 v4l2_subdev_call(fimc
->vid_cap
.sd
, core
, s_power
, 0);
427 clk_disable(fimc
->clock
[CLK_CAM
]);
428 fimc_subdev_unregister(fimc
);
434 static unsigned int fimc_capture_poll(struct file
*file
,
435 struct poll_table_struct
*wait
)
437 struct fimc_ctx
*ctx
= file
->private_data
;
438 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
440 return vb2_poll(&fimc
->vid_cap
.vbq
, file
, wait
);
443 static int fimc_capture_mmap(struct file
*file
, struct vm_area_struct
*vma
)
445 struct fimc_ctx
*ctx
= file
->private_data
;
446 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
448 return vb2_mmap(&fimc
->vid_cap
.vbq
, vma
);
451 /* video device file operations */
452 static const struct v4l2_file_operations fimc_capture_fops
= {
453 .owner
= THIS_MODULE
,
454 .open
= fimc_capture_open
,
455 .release
= fimc_capture_close
,
456 .poll
= fimc_capture_poll
,
457 .unlocked_ioctl
= video_ioctl2
,
458 .mmap
= fimc_capture_mmap
,
461 static int fimc_vidioc_querycap_capture(struct file
*file
, void *priv
,
462 struct v4l2_capability
*cap
)
464 struct fimc_ctx
*ctx
= file
->private_data
;
465 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
467 strncpy(cap
->driver
, fimc
->pdev
->name
, sizeof(cap
->driver
) - 1);
468 strncpy(cap
->card
, fimc
->pdev
->name
, sizeof(cap
->card
) - 1);
469 cap
->bus_info
[0] = 0;
470 cap
->version
= KERNEL_VERSION(1, 0, 0);
471 cap
->capabilities
= V4L2_CAP_STREAMING
| V4L2_CAP_VIDEO_CAPTURE
|
472 V4L2_CAP_VIDEO_CAPTURE_MPLANE
;
477 /* Synchronize formats of the camera interface input and attached sensor. */
478 static int sync_capture_fmt(struct fimc_ctx
*ctx
)
480 struct fimc_frame
*frame
= &ctx
->s_frame
;
481 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
482 struct v4l2_mbus_framefmt
*fmt
= &fimc
->vid_cap
.fmt
;
485 fmt
->width
= ctx
->d_frame
.o_width
;
486 fmt
->height
= ctx
->d_frame
.o_height
;
488 ret
= v4l2_subdev_call(fimc
->vid_cap
.sd
, video
, s_mbus_fmt
, fmt
);
489 if (ret
== -ENOIOCTLCMD
) {
490 err("s_mbus_fmt failed");
493 dbg("w: %d, h: %d, code= %d", fmt
->width
, fmt
->height
, fmt
->code
);
495 frame
->fmt
= find_mbus_format(fmt
, FMT_FLAGS_CAM
);
497 err("fimc source format not found\n");
501 frame
->f_width
= fmt
->width
;
502 frame
->f_height
= fmt
->height
;
503 frame
->width
= fmt
->width
;
504 frame
->height
= fmt
->height
;
505 frame
->o_width
= fmt
->width
;
506 frame
->o_height
= fmt
->height
;
513 static int fimc_cap_s_fmt_mplane(struct file
*file
, void *priv
,
514 struct v4l2_format
*f
)
516 struct fimc_ctx
*ctx
= priv
;
517 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
518 struct fimc_frame
*frame
;
519 struct v4l2_pix_format_mplane
*pix
;
523 if (f
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
526 ret
= fimc_vidioc_try_fmt_mplane(file
, priv
, f
);
530 if (vb2_is_streaming(&fimc
->vid_cap
.vbq
) || fimc_capture_active(fimc
))
533 frame
= &ctx
->d_frame
;
535 pix
= &f
->fmt
.pix_mp
;
536 frame
->fmt
= find_format(f
, FMT_FLAGS_M2M
| FMT_FLAGS_CAM
);
538 err("fimc target format not found\n");
542 for (i
= 0; i
< frame
->fmt
->colplanes
; i
++)
543 frame
->payload
[i
] = pix
->plane_fmt
[i
].bytesperline
* pix
->height
;
545 /* Output DMA frame pixel size and offsets. */
546 frame
->f_width
= pix
->plane_fmt
[0].bytesperline
* 8
547 / frame
->fmt
->depth
[0];
548 frame
->f_height
= pix
->height
;
549 frame
->width
= pix
->width
;
550 frame
->height
= pix
->height
;
551 frame
->o_width
= pix
->width
;
552 frame
->o_height
= pix
->height
;
556 ctx
->state
|= (FIMC_PARAMS
| FIMC_DST_FMT
);
558 ret
= sync_capture_fmt(ctx
);
562 static int fimc_cap_enum_input(struct file
*file
, void *priv
,
563 struct v4l2_input
*i
)
565 struct fimc_ctx
*ctx
= priv
;
566 struct s5p_platform_fimc
*pldata
= ctx
->fimc_dev
->pdata
;
567 struct s5p_fimc_isp_info
*isp_info
;
569 if (i
->index
>= pldata
->num_clients
)
572 isp_info
= &pldata
->isp_info
[i
->index
];
574 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
575 strncpy(i
->name
, isp_info
->board_info
->type
, 32);
579 static int fimc_cap_s_input(struct file
*file
, void *priv
,
582 struct fimc_ctx
*ctx
= priv
;
583 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
584 struct s5p_platform_fimc
*pdata
= fimc
->pdata
;
586 if (fimc_capture_active(ctx
->fimc_dev
))
589 if (i
>= pdata
->num_clients
)
593 if (fimc
->vid_cap
.sd
) {
594 int ret
= v4l2_subdev_call(fimc
->vid_cap
.sd
, core
, s_power
, 0);
596 err("s_power failed: %d", ret
);
598 clk_disable(fimc
->clock
[CLK_CAM
]);
601 /* Release the attached sensor subdevice. */
602 fimc_subdev_unregister(fimc
);
604 return fimc_isp_subdev_init(fimc
, i
);
607 static int fimc_cap_g_input(struct file
*file
, void *priv
,
610 struct fimc_ctx
*ctx
= priv
;
611 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
613 *i
= cap
->input_index
;
617 static int fimc_cap_streamon(struct file
*file
, void *priv
,
618 enum v4l2_buf_type type
)
620 struct fimc_ctx
*ctx
= priv
;
621 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
623 if (fimc_capture_active(fimc
) || !fimc
->vid_cap
.sd
)
626 if (!(ctx
->state
& FIMC_DST_FMT
)) {
627 v4l2_err(&fimc
->vid_cap
.v4l2_dev
, "Format is not set\n");
631 return vb2_streamon(&fimc
->vid_cap
.vbq
, type
);
634 static int fimc_cap_streamoff(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 return vb2_streamoff(&fimc
->vid_cap
.vbq
, type
);
643 static int fimc_cap_reqbufs(struct file
*file
, void *priv
,
644 struct v4l2_requestbuffers
*reqbufs
)
646 struct fimc_ctx
*ctx
= priv
;
647 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
651 ret
= vb2_reqbufs(&cap
->vbq
, reqbufs
);
653 cap
->reqbufs_count
= reqbufs
->count
;
658 static int fimc_cap_querybuf(struct file
*file
, void *priv
,
659 struct v4l2_buffer
*buf
)
661 struct fimc_ctx
*ctx
= priv
;
662 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
664 return vb2_querybuf(&cap
->vbq
, buf
);
667 static int fimc_cap_qbuf(struct file
*file
, void *priv
,
668 struct v4l2_buffer
*buf
)
670 struct fimc_ctx
*ctx
= priv
;
671 struct fimc_vid_cap
*cap
= &ctx
->fimc_dev
->vid_cap
;
672 return vb2_qbuf(&cap
->vbq
, buf
);
675 static int fimc_cap_dqbuf(struct file
*file
, void *priv
,
676 struct v4l2_buffer
*buf
)
678 struct fimc_ctx
*ctx
= priv
;
679 return vb2_dqbuf(&ctx
->fimc_dev
->vid_cap
.vbq
, buf
,
680 file
->f_flags
& O_NONBLOCK
);
683 static int fimc_cap_s_ctrl(struct file
*file
, void *priv
,
684 struct v4l2_control
*ctrl
)
686 struct fimc_ctx
*ctx
= priv
;
689 /* Allow any controls but 90/270 rotation while streaming */
690 if (!fimc_capture_active(ctx
->fimc_dev
) ||
691 ctrl
->id
!= V4L2_CID_ROTATE
||
692 (ctrl
->value
!= 90 && ctrl
->value
!= 270)) {
693 ret
= check_ctrl_val(ctx
, ctrl
);
695 ret
= fimc_s_ctrl(ctx
, ctrl
);
697 ctx
->state
|= FIMC_PARAMS
;
701 ret
= v4l2_subdev_call(ctx
->fimc_dev
->vid_cap
.sd
,
706 static int fimc_cap_cropcap(struct file
*file
, void *fh
,
707 struct v4l2_cropcap
*cr
)
709 struct fimc_frame
*f
;
710 struct fimc_ctx
*ctx
= fh
;
712 if (cr
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
719 cr
->bounds
.width
= f
->o_width
;
720 cr
->bounds
.height
= f
->o_height
;
721 cr
->defrect
= cr
->bounds
;
726 static int fimc_cap_g_crop(struct file
*file
, void *fh
, struct v4l2_crop
*cr
)
728 struct fimc_frame
*f
;
729 struct fimc_ctx
*ctx
= file
->private_data
;
733 cr
->c
.left
= f
->offs_h
;
734 cr
->c
.top
= f
->offs_v
;
735 cr
->c
.width
= f
->width
;
736 cr
->c
.height
= f
->height
;
741 static int fimc_cap_s_crop(struct file
*file
, void *fh
,
742 struct v4l2_crop
*cr
)
744 struct fimc_frame
*f
;
745 struct fimc_ctx
*ctx
= file
->private_data
;
746 struct fimc_dev
*fimc
= ctx
->fimc_dev
;
749 if (fimc_capture_active(fimc
))
752 ret
= fimc_try_crop(ctx
, cr
);
756 if (!(ctx
->state
& FIMC_DST_FMT
)) {
757 v4l2_err(&fimc
->vid_cap
.v4l2_dev
,
758 "Capture color format not set\n");
759 return -EINVAL
; /* TODO: make sure this is the right value */
763 /* Check for the pixel scaling ratio when cropping input image. */
764 ret
= fimc_check_scaler_ratio(cr
->c
.width
, cr
->c
.height
,
765 ctx
->d_frame
.width
, ctx
->d_frame
.height
,
768 v4l2_err(&fimc
->vid_cap
.v4l2_dev
, "Out of the scaler range\n");
772 f
->offs_h
= cr
->c
.left
;
773 f
->offs_v
= cr
->c
.top
;
774 f
->width
= cr
->c
.width
;
775 f
->height
= cr
->c
.height
;
781 static const struct v4l2_ioctl_ops fimc_capture_ioctl_ops
= {
782 .vidioc_querycap
= fimc_vidioc_querycap_capture
,
784 .vidioc_enum_fmt_vid_cap_mplane
= fimc_vidioc_enum_fmt_mplane
,
785 .vidioc_try_fmt_vid_cap_mplane
= fimc_vidioc_try_fmt_mplane
,
786 .vidioc_s_fmt_vid_cap_mplane
= fimc_cap_s_fmt_mplane
,
787 .vidioc_g_fmt_vid_cap_mplane
= fimc_vidioc_g_fmt_mplane
,
789 .vidioc_reqbufs
= fimc_cap_reqbufs
,
790 .vidioc_querybuf
= fimc_cap_querybuf
,
792 .vidioc_qbuf
= fimc_cap_qbuf
,
793 .vidioc_dqbuf
= fimc_cap_dqbuf
,
795 .vidioc_streamon
= fimc_cap_streamon
,
796 .vidioc_streamoff
= fimc_cap_streamoff
,
798 .vidioc_queryctrl
= fimc_vidioc_queryctrl
,
799 .vidioc_g_ctrl
= fimc_vidioc_g_ctrl
,
800 .vidioc_s_ctrl
= fimc_cap_s_ctrl
,
802 .vidioc_g_crop
= fimc_cap_g_crop
,
803 .vidioc_s_crop
= fimc_cap_s_crop
,
804 .vidioc_cropcap
= fimc_cap_cropcap
,
806 .vidioc_enum_input
= fimc_cap_enum_input
,
807 .vidioc_s_input
= fimc_cap_s_input
,
808 .vidioc_g_input
= fimc_cap_g_input
,
811 /* fimc->lock must be already initialized */
812 int fimc_register_capture_device(struct fimc_dev
*fimc
)
814 struct v4l2_device
*v4l2_dev
= &fimc
->vid_cap
.v4l2_dev
;
815 struct video_device
*vfd
;
816 struct fimc_vid_cap
*vid_cap
;
817 struct fimc_ctx
*ctx
;
818 struct v4l2_format f
;
819 struct fimc_frame
*fr
;
823 ctx
= kzalloc(sizeof *ctx
, GFP_KERNEL
);
827 ctx
->fimc_dev
= fimc
;
828 ctx
->in_path
= FIMC_CAMERA
;
829 ctx
->out_path
= FIMC_DMA
;
830 ctx
->state
= FIMC_CTX_CAP
;
832 /* Default format of the output frames */
833 f
.fmt
.pix
.pixelformat
= V4L2_PIX_FMT_RGB32
;
835 fr
->fmt
= find_format(&f
, FMT_FLAGS_M2M
);
836 fr
->width
= fr
->f_width
= fr
->o_width
= 640;
837 fr
->height
= fr
->f_height
= fr
->o_height
= 480;
839 if (!v4l2_dev
->name
[0])
840 snprintf(v4l2_dev
->name
, sizeof(v4l2_dev
->name
),
841 "%s.capture", dev_name(&fimc
->pdev
->dev
));
843 ret
= v4l2_device_register(NULL
, v4l2_dev
);
847 vfd
= video_device_alloc();
849 v4l2_err(v4l2_dev
, "Failed to allocate video device\n");
853 snprintf(vfd
->name
, sizeof(vfd
->name
), "%s:cap",
854 dev_name(&fimc
->pdev
->dev
));
856 vfd
->fops
= &fimc_capture_fops
;
857 vfd
->ioctl_ops
= &fimc_capture_ioctl_ops
;
859 vfd
->release
= video_device_release
;
860 vfd
->lock
= &fimc
->lock
;
861 video_set_drvdata(vfd
, fimc
);
863 vid_cap
= &fimc
->vid_cap
;
865 vid_cap
->active_buf_cnt
= 0;
866 vid_cap
->reqbufs_count
= 0;
868 /* Default color format for image sensor */
869 vid_cap
->fmt
.code
= V4L2_MBUS_FMT_YUYV8_2X8
;
871 INIT_LIST_HEAD(&vid_cap
->pending_buf_q
);
872 INIT_LIST_HEAD(&vid_cap
->active_buf_q
);
873 spin_lock_init(&ctx
->slock
);
876 q
= &fimc
->vid_cap
.vbq
;
877 memset(q
, 0, sizeof(*q
));
878 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
879 q
->io_modes
= VB2_MMAP
| VB2_USERPTR
;
880 q
->drv_priv
= fimc
->vid_cap
.ctx
;
881 q
->ops
= &fimc_capture_qops
;
882 q
->mem_ops
= &vb2_dma_contig_memops
;
883 q
->buf_struct_size
= sizeof(struct fimc_vid_buffer
);
887 ret
= video_register_device(vfd
, VFL_TYPE_GRABBER
, -1);
889 v4l2_err(v4l2_dev
, "Failed to register video device\n");
894 "FIMC capture driver registered as /dev/video%d\n",
900 video_device_release(vfd
);
902 v4l2_device_unregister(v4l2_dev
);
904 dev_err(&fimc
->pdev
->dev
, "failed to install\n");
908 void fimc_unregister_capture_device(struct fimc_dev
*fimc
)
910 struct fimc_vid_cap
*capture
= &fimc
->vid_cap
;
913 video_unregister_device(capture
->vfd
);