blob: e0023a858a02c83b963878e445e5a378eaec7c14 [file] [log] [blame]
/*
* NDA AND NEED-TO-KNOW REQUIRED
*
* Copyright © 2013-2018 Synaptics Incorporated. All rights reserved.
*
* This file contains information that is proprietary to Synaptics
* Incorporated ("Synaptics"). The holder of this file shall treat all
* information contained herein as confidential, shall use the
* information only for its intended purpose, and shall not duplicate,
* disclose, or disseminate any of this information in any manner
* unless Synaptics has otherwise provided express, written
* permission.
*
* Use of the materials may require a license of intellectual property
* from a third party or from Synaptics. This file conveys no express
* or implied licenses to any intellectual property rights belonging
* to Synaptics.
*
* 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 __SDIO_CONTROLLER_H
#define __SDIO_CONTROLLER_H
#include "sdmmc_api.h"
//Function Prototypes
void EMMCHC_StopInternalBusClock(P_MM4_SDMMC_CONTEXT_T pContext);
void EMMCHC_StartInternalBusClock(P_MM4_SDMMC_CONTEXT_T pContext);
void EMMCHC_StartBusClock(P_MM4_SDMMC_CONTEXT_T pContext);
void EMMCHC_StopBusClock (P_MM4_SDMMC_CONTEXT_T pContext);
void EMMCHC_SetBusRate(P_MM4_SDMMC_CONTEXT_T pContext, unsigned int rate);
void EMMCHC_EnableDisableIntSources(P_MM4_SDMMC_CONTEXT_T pContext, unsigned char Desire);
void EMMCHC_SetDataTimeout(P_MM4_SDMMC_CONTEXT_T pContext, unsigned char CounterValue);
void EMMCHC_DataSWReset(P_MM4_SDMMC_CONTEXT_T pContext);
void EMMCHC_FullSWReset(P_MM4_SDMMC_CONTEXT_T pContext);
void EMMCHC_HighSpeedSelect(P_MM4_SDMMC_CONTEXT_T pContext, UINT_T hs_mode);
void EMMCHC_host_mode(P_MM4_SDMMC_CONTEXT_T pContext, UINT_T uhs_mode);
void EMMCHC_SendDataCommand(P_MM4_SDMMC_CONTEXT_T pContext,
UINT_T Cmd,
UINT_T Argument,
UINT_T BlockType,
UINT_T DataDirection,
UINT_T ResType);
void EMMCHC_SendSetupCommand(P_MM4_SDMMC_CONTEXT_T pContext,
UINT_T Cmd,
UINT_T CmdType,
UINT_T Argument,
UINT_T ResType);
void EMMCHC_SendDataCommandNoAuto12(P_MM4_SDMMC_CONTEXT_T pContext,
UINT_T Cmd,
UINT_T Argument,
UINT_T BlockType,
UINT_T DataDirection,
UINT_T ResType);
extern UINT_T EMMCHC_SetControllerVoltage (P_MM4_SDMMC_CONTEXT_T pContext, UINT_T vcc);
extern void EMMCHC_EnableCmdInterrupt(P_MM4_SDMMC_CONTEXT_T pContext, unsigned int enable);
extern void EMMCHC_cdInt_enable(P_MM4_SDMMC_CONTEXT_T pContext, UINT8_T Desire);
static inline void ndelay(unsigned int ns)
{
#ifndef CPUPLL
#define CPUPLL 1000
#endif
unsigned long cycles = (unsigned long)((unsigned long long)ns * CPUPLL / 1000);
__asm__ __volatile__ (
"1: subs %0, %0, #1 \n\t"
" bhi 1b \n\t"
: "+r" (cycles)
:
: "cc"
);
}
static void delay_us(unsigned int us)
{
const unsigned int step_us = 1000000;
const unsigned int step_ns = 1000 * step_us;
while (us > step_us) {
ndelay(step_ns);
us -= step_us;
}
if (us)
ndelay(1000 * us);
}
static void delay_ms(unsigned int ms)
{
const unsigned int step_ms = 1000000;
const unsigned int step_us = 1000 * step_ms;
while (ms > step_ms) {
delay_us(step_us);
ms -= step_ms;
}
if (ms)
delay_us(1000 * ms);
}
#endif