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

#include "dHub.h"
#include "avioDhub.h"
#include "api_dhub.h"
#include "avio_memmap.h"

#define VPP_DHUB_BASE           (MEMMAP_AVIO_REG_BASE + AVIO_MEMMAP_VPP128B_DHUB_REG_BASE + RA_vpp128bDhub_dHub0)
#define VPP_HBO_SRAM_BASE       (MEMMAP_AVIO_REG_BASE + AVIO_MEMMAP_VPP128B_DHUB_REG_BASE + RA_vpp128bDhub_tcm0)
#define VPP_NUM_OF_CHANNELS     (avioDhubChMap_vpp128b_1DSCL_W1+1)
#define AG_DHUB_BASE            (MEMMAP_AVIO_REG_BASE + AVIO_MEMMAP_AIO64B_DHUB_REG_BASE + RA_aio64bDhub_dHub0)
#define AG_HBO_SRAM_BASE        (MEMMAP_AVIO_REG_BASE + AVIO_MEMMAP_AIO64B_DHUB_REG_BASE + RA_aio64bDhub_tcm0)
#define AG_NUM_OF_CHANNELS      (avioDhubChMap_aio64b_SPDIF_W+1)

#define VPP_DHUB_BANK0_START_ADDR       avioDhubTcmMap_vpp128bDhub_BANK0_START_ADDR
#define VPP_DHUB_BANK1_START_ADDR       avioDhubTcmMap_vpp128bDhub_BANK1_START_ADDR
#define VPP_DHUB_BANK2_START_ADDR       avioDhubTcmMap_vpp128bDhub_BANK2_START_ADDR
#define VPP_DHUB_BANK3_START_ADDR       avioDhubTcmMap_vpp128bDhub_BANK3_START_ADDR
#define AG_DHUB_BANK0_START_ADDR        avioDhubTcmMap_aio64bDhub_BANK0_START_ADDR

typedef UNSG32              T64b [2];

typedef enum {
	DHUB_TYPE_64BIT = 0,
	DHUB_TYPE_128BIT
} DHUB_TYPE;

typedef struct DHUB_channel_config {
	INT32 chanId;
	UINT32 chanCmdBase;
	UINT32 chanDataBase;
	INT32 chanCmdSize;
	INT32 chanDataSize;
	INT32 chanMtuSize;
	INT32 chanQos;
	INT32 chanSelfLoop;
	INT32 chanEnable;
} DHUB_channel_config;

extern HDL_dhub2d AG_dhubHandle;
extern HDL_dhub2d VPP_dhubHandle;
extern DHUB_channel_config	AG_config[];
extern DHUB_channel_config	VPP_config[];
/******************************************************************************
 *	  Function: DhubInitialization
 *	  Description: Initialize DHUB .
 *	  Parameter : cpuId ------------- cpu ID
 *			   dHubBaseAddr -------------  dHub Base address.
 *			   hboSramAddr ----- Sram Address for HBO.
 *			   pdhubHandle ----- pointer to 2D dhubHandle
 *			   dhub_config ----- configuration of AG
 *			   numOfChans	  ----- number of channels
 *	  Return:		 void
******************************************************************************/

void DhubInitialization(SIGN32 cpuId, UNSG32 dHubBaseAddr, UNSG32 hboSramAddr,
		HDL_dhub2d *pdhubHandle, DHUB_channel_config *dhub_config,
		SIGN32 numOfChans, DHUB_TYPE dHubType);
void DhubChannelClear(void *hdl, SIGN32 id, T64b cfgQ[]);

int getDhubChannelInfo(HDL_dhub2d *pdhubHandle, SIGN32 IChannel,
		T32dHubChannel_CFG *cfg);

#endif

