fimc-core.h 20.9 KB
Newer Older
1
/*
2
 * Copyright (C) 2010 - 2012 Samsung Electronics Co., Ltd.
3 4 5 6 7 8 9 10 11
 *
 * 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.
 */

#ifndef FIMC_CORE_H_
#define FIMC_CORE_H_

12 13
/*#define DEBUG*/

14
#include <linux/platform_device.h>
15
#include <linux/regmap.h>
16
#include <linux/sched.h>
17
#include <linux/spinlock.h>
18
#include <linux/mfd/syscon.h>
19
#include <linux/types.h>
20
#include <linux/videodev2.h>
21
#include <linux/io.h>
22
#include <linux/sizes.h>
23 24

#include <media/media-entity.h>
25
#include <media/videobuf2-core.h>
26
#include <media/v4l2-ctrls.h>
27 28
#include <media/v4l2-device.h>
#include <media/v4l2-mem2mem.h>
29
#include <media/v4l2-mediabus.h>
30
#include <media/s5p_fimc.h>
31

32
#define dbg(fmt, args...) \
33
	pr_debug("%s:%d: " fmt "\n", __func__, __LINE__, ##args)
34

35 36
/* Time to wait for next frame VSYNC interrupt while stopping operation. */
#define FIMC_SHUTDOWN_TIMEOUT	((100*HZ)/1000)
37
#define MAX_FIMC_CLOCKS		2
38
#define FIMC_DRIVER_NAME	"exynos4-fimc"
39
#define FIMC_MAX_DEVS		4
40 41 42
#define FIMC_MAX_OUT_BUFS	4
#define SCALER_MAX_HRATIO	64
#define SCALER_MAX_VRATIO	64
43
#define DMA_MIN_SIZE		8
44
#define FIMC_CAMIF_MAX_HEIGHT	0x2000
45 46
#define FIMC_MAX_JPEG_BUF_SIZE	(10 * SZ_1M)
#define FIMC_MAX_PLANES		3
47 48 49 50
#define FIMC_PIX_LIMITS_MAX	4
#define FIMC_DEF_MIN_SIZE	16
#define FIMC_DEF_HEIGHT_ALIGN	2
#define FIMC_DEF_HOR_OFFS_ALIGN	1
51

52 53 54 55 56 57
/* indices to the clocks array */
enum {
	CLK_BUS,
	CLK_GATE,
};

58
enum fimc_dev_flags {
59 60 61
	ST_LPM,
	/* m2m node */
	ST_M2M_RUN,
62
	ST_M2M_PEND,
63 64 65
	ST_M2M_SUSPENDING,
	ST_M2M_SUSPENDED,
	/* capture node */
66 67 68
	ST_CAPT_PEND,
	ST_CAPT_RUN,
	ST_CAPT_STREAM,
69
	ST_CAPT_ISP_STREAM,
70
	ST_CAPT_SUSPENDED,
71
	ST_CAPT_SHUT,
72
	ST_CAPT_BUSY,
73
	ST_CAPT_APPLY_CFG,
74
	ST_CAPT_JPEG,
75 76
};

77
#define fimc_m2m_active(dev) test_bit(ST_M2M_RUN, &(dev)->state)
78 79
#define fimc_m2m_pending(dev) test_bit(ST_M2M_PEND, &(dev)->state)

80 81
#define fimc_capture_running(dev) test_bit(ST_CAPT_RUN, &(dev)->state)
#define fimc_capture_pending(dev) test_bit(ST_CAPT_PEND, &(dev)->state)
82
#define fimc_capture_busy(dev) test_bit(ST_CAPT_BUSY, &(dev)->state)
83

84
enum fimc_datapath {
85 86 87 88 89 90
	FIMC_IO_NONE,
	FIMC_IO_CAMERA,
	FIMC_IO_DMA,
	FIMC_IO_LCDFIFO,
	FIMC_IO_WRITEBACK,
	FIMC_IO_ISP,
91 92 93
};

enum fimc_color_fmt {
94
	FIMC_FMT_RGB444	= 0x10,
95 96 97 98 99 100 101 102 103 104 105
	FIMC_FMT_RGB555,
	FIMC_FMT_RGB565,
	FIMC_FMT_RGB666,
	FIMC_FMT_RGB888,
	FIMC_FMT_RGB30_LOCAL,
	FIMC_FMT_YCBCR420 = 0x20,
	FIMC_FMT_YCBYCR422,
	FIMC_FMT_YCRYCB422,
	FIMC_FMT_CBYCRY422,
	FIMC_FMT_CRYCBY422,
	FIMC_FMT_YCBCR444_LOCAL,
106
	FIMC_FMT_RAW8 = 0x40,
107 108
	FIMC_FMT_RAW10,
	FIMC_FMT_RAW12,
109 110
	FIMC_FMT_JPEG = 0x80,
	FIMC_FMT_YUYV_JPEG = 0x100,
111 112
};

113
#define fimc_fmt_is_user_defined(x) (!!((x) & 0x180))
114
#define fimc_fmt_is_rgb(x) (!!((x) & 0x10))
115

116 117 118
#define IS_M2M(__strt) ((__strt) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE || \
			__strt == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)

119
/* The hardware context state. */
120
#define	FIMC_PARAMS		(1 << 0)
121
#define	FIMC_COMPOSE		(1 << 1)
122 123 124
#define	FIMC_CTX_M2M		(1 << 16)
#define	FIMC_CTX_CAP		(1 << 17)
#define	FIMC_CTX_SHUT		(1 << 18)
125 126 127 128 129 130 131 132

/* Image conversion flags */
#define	FIMC_IN_DMA_ACCESS_TILED	(1 << 0)
#define	FIMC_IN_DMA_ACCESS_LINEAR	(0 << 0)
#define	FIMC_OUT_DMA_ACCESS_TILED	(1 << 1)
#define	FIMC_OUT_DMA_ACCESS_LINEAR	(0 << 1)
#define	FIMC_SCAN_MODE_PROGRESSIVE	(0 << 2)
#define	FIMC_SCAN_MODE_INTERLACED	(1 << 2)
133 134 135
/*
 * YCbCr data dynamic range for RGB-YUV color conversion.
 * Y/Cb/Cr: (0 ~ 255) */
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
#define	FIMC_COLOR_RANGE_WIDE		(0 << 3)
/* Y (16 ~ 235), Cb/Cr (16 ~ 240) */
#define	FIMC_COLOR_RANGE_NARROW		(1 << 3)

/**
 * struct fimc_dma_offset - pixel offset information for DMA
 * @y_h:	y value horizontal offset
 * @y_v:	y value vertical offset
 * @cb_h:	cb value horizontal offset
 * @cb_v:	cb value vertical offset
 * @cr_h:	cr value horizontal offset
 * @cr_v:	cr value vertical offset
 */
struct fimc_dma_offset {
	int	y_h;
	int	y_v;
	int	cb_h;
	int	cb_v;
	int	cr_h;
	int	cr_v;
};

/**
159
 * struct fimc_effect - color effect information
160 161 162 163 164 165 166 167 168 169 170 171
 * @type:	effect type
 * @pat_cb:	cr value when type is "arbitrary"
 * @pat_cr:	cr value when type is "arbitrary"
 */
struct fimc_effect {
	u32	type;
	u8	pat_cb;
	u8	pat_cr;
};

/**
 * struct fimc_scaler - the configuration data for FIMC inetrnal scaler
172 173 174 175 176
 * @scaleup_h:		flag indicating scaling up horizontally
 * @scaleup_v:		flag indicating scaling up vertically
 * @copy_mode:		flag indicating transparent DMA transfer (no scaling
 *			and color format conversion)
 * @enabled:		flag indicating if the scaler is used
177 178 179 180 181 182 183 184
 * @hfactor:		horizontal shift factor
 * @vfactor:		vertical shift factor
 * @pre_hratio:		horizontal ratio of the prescaler
 * @pre_vratio:		vertical ratio of the prescaler
 * @pre_dst_width:	the prescaler's destination width
 * @pre_dst_height:	the prescaler's destination height
 * @main_hratio:	the main scaler's horizontal ratio
 * @main_vratio:	the main scaler's vertical ratio
185 186
 * @real_width:		source pixel (width - offset)
 * @real_height:	source pixel (height - offset)
187 188
 */
struct fimc_scaler {
189 190 191 192
	unsigned int scaleup_h:1;
	unsigned int scaleup_v:1;
	unsigned int copy_mode:1;
	unsigned int enabled:1;
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
	u32	hfactor;
	u32	vfactor;
	u32	pre_hratio;
	u32	pre_vratio;
	u32	pre_dst_width;
	u32	pre_dst_height;
	u32	main_hratio;
	u32	main_vratio;
	u32	real_width;
	u32	real_height;
};

/**
 * struct fimc_addr - the FIMC physical address set for DMA
 * @y:	 luminance plane physical address
 * @cb:	 Cb plane physical address
 * @cr:	 Cr plane physical address
 */
struct fimc_addr {
	u32	y;
	u32	cb;
	u32	cr;
};

/**
 * struct fimc_vid_buffer - the driver's video buffer
219
 * @vb:    v4l videobuf buffer
220
 * @list:  linked list structure for buffer queue
221 222
 * @paddr: precalculated physical address set
 * @index: buffer index for the output DMA engine
223 224
 */
struct fimc_vid_buffer {
225 226
	struct vb2_buffer	vb;
	struct list_head	list;
227 228
	struct fimc_addr	paddr;
	int			index;
229 230 231
};

/**
232
 * struct fimc_frame - source/target frame properties
233 234 235 236 237 238 239 240
 * @f_width:	image full width (virtual screen size)
 * @f_height:	image full height (virtual screen size)
 * @o_width:	original image width as set by S_FMT
 * @o_height:	original image height as set by S_FMT
 * @offs_h:	image horizontal pixel offset
 * @offs_v:	image vertical pixel offset
 * @width:	image pixel width
 * @height:	image pixel weight
241
 * @payload:	image size in bytes (w x h x bpp)
242
 * @bytesperline: bytesperline value for each plane
243
 * @paddr:	image frame buffer physical addresses
244
 * @dma_offset:	DMA offset in bytes
245
 * @fmt:	fimc color format pointer
246 247 248 249 250 251 252 253 254 255
 */
struct fimc_frame {
	u32	f_width;
	u32	f_height;
	u32	o_width;
	u32	o_height;
	u32	offs_h;
	u32	offs_v;
	u32	width;
	u32	height;
256
	unsigned int		payload[VIDEO_MAX_PLANES];
257
	unsigned int		bytesperline[VIDEO_MAX_PLANES];
258 259 260
	struct fimc_addr	paddr;
	struct fimc_dma_offset	dma_offset;
	struct fimc_fmt		*fmt;
261
	u8			alpha;
262 263 264 265 266 267 268 269 270 271
};

/**
 * struct fimc_m2m_device - v4l2 memory-to-memory device data
 * @vfd: the video device node for v4l2 m2m mode
 * @m2m_dev: v4l2 memory-to-memory device data
 * @ctx: hardware context data
 * @refcnt: the reference counter
 */
struct fimc_m2m_device {
272
	struct video_device	vfd;
273 274 275 276 277
	struct v4l2_m2m_dev	*m2m_dev;
	struct fimc_ctx		*ctx;
	int			refcnt;
};

278 279 280 281
#define FIMC_SD_PAD_SINK_CAM	0
#define FIMC_SD_PAD_SINK_FIFO	1
#define FIMC_SD_PAD_SOURCE	2
#define FIMC_SD_PADS_NUM	3
282

283 284 285
/**
 * struct fimc_vid_cap - camera capture device information
 * @ctx: hardware context data
286
 * @subdev: subdev exposing the FIMC processing block
287
 * @ve: exynos video device entity structure
288
 * @vd_pad: fimc video capture node pad
289
 * @sd_pads: fimc video processing block pads
290 291 292
 * @ci_fmt: image format at the FIMC camera input (and the scaler output)
 * @wb_fmt: image format at the FIMC ISP Writeback input
 * @source_config: external image source related configuration structure
293 294 295 296 297 298 299 300
 * @pending_buf_q: the pending buffer queue head
 * @active_buf_q: the queue head of buffers scheduled in hardware
 * @vbq: the capture am video buffer queue
 * @active_buf_cnt: number of video buffers scheduled in hardware
 * @buf_index: index for managing the output DMA buffers
 * @frame_count: the frame counter for statistics
 * @reqbufs_count: the number of buffers requested in REQBUFS ioctl
 * @input_index: input (camera sensor) index
301
 * @input: capture input type, grp_id of the attached subdev
302
 * @user_subdev_api: true if subdevs are not configured by the host driver
303 304
 * @inh_sensor_ctrls: a flag indicating v4l2 controls are inherited from
 * 		      an image sensor subdev
305 306 307
 */
struct fimc_vid_cap {
	struct fimc_ctx			*ctx;
308
	struct vb2_alloc_ctx		*alloc_ctx;
309
	struct v4l2_subdev		subdev;
310
	struct exynos_video_entity	ve;
311
	struct media_pad		vd_pad;
312
	struct media_pad		sd_pads[FIMC_SD_PADS_NUM];
313 314 315
	struct v4l2_mbus_framefmt	ci_fmt;
	struct v4l2_mbus_framefmt	wb_fmt;
	struct fimc_source_info		source_config;
316 317
	struct list_head		pending_buf_q;
	struct list_head		active_buf_q;
318
	struct vb2_queue		vbq;
319 320 321 322
	int				active_buf_cnt;
	int				buf_index;
	unsigned int			frame_count;
	unsigned int			reqbufs_count;
323
	bool				streaming;
324
	int				input_index;
325
	u32				input;
326
	bool				user_subdev_api;
327
	bool				inh_sensor_ctrls;
328 329
};

330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
/**
 *  struct fimc_pix_limit - image pixel size limits in various IP configurations
 *
 *  @scaler_en_w: max input pixel width when the scaler is enabled
 *  @scaler_dis_w: max input pixel width when the scaler is disabled
 *  @in_rot_en_h: max input width with the input rotator is on
 *  @in_rot_dis_w: max input width with the input rotator is off
 *  @out_rot_en_w: max output width with the output rotator on
 *  @out_rot_dis_w: max output width with the output rotator off
 */
struct fimc_pix_limit {
	u16 scaler_en_w;
	u16 scaler_dis_w;
	u16 in_rot_en_h;
	u16 in_rot_dis_w;
	u16 out_rot_en_w;
	u16 out_rot_dis_w;
};

349
/**
350
 * struct fimc_variant - FIMC device variant information
351 352
 * @has_inp_rot: set if has input rotator
 * @has_out_rot: set if has output rotator
353 354
 * @has_mainscaler_ext: 1 if extended mainscaler ratios in CIEXTEN register
 *			 are present in this IP revision
355
 * @has_cam_if: set if this instance has a camera input interface
356
 * @has_isp_wb: set if this instance has ISP writeback input
357
 * @pix_limit: pixel size constraints for the scaler
358 359
 * @min_inp_pixsize: minimum input pixel size
 * @min_out_pixsize: minimum output pixel size
360
 * @hor_offs_align: horizontal pixel offset aligment
361
 * @min_vsize_align: minimum vertical pixel size alignment
362
 */
363
struct fimc_variant {
364 365
	unsigned int	has_inp_rot:1;
	unsigned int	has_out_rot:1;
366
	unsigned int	has_mainscaler_ext:1;
367
	unsigned int	has_cam_if:1;
368 369
	unsigned int	has_isp_wb:1;
	const struct fimc_pix_limit *pix_limit;
370 371
	u16		min_inp_pixsize;
	u16		min_out_pixsize;
372
	u16		hor_offs_align;
373
	u16		min_vsize_align;
374 375 376
};

/**
377 378 379 380
 * struct fimc_drvdata - per device type driver data
 * @variant: variant information for this device
 * @num_entities: number of fimc instances available in a SoC
 * @lclk_frequency: local bus clock frequency
381 382 383 384
 * @cistatus2: 1 if the FIMC IPs have CISTATUS2 register
 * @dma_pix_hoff: the horizontal DMA offset unit: 1 - pixels, 0 - bytes
 * @alpha_color: 1 if alpha color component is supported
 * @out_buf_count: maximum number of output DMA buffers supported
385
 */
386
struct fimc_drvdata {
387
	const struct fimc_variant *variant[FIMC_MAX_DEVS];
388 389
	int num_entities;
	unsigned long lclk_frequency;
390 391 392 393 394
	/* Fields common to all FIMC IP instances */
	u8 cistatus2;
	u8 dma_pix_hoff;
	u8 alpha_color;
	u8 out_buf_count;
395 396
};

397 398
#define fimc_get_drvdata(_pdev) \
	((struct fimc_drvdata *) platform_get_device_id(_pdev)->driver_data)
399

400 401 402
struct fimc_ctx;

/**
403
 * struct fimc_dev - abstraction for FIMC entity
404 405 406
 * @slock:	the spinlock protecting this data structure
 * @lock:	the mutex protecting this data structure
 * @pdev:	pointer to the FIMC platform device
407
 * @pdata:	pointer to the device platform data
408
 * @sysreg:	pointer to the SYSREG regmap
409
 * @variant:	the IP variant information
410
 * @id:		FIMC device index (0..FIMC_MAX_DEVS)
411
 * @clock:	clocks required for FIMC operation
412
 * @regs:	the mapped hardware registers
413
 * @irq_queue:	interrupt handler waitqueue
414
 * @v4l2_dev:	root v4l2_device
415
 * @m2m:	memory-to-memory V4L2 device information
416 417
 * @vid_cap:	camera capture device information
 * @state:	flags used to synchronize m2m and capture mode operation
418
 * @alloc_ctx:	videobuf2 memory allocator context
419
 * @pipeline:	fimc video capture pipeline data structure
420 421 422 423 424
 */
struct fimc_dev {
	spinlock_t			slock;
	struct mutex			lock;
	struct platform_device		*pdev;
425
	struct s5p_platform_fimc	*pdata;
426
	struct regmap			*sysreg;
427
	const struct fimc_variant	*variant;
428
	const struct fimc_drvdata	*drv_data;
429
	int				id;
430
	struct clk			*clock[MAX_FIMC_CLOCKS];
431
	void __iomem			*regs;
432
	wait_queue_head_t		irq_queue;
433
	struct v4l2_device		*v4l2_dev;
434
	struct fimc_m2m_device		m2m;
435
	struct fimc_vid_cap		vid_cap;
436
	unsigned long			state;
437
	struct vb2_alloc_ctx		*alloc_ctx;
438
	struct fimc_pipeline		pipeline;
439
	const struct fimc_pipeline_ops	*pipeline_ops;
440 441
};

442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
/**
 * struct fimc_ctrls - v4l2 controls structure
 * @handler: the control handler
 * @colorfx: image effect control
 * @colorfx_cbcr: Cb/Cr coefficients control
 * @rotate: image rotation control
 * @hflip: horizontal flip control
 * @vflip: vertical flip control
 * @alpha: RGB alpha control
 * @ready: true if @handler is initialized
 */
struct fimc_ctrls {
	struct v4l2_ctrl_handler handler;
	struct {
		struct v4l2_ctrl *colorfx;
		struct v4l2_ctrl *colorfx_cbcr;
	};
	struct v4l2_ctrl *rotate;
	struct v4l2_ctrl *hflip;
	struct v4l2_ctrl *vflip;
	struct v4l2_ctrl *alpha;
	bool ready;
};

466 467 468 469 470 471 472 473 474 475 476 477 478
/**
 * fimc_ctx - the device context data
 * @s_frame:		source frame properties
 * @d_frame:		destination frame properties
 * @out_order_1p:	output 1-plane YCBCR order
 * @out_order_2p:	output 2-plane YCBCR order
 * @in_order_1p		input 1-plane YCBCR order
 * @in_order_2p:	input 2-plane YCBCR order
 * @in_path:		input mode (DMA or camera)
 * @out_path:		output mode (DMA or FIFO)
 * @scaler:		image scaler properties
 * @effect:		image effect
 * @rotation:		image clockwise rotation in degrees
479 480
 * @hflip:		indicates image horizontal flip if set
 * @vflip:		indicates image vertical flip if set
481
 * @flags:		additional flags for image conversion
482 483 484
 * @state:		flags to keep track of user configuration
 * @fimc_dev:		the FIMC device this context applies to
 * @m2m_ctx:		memory-to-memory device context
485
 * @fh:			v4l2 file handle
486
 * @ctrls:		v4l2 controls structure
487 488 489 490 491 492 493 494 495 496 497 498 499
 */
struct fimc_ctx {
	struct fimc_frame	s_frame;
	struct fimc_frame	d_frame;
	u32			out_order_1p;
	u32			out_order_2p;
	u32			in_order_1p;
	u32			in_order_2p;
	enum fimc_datapath	in_path;
	enum fimc_datapath	out_path;
	struct fimc_scaler	scaler;
	struct fimc_effect	effect;
	int			rotation;
500 501
	unsigned int		hflip:1;
	unsigned int		vflip:1;
502 503 504 505
	u32			flags;
	u32			state;
	struct fimc_dev		*fimc_dev;
	struct v4l2_m2m_ctx	*m2m_ctx;
506
	struct v4l2_fh		fh;
507
	struct fimc_ctrls	ctrls;
508 509
};

510 511
#define fh_to_ctx(__fh) container_of(__fh, struct fimc_ctx, fh)

512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538
static inline void set_frame_bounds(struct fimc_frame *f, u32 width, u32 height)
{
	f->o_width  = width;
	f->o_height = height;
	f->f_width  = width;
	f->f_height = height;
}

static inline void set_frame_crop(struct fimc_frame *f,
				  u32 left, u32 top, u32 width, u32 height)
{
	f->offs_h = left;
	f->offs_v = top;
	f->width  = width;
	f->height = height;
}

static inline u32 fimc_get_format_depth(struct fimc_fmt *ff)
{
	u32 i, depth = 0;

	if (ff != NULL)
		for (i = 0; i < ff->colplanes; i++)
			depth += ff->depth[i];
	return depth;
}

539 540 541 542 543 544 545 546 547 548 549 550
static inline bool fimc_capture_active(struct fimc_dev *fimc)
{
	unsigned long flags;
	bool ret;

	spin_lock_irqsave(&fimc->slock, flags);
	ret = !!(fimc->state & (1 << ST_CAPT_RUN) ||
		 fimc->state & (1 << ST_CAPT_PEND));
	spin_unlock_irqrestore(&fimc->slock, flags);
	return ret;
}

551
static inline void fimc_ctx_state_set(u32 state, struct fimc_ctx *ctx)
552 553 554
{
	unsigned long flags;

555
	spin_lock_irqsave(&ctx->fimc_dev->slock, flags);
556
	ctx->state |= state;
557
	spin_unlock_irqrestore(&ctx->fimc_dev->slock, flags);
558 559 560 561 562 563 564
}

static inline bool fimc_ctx_state_is_set(u32 mask, struct fimc_ctx *ctx)
{
	unsigned long flags;
	bool ret;

565
	spin_lock_irqsave(&ctx->fimc_dev->slock, flags);
566
	ret = (ctx->state & mask) == mask;
567
	spin_unlock_irqrestore(&ctx->fimc_dev->slock, flags);
568 569 570
	return ret;
}

571 572
static inline int tiled_fmt(struct fimc_fmt *fmt)
{
573
	return fmt->fourcc == V4L2_PIX_FMT_NV12MT;
574 575
}

576 577 578 579 580 581 582 583 584 585 586 587
static inline bool fimc_jpeg_fourcc(u32 pixelformat)
{
	return (pixelformat == V4L2_PIX_FMT_JPEG ||
		pixelformat == V4L2_PIX_FMT_S5C_UYVY_JPG);
}

static inline bool fimc_user_defined_mbus_fmt(u32 code)
{
	return (code == V4L2_MBUS_FMT_JPEG_1X8 ||
		code == V4L2_MBUS_FMT_S5C_UYVY_JPEG_1X8);
}

588 589 590 591
/* Return the alpha component bit mask */
static inline int fimc_get_alpha_mask(struct fimc_fmt *fmt)
{
	switch (fmt->color) {
592 593 594
	case FIMC_FMT_RGB444:	return 0x0f;
	case FIMC_FMT_RGB555:	return 0x01;
	case FIMC_FMT_RGB888:	return 0xff;
595 596 597 598
	default:		return 0;
	};
}

599 600
static inline struct fimc_frame *ctx_get_frame(struct fimc_ctx *ctx,
					       enum v4l2_buf_type type)
601 602 603
{
	struct fimc_frame *frame;

604
	if (V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE == type) {
605
		if (fimc_ctx_state_is_set(FIMC_CTX_M2M, ctx))
606 607 608
			frame = &ctx->s_frame;
		else
			return ERR_PTR(-EINVAL);
609
	} else if (V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == type) {
610 611
		frame = &ctx->d_frame;
	} else {
612
		v4l2_err(ctx->fimc_dev->v4l2_dev,
613 614 615 616 617 618 619
			"Wrong buffer/video queue type (%d)\n", type);
		return ERR_PTR(-EINVAL);
	}

	return frame;
}

620 621
/* -----------------------------------------------------*/
/* fimc-core.c */
622 623
int fimc_vidioc_enum_fmt_mplane(struct file *file, void *priv,
				struct v4l2_fmtdesc *f);
624 625
void __fimc_vidioc_querycap(struct device *dev, struct v4l2_capability *cap,
						unsigned int caps);
626 627 628
int fimc_ctrls_create(struct fimc_ctx *ctx);
void fimc_ctrls_delete(struct fimc_ctx *ctx);
void fimc_ctrls_activate(struct fimc_ctx *ctx, bool active);
629
void fimc_alpha_ctrl_update(struct fimc_ctx *ctx);
630
void __fimc_get_format(struct fimc_frame *frame, struct v4l2_format *f);
631 632
void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height,
			       struct v4l2_pix_format_mplane *pix);
633
struct fimc_fmt *fimc_find_format(const u32 *pixelformat, const u32 *mbus_code,
634
				  unsigned int mask, int index);
635
struct fimc_fmt *fimc_get_format(unsigned int index);
636

637 638
int fimc_check_scaler_ratio(struct fimc_ctx *ctx, int sw, int sh,
			    int dw, int dh, int rotation);
639 640
int fimc_set_scaler_info(struct fimc_ctx *ctx);
int fimc_prepare_config(struct fimc_ctx *ctx, u32 flags);
641
int fimc_prepare_addr(struct fimc_ctx *ctx, struct vb2_buffer *vb,
642
		      struct fimc_frame *frame, struct fimc_addr *paddr);
643 644
void fimc_prepare_dma_offset(struct fimc_ctx *ctx, struct fimc_frame *f);
void fimc_set_yuv_order(struct fimc_ctx *ctx);
645
void fimc_capture_irq_handler(struct fimc_dev *fimc, int deq_buf);
646

647 648 649
int fimc_register_m2m_device(struct fimc_dev *fimc,
			     struct v4l2_device *v4l2_dev);
void fimc_unregister_m2m_device(struct fimc_dev *fimc);
650 651
int fimc_register_driver(void);
void fimc_unregister_driver(void);
652

653 654 655 656 657 658 659 660 661
#ifdef CONFIG_MFD_SYSCON
static inline struct regmap * fimc_get_sysreg_regmap(struct device_node *node)
{
	return syscon_regmap_lookup_by_phandle(node, "samsung,sysreg");
}
#else
#define fimc_get_sysreg_regmap(node) (NULL)
#endif

662 663 664 665
/* -----------------------------------------------------*/
/* fimc-m2m.c */
void fimc_m2m_job_finish(struct fimc_ctx *ctx, int vb_state);

666 667
/* -----------------------------------------------------*/
/* fimc-capture.c					*/
668 669
int fimc_initialize_capture_subdev(struct fimc_dev *fimc);
void fimc_unregister_capture_subdev(struct fimc_dev *fimc);
670
int fimc_capture_ctrls_create(struct fimc_dev *fimc);
671 672
void fimc_sensor_notify(struct v4l2_subdev *sd, unsigned int notification,
			void *arg);
673 674
int fimc_capture_suspend(struct fimc_dev *fimc);
int fimc_capture_resume(struct fimc_dev *fimc);
675

676
/*
677
 * Buffer list manipulation functions. Must be called with fimc.slock held.
678
 */
679 680 681 682 683 684 685

/**
 * fimc_active_queue_add - add buffer to the capture active buffers queue
 * @buf: buffer to add to the active buffers list
 */
static inline void fimc_active_queue_add(struct fimc_vid_cap *vid_cap,
					 struct fimc_vid_buffer *buf)
686
{
687
	list_add_tail(&buf->list, &vid_cap->active_buf_q);
688 689 690
	vid_cap->active_buf_cnt++;
}

691 692 693 694
/**
 * fimc_active_queue_pop - pop buffer from the capture active buffers queue
 *
 * The caller must assure the active_buf_q list is not empty.
695
 */
696 697
static inline struct fimc_vid_buffer *fimc_active_queue_pop(
				    struct fimc_vid_cap *vid_cap)
698 699 700
{
	struct fimc_vid_buffer *buf;
	buf = list_entry(vid_cap->active_buf_q.next,
701 702
			 struct fimc_vid_buffer, list);
	list_del(&buf->list);
703 704 705 706
	vid_cap->active_buf_cnt--;
	return buf;
}

707 708 709 710
/**
 * fimc_pending_queue_add - add buffer to the capture pending buffers queue
 * @buf: buffer to add to the pending buffers list
 */
711 712 713
static inline void fimc_pending_queue_add(struct fimc_vid_cap *vid_cap,
					  struct fimc_vid_buffer *buf)
{
714
	list_add_tail(&buf->list, &vid_cap->pending_buf_q);
715 716
}

717 718 719 720 721 722 723
/**
 * fimc_pending_queue_pop - pop buffer from the capture pending buffers queue
 *
 * The caller must assure the pending_buf_q list is not empty.
 */
static inline struct fimc_vid_buffer *fimc_pending_queue_pop(
				     struct fimc_vid_cap *vid_cap)
724 725 726
{
	struct fimc_vid_buffer *buf;
	buf = list_entry(vid_cap->pending_buf_q.next,
727 728
			struct fimc_vid_buffer, list);
	list_del(&buf->list);
729 730 731
	return buf;
}

732
#endif /* FIMC_CORE_H_ */