/*
 *  Routines to access hardware
 *
 *  Copyright (c) 2013 Realtek Semiconductor Corp.
 *
 *  This module is a confidential and proprietary property of RealTek and
 *  possession or use of this module requires written permission of RealTek.
 */

#ifndef _HAL_SDIO_HOST_H_
#define _HAL_SDIO_HOST_H_


#include "rtl8195a_sdio_host.h"



#define SDIO_HOST_WAIT_FOREVER       0xFFFFFFFF



typedef struct _HAL_SDIO_HOST_OP_ {
	HAL_Status	(*HalSdioHostInitHost)			(VOID *Data);
	HAL_Status	(*HalSdioHostInitCard)			(VOID *Data);
	HAL_Status	(*HalSdioHostDeInit)			(VOID *Data);
	HAL_Status	(*HalSdioHostRegIrq)			(VOID *Data);
	HAL_Status	(*HalSdioHostReadBlocksDma)		(VOID *Data, u64 ReadAddr, u32 BlockCnt);
	HAL_Status	(*HalSdioHostWriteBlocksDma)	(VOID *Data, u64 WriteAddr, u32 BlockCnt);
	HAL_Status	(*HalSdioHostStopTransfer)		(VOID *Data);
	HAL_Status	(*HalSdioHostGetCardStatus) 	(VOID *Data);
	HAL_Status	(*HalSdioHostGetSdStatus) 		(VOID *Data);
    HAL_Status  (*HalSdioHostChangeSdClock)     (VOID *Data, u8 Frequency);
	HAL_Status	(*HalSdioHostErase)				(VOID *Data, u64 StartAddr, u64 EndAddr);
	HAL_Status	(*HalSdioHostGetWriteProtect)	(VOID *Data);
	HAL_Status	(*HalSdioHostSetWriteProtect)	(VOID *Data, u8 Setting);
}HAL_SDIO_HOST_OP, *PHAL_SDIO_HOST_OP;

typedef struct _HAL_SDIO_HOST_ADAPTER_{
	IRQ_HANDLE				IrqHandle;			// Irq Handler
	ADMA2_DESC_FMT			*AdmaDescTbl;
	u32						Response[4];	
	u32						CardOCR;
	u32 					CardStatus;
	u32						IsWriteProtect;
	u8 						SdStatus[SD_STATUS_LEN];
	u8						Csd[CSD_REG_LEN];
    volatile u8             CmdCompleteFlg;
    volatile u8             XferCompleteFlg;
    volatile u8             ErrIntFlg;
    volatile u8             CardCurState;
	u8						IsSdhc;
	u8						CurrSdClk;
	u16 					RCA;
	u16						SdSpecVer;
	VOID (*CardInsertCallBack)(VOID *pAdapter);
	VOID (*CardRemoveCallBack)(VOID *pAdapter);
	VOID *CardInsertCbPara;
	VOID *CardRemoveCbPara;
}HAL_SDIO_HOST_ADAPTER, *PHAL_SDIO_HOST_ADAPTER;


extern HAL_Status 
HalSdioHostInit(
	IN VOID *Data
);

extern HAL_Status 
HalSdioHostDeInit(
	IN VOID *Data
);

extern HAL_Status 
HalSdioHostEnable(
	IN VOID *Data
);

extern HAL_Status 
HalSdioHostDisable(
	IN VOID *Data
);

extern VOID
HalSdioHostOpInit(
	IN VOID *Data
);


#endif

