diff options
author | Olivier Deprez <o-deprez@ti.com> | 2012-11-21 15:51:26 +0100 |
---|---|---|
committer | Ryan Harkin <ryan.harkin@linaro.org> | 2013-03-14 17:00:40 +0000 |
commit | bf6cdc7677c17dfe094fe1c9abf35a0043bd56e7 (patch) | |
tree | 75ea4f0875b28f7d91706d712f08edc17fa8f646 | |
parent | 575a727bb60efec19e1398d62c1a411e6bc5edc7 (diff) |
panda: add pmic support for sd card scenarios
Restore card detection mechanism
Handle SD card PBIAS
Support Pmic in MMCHS init. routine
-rw-r--r-- | Omap44xxPkg/Include/Omap4430/Omap4430.h | 12 | ||||
-rw-r--r-- | Omap44xxPkg/MmcHostDxe/MmcHostDxe.c | 68 | ||||
-rwxr-xr-x | Omap44xxPkg/MmcHostDxe/MmcHostDxe.h | 2 |
3 files changed, 44 insertions, 38 deletions
diff --git a/Omap44xxPkg/Include/Omap4430/Omap4430.h b/Omap44xxPkg/Include/Omap4430/Omap4430.h index 65da46cba..c127398cb 100644 --- a/Omap44xxPkg/Include/Omap4430/Omap4430.h +++ b/Omap44xxPkg/Include/Omap4430/Omap4430.h @@ -29,12 +29,12 @@ //CONTROL_PBIAS_LITE -#define CONTROL_PBIAS_LITE 0x48002520 -#define PBIASLITEVMODE0 BIT0 -#define PBIASLITEPWRDNZ0 BIT1 -#define PBIASSPEEDCTRL0 BIT2 -#define PBIASLITEVMODE1 BIT8 -#define PBIASLITEWRDNZ1 BIT9 +#define CONTROL_PBIAS_LITE 0x4a100600 +#define PBIASVMODE3V BIT21 +#define PBIASLITEPWRDNZ BIT22 +#define PBIASVMODEERR BIT23 +#define PBIASHIZ BIT25 +#define PBIASPWRDNZ BIT26 #endif // __OMAP4430_H__ diff --git a/Omap44xxPkg/MmcHostDxe/MmcHostDxe.c b/Omap44xxPkg/MmcHostDxe/MmcHostDxe.c index 1812dbb11..f2ac0bbcc 100644 --- a/Omap44xxPkg/MmcHostDxe/MmcHostDxe.c +++ b/Omap44xxPkg/MmcHostDxe/MmcHostDxe.c @@ -15,7 +15,7 @@ #include "MmcHostDxe.h" -EMBEDDED_EXTERNAL_DEVICE *gTPS65950; +EMBEDDED_EXTERNAL_DEVICE *gTWL6030; UINT8 mMaxDataTransferRate = 0; UINT32 mRca = 0; BOOLEAN mBitModeSet = FALSE; @@ -250,39 +250,51 @@ InitializeMMCHS ( VOID ) { - // TODO: adapt to Panda -#if 0 UINT8 Data; EFI_STATUS Status; -#endif DEBUG ((DEBUG_BLKIO, "InitializeMMCHS()\n")); -#if 0 - // Select Device group to belong to P1 device group in Power IC. - Data = DEV_GRP_P1; - Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VMMC1_DEV_GRP), 1, &Data); + // Disconnect PBIAS prior to voltage change + MmioAnd32 (CONTROL_PBIAS_LITE, ~(PBIASPWRDNZ | PBIASLITEPWRDNZ)); + + // Disable VMMC LDO + Data = VMMC_CFG_STATE_OFF; + Status = gTWL6030->Write (gTWL6030, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID1, VMMC_CFG_STATE), 1, &Data); ASSERT_EFI_ERROR(Status); - // Configure voltage regulator for MMC1 in Power IC to output 3.0 voltage. + // Wait for stabilization + gBS->Stall(500); + + // Configure VMMC LDO to output 3.0 voltage. Data = VSEL_3_00V; - Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VMMC1_DEDICATED_REG), 1, &Data); + Status = gTWL6030->Write (gTWL6030, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID1, VMMC_CFG_VOLTAGE), 1, &Data); ASSERT_EFI_ERROR(Status); - - // After ramping up voltage, set VDDS stable bit to indicate that voltage level is stable. - MmioOr32 (CONTROL_PBIAS_LITE, (PBIASLITEVMODE0 | PBIASLITEPWRDNZ0 | PBIASSPEEDCTRL0 | PBIASLITEVMODE1 | PBIASLITEWRDNZ1)); - // Enable WP GPIO - MmioAndThenOr32 (GPIO1_BASE + GPIO_OE, ~BIT23, BIT23); + // Enable VMMC LDO + Data = VMMC_CFG_STATE_ON; + Status = gTWL6030->Write (gTWL6030, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID1, VMMC_CFG_STATE), 1, &Data); + ASSERT_EFI_ERROR(Status); + + // Wait for stabilization + gBS->Stall(500); - // Enable Card Detect - Data = CARD_DETECT_ENABLE; - gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID2, TPS65950_GPIO_CTRL), 1, &Data); + // PBIAS in normal operating mode (not HiZ) + MmioAnd32 (CONTROL_PBIAS_LITE, ~PBIASHIZ); - return Status; -#endif + // Select VMODE=3V and connect VDDS_MMC1 to PBIAS + MmioOr32 (CONTROL_PBIAS_LITE, (PBIASVMODE3V|PBIASLITEPWRDNZ)); - return (1); + // Wait for PBIAS supply detection + gBS->Stall(100); + + // Connect pads + MmioOr32 (CONTROL_PBIAS_LITE, PBIASPWRDNZ); + + // Stop here if supply detector did not sense 3V + ASSERT( !(MmioRead32(CONTROL_PBIAS_LITE) & PBIASVMODEERR) ); + + return Status; } BOOLEAN @@ -290,24 +302,18 @@ MMCIsCardPresent ( IN EFI_MMC_HOST_PROTOCOL *This ) { - // TODO: adapt to Panda - // Always return card present presently - return (1); - -#if 0 EFI_STATUS Status; UINT8 Data; // - // Card detect is a GPIO0 on the TPS65950 + // Card detect is a GPIO0 on the TWL6030 // - Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID2, GPIODATAIN1), 1, &Data); + Status = gTWL6030->Read (gTWL6030, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID1, MMCCTRL), 1, &Data); if (EFI_ERROR (Status)) { return FALSE; } - return !(Data & CARD_DETECT_BIT); -#endif + return !(Data & CARD_DET_STS_MMC); } @@ -677,7 +683,7 @@ MMCInitialize ( DEBUG ((DEBUG_BLKIO, "MMCInitialize()\n")); - Status = gBS->LocateProtocol (&gEmbeddedExternalDeviceProtocolGuid, NULL, (VOID **)&gTPS65950); + Status = gBS->LocateProtocol (&gEmbeddedExternalDeviceProtocolGuid, NULL, (VOID **)&gTWL6030); ASSERT_EFI_ERROR(Status); Status = gBS->InstallMultipleProtocolInterfaces ( diff --git a/Omap44xxPkg/MmcHostDxe/MmcHostDxe.h b/Omap44xxPkg/MmcHostDxe/MmcHostDxe.h index a7bea5a37..4b9da8527 100755 --- a/Omap44xxPkg/MmcHostDxe/MmcHostDxe.h +++ b/Omap44xxPkg/MmcHostDxe/MmcHostDxe.h @@ -35,7 +35,7 @@ #include <Protocol/MmcHost.h> #include <Omap4430/Omap4430.h> -#include <TPS65950.h> +#include <TWL6030.h> #define MAX_RETRY_COUNT (100*5) |