/*
 * Copyright (C) 2012 Texas Instruments Inc
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation version 2.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 * Contributors:
 *      Manjunath Hadli <manjunath.hadli@ti.com>
 *      Prabhakar Lad <prabhakar.lad@ti.com>
 */

#ifndef _DAVINCI_VPFE_VIDEO_H
#define _DAVINCI_VPFE_VIDEO_H

#include <media/videobuf2-dma-contig.h>

struct vpfe_device;

/*
 * struct vpfe_video_operations - VPFE video operations
 * @queue:	Resume streaming when a buffer is queued. Called on VIDIOC_QBUF
 *		if there was no buffer previously queued.
 */
struct vpfe_video_operations {
	int (*queue)(struct vpfe_device *vpfe_dev, unsigned long addr);
};

enum vpfe_pipeline_stream_state {
	VPFE_PIPELINE_STREAM_STOPPED = 0,
	VPFE_PIPELINE_STREAM_CONTINUOUS = 1,
	VPFE_PIPELINE_STREAM_SINGLESHOT = 2,
};

enum vpfe_video_state {
	/* indicates that buffer is not queued */
	VPFE_VIDEO_BUFFER_NOT_QUEUED = 0,
	/* indicates that buffer is queued */
	VPFE_VIDEO_BUFFER_QUEUED = 1,
};

struct vpfe_pipeline {
	/* media pipeline */
	struct media_pipeline		*pipe;
	/* state of the pipeline, continuous,
	 * single-shot or stopped
	 */
	enum vpfe_pipeline_stream_state	state;
	/* number of active input video entities */
	unsigned int			input_num;
	/* number of active output video entities */
	unsigned int			output_num;
	/* input video nodes in case of single-shot mode */
	struct vpfe_video_device	*inputs[10];
	/* capturing video nodes */
	struct vpfe_video_device	*outputs[10];
};

#define to_vpfe_pipeline(__e) \
	container_of((__e)->pipe, struct vpfe_pipeline, pipe)

#define to_vpfe_video(vdev) \
	container_of(vdev, struct vpfe_video_device, video_dev)

struct vpfe_cap_buffer {
	struct vb2_buffer vb;
	struct list_head list;
};

struct vpfe_video_device {
	/* vpfe device */
	struct vpfe_device			*vpfe_dev;
	/* video dev */
	struct video_device			video_dev;
	/* media pad of video entity */
	struct media_pad			pad;
	/* video operations supported by video device */
	const struct vpfe_video_operations	*ops;
	/* type of the video buffers used by user */
	enum v4l2_buf_type			type;
	/* Indicates id of the field which is being captured */
	u32					field_id;
	/* pipeline for which video device is part of */
	struct vpfe_pipeline			pipe;
	/* Indicates whether streaming started */
	u8					started;
	/* Indicates state of the stream */
	unsigned int				state;
	/* current input at the sub device */
	int					current_input;
	/*
	 * This field keeps track of type of buffer exchange mechanism
	 * user has selected
	 */
	enum v4l2_memory			memory;
	/* number of open instances of the channel */
	u32					usrs;
	/* flag to indicate whether decoder is initialized */
	u8					initialized;
	/* skip frame count */
	u8					skip_frame_count;
	/* skip frame count init value */
	u8					skip_frame_count_init;
	/* time per frame for skipping */
	struct v4l2_fract			timeperframe;
	/* ptr to currently selected sub device */
	struct vpfe_ext_subdev_info		*current_ext_subdev;
	/* Pointer pointing to current vpfe_cap_buffer */
	struct vpfe_cap_buffer			*cur_frm;
	/* Pointer pointing to next vpfe_cap_buffer */
	struct vpfe_cap_buffer			*next_frm;
	/* Used to store pixel format */
	struct v4l2_format			fmt;
	struct vb2_queue			buffer_queue;
	/* allocator-specific contexts for each plane */
	struct vb2_alloc_ctx *alloc_ctx;
	/* Queue of filled frames */
	struct list_head			dma_queue;
	spinlock_t				irqlock;
	/* IRQ lock for DMA queue */
	spinlock_t				dma_queue_lock;
	/* lock used to access this structure */
	struct mutex				lock;
	/* number of users performing IO */
	u32					io_usrs;
	/* Currently selected or default standard */
	v4l2_std_id				stdid;
	/*
	 * offset where second field starts from the starting of the
	 * buffer for field separated YCbCr formats
	 */
	u32					field_off;
};

int vpfe_video_is_pipe_ready(struct vpfe_pipeline *pipe);
void vpfe_video_unregister(struct vpfe_video_device *video);
int vpfe_video_register(struct vpfe_video_device *video,
			struct v4l2_device *vdev);
int vpfe_video_init(struct vpfe_video_device *video, const char *name);
void vpfe_video_process_buffer_complete(struct vpfe_video_device *video);
void vpfe_video_schedule_bottom_field(struct vpfe_video_device *video);
void vpfe_video_schedule_next_buffer(struct vpfe_video_device *video);

#endif		/* _DAVINCI_VPFE_VIDEO_H */
