/*
 * 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_DM365_ISIF_H
#define _DAVINCI_VPFE_DM365_ISIF_H

#include <linux/platform_device.h>

#include <mach/mux.h>

#include <media/davinci/vpfe_types.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>

#include "davinci_vpfe_user.h"
#include "dm365_isif_regs.h"
#include "vpfe_video.h"

#define ISIF_CULLING_HCAPT_ODD		0xff
#define ISIF_CULLING_HCAPT_EVEN		0xff
#define ISIF_CULLING_VCAPT		0xff

#define ISIF_CADU_BITS			0x07ff
#define ISIF_CADL_BITS			0x0ffff

enum isif_pixfmt {
	ISIF_PIXFMT_RAW = 0,
	ISIF_PIXFMT_YCBCR_16BIT = 1,
	ISIF_PIXFMT_YCBCR_8BIT = 2,
};

enum isif_frmfmt {
	ISIF_FRMFMT_PROGRESSIVE = 0,
	ISIF_FRMFMT_INTERLACED = 1,
};

/* PIXEL ORDER IN MEMORY from LSB to MSB */
/* only applicable for 8-bit input mode  */
enum isif_pixorder {
	ISIF_PIXORDER_YCBYCR = 0,
	ISIF_PIXORDER_CBYCRY = 1,
};

enum isif_buftype {
	ISIF_BUFTYPE_FLD_INTERLEAVED = 0,
	ISIF_BUFTYPE_FLD_SEPARATED = 1,
};

struct isif_ycbcr_config {
	/* v4l2 pixel format */
	unsigned long v4l2_pix_fmt;
	/* isif pixel format */
	enum isif_pixfmt pix_fmt;
	/* isif frame format */
	enum isif_frmfmt frm_fmt;
	/* isif crop window */
	struct v4l2_rect win;
	/* field polarity */
	enum vpfe_pin_pol fid_pol;
	/* interface VD polarity */
	enum vpfe_pin_pol vd_pol;
	/* interface HD polarity */
	enum vpfe_pin_pol hd_pol;
	/* isif pix order. Only used for ycbcr capture */
	enum isif_pixorder pix_order;
	/* isif buffer type. Only used for ycbcr capture */
	enum isif_buftype buf_type;
};

enum isif_cfa_pattern {
	ISIF_CFA_PAT_MOSAIC = 0,
	ISIF_CFA_PAT_STRIPE = 1,
};

enum isif_data_msb {
	/* MSB b15 */
	ISIF_BIT_MSB_15 = 0,
	/* MSB b14 */
	ISIF_BIT_MSB_14 = 1,
	/* MSB b13 */
	ISIF_BIT_MSB_13 = 2,
	/* MSB b12 */
	ISIF_BIT_MSB_12 = 3,
	/* MSB b11 */
	ISIF_BIT_MSB_11 = 4,
	/* MSB b10 */
	ISIF_BIT_MSB_10 = 5,
	/* MSB b9 */
	ISIF_BIT_MSB_9 = 6,
	/* MSB b8 */
	ISIF_BIT_MSB_8 = 7,
	/* MSB b7 */
	ISIF_BIT_MSB_7 = 8,
};

struct isif_params_raw {
	/* v4l2 pixel format */
	unsigned long v4l2_pix_fmt;
	/* isif pixel format */
	enum isif_pixfmt pix_fmt;
	/* isif frame format */
	enum isif_frmfmt frm_fmt;
	/* video window */
	struct v4l2_rect win;
	/* field polarity */
	enum vpfe_pin_pol fid_pol;
	/* interface VD polarity */
	enum vpfe_pin_pol vd_pol;
	/* interface HD polarity */
	enum vpfe_pin_pol hd_pol;
	/* buffer type. Applicable for interlaced mode */
	enum isif_buftype buf_type;
	/* cfa pattern */
	enum isif_cfa_pattern cfa_pat;
	/* Data MSB position */
	enum isif_data_msb data_msb;
	/* Enable horizontal flip */
	unsigned char horz_flip_en;
	/* Enable image invert vertically */
	unsigned char image_invert_en;
	unsigned char dpcm_predictor;
	struct vpfe_isif_raw_config config_params;
};

enum isif_data_pack {
	ISIF_PACK_16BIT = 0,
	ISIF_PACK_12BIT = 1,
	ISIF_PACK_8BIT = 2,
};

struct isif_gain_values {
	unsigned int cr_gain;
	unsigned int cgr_gain;
	unsigned int cgb_gain;
	unsigned int cb_gain;
	unsigned int offset;
};

struct isif_oper_config {
	struct isif_ycbcr_config ycbcr;
	struct isif_params_raw bayer;
	enum isif_data_pack data_pack;
	struct isif_gain_values isif_gain_params;
	void __iomem *base_addr;
	void __iomem *linear_tbl0_addr;
	void __iomem *linear_tbl1_addr;
};

#define ISIF_PAD_SINK      0
#define ISIF_PAD_SOURCE    1

#define ISIF_PADS_NUM      2

enum isif_input_entity {
	ISIF_INPUT_NONE = 0,
	ISIF_INPUT_PARALLEL = 1,
};

#define ISIF_OUTPUT_NONE	(0)
#define ISIF_OUTPUT_MEMORY	(1 << 0)
#define ISIF_OUTPUT_IPIPEIF	(1 << 1)

struct vpfe_isif_device {
	struct v4l2_subdev		subdev;
	struct media_pad		pads[ISIF_PADS_NUM];
	struct v4l2_mbus_framefmt	formats[ISIF_PADS_NUM];
	enum isif_input_entity		input;
	unsigned int			output;
	struct v4l2_ctrl_handler        ctrls;
	struct v4l2_rect		crop;
	struct isif_oper_config		isif_cfg;
	struct vpfe_video_device	video_out;
};

enum v4l2_field vpfe_isif_get_fid(struct vpfe_device *vpfe_dev);
void vpfe_isif_unregister_entities(struct vpfe_isif_device *isif);
int vpfe_isif_register_entities(struct vpfe_isif_device *isif,
				struct v4l2_device *dev);
int vpfe_isif_init(struct vpfe_isif_device *isif, struct platform_device *pdev);
void vpfe_isif_cleanup(struct vpfe_isif_device *vpfe_isif,
		       struct platform_device *pdev);
void vpfe_isif_vidint1_isr(struct vpfe_isif_device *isif);
void vpfe_isif_buffer_isr(struct vpfe_isif_device *isif);

#endif		/* _DAVINCI_VPFE_DM365_ISIF_H */
