/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * 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 https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/

/*-----------------------------------------------------------------------------
 *
 * $Author: brianpc.huang $
 * $Date: 2015/05/29 $
 * $RCSfile: drv_hdtv.h,v $
 * $Revision: #1 $
 *
 *---------------------------------------------------------------------------*/

#ifndef _DRV_HDTV_H_
#define _DRV_HDTV_H_

#include "general.h"
#include "hw_vdoin.h"
#include "hw_hdtv.h"

#define HDTV_VOut_Offset		10

extern UINT8   _bHdtvTiming;
extern UINT8   _IsHdtvDetectDone;
extern UINT8   _bUnLockCnt;
//for not support blue mute 
extern UINT8   _bHdtvTimerCnt ;
extern UINT8   _bHdtvNotSupCnt;
extern UINT8   _bHdtvBlueMuteFlg;
extern UINT8 _bHsyncWidth;

	
extern void vHdtvConnect(UINT8 bchannel, UINT8 fgIsOn) ;
extern UINT16 wHdtvInputWidth(void) ;
extern UINT8 bHdtvInputWidthOverSample(UINT8 bMode);
extern UINT16 wHdtvInputHeight(void) ;
extern UINT8 bHdtvRefreshRate(void) ;
extern UINT8 bHdtvInterlace(void) ;
//extern UINT16 wHdtvMDDIVPorch(UINT8 bPath);
extern UINT16 wHdtvVPorch(UINT8 bPath) ;
extern UINT16 wHdtvHPorch(UINT8 bPath) ;
extern UINT8 bHdtvSigStatus(void) ;
extern void vHdtvISR(void) ;
extern void vHdtvHwInit(void);

extern void vHdtvModeDetect(void) ;
extern void vHdtvChkModeChange(void) ;
extern void vHdtvSetInput(UINT16 wstart, UINT16 wwidth) ;
extern void vHdtvClampWin(UINT16 wclamp_start, UINT16 wclamp_end) ;
extern void vHdtvBlankStart(UINT16 wblank_start) ;
extern void vHdtvReset(void) ;
extern void vHdtvSetInputCapature(UINT8 bmode, UINT8 bIsHdtv) ;
extern UINT16 wHdtvDEInputWidth(void) ;

typedef struct RHDTVNSTDStatus
{
	UINT8 fgIsNSTD;
	UINT8 bRefreshRate;
	UINT16 wVTotal;
	UINT16 wHTotal;
	UINT16 wVTotalDiff;
} RHDTVNSTDStatus;

#define HDTV_CODE_SHRINK   1  // penggang 20090914 add.

#if HDTV_CODE_SHRINK
typedef struct
{
	UINT8 bTimingIdx ;
	UINT8 bClampStart;
	UINT8 bClampEnd;
	UINT8 bBlankStart;
	UINT8 bVmaskStart;
	UINT8 bVmaskEnd;
 	UINT8  bPhase;
} HDTVTimingPrmSet;
#endif
extern const HDTVTimingPrmSet _arHDTVPrm[];
extern void vHDTVGetNSTDStatus(RHDTVNSTDStatus* pHDTVNSTDStatus);
extern RHDTVNSTDStatus _rHDTV_NSTDStatus;


#if 0
/* for cust */
extern UINT16 vHdtv_CustPos_GetHPos(void);
extern UINT16 vHdtv_CustPos_GetVPos(void);
extern UINT8 vHdtv_CustPos_SetHPos(UINT8 path, UINT16 wValue);
extern UINT8 vHdtv_CustPos_SetVPos(UINT8 path, UINT16 wValue);
extern UINT16 vHdtv_CustPos_HPosMax(void);
extern UINT16 vHdtv_CustPos_HPosMin(void);
extern UINT16 vHdtv_CustPos_VPosMax(void);
extern UINT16 vHdtv_CustPos_VPosMin(void);
extern void vHdtv_CustPos_Execute(void);
extern void vHdtv_CustPos_Update(void);
extern void vHdtv_CustPos_EEPReset(void);
extern void vHdtv_CustPos_Init(void);
extern void vHdtv_CustPos_Exit(void);
#endif


/* for CLI */
void vHdtvSwReset(void);
void vHdtvStatus(void);

#define vHdtvCenSel(fgswitch) vIO32WriteFldAlign(HDTV_00,fgswitch,HDTV_CEN_SEL)
#define vHdtvRGBFormatOn(fgswitch) vIO32WriteFldAlign(HDTV_00,fgswitch,HDTV_RGB)
#define vHdtvAGCSet(blevel)	vIO32WriteFldAlign(HDTV_04,blevel,HDTV_AGC)
#define bHdtvCheckCenEnable()	IO32ReadFldAlign(HDTV_00,HDTV_CEN_SEL)

void vHdtvSetOversampleForSD(UINT8 bmode);
UINT8 vHdtvGetOversampleForSD(void);


/* HDTV options ------------------------------*/
extern UINT8 bHdtvOpt01_MDmute0; //for MD , waiting lock mute
extern UINT8 bHdtvOpt01_MDmute1; //for MD , after lock stable
/* Opt03 leave for sync slicer*/
extern UINT8 bHdtvOpt04_AutoPhase;//for auto phase
//extern UINT8 bHdtvOpt05_CustPos;//for save each timing custom position in EEPROM
extern UINT8 bHdtvOpt05_AdaptiveSlicer; //Enable adaptive slicer

#ifdef  SUPPORT_AV_COMP_AUTO
UINT8 u1DrvGetCompStatus(void);
#endif


#endif
