fimc-capture.c 20.0 KB
Newer Older
1
/*
2
 * Samsung S5P/EXYNOS4 SoC series camera interface (camera capture) driver
3
 *
4
 * Copyright (C) 2010 - 2011 Samsung Electronics Co., Ltd.
5 6 7 8 9 10 11 12 13 14 15 16 17 18
 * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/bug.h>
#include <linux/interrupt.h>
#include <linux/device.h>
19
#include <linux/pm_runtime.h>
20 21 22 23 24 25 26
#include <linux/list.h>
#include <linux/slab.h>

#include <linux/videodev2.h>
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-mem2mem.h>
27 28
#include <media/videobuf2-core.h>
#include <media/videobuf2-dma-contig.h>
29

30
#include "fimc-mdevice.h"
31 32
#include "fimc-core.h"

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
static int fimc_init_capture(struct fimc_dev *fimc)
{
	struct fimc_ctx *ctx = fimc->vid_cap.ctx;
	struct fimc_sensor_info *sensor;
	unsigned long flags;
	int ret = 0;

	if (fimc->pipeline.sensor == NULL || ctx == NULL)
		return -ENXIO;
	if (ctx->s_frame.fmt == NULL)
		return -EINVAL;

	sensor = v4l2_get_subdev_hostdata(fimc->pipeline.sensor);

	spin_lock_irqsave(&fimc->slock, flags);
	fimc_prepare_dma_offset(ctx, &ctx->d_frame);
	fimc_set_yuv_order(ctx);

	fimc_hw_set_camera_polarity(fimc, sensor->pdata);
	fimc_hw_set_camera_type(fimc, sensor->pdata);
	fimc_hw_set_camera_source(fimc, sensor->pdata);
	fimc_hw_set_camera_offset(fimc, &ctx->s_frame);

	ret = fimc_set_scaler_info(ctx);
	if (!ret) {
		fimc_hw_set_input_path(ctx);
		fimc_hw_set_prescaler(ctx);
		fimc_hw_set_mainscaler(ctx);
		fimc_hw_set_target_format(ctx);
		fimc_hw_set_rotation(ctx);
		fimc_hw_set_effect(ctx);
		fimc_hw_set_output_path(ctx);
		fimc_hw_set_out_dma(ctx);
	}
	spin_unlock_irqrestore(&fimc->slock, flags);
	return ret;
}

71
static void fimc_capture_state_cleanup(struct fimc_dev *fimc)
72
{
73
	struct fimc_vid_cap *cap = &fimc->vid_cap;
74
	struct fimc_vid_buffer *buf;
75
	unsigned long flags;
76 77 78

	spin_lock_irqsave(&fimc->slock, flags);
	fimc->state &= ~(1 << ST_CAPT_RUN | 1 << ST_CAPT_PEND |
79
			 1 << ST_CAPT_SHUT | 1 << ST_CAPT_STREAM);
80 81

	fimc->vid_cap.active_buf_cnt = 0;
82 83 84 85 86 87 88 89 90 91 92 93

	/* Release buffers that were enqueued in the driver by videobuf2. */
	while (!list_empty(&cap->pending_buf_q)) {
		buf = pending_queue_pop(cap);
		vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
	}

	while (!list_empty(&cap->active_buf_q)) {
		buf = active_queue_pop(cap);
		vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
	}

94
	spin_unlock_irqrestore(&fimc->slock, flags);
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
}

static int fimc_stop_capture(struct fimc_dev *fimc)
{
	struct fimc_vid_cap *cap = &fimc->vid_cap;
	unsigned long flags;

	if (!fimc_capture_active(fimc))
		return 0;

	spin_lock_irqsave(&fimc->slock, flags);
	set_bit(ST_CAPT_SHUT, &fimc->state);
	fimc_deactivate_capture(fimc);
	spin_unlock_irqrestore(&fimc->slock, flags);

	wait_event_timeout(fimc->irq_queue,
			   !test_bit(ST_CAPT_SHUT, &fimc->state),
			   FIMC_SHUTDOWN_TIMEOUT);
113

114 115 116
	v4l2_subdev_call(cap->sd, video, s_stream, 0);

	fimc_capture_state_cleanup(fimc);
117 118 119 120
	dbg("state: 0x%lx", fimc->state);
	return 0;
}

121 122

static int start_streaming(struct vb2_queue *q, unsigned int count)
123 124 125
{
	struct fimc_ctx *ctx = q->drv_priv;
	struct fimc_dev *fimc = ctx->fimc_dev;
126
	struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
127
	int min_bufs;
128 129
	int ret;

130
	fimc_hw_reset(fimc);
131
	vid_cap->frame_count = 0;
132

133
	ret = fimc_init_capture(fimc);
134
	if (ret)
135
		goto error;
136 137 138

	set_bit(ST_CAPT_PEND, &fimc->state);

139 140 141 142 143
	min_bufs = fimc->vid_cap.reqbufs_count > 1 ? 2 : 1;

	if (fimc->vid_cap.active_buf_cnt >= min_bufs)
		fimc_activate_capture(ctx);

144
	return 0;
145 146 147
error:
	fimc_capture_state_cleanup(fimc);
	return ret;
148 149 150 151 152 153 154
}

static int stop_streaming(struct vb2_queue *q)
{
	struct fimc_ctx *ctx = q->drv_priv;
	struct fimc_dev *fimc = ctx->fimc_dev;

155
	if (!fimc_capture_active(fimc))
156 157 158 159 160
		return -EINVAL;

	return fimc_stop_capture(fimc);
}

161 162 163 164 165 166 167 168 169 170
int fimc_capture_suspend(struct fimc_dev *fimc)
{
	return -EBUSY;
}

int fimc_capture_resume(struct fimc_dev *fimc)
{
	return 0;
}

171
static unsigned int get_plane_size(struct fimc_frame *fr, unsigned int plane)
172
{
173
	if (!fr || plane >= fr->fmt->memplanes)
174
		return 0;
175
	return fr->f_width * fr->f_height * fr->fmt->depth[plane] / 8;
176 177 178
}

static int queue_setup(struct vb2_queue *vq, unsigned int *num_buffers,
179
		       unsigned int *num_planes, unsigned int sizes[],
180 181 182
		       void *allocators[])
{
	struct fimc_ctx *ctx = vq->drv_priv;
183 184
	struct fimc_fmt *fmt = ctx->d_frame.fmt;
	int i;
185 186 187 188

	if (!fmt)
		return -EINVAL;

189
	*num_planes = fmt->memplanes;
190

191 192 193 194
	for (i = 0; i < fmt->memplanes; i++) {
		sizes[i] = get_plane_size(&ctx->d_frame, i);
		allocators[i] = ctx->fimc_dev->alloc_ctx;
	}
195

196
	return 0;
197 198 199 200 201 202 203 204
}

static int buffer_prepare(struct vb2_buffer *vb)
{
	struct vb2_queue *vq = vb->vb2_queue;
	struct fimc_ctx *ctx = vq->drv_priv;
	int i;

205 206
	if (!ctx->d_frame.fmt || vq->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
		return -EINVAL;
207

208 209
	for (i = 0; i < ctx->d_frame.fmt->memplanes; i++) {
		unsigned long size = get_plane_size(&ctx->d_frame, i);
210 211

		if (vb2_plane_size(vb, i) < size) {
212 213
			v4l2_err(ctx->fimc_dev->vid_cap.vfd,
				 "User buffer too small (%ld < %ld)\n",
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
				 vb2_plane_size(vb, i), size);
			return -EINVAL;
		}

		vb2_set_plane_payload(vb, i, size);
	}

	return 0;
}

static void buffer_queue(struct vb2_buffer *vb)
{
	struct fimc_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
	struct fimc_dev *fimc = ctx->fimc_dev;
	struct fimc_vid_buffer *buf
		= container_of(vb, struct fimc_vid_buffer, vb);
	struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
	unsigned long flags;
232
	int min_bufs;
233 234

	spin_lock_irqsave(&fimc->slock, flags);
235 236 237 238 239 240 241
	fimc_prepare_addr(ctx, &buf->vb, &ctx->d_frame, &buf->paddr);

	if (!test_bit(ST_CAPT_STREAM, &fimc->state)
	     && vid_cap->active_buf_cnt < FIMC_MAX_OUT_BUFS) {
		/* Setup the buffer directly for processing. */
		int buf_id = (vid_cap->reqbufs_count == 1) ? -1 :
				vid_cap->buf_index;
242

243 244 245
		fimc_hw_set_output_addr(fimc, &buf->paddr, buf_id);
		buf->index = vid_cap->buf_index;
		active_queue_add(vid_cap, buf);
246

247 248 249 250
		if (++vid_cap->buf_index >= FIMC_MAX_OUT_BUFS)
			vid_cap->buf_index = 0;
	} else {
		fimc_pending_queue_add(vid_cap, buf);
251
	}
252 253 254

	min_bufs = vid_cap->reqbufs_count > 1 ? 2 : 1;

255 256
	if (vb2_is_streaming(&vid_cap->vbq) &&
	    vid_cap->active_buf_cnt >= min_bufs &&
257 258 259
	    !test_and_set_bit(ST_CAPT_STREAM, &fimc->state))
		fimc_activate_capture(ctx);

260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
	spin_unlock_irqrestore(&fimc->slock, flags);
}

static void fimc_lock(struct vb2_queue *vq)
{
	struct fimc_ctx *ctx = vb2_get_drv_priv(vq);
	mutex_lock(&ctx->fimc_dev->lock);
}

static void fimc_unlock(struct vb2_queue *vq)
{
	struct fimc_ctx *ctx = vb2_get_drv_priv(vq);
	mutex_unlock(&ctx->fimc_dev->lock);
}

static struct vb2_ops fimc_capture_qops = {
	.queue_setup		= queue_setup,
	.buf_prepare		= buffer_prepare,
	.buf_queue		= buffer_queue,
	.wait_prepare		= fimc_unlock,
	.wait_finish		= fimc_lock,
	.start_streaming	= start_streaming,
	.stop_streaming		= stop_streaming,
};

285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
/**
 * fimc_capture_ctrls_create - initialize the control handler
 * Initialize the capture video node control handler and fill it
 * with the FIMC controls. Inherit any sensor's controls if the
 * 'user_subdev_api' flag is false (default behaviour).
 * This function need to be called with the graph mutex held.
 */
int fimc_capture_ctrls_create(struct fimc_dev *fimc)
{
	struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
	int ret;

	if (WARN_ON(vid_cap->ctx == NULL))
		return -ENXIO;
	if (vid_cap->ctx->ctrls_rdy)
		return 0;

	ret = fimc_ctrls_create(vid_cap->ctx);
	if (ret || vid_cap->user_subdev_api)
		return ret;

	return v4l2_ctrl_add_handler(&vid_cap->ctx->ctrl_handler,
				    fimc->pipeline.sensor->ctrl_handler);
}

310 311 312
static int fimc_capture_open(struct file *file)
{
	struct fimc_dev *fimc = video_drvdata(file);
313 314 315 316
	int ret = v4l2_fh_open(file);

	if (ret)
		return ret;
317 318 319 320 321 322 323

	dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state);

	/* Return if the corresponding video mem2mem node is already opened. */
	if (fimc_m2m_active(fimc))
		return -EBUSY;

324
	ret = pm_runtime_get_sync(&fimc->pdev->dev);
325 326
	if (ret < 0) {
		v4l2_fh_release(file);
327
		return ret;
328
	}
329

330 331
	if (++fimc->vid_cap.refcnt == 1)
		ret = fimc_capture_ctrls_create(fimc);
332

333
	return ret;
334 335 336 337 338 339 340 341 342 343
}

static int fimc_capture_close(struct file *file)
{
	struct fimc_dev *fimc = video_drvdata(file);

	dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state);

	if (--fimc->vid_cap.refcnt == 0) {
		fimc_stop_capture(fimc);
344
		fimc_ctrls_delete(fimc->vid_cap.ctx);
345
		vb2_queue_release(&fimc->vid_cap.vbq);
346 347
	}

348 349
	pm_runtime_put(&fimc->pdev->dev);

350
	return v4l2_fh_release(file);
351 352 353 354 355
}

static unsigned int fimc_capture_poll(struct file *file,
				      struct poll_table_struct *wait)
{
356
	struct fimc_dev *fimc = video_drvdata(file);
357

358
	return vb2_poll(&fimc->vid_cap.vbq, file, wait);
359 360 361 362
}

static int fimc_capture_mmap(struct file *file, struct vm_area_struct *vma)
{
363
	struct fimc_dev *fimc = video_drvdata(file);
364

365
	return vb2_mmap(&fimc->vid_cap.vbq, vma);
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
}

/* video device file operations */
static const struct v4l2_file_operations fimc_capture_fops = {
	.owner		= THIS_MODULE,
	.open		= fimc_capture_open,
	.release	= fimc_capture_close,
	.poll		= fimc_capture_poll,
	.unlocked_ioctl	= video_ioctl2,
	.mmap		= fimc_capture_mmap,
};

static int fimc_vidioc_querycap_capture(struct file *file, void *priv,
					struct v4l2_capability *cap)
{
381
	struct fimc_dev *fimc = video_drvdata(file);
382 383 384 385

	strncpy(cap->driver, fimc->pdev->name, sizeof(cap->driver) - 1);
	strncpy(cap->card, fimc->pdev->name, sizeof(cap->card) - 1);
	cap->bus_info[0] = 0;
386 387
	cap->capabilities = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE |
			    V4L2_CAP_VIDEO_CAPTURE_MPLANE;
388 389 390 391

	return 0;
}

392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
static int fimc_cap_enum_fmt_mplane(struct file *file, void *priv,
				    struct v4l2_fmtdesc *f)
{
	struct fimc_fmt *fmt;

	fmt = fimc_find_format(NULL, NULL, FMT_FLAGS_CAM | FMT_FLAGS_M2M,
			       f->index);
	if (!fmt)
		return -EINVAL;
	strncpy(f->description, fmt->name, sizeof(f->description) - 1);
	f->pixelformat = fmt->fourcc;
	if (fmt->fourcc == V4L2_MBUS_FMT_JPEG_1X8)
		f->flags |= V4L2_FMT_FLAG_COMPRESSED;
	return 0;
}

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
/* Synchronize formats of the camera interface input and attached  sensor. */
static int sync_capture_fmt(struct fimc_ctx *ctx)
{
	struct fimc_frame *frame = &ctx->s_frame;
	struct fimc_dev *fimc = ctx->fimc_dev;
	struct v4l2_mbus_framefmt *fmt = &fimc->vid_cap.fmt;
	int ret;

	fmt->width  = ctx->d_frame.o_width;
	fmt->height = ctx->d_frame.o_height;

	ret = v4l2_subdev_call(fimc->vid_cap.sd, video, s_mbus_fmt, fmt);
	if (ret == -ENOIOCTLCMD) {
		err("s_mbus_fmt failed");
		return ret;
	}
	dbg("w: %d, h: %d, code= %d", fmt->width, fmt->height, fmt->code);

426
	frame->fmt = fimc_find_format(NULL, &fmt->code, FMT_FLAGS_CAM, -1);
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
	if (!frame->fmt) {
		err("fimc source format not found\n");
		return -EINVAL;
	}

	frame->f_width	= fmt->width;
	frame->f_height = fmt->height;
	frame->width	= fmt->width;
	frame->height	= fmt->height;
	frame->o_width	= fmt->width;
	frame->o_height = fmt->height;
	frame->offs_h	= 0;
	frame->offs_v	= 0;

	return 0;
}

444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
static int fimc_cap_g_fmt_mplane(struct file *file, void *fh,
				 struct v4l2_format *f)
{
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_ctx *ctx = fimc->vid_cap.ctx;

	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
		return -EINVAL;

	return fimc_fill_format(&ctx->d_frame, f);
}

static int fimc_cap_try_fmt_mplane(struct file *file, void *fh,
				   struct v4l2_format *f)
{
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_ctx *ctx = fimc->vid_cap.ctx;

	return fimc_try_fmt_mplane(ctx, f);
}

465 466
static int fimc_cap_s_fmt_mplane(struct file *file, void *priv,
				 struct v4l2_format *f)
467
{
468 469
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_ctx *ctx = fimc->vid_cap.ctx;
470
	struct v4l2_pix_format_mplane *pix;
471
	struct fimc_frame *frame;
472
	int ret;
473
	int i;
474

475
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
476 477
		return -EINVAL;

478
	ret = fimc_try_fmt_mplane(ctx, f);
479 480 481
	if (ret)
		return ret;

482
	if (vb2_is_busy(&fimc->vid_cap.vbq) || fimc_capture_active(fimc))
483
		return -EBUSY;
484 485 486

	frame = &ctx->d_frame;

487
	pix = &f->fmt.pix_mp;
488 489 490
	frame->fmt = fimc_find_format(&pix->pixelformat, NULL,
				      FMT_FLAGS_M2M | FMT_FLAGS_CAM, 0);
	if (WARN(frame->fmt == NULL, "Pixel format lookup failed\n"))
491
		return -EINVAL;
492

493 494 495 496
	for (i = 0; i < frame->fmt->colplanes; i++) {
		frame->payload[i] =
			(pix->width * pix->height * frame->fmt->depth[i]) >> 3;
	}
497

498
	/* Output DMA frame pixel size and offsets. */
499 500
	frame->f_width = pix->plane_fmt[0].bytesperline * 8
			/ frame->fmt->depth[0];
501 502 503 504 505 506 507 508 509 510
	frame->f_height = pix->height;
	frame->width	= pix->width;
	frame->height	= pix->height;
	frame->o_width	= pix->width;
	frame->o_height = pix->height;
	frame->offs_h	= 0;
	frame->offs_v	= 0;

	ctx->state |= (FIMC_PARAMS | FIMC_DST_FMT);

511
	ret = sync_capture_fmt(ctx);
512 513 514 515
	return ret;
}

static int fimc_cap_enum_input(struct file *file, void *priv,
516
			       struct v4l2_input *i)
517
{
518
	struct fimc_dev *fimc = video_drvdata(file);
519

520
	if (i->index != 0)
521 522 523 524 525 526 527
		return -EINVAL;


	i->type = V4L2_INPUT_TYPE_CAMERA;
	return 0;
}

528
static int fimc_cap_s_input(struct file *file, void *priv, unsigned int i)
529
{
530
	return i == 0 ? i : -EINVAL;
531 532
}

533
static int fimc_cap_g_input(struct file *file, void *priv, unsigned int *i)
534
{
535
	*i = 0;
536 537 538 539
	return 0;
}

static int fimc_cap_streamon(struct file *file, void *priv,
540
			     enum v4l2_buf_type type)
541
{
542 543
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_ctx *ctx = fimc->vid_cap.ctx;
544 545

	if (fimc_capture_active(fimc) || !fimc->vid_cap.sd)
546
		return -EBUSY;
547 548

	if (!(ctx->state & FIMC_DST_FMT)) {
549
		v4l2_err(fimc->vid_cap.vfd, "Format is not set\n");
550
		return -EINVAL;
551 552
	}

553
	return vb2_streamon(&fimc->vid_cap.vbq, type);
554 555 556
}

static int fimc_cap_streamoff(struct file *file, void *priv,
557
			    enum v4l2_buf_type type)
558
{
559
	struct fimc_dev *fimc = video_drvdata(file);
560

561
	return vb2_streamoff(&fimc->vid_cap.vbq, type);
562 563 564
}

static int fimc_cap_reqbufs(struct file *file, void *priv,
565
			    struct v4l2_requestbuffers *reqbufs)
566
{
567 568
	struct fimc_dev *fimc = video_drvdata(file);
	int ret = vb2_reqbufs(&fimc->vid_cap.vbq, reqbufs);
569 570

	if (!ret)
571
		fimc->vid_cap.reqbufs_count = reqbufs->count;
572 573 574 575 576 577
	return ret;
}

static int fimc_cap_querybuf(struct file *file, void *priv,
			   struct v4l2_buffer *buf)
{
578
	struct fimc_dev *fimc = video_drvdata(file);
579

580
	return vb2_querybuf(&fimc->vid_cap.vbq, buf);
581 582 583 584 585
}

static int fimc_cap_qbuf(struct file *file, void *priv,
			  struct v4l2_buffer *buf)
{
586 587 588
	struct fimc_dev *fimc = video_drvdata(file);

	return vb2_qbuf(&fimc->vid_cap.vbq, buf);
589 590 591 592 593
}

static int fimc_cap_dqbuf(struct file *file, void *priv,
			   struct v4l2_buffer *buf)
{
594 595 596
	struct fimc_dev *fimc = video_drvdata(file);

	return vb2_dqbuf(&fimc->vid_cap.vbq, buf, file->f_flags & O_NONBLOCK);
597 598
}

599 600 601
static int fimc_cap_cropcap(struct file *file, void *fh,
			    struct v4l2_cropcap *cr)
{
602 603
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame;
604

605
	if (cr->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
606 607 608 609 610 611 612 613 614 615 616 617 618
		return -EINVAL;

	cr->bounds.left		= 0;
	cr->bounds.top		= 0;
	cr->bounds.width	= f->o_width;
	cr->bounds.height	= f->o_height;
	cr->defrect		= cr->bounds;

	return 0;
}

static int fimc_cap_g_crop(struct file *file, void *fh, struct v4l2_crop *cr)
{
619 620
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame;
621

622 623 624 625 626 627 628 629
	cr->c.left	= f->offs_h;
	cr->c.top	= f->offs_v;
	cr->c.width	= f->width;
	cr->c.height	= f->height;

	return 0;
}

630
static int fimc_cap_s_crop(struct file *file, void *fh, struct v4l2_crop *cr)
631
{
632 633
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_ctx *ctx = fimc->vid_cap.ctx;
634 635 636 637 638 639 640 641 642 643 644
	struct fimc_frame *f;
	int ret = -EINVAL;

	if (fimc_capture_active(fimc))
		return -EBUSY;

	ret = fimc_try_crop(ctx, cr);
	if (ret)
		return ret;

	if (!(ctx->state & FIMC_DST_FMT)) {
645 646
		v4l2_err(fimc->vid_cap.vfd, "Capture format is not set\n");
		return -EINVAL;
647 648 649 650
	}

	f = &ctx->s_frame;
	/* Check for the pixel scaling ratio when cropping input image. */
651 652 653
	ret = fimc_check_scaler_ratio(cr->c.width, cr->c.height,
				      ctx->d_frame.width, ctx->d_frame.height,
				      ctx->rotation);
654
	if (ret) {
655
		v4l2_err(fimc->vid_cap.vfd, "Out of the scaler range\n");
656
		return ret;
657 658
	}

659 660 661 662 663 664
	f->offs_h = cr->c.left;
	f->offs_v = cr->c.top;
	f->width  = cr->c.width;
	f->height = cr->c.height;

	return 0;
665 666 667 668 669 670
}


static const struct v4l2_ioctl_ops fimc_capture_ioctl_ops = {
	.vidioc_querycap		= fimc_vidioc_querycap_capture,

671
	.vidioc_enum_fmt_vid_cap_mplane	= fimc_cap_enum_fmt_mplane,
672
	.vidioc_try_fmt_vid_cap_mplane	= fimc_cap_try_fmt_mplane,
673
	.vidioc_s_fmt_vid_cap_mplane	= fimc_cap_s_fmt_mplane,
674
	.vidioc_g_fmt_vid_cap_mplane	= fimc_cap_g_fmt_mplane,
675 676 677 678 679 680 681 682 683 684

	.vidioc_reqbufs			= fimc_cap_reqbufs,
	.vidioc_querybuf		= fimc_cap_querybuf,

	.vidioc_qbuf			= fimc_cap_qbuf,
	.vidioc_dqbuf			= fimc_cap_dqbuf,

	.vidioc_streamon		= fimc_cap_streamon,
	.vidioc_streamoff		= fimc_cap_streamoff,

685
	.vidioc_g_crop			= fimc_cap_g_crop,
686
	.vidioc_s_crop			= fimc_cap_s_crop,
687
	.vidioc_cropcap			= fimc_cap_cropcap,
688 689 690 691 692 693

	.vidioc_enum_input		= fimc_cap_enum_input,
	.vidioc_s_input			= fimc_cap_s_input,
	.vidioc_g_input			= fimc_cap_g_input,
};

694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
/* Media operations */
static int fimc_link_setup(struct media_entity *entity,
			   const struct media_pad *local,
			   const struct media_pad *remote, u32 flags)
{
	struct video_device *vd = media_entity_to_video_device(entity);
	struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(remote->entity);
	struct fimc_dev *fimc = video_get_drvdata(vd);

	if (WARN_ON(fimc == NULL))
		return 0;

	dbg("%s --> %s, flags: 0x%x. input: 0x%x",
	    local->entity->name, remote->entity->name, flags,
	    fimc->vid_cap.input);

	if (flags & MEDIA_LNK_FL_ENABLED) {
		if (fimc->vid_cap.input != 0)
			return -EBUSY;
		fimc->vid_cap.input = sd->grp_id;
		return 0;
	}

	fimc->vid_cap.input = 0;
	return 0;
}

static const struct media_entity_operations fimc_media_ops = {
	.link_setup = fimc_link_setup,
};

725
/* fimc->lock must be already initialized */
726 727
int fimc_register_capture_device(struct fimc_dev *fimc,
				 struct v4l2_device *v4l2_dev)
728 729 730 731
{
	struct video_device *vfd;
	struct fimc_vid_cap *vid_cap;
	struct fimc_ctx *ctx;
732
	struct fimc_frame *fr;
733
	struct vb2_queue *q;
734
	int ret = -ENOMEM;
735 736 737 738 739 740 741 742 743 744

	ctx = kzalloc(sizeof *ctx, GFP_KERNEL);
	if (!ctx)
		return -ENOMEM;

	ctx->fimc_dev	 = fimc;
	ctx->in_path	 = FIMC_CAMERA;
	ctx->out_path	 = FIMC_DMA;
	ctx->state	 = FIMC_CTX_CAP;

745 746
	/* Default format of the output frames */
	fr = &ctx->d_frame;
747
	fr->fmt = fimc_find_format(NULL, NULL, FMT_FLAGS_CAM, 0);
748 749
	fr->width = fr->f_width = fr->o_width = 640;
	fr->height = fr->f_height = fr->o_height = 480;
750 751 752 753

	vfd = video_device_alloc();
	if (!vfd) {
		v4l2_err(v4l2_dev, "Failed to allocate video device\n");
754
		goto err_vd_alloc;
755 756
	}

757 758
	snprintf(vfd->name, sizeof(vfd->name), "%s.capture",
		 dev_name(&fimc->pdev->dev));
759 760 761

	vfd->fops	= &fimc_capture_fops;
	vfd->ioctl_ops	= &fimc_capture_ioctl_ops;
762
	vfd->v4l2_dev	= v4l2_dev;
763 764
	vfd->minor	= -1;
	vfd->release	= video_device_release;
765
	vfd->lock	= &fimc->lock;
766 767 768 769 770 771 772
	video_set_drvdata(vfd, fimc);

	vid_cap = &fimc->vid_cap;
	vid_cap->vfd = vfd;
	vid_cap->active_buf_cnt = 0;
	vid_cap->reqbufs_count  = 0;
	vid_cap->refcnt = 0;
773
	/* Default color format for image sensor */
774 775 776 777 778 779 780
	vid_cap->fmt.code = V4L2_MBUS_FMT_YUYV8_2X8;

	INIT_LIST_HEAD(&vid_cap->pending_buf_q);
	INIT_LIST_HEAD(&vid_cap->active_buf_q);
	spin_lock_init(&ctx->slock);
	vid_cap->ctx = ctx;

781 782
	q = &fimc->vid_cap.vbq;
	memset(q, 0, sizeof(*q));
783
	q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
784 785 786 787 788 789 790
	q->io_modes = VB2_MMAP | VB2_USERPTR;
	q->drv_priv = fimc->vid_cap.ctx;
	q->ops = &fimc_capture_qops;
	q->mem_ops = &vb2_dma_contig_memops;
	q->buf_struct_size = sizeof(struct fimc_vid_buffer);

	vb2_queue_init(q);
791

792 793 794 795 796
	fimc->vid_cap.vd_pad.flags = MEDIA_PAD_FL_SINK;
	ret = media_entity_init(&vfd->entity, 1, &fimc->vid_cap.vd_pad, 0);
	if (ret)
		goto err_ent;

797
	vfd->entity.ops = &fimc_media_ops;
798
	vfd->ctrl_handler = &ctx->ctrl_handler;
799 800
	return 0;

801
err_ent:
802
	video_device_release(vfd);
803
err_vd_alloc:
804
	kfree(ctx);
805 806 807 808 809
	return ret;
}

void fimc_unregister_capture_device(struct fimc_dev *fimc)
{
810
	struct video_device *vfd = fimc->vid_cap.vfd;
811

812 813
	if (vfd) {
		media_entity_cleanup(&vfd->entity);
814 815
		/* Can also be called if video device was
		   not registered */
816 817 818
		video_unregister_device(vfd);
	}
	kfree(fimc->vid_cap.ctx);
819
	fimc->vid_cap.ctx = NULL;
820
}