index 8b81f2e0b684e9a4d76b5f3804ac9a98ca02aba7..f7e123d28b3d4eabc7d58c08072cdfb15329113e 100755 (executable)
*/
/*
- * Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2017-2021 Texas Instruments Incorporated - http://www.ti.com/
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
#include <ti/drv/mmcsd/soc/MMCSD_soc.h>
#include <ti/drv/mmcsd/src/MMCSD_osal.h>
+
+
#define MMCSD_log UART_printf
#define MMCSD_DEBUG_TRAP {while(mmcsd_emuwait_trap);}
/** \brief Command to configure for data write. */
#define MMCSD_CMDRSP_WRITE (BIT(8U))
+/** \brief Command to configure for Read or Write interrupt */
+#define MMCSD_CMDREQ_WR_RD (BIT(31U))
+
/** \brief SD voltage enumeration as per VHS field, after the CHECK PATTERN FIELD */
#define MMCSD_VOLT_2P7_3P6 (0x000100U)
#define MMCSD_VOLT_LOW_RANGE (0x000200U)
#define MMCSD_ECSD_STROBE_SUPPORT_ENHANCED_DIS (0U)
#define MMCSD_ECSD_STROBE_SUPPORT_ENHANCED_EN (1U)
-
+#define HS_MMCSD_INTR_ALL_ERR (\
+ HS_MMCSD_INTR_ADMAERROR |\
+ HS_MMCSD_INTR_ACMDERR |\
+ HS_MMCSD_INTR_DATABITERR |\
+ HS_MMCSD_INTR_DATACRCERR |\
+ HS_MMCSD_INTR_DATATIMEOUT |\
+ HS_MMCSD_INTR_CMDINDXERR |\
+ HS_MMCSD_INTR_CMDBITERR |\
+ HS_MMCSD_INTR_CMDCRCERR |\
+ HS_MMCSD_INTR_CMDTIMEOUT\
+)
volatile uint32_t mmcsd_emuwait_trap=1;
@@ -448,12 +463,14 @@ static MMCSD_Error MMCSD_v2_setBusFreq(MMCSD_Handle handle, const uint32_t *busF
static MMCSD_Error MMCSD_v2_getBusWidth(MMCSD_Handle handle, uint32_t *busWidth);
static MMCSD_Error MMCSD_v2_getBusFreq(MMCSD_Handle handle, uint32_t *busFreq);
static MMCSD_Error MMCSD_v2_getMediaParams(MMCSD_Handle handle, MMCSD_mediaParams *params);
+static MMCSD_Error MMCSD_v2_getErrorStatus(MMCSD_Handle handle, uint32_t *errorStat);
void MMCSD_v2_hwiFxn(uintptr_t arg);
static void MMCSD_v2_cmdStatusFxn(uintptr_t arg);
static void MMCSD_v2_xferStatusFxn(uintptr_t arg);
static MMCSD_Error mmcsd_tuning_procedure(MMCSD_Handle handle);
static void MMCSD_v2_xferStatusFxn_CMD19(uintptr_t arg);
+static void MMCSD_v2_controllerReset(MMCSD_v2_Object *,MMCSD_v2_HwAttrs const *);
static MMCSD_Error MMCSD_switch_card_speed(MMCSD_Handle handle,uint32_t cmd16_grp1_fn);
/* Delay function */
static void delay(uint32_t delayValue);
} adma2_desc_t;
adma2_desc_t adma2_desc;
-#if defined(__ARM_ARCH_7A__) || defined(__aarch64__) || defined(__TI_ARM_V7R4__)
+#if defined(__ARM_ARCH_7A__) || defined(__aarch64__) || ((__ARM_ARCH == 7) && (__ARM_ARCH_PROFILE == 'R'))
__attribute__((aligned(SOC_CACHELINE_SIZE))) // GCC way of aligning
#endif
MMCSD_Error ret = MMCSD_ERR;
uint32_t key;
uint32_t address = 0U;
+ uint32_t isrErr = MMCSD_ISR_RET_OK;
MMCSD_v2_Object *object = NULL;
MMCSD_v2_Transaction transaction;
address = block * object->blockSize;
}
- transaction.flags = MMCSD_CMDRSP_WRITE | MMCSD_CMDRSP_DATA;
+ transaction.flags = MMCSD_CMDRSP_WRITE | MMCSD_CMDRSP_DATA | MMCSD_CMDREQ_WR_RD;
transaction.arg = address;
transaction.blockCount = numBlks;
transaction.blockSize = object->blockSize;
}
ret = MMCSD_v2_transfer(handle, &transaction);
+ isrErr = object->intStatusErr;
} else {
MMCSD_DEBUG_TRAP
}
ret = MMCSD_v2_transfer(handle, &transaction);
}
}
-
+ if ((ret != MMCSD_OK) || (isrErr != MMCSD_ISR_RET_OK))
+ {
+ ret = MMCSD_ERR;
+ }
return (ret);
}
MMCSD_Error ret = MMCSD_ERR;
uint32_t key;
uint32_t address = 0U;
+ uint32_t isrErr = MMCSD_ISR_RET_OK;
MMCSD_v2_Object *object = NULL;
MMCSD_v2_Transaction transaction;
address = block * object->blockSize;
}
- transaction.flags = MMCSD_CMDRSP_READ | MMCSD_CMDRSP_DATA;
+ transaction.flags = MMCSD_CMDRSP_READ | MMCSD_CMDRSP_DATA | MMCSD_CMDREQ_WR_RD;
transaction.arg = address;
transaction.blockCount = numBlks;
transaction.blockSize = object->blockSize;
}
ret = MMCSD_v2_transfer(handle, &transaction);
+ isrErr = object->intStatusErr;
} else {
MMCSD_DEBUG_TRAP
}
ret = MMCSD_v2_transfer(handle, &transaction);
}
}
+ if ((ret != MMCSD_OK) || (isrErr != MMCSD_ISR_RET_OK))
+ {
+ ret = MMCSD_ERR;
+ }
return (ret);
}
object = (MMCSD_v2_Object *)((MMCSD_Config *) handle)->object;
hwAttrs = (MMCSD_v2_HwAttrs const *)((MMCSD_Config *) handle)->hwAttrs;
+ ret = MMCSD_socPhyConfigure((MMCSD_v2_HwAttrs const *)hwAttrs, MODE_DEFAULT, 0, 0);
+ if(ret != MMCSD_OK)
+ {
+ MMCSD_DEBUG_TRAP
+ }
+
if(0U != hwAttrs->enableInterrupt)
{
/* Release the interrupt path */
memset(object, 0, sizeof(MMCSD_v2_Object));
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1, "MMCSD: Object closed 0x%x", ((MMCSD_Config *) handle)->hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1, "MMCSD: Object closed 0x%x", hwAttrs->baseAddr);
#endif
}
return (ret);
if(inputClockRet!=0) {
if(inputClockRet!=hwAttrs->inputClk) {
- MMCSD_drv_log4(Diags_USER1,"Input clock[%d] to MMC is different from what is set in hwAttrs",inputClockRet);
+ MMCSD_drv_log4(Diags_USER1,"Input clock[%d] to MMC is different from what is set in hwAttrs\n",inputClockRet);
hwAttrs->inputClk=inputClockRet;
}
} else {
- MMCSD_drv_log(Diags_USER1,"Something is wrong. Input clock is not enabled!!");
+ MMCSD_drv_log(Diags_USER1,"Something is wrong. Input clock is not enabled!!\n");
ret = MMCSD_ERR;
}
}
return (ret);
}
/* Data buffer for message transmission, it is not stack allocated to allow cache aligning */
-#if defined(__GNUC__) && !defined(__ti__)
-CSL_SET_DALIGN(256) /* GCC way of aligning */
-#else
-CSL_SET_DALIGN(dataBuffer, 256)
-#endif
-static uint8_t dataBuffer[512];
-
-#if defined(__GNUC__) && !defined(__ti__)
-CSL_SET_DALIGN(256) /* GCC way of aligning */
-#else
-CSL_SET_DALIGN(cmd6_response_buf, 256)
-#endif
-static uint8_t cmd6_response_buf[512];
-
-
-
-
+static uint8_t dataBuffer[512] __attribute__((aligned(256)));
+static uint8_t cmd6_response_buf[512] __attribute__((aligned(256)));
/*
* ======== MMCSD_v2_initSd ========
if (STW_SOK != status)
{
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) HS MMC/SD Reset failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) HS MMC/SD Reset failed\n", hwAttrs->baseAddr);
#endif
ret = MMCSD_ERR;
}
if (STW_SOK != status)
{
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) HS MMC/SD Power on failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) HS MMC/SD Power on failed\n", hwAttrs->baseAddr);
#endif
ret = MMCSD_ERR;
}
MMCSD_DEBUG_TRAP
}
+ HSMMCSDUhsModeSet(hwAttrs->baseAddr,MMC_AC12_UHSMS_SDR12);
+ HSMMCSDHSModeSet(hwAttrs->baseAddr,MMC_HCTL_HSPE_NORMALSPEED);
+
+ /* Set the initialization frequency */
+ status = HSMMCSDBusFreqSet(hwAttrs->baseAddr, hwAttrs->inputClk,hwAttrs->outputClk, FALSE);
+
+ Osal_delay(10);
+ if(status !=STW_SOK) {
+ MMCSD_DEBUG_TRAP
+ }
+
+ /* PHY configurae */
+ MMCSD_socPhyDisableDLL((MMCSD_v2_HwAttrs const *)hwAttrs);
+
+ Osal_delay(50);
+
+ /* Configure the Phy accordignly */
+ ret = MMCSD_socPhyConfigure((MMCSD_v2_HwAttrs const *)hwAttrs, MODE_SDR12, 25000000U, 0);
+ if(ret != MMCSD_OK)
+ {
+ MMCSD_DEBUG_TRAP
+ }
- HSMMCSDSDClockEnable(hwAttrs->baseAddr); /* Enable clock to SD card */
/* Wait for 1 ms */
Osal_delay(1);
if(MMCSD_OK == ret)
{
+ object->blockCount = (object->blockCount * object->blockSize) / 512U;
object->blockSize = 512U;
}
}
}
ret=MMCSD_switch_card_speed(handle,cmd16_grp1_fn);
if(ret==MMCSD_OK) {
- MMCSD_drv_log(Diags_USER1," Successfully switched to the above speed");
+ MMCSD_drv_log(Diags_USER1," Successfully switched to the above speed\n");
break;/* Successful switching */
}
}
@@ -1766,6 +1807,7 @@ static MMCSD_Error MMCSD_switch_card_speed(MMCSD_Handle handle,uint32_t cmd16_gr
{
tranSpeed = MMCSD_TRANSPEED_SDR50;
uhsMode=MMC_AC12_UHSMS_SDR50;
+ sdr104_tuning_required=TRUE;
clk_freq=100000000U; /* 100MHz for SDR50 */
phy_freq=100000000U;
phy_mode = MODE_SDR50;
@@ -1774,6 +1816,7 @@ static MMCSD_Error MMCSD_switch_card_speed(MMCSD_Handle handle,uint32_t cmd16_gr
{
tranSpeed = MMCSD_TRANSPEED_DDR50;
uhsMode=MMC_AC12_UHSMS_DDR50;
+ sdr104_tuning_required=TRUE;
clk_freq=50000000U; /* 50MHz for DDR50 */
phy_freq=50000000U;
phy_mode=MODE_DDR50;
@@ -1837,9 +1880,9 @@ static MMCSD_Error MMCSD_switch_card_speed(MMCSD_Handle handle,uint32_t cmd16_gr
/* Set the UHS mode accordingly */
if(uhsMode!=0xffff) {
HSMMCSDUhsModeSet(hwAttrs->baseAddr,uhsMode);
+ /* SDR50 is rising edge */
if( (uhsMode==MMC_AC12_UHSMS_SDR12) ||
- (uhsMode==MMC_AC12_UHSMS_SDR25) ||
- (uhsMode==MMC_AC12_UHSMS_SDR50) )
+ (uhsMode==MMC_AC12_UHSMS_SDR25) )
{
/* For non-high speed modes the data should be on the falling edge */
HSMMCSDHSModeSet(hwAttrs->baseAddr,MMC_HCTL_HSPE_NORMALSPEED);
if (STW_SOK != status)
{
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) HS MMC/SD Reset failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) HS MMC/SD Reset failed\n", hwAttrs->baseAddr);
#endif
ret = MMCSD_ERR;
}
if (STW_SOK != status)
{
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) HS MMC/SD Power on failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) HS MMC/SD Power on failed\n", hwAttrs->baseAddr);
#endif
ret = MMCSD_ERR;
}
if (STW_SOK != status)
{
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) HS MMC/SD Bus Frequency set failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) HS MMC/SD Bus Frequency set failed\n", hwAttrs->baseAddr);
#endif
ret = MMCSD_ERR;
}
if(MMCSD_OK == ret)
{
+ object->intStatusErr = MMCSD_ISR_RET_OK;
+
/* Configure the command type to be executed from the command flags */
if (transaction->flags & MMCSD_CMDRSP_STOP)
{
HSMMCSDIntrStatusEnable(hwAttrs->baseAddr,
(HS_MMCSD_INTR_CMDCOMP | HS_MMCSD_INTR_CMDTIMEOUT |
- HS_MMCSD_INTR_DATATIMEOUT | HS_MMCSD_INTR_TRNFCOMP | 0x17ff0000));
+ HS_MMCSD_INTR_DATATIMEOUT | HS_MMCSD_INTR_TRNFCOMP | 0x17ff0000 |
+ HS_MMCSD_INTR_ALL_ERR));
if(0U != hwAttrs->enableInterrupt)
{
/* MMCSD_osalHardwareIntrEnable(hwAttrs->intNum); */
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Pending on commandComplete semaphore",
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Pending on commandComplete semaphore\n",
hwAttrs->baseAddr);
#endif
#ifdef LOG_EN
MMCSD_drv_log4(Diags_USER1,
- "MMCSD:(%p) Command transaction completed", hwAttrs->baseAddr);
+ "MMCSD:(%p) Command transaction completed\n", hwAttrs->baseAddr);
#endif
+ if ((transaction->flags & MMCSD_CMDREQ_WR_RD) != 0)
+ {
+ HSMMCSDIntrStatusDisable(hwAttrs->baseAddr,
+ (HS_MMCSD_INTR_CMDBITERR | HS_MMCSD_INTR_CMDCRCERR |
+ HS_MMCSD_INTR_DATABITERR | HS_MMCSD_INTR_DATACRCERR) );
+ }
if( object->manualTuning && object->cmdError && ( (cmdObj.cmd.cmdId==MMCSD_CMD(19U)) || (cmdObj.cmd.cmdId==MMCSD_CMD(21U)) ) )
{
/* Git response for command sent to MMC device */
HSMMCSDResponseGet(hwAttrs->baseAddr, transaction->response);
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Command Execution Failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Command Execution Failed\n", hwAttrs->baseAddr);
#endif
}
if(MMCSD_OK == ret)
{
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Pending on transferComplete semaphore",
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Pending on transferComplete semaphore\n",
hwAttrs->baseAddr);
#endif
}
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Data transaction completed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Data transaction completed\n", hwAttrs->baseAddr);
#endif
if( object->manualTuning && object->cmdError && ( (cmdObj.cmd.cmdId==MMCSD_CMD(19U)) || (cmdObj.cmd.cmdId==MMCSD_CMD(21U)) ) )
MMCSD_DEBUG_TRAP
object->xferTimeout = 0;
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Data Transfer Failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Data Transfer Failed\n", hwAttrs->baseAddr);
#endif
}
ret = MMCSD_OK;
object->xferComp = 0;
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Data Transfer Successful", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Data Transfer Successful\n", hwAttrs->baseAddr);
#endif
}
}
cmdObj.enableDma = 0;
HSMMCSDIntrStatusEnable(hwAttrs->baseAddr,
- (HS_MMCSD_INTR_CMDCOMP | HS_MMCSD_INTR_CMDTIMEOUT));
+ (HS_MMCSD_INTR_CMDCOMP | HS_MMCSD_INTR_ALL_ERR));
if(0U != hwAttrs->enableInterrupt)
{
cmdObj.enableDma,
MMC_CMD_ACEN_DISABLE);
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Pending on commandComplete semaphore",
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Pending on commandComplete semaphore\n",
hwAttrs->baseAddr);
#endif
}
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Command transaction completed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Command transaction completed\n", hwAttrs->baseAddr);
#endif
/* Command execution successful */
ret = MMCSD_OK;
object->cmdComp = 0;
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Command Execution Failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Command Execution successfull\n", hwAttrs->baseAddr);
#endif
}
- /* Command execution fail */
- if (1 == object->cmdTimeout)
+ /* Get response for command sent to MMC device */
+ HSMMCSDResponseGet(hwAttrs->baseAddr, transaction->response);
+
+ /* Release the lock for this particular MMCSD handle */
+ MMCSD_osalPostLock(object->commandMutex);
+ }
+
+ /* Data transfer fail or Command execution fail */
+ if ((1 == object->xferTimeout) || (1 == object->cmdTimeout))
+ {
+ if (1 == object->xferTimeout)
+ {
+ ret = MMCSD_ERR;
+ object->xferTimeout = 0;
+#ifdef LOG_EN
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Data Transfer Failed", hwAttrs->baseAddr);
+#endif
+ }
+ else
{
ret = MMCSD_ERR;
object->cmdTimeout = 0;
#ifdef LOG_EN
- MMCSD_drv_log(Diags_USER1,
- "MMCSD:(%p) Command Execution Failed", hwAttrs->baseAddr);
+ MMCSD_drv_log4(Diags_USER1,
+ "MMCSD:(%p) Command Execution Failed", hwAttrs->baseAddr);
#endif
}
-
- /* Git response for command sent to MMC device */
- HSMMCSDResponseGet(hwAttrs->baseAddr, transaction->response);
-
- /* Release the lock for this particular MMCSD handle */
- MMCSD_osalPostLock(object->commandMutex);
+ MMCSD_v2_controllerReset(object, (MMCSD_v2_HwAttrs *)hwAttrs);
}
-
}
/* Return the transaction status */
return (ret);
@@ -3255,6 +3319,11 @@ static MMCSD_Error MMCSD_v2_control(MMCSD_Handle handle, uint32_t cmd, const voi
break;
}
+ case MMCSD_CMD_GETERRORSTATUS:
+ {
+ ret = MMCSD_v2_getErrorStatus(handle, (uint32_t *)arg);
+ break;
+ }
default:
ret = MMCSD_UNDEFINEDCMD;
break;
@@ -3481,6 +3550,37 @@ static MMCSD_Error MMCSD_v2_getMediaParams(MMCSD_Handle handle, MMCSD_mediaParam
return(ret);
}
+/*
+ * ======== MMCSD_v2_getErrorStatus ========
+ */
+/*!
+ * @brief A function returns a error status for the command timeout
+ * or data transfer timeout.
+ */
+static MMCSD_Error MMCSD_v2_getErrorStatus(MMCSD_Handle handle, uint32_t *errorStat)
+{
+ MMCSD_Error ret = MMCSD_ERR;
+ MMCSD_v2_Object *object = NULL;
+
+ /* Input parameter validation */
+ if(handle != NULL)
+ {
+ /* Get the pointer to the object and hwAttrs */
+ object = (MMCSD_v2_Object *)((MMCSD_Config *) handle)->object;
+ if(object != NULL)
+ {
+ if ((MMCSD_CARD_SD == object->cardType) ||
+ (MMCSD_CARD_MMC == object->cardType) ||
+ (MMCSD_CARD_EMMC == object->cardType))
+ {
+ *errorStat = object->intStatusErr;
+ ret = MMCSD_OK;
+ }
+ }
+ }
+ return(ret);
+}
+
/*
* ======== MMCSD_v2_hwiFxn ========
* Hwi interrupt handler to service the MMCSD peripheral
{
object->cmdError = 1;
+ object->intStatusErr = MMCSD_ISR_RET_SDSTS;
if (errStatus & HS_MMCSD_INTR_CMDTIMEOUT)
{
volatile uint32_t delay1 = delayValue*10000U;
while (delay1--) {}
}
+/*
+ * ======== MMCSD_v2_controllerReset ========
+ */
+static void MMCSD_v2_controllerReset(MMCSD_v2_Object *object, MMCSD_v2_HwAttrs const *hwAttrs)
+{
+ volatile int32_t status = CSL_ESYS_FAIL;
+ MMCSD_v2_IodelayParams iodelayParams = {MMCSD_CARD_SD, MMCSD_TRANSPEED_25MBPS, MMCSD_VOLTAGE_ANY, MMCSD_LOOPBACK_ANY};
+
+ MMCSD_Error ret = MMCSD_OK;
+
+ if (MMCSD_OK == ret)
+ {
+ /* Lines Reset */
+ HSMMCSDLinesReset(hwAttrs->baseAddr, HS_MMCSD_ALL_RESET);
+
+ /* Set the bus width */
+ HSMMCSDBusWidthSet(hwAttrs->baseAddr, HS_MMCSD_BUS_WIDTH_1BIT);
+ /* Set the bus voltage */
+ if(hwAttrs->supportedBusVoltages & MMCSD_BUS_VOLTAGE_3_0V) {
+ HSMMCSDBusVoltSet(hwAttrs->baseAddr, HS_MMCSD_BUS_VOLT_3P0); /* Default */
+ } else if(hwAttrs->supportedBusVoltages & MMCSD_BUS_VOLTAGE_1_8V) {
+ HSMMCSDBusVoltSet(hwAttrs->baseAddr, HS_MMCSD_BUS_VOLT_1P8);
+ }
+ /* Bus power on */
+ status = ((int32_t)(HSMMCSDBusPower(hwAttrs->baseAddr, MMC_HCTL_SDBP_PWRON)));
+ object->switched_to_v18=FALSE;
+ if (STW_SOK != status)
+ {
+ ret = MMCSD_ERR;
+ }
+ }
+
+ if (MMCSD_OK == ret)
+ {
+ /* Set the initialization frequency */
+ status = HSMMCSDBusFreqSet(hwAttrs->baseAddr, hwAttrs->inputClk,
+ hwAttrs->outputClk, FALSE);
+ if(NULL != hwAttrs->iodelayFxn)
+ {
+ iodelayParams.transferSpeed = MMCSD_TRANSPEED_25MBPS;
+ hwAttrs->iodelayFxn(hwAttrs->instNum, &iodelayParams);
+ }
+
+ if (STW_SOK != status)
+ {
+ ret = MMCSD_ERR;
+ }
+ }
+}