/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 *
 * 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.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#ifndef _VPP_MODULE_H_
#define _VPP_MODULE_H_

#include "api_avio_dhub.h"
#include "com_type.h"
#include "vpp_com.h"
#include "vpp_api.h"
#include "vpp_bcmbuf.h"
#include "framequeue.h"
#include "vbuf.h"

#define START_1DDMA(dhubID, dmaID, start_addr, size, cfgQ, ptr) \
	dhub_channel_big_write_cmd(&(((HDL_dhub2d *)dhubID)->dhub), \
	dmaID, (INT)start_addr, size, 0,\
	0, 0, 1, cfgQ, ptr)

#define CLEAR_1DDMA(dhubID, dmaID, bcmbuf) \
	dhub_channel_clear_seq(dhubID, dmaID, bcmbuf); \

#define START_2DDMA(dhubID, dmaID, start_addr, stride, width, height, cfgQ) \
	dhub2d_channel_cfg((HDL_dhub2d *)dhubID, dmaID, start_addr, \
	stride, width, height, 1, 0, 0, 0,\
	0, 1, cfgQ)

#define CLEAR_2DDMA(dhubID, dmaID, bcmbuf) \
	do { \
		dhub2d_channel_clear_seq(dhubID, dmaID); \
		dhub2d_channel_start_seq(dhubID, dmaID); \
		dhub2d_channel_clear_seq_bcm(dhubID, dmaID, bcmbuf); \
	} while (0)

#define START_2NDDMA(dhubID, dmaID, start_addr, \
            burst, step1, size1, step2, size2, cfgQ) \
            dhub2nd_channel_cfg((HDL_dhub2d *)dhubID, \
            dmaID, start_addr, burst, step1, size1, \
            step2, size2, 0, 0, 0, 1, cfgQ)

#define CLEAR_2NDDMA(dhubID, dmaID, bcmbuf) \
    do{ \
    }while(0)

/* default window attributes */
#define DEFAULT_BGCOLOR		0
#define DEFAULT_ALPHA		0xff

/* definition of video frame-rate */
enum {
	TYPE_SD = 0,
	TYPE_HD = 1,
	TYPE_UHD = 2,
};

/* definition of video scan mode */
enum {
	SCAN_PROGRESSIVE = 0,
	SCAN_INTERLACED  = 1,
};

enum {
	FRAME_RATE_23P98 = 0,
	FRAME_RATE_24	 = 1,
	FRAME_RATE_25	 = 2,
	FRAME_RATE_29P97 = 3,
	FRAME_RATE_30	 = 4,
	FRAME_RATE_47P96 = 5,
	FRAME_RATE_48	 = 6,
	FRAME_RATE_50	 = 7,
	FRAME_RATE_59P94 = 8,
	FRAME_RATE_60	 = 9,
	FRAME_RATE_100	 = 10,
	FRAME_RATE_119P88 = 11,
	FRAME_RATE_120	 = 12,
};


typedef struct VPP_OBJ_T {
	UINT8 is_uf_triggered;
	INT vbi_num;
	UINT8 dvstatus;
	UINT8 status;
	HDL_semaphore *pSemHandle;
	VBUF_INFO *curr_frame;
	VBUF_INFO *prev_curr_frame;
	VBUF_INFO *curr_still_picture;
	VBUF_INFO *still_picture;
	FRAMEQUEUE inputq;
	FRAMEQUEUE outputq;
	INT frm_count;
	DHUB_CFGQ vbi_dma_cfgQ[2];
	DHUB_CFGQ *curr_cpcb_vbi_dma_cfgQ;
	DHUB_CFGQ vbi_bcm_cfgQ[2];
	DHUB_CFGQ *curr_cpcb_vbi_bcm_cfgQ;
	DHUB_CFGQ vde_bcm_cfgQ[2];
	DHUB_CFGQ *curr_cpcb_vde_bcm_cfgQ;
	DHUB_CFGQ	*curr_vbi_bcm_cfgQ;
	INT skip_vde_int;
	INT dmaRID;
	INT dmaRdhubID;
	BCMBUF  vbi_bcm_buf[2];
	BCMBUF *pVbiBcmBufCpcb[3];
	BCMBUF *pVbiBcmBuf;
	BCMBUF  vbi_clear_bcm_buf[2];
	BCMBUF *pVbiClearBcmBufCpcb[3];
	BCMBUF *pVbiClearBcmBuf;
} VPP_OBJ;

VOID VPP_ISR_Unregistration(INT32 handle);
VOID VPP_RegisterInterruptService(voidfunc_t f1, voidfunc_t f2, voidfunc_t f3);
VOID VPP_Enable_ISR_Interrupt(VPP_OBJ *vpp_obj, INT32 cpcbID);
VOID MV_VPP_EnableISR(VPP_OBJ *pVpp_obj);
VOID MV_VPP_DisableISR(VPP_OBJ *pVpp_obj);
#endif

