NvBool Max8907bI2cRead8( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU8 *Data) { NvU32 i; NvU8 ReadBuffer = 0; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo[2]; for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++) { NvU32 TransactionCount = 0; // Write the PMU offset ReadBuffer = Addr & 0xFF; TransactionInfo[TransactionCount].Address = hPmu->DeviceAddr; TransactionInfo[TransactionCount].Buf = &ReadBuffer; TransactionInfo[TransactionCount].Flags = NVODM_I2C_IS_WRITE | NVODM_I2C_USE_REPEATED_START; TransactionInfo[TransactionCount++].NumBytes = 1; TransactionInfo[TransactionCount].Address = (hPmu->DeviceAddr | 0x1); TransactionInfo[TransactionCount].Buf = &ReadBuffer; TransactionInfo[TransactionCount].Flags = 0; TransactionInfo[TransactionCount++].NumBytes = 1; // Read data from PMU at the specified offset status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], TransactionCount, MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status == NvOdmI2cStatus_Success) { *Data = ReadBuffer; return NV_TRUE; } } // Transaction Error switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: SlaveNotFound\n")); break; } return NV_FALSE; }
NvBool Pcf50626SetVoltage( NvOdmPmuDeviceHandle hDevice, NvU32 vddRail, NvU32 MilliVolts, NvU32* pSettleMicroSeconds) { NvU8 data = 0; NV_ASSERT(hDevice); NV_ASSERT(vddRail < PCF50626PmuSupply_Num); if (pcf50626SupplyInfoTable[vddRail].cap.OdmProtected == NV_TRUE) { NVODMPMU_PRINTF(("[NVODM PMU] Pcf50626SetVoltage Warning: The voltage is protected and can not be set: %d.\n", vddRail)); return NV_TRUE; } if ((MilliVolts == ODM_VOLTAGE_OFF) || ((MilliVolts <= pcf50626SupplyInfoTable[vddRail].cap.MaxMilliVolts) && (MilliVolts >= pcf50626SupplyInfoTable[vddRail].cap.MinMilliVolts))) { if (! Pcf50626WriteVoltageReg(hDevice, vddRail, MilliVolts, pSettleMicroSeconds)) return NV_FALSE; } else { NVODMPMU_PRINTF(("[NVODM OPMU] Pcf50626SetVoltage Error: The required voltage is not supported..\n")); return NV_FALSE; } if (vddRail == PCF50626PmuSupply_DCUD) { // VBUs rail is enabled bydefault, so no need to enable set voltage. // "Millivolts" field is used as Enable or disable VBUS GPIO if (MilliVolts == ODM_VOLTAGE_OFF) { data = 0x7; // all bits to low fixed 0 } else { data = 0x0; // default reset value high impedence state } if (!Pcf50626I2cWrite8(hDevice,PCF50626_GPIO5C1_ADDR, data)) return NV_FALSE; } return NV_TRUE; }
NvBool Max8907bRtcI2cWriteTime( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU32 Data) { NvU32 i; NvU8 WriteBuffer[5]; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo; NVODMPMU_PRINTF(("\n RTC I2C write: Addr=0x%x, Data=0x%x ", Addr, Data)); for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++) { WriteBuffer[0] = (NvU8)(Addr & 0xFF); WriteBuffer[1] = (NvU8)((Data >> 24) & 0xFF); WriteBuffer[2] = (NvU8)((Data >> 16) & 0xFF); WriteBuffer[3] = (NvU8)((Data >> 8) & 0xFF); WriteBuffer[4] = (NvU8)(Data & 0xFF); TransactionInfo.Address = MAX8907B_RTC_SLAVE_ADDR; TransactionInfo.Buf = &WriteBuffer[0]; TransactionInfo.Flags = NVODM_I2C_IS_WRITE; TransactionInfo.NumBytes = 5; status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1, MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status == NvOdmI2cStatus_Success) return NV_TRUE; } // Transaction Error switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("Max8907bRtcI2cWrite32 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("Max8907bRtcI2cWrite32 Failed: SlaveNotFound\n")); break; } return NV_FALSE; }
NvBool Pcf50626I2cRead32( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU32 *Data) { NvU8 ReadBuffer[5]; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Pcf50626PrivData *hPmu = (Pcf50626PrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo[2]; ReadBuffer[0] = Addr & 0xFF; TransactionInfo[0].Address = hPmu->DeviceAddr; TransactionInfo[0].Buf = &ReadBuffer[0]; TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE; TransactionInfo[0].NumBytes = 1; TransactionInfo[1].Address = (hPmu->DeviceAddr | 0x1); TransactionInfo[1].Buf = &ReadBuffer[0]; TransactionInfo[1].Flags = 0; TransactionInfo[1].NumBytes = 4; status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], 2, PCF506226_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status != NvOdmI2cStatus_Success) { switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuI2cRead32 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuI2cRead32 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } *Data = (ReadBuffer[0] << 24) | (ReadBuffer[1] << 16) | (ReadBuffer[2] << 8) | ReadBuffer[3]; return NV_TRUE; }
NvBool Tps6586xI2cRead32( NvOdmPmuDeviceHandle hPmu, NvU32 Addr, NvU32 *Data) { NvU8 ReadBuffer[5]; NvOdmI2cStatus status = NvOdmI2cStatus_Success; NvOdmI2cTransactionInfo TransactionInfo[2]; // Write the PMU offset ReadBuffer[0] = Addr & 0xFF; TransactionInfo[0].Address = ((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->DeviceAddr; TransactionInfo[0].Buf = &ReadBuffer[0]; TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE; TransactionInfo[0].NumBytes = 1; TransactionInfo[1].Address = (((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->DeviceAddr | 0x1); TransactionInfo[1].Buf = &ReadBuffer[0]; TransactionInfo[1].Flags = 0; TransactionInfo[1].NumBytes = 4; // Read data from PMU at the specified offset status = NvOdmI2cTransaction(((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->hOdmI2C, &TransactionInfo[0], 2, TPS6586x_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status != NvOdmI2cStatus_Success) { switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } *Data = (ReadBuffer[0] << 24) | (ReadBuffer[1] << 16) | (ReadBuffer[2] << 8) | ReadBuffer[3]; return NV_TRUE; }
NvBool Pcf50626I2cRead8( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU8 *Data) { NvU8 ReadBuffer = 0; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Pcf50626PrivData *hPmu = (Pcf50626PrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo[2]; // Write the PMU offset ReadBuffer = Addr & 0xFF; TransactionInfo[0].Address = hPmu->DeviceAddr; TransactionInfo[0].Buf = &ReadBuffer; TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE; TransactionInfo[0].NumBytes = 1; TransactionInfo[1].Address = (hPmu->DeviceAddr | 0x1); TransactionInfo[1].Buf = &ReadBuffer; TransactionInfo[1].Flags = 0; TransactionInfo[1].NumBytes = 1; // Read data from PMU at the specified offset status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], 2, PCF506226_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status != NvOdmI2cStatus_Success) { switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } *Data = ReadBuffer; return NV_TRUE; }
/* --- Read/Write40 for reading/writing RTC */ #if 0 /* PMU does not support i2c multibyte write */ NvBool Tps6586xI2cWrite40( NvOdmPmuDeviceHandle hPmu, NvU32 Addr, NvU8 *Data) { NvU8 WriteBuffer[6]; NvOdmI2cStatus status = NvOdmI2cStatus_Success; NvOdmI2cTransactionInfo TransactionInfo = {0}; WriteBuffer[0] = (NvU8)(Addr & 0xFF); WriteBuffer[1] = Data[0]; WriteBuffer[2] = Data[1]; WriteBuffer[3] = Data[2]; WriteBuffer[4] = Data[3]; WriteBuffer[5] = Data[4]; TransactionInfo.Address = ((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->DeviceAddr; TransactionInfo.Buf = &WriteBuffer[0]; TransactionInfo.Flags = NVODM_I2C_IS_WRITE; TransactionInfo.NumBytes = 6; status = NvOdmI2cTransaction(((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->hOdmI2C, &TransactionInfo, 1, TPS6586x_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status == NvOdmI2cStatus_Success) { return NV_TRUE; } else { switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuI2cWrite40 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuI2cWrite40 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } }
NvBool MIC2826I2cRead8( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU8 *Data) { NvU8 ReadBuffer = 0; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo[2]; ReadBuffer = Addr & 0xFF; TransactionInfo[0].Address = MIC2826_SLAVE_ADDR; TransactionInfo[0].Buf = &ReadBuffer; TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE; TransactionInfo[0].NumBytes = 1; TransactionInfo[1].Address = (MIC2826_SLAVE_ADDR | 0x1); TransactionInfo[1].Buf = &ReadBuffer; TransactionInfo[1].Flags = 0; TransactionInfo[1].NumBytes = 1; status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], 2, MIC2826_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status != NvOdmI2cStatus_Success) { switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuOWI2cRead8 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuOWI2cRead8 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } *Data = ReadBuffer; return NV_TRUE; }
NvBool Max8907bI2cWrite8( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU8 Data) { NvU32 i; NvU8 WriteBuffer[2]; NvOdmI2cTransactionInfo TransactionInfo; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++) { WriteBuffer[0] = Addr & 0xFF; // PMU offset WriteBuffer[1] = Data & 0xFF; // written data TransactionInfo.Address = hPmu->DeviceAddr; TransactionInfo.Buf = &WriteBuffer[0]; TransactionInfo.Flags = NVODM_I2C_IS_WRITE; TransactionInfo.NumBytes = 2; status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1, MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status == NvOdmI2cStatus_Success) return NV_TRUE; } // Transaction Error switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuI2cWrite8 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuI2cWrite8 Failed: SlaveNotFound\n")); break; } return NV_FALSE; }
NvBool Pcf50626I2cWrite32( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU32 Data) { NvU8 WriteBuffer[5]; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Pcf50626PrivData *hPmu = (Pcf50626PrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo; WriteBuffer[0] = (NvU8)(Addr & 0xFF); WriteBuffer[1] = (NvU8)((Data >> 24) & 0xFF); WriteBuffer[2] = (NvU8)((Data >> 16) & 0xFF); WriteBuffer[3] = (NvU8)((Data >> 8) & 0xFF); WriteBuffer[4] = (NvU8)(Data & 0xFF); TransactionInfo.Address = hPmu->DeviceAddr; TransactionInfo.Buf = &WriteBuffer[0]; TransactionInfo.Flags = NVODM_I2C_IS_WRITE; TransactionInfo.NumBytes = 5; status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1, PCF506226_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status != NvOdmI2cStatus_Success) { switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuI2cWrite32 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuI2cWrite32 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } return NV_TRUE; }
NvBool MIC2826I2cWrite8( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU8 Data) { NvU8 WriteBuffer[2]; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo; WriteBuffer[0] = Addr & 0xFF; WriteBuffer[1] = Data & 0xFF; // written data TransactionInfo.Address = MIC2826_SLAVE_ADDR; TransactionInfo.Buf = &WriteBuffer[0]; TransactionInfo.Flags = NVODM_I2C_IS_WRITE; TransactionInfo.NumBytes = 2; status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1, MIC2826_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status == NvOdmI2cStatus_Success) { return NV_TRUE; } else { switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("NvOdmPmuOWI2cWrite8 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("NvOdmPmuOWI2cWrite8 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } }
static NvBool Pcf50626AdcIn1Read(NvOdmPmuDeviceHandle hDevice, NvU32 *volt) { NvU32 timeout = 0; NvU8 dataS1 = 0; NvU8 dataS3 = 0; NV_ASSERT(hDevice); NV_ASSERT(volt); // Turn off GPIO7 if(! Pcf50626I2cWrite8(hDevice, PCF50626_GPIO7C1_ADDR, 0x0)) return NV_FALSE; //ADCC3 - Division sel if(! Pcf50626I2cWrite8(hDevice, PCF50626_ADCC3_ADDR, PCF50626_ADCC3_RESET)) return NV_FALSE; //ADCC1 - Resolustion, Mux Sel, Avg sel if(! Pcf50626I2cWrite8(hDevice, PCF50626_ADCC1_ADDR, 0x0C)) return NV_FALSE; // Start Converstion if(! Pcf50626I2cWrite8(hDevice, PCF50626_ADCC1_ADDR, 0x0D)) return NV_FALSE; // Wait for conversion NvOdmOsWaitUS(ADC_CONVERSION_DELAY_USEC); // make sure the conversion is completed, or timeout. while (timeout < ADC_CONVERSION_TIMEOUT_USEC) { if(! Pcf50626I2cRead8(hDevice, PCF50626_ADCS3_ADDR, &dataS3)) return NV_FALSE; if (dataS3 & 0x80) break; NvOdmOsWaitUS(ADC_CONVERSION_DELAY_USEC); timeout += ADC_CONVERSION_DELAY_USEC; } if (timeout >= ADC_CONVERSION_TIMEOUT_USEC) { NVODMPMU_PRINTF(("ADC conversion timeout.\n")); return NV_FALSE; } // read the conversion result if (!Pcf50626I2cRead8(hDevice, PCF50626_ADCS1_ADDR, &dataS1)) return NV_FALSE; // Get result *volt = (((NvU32)((dataS1 << 2) | (dataS3 & 0x03))) * ADC_CONVERSION_VOLTAGE_RANGE * ADC_CONVERSION_DIVIDOR) >> ADC_CONVERSION_PRECISION; return NV_TRUE; }
NvBool Tca6416ConfigPortPin( NvOdmPmuDeviceHandle hDevice, NvU32 PortNo, NvU32 PinNo, GpioPinMode Mode) { NvU8 WriteBuffer[2]; NvOdmI2cStatus Error; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo; static NvU8 ConfigPort1Val = 0xFF; // set to default value static NvU8 ConfigPort2Val = 0xFF; // set to default value if (PortNo == TCA6416_PORT_0) { WriteBuffer[0] = TCA6416_CONFIG_PORT_0 & 0xFF; if (Mode == GpioPinMode_Output) { WriteBuffer[1] = ((ConfigPort1Val & (0xFF & (~(1 << PinNo)))) | (0x0 << PinNo)); } else if (Mode == GpioPinMode_InputData) { WriteBuffer[1] = ((ConfigPort1Val & (0xFF & (~(1 << PinNo)))) | (0x1 << PinNo)); } ConfigPort1Val = WriteBuffer[1]; }else if (PortNo == TCA6416_PORT_1) { WriteBuffer[0] = TCA6416_CONFIG_PORT_1 & 0xFF; if (Mode == GpioPinMode_Output) { WriteBuffer[1] = (ConfigPort2Val & (0xFF & (~(1 << PinNo)))); } else if (Mode == GpioPinMode_InputData) { WriteBuffer[1] = ((ConfigPort2Val & (0xFF & (~(1 << PinNo)))) | (0x1 << PinNo)); } ConfigPort2Val = WriteBuffer[1]; } TransactionInfo.Address = TCA6416_SLAVE_ADDR; TransactionInfo.Buf = WriteBuffer; TransactionInfo.Flags = NVODM_I2C_IS_WRITE; TransactionInfo.NumBytes = 2; // write the pmu Offset (from where data gpio need to be set) Error = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1, TCA6416_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (Error == NvOdmI2cStatus_Success) { return NV_TRUE; } else { switch (Error) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("Tca6416ConfigPortPin Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("Tca6416ConfigPortPin Failed: SlaveNotFound\n")); break; } return NV_FALSE; } }
NvBool Tca6416WritePortPin( NvOdmPmuDeviceHandle hDevice, NvU32 PortNo, NvU32 PinNo, GpioPinState data) { NvOdmI2cTransactionInfo TransactionInfo; NvOdmI2cStatus Error; NvU8 WriteBuffer[2]; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; static NvU8 OutPut1Val = 0xFF; // set to default value static NvU8 OutPut2Val = 0xFF; // set to default value /* set the command byte */ if (PortNo == TCA6416_PORT_0) { WriteBuffer[0] = TCA6416_OUTPUT_PORT_0 & 0xFF; // Set the data WriteBuffer[1] = ((OutPut1Val & (0xFF & (~(1 << PinNo)))) | (data << PinNo)); OutPut1Val = WriteBuffer[1]; } else if (PortNo == TCA6416_PORT_1) { WriteBuffer[0] = TCA6416_OUTPUT_PORT_1 & 0xFF; // Set the data WriteBuffer[1] = ((OutPut2Val & (0xFF & (~(1 << PinNo)))) | (data << PinNo)); OutPut2Val = WriteBuffer[1]; } TransactionInfo.Address = TCA6416_SLAVE_ADDR; TransactionInfo.Buf = WriteBuffer; TransactionInfo.Flags = NVODM_I2C_IS_WRITE; TransactionInfo.NumBytes = 2; Error = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1, TCA6416_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (Error == NvOdmI2cStatus_Success) { return NV_TRUE; } else { switch (Error) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("Tca6416I2cWrite8 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("Tca6416I2cWrite8 Failed: SlaveNotFound\n")); break; } return NV_FALSE; } }
NvBool Max8907bRtcI2cReadTime( NvOdmPmuDeviceHandle hDevice, NvU8 Addr, NvU32 *Data) { NvU32 i; NvU8 ReadBuffer[4]; NvOdmI2cStatus status = NvOdmI2cStatus_Success; Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate; NvOdmI2cTransactionInfo TransactionInfo[MAX_TRANSACTION_COUNT]; NVODMPMU_PRINTF(("\n RTC I2C read: Addr=0x%x ", Addr)); for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++) { NvU32 TransactionCount = 0; ReadBuffer[0] = Addr & 0xFF; TransactionInfo[TransactionCount].Address = MAX8907B_RTC_SLAVE_ADDR; TransactionInfo[TransactionCount].Buf = &ReadBuffer[0]; TransactionInfo[TransactionCount].Flags = NVODM_I2C_IS_WRITE | NVODM_I2C_USE_REPEATED_START; TransactionInfo[TransactionCount++].NumBytes = 1; // Seconds / day if (TransactionCount >= MAX_TRANSACTION_COUNT) return NV_FALSE; TransactionInfo[TransactionCount].Address = (MAX8907B_RTC_SLAVE_ADDR | 0x1); TransactionInfo[TransactionCount].Buf = &ReadBuffer[0]; TransactionInfo[TransactionCount].Flags = 0; TransactionInfo[TransactionCount++].NumBytes = 1; // Minutes / month if (TransactionCount >= MAX_TRANSACTION_COUNT) return NV_FALSE; TransactionInfo[TransactionCount].Address = (MAX8907B_RTC_SLAVE_ADDR | 0x1); TransactionInfo[TransactionCount].Buf = &ReadBuffer[1]; TransactionInfo[TransactionCount].Flags = 0; TransactionInfo[TransactionCount++].NumBytes = 1; // Hours / YY1 if (TransactionCount >= MAX_TRANSACTION_COUNT) return NV_FALSE; TransactionInfo[TransactionCount].Address = (MAX8907B_RTC_SLAVE_ADDR | 0x1); TransactionInfo[TransactionCount].Buf = &ReadBuffer[2]; TransactionInfo[TransactionCount].Flags = 0; TransactionInfo[TransactionCount++].NumBytes = 1; // Weekday / YY2 if (TransactionCount >= MAX_TRANSACTION_COUNT) return NV_FALSE; TransactionInfo[TransactionCount].Address = (MAX8907B_RTC_SLAVE_ADDR | 0x1); TransactionInfo[TransactionCount].Buf = &ReadBuffer[3]; TransactionInfo[TransactionCount].Flags = 0; TransactionInfo[TransactionCount++].NumBytes = 1; status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], TransactionCount, MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE); if (status == NvOdmI2cStatus_Success) { *Data = (ReadBuffer[0] << 24) | (ReadBuffer[1] << 16) | (ReadBuffer[2] << 8) | ReadBuffer[3]; return NV_TRUE; } } // Transaction Error switch (status) { case NvOdmI2cStatus_Timeout: NVODMPMU_PRINTF(("Max8907bRtcI2cRead32 Failed: Timeout\n")); break; case NvOdmI2cStatus_SlaveNotFound: default: NVODMPMU_PRINTF(("Max8907bRtcI2cRead32 Failed: SlaveNotFound\n")); break; } return NV_FALSE; }
NvBool Pcf50626Setup(NvOdmPmuDeviceHandle hDevice) { NvOdmIoModule I2cModule = NvOdmIoModule_I2c; NvU32 I2cInstance = 0; NvU32 I2cAddress = 0; NvU32 i = 0; NvBool status = NV_FALSE; const NvOdmPeripheralConnectivity *pConnectivity = NvOdmPeripheralGetGuid(PMUGUID); NV_ASSERT(hDevice); pPrivData = (Pcf50626PrivData*) NvOdmOsAlloc(sizeof(Pcf50626PrivData)); if (pPrivData == NULL) { NVODMPMU_PRINTF(("Error Allocating Pcf50626PrivData. \n")); return NV_FALSE; } NvOdmOsMemset(pPrivData, 0, sizeof(Pcf50626PrivData)); hDevice->pPrivate = pPrivData; ((Pcf50626PrivData*)hDevice->pPrivate)->supplyRefCntTable = NvOdmOsAlloc(sizeof(NvU32) * PCF50626PmuSupply_Num); if (((Pcf50626PrivData*)hDevice->pPrivate)->supplyRefCntTable == NULL) { NVODMPMU_PRINTF(("Error Allocating RefCntTable. \n")); goto fail; } // memset for (i = 0; i < PCF50626PmuSupply_Num; i++) { ((Pcf50626PrivData*)hDevice->pPrivate)->supplyRefCntTable[i] = 0; } if (pConnectivity != NULL) // PMU is in database { for (i = 0; i < pConnectivity->NumAddress; i ++) { if (pConnectivity->AddressList[i].Interface == NvOdmIoModule_I2c_Pmu) { I2cModule = NvOdmIoModule_I2c_Pmu; I2cInstance = pConnectivity->AddressList[i].Instance; I2cAddress = pConnectivity->AddressList[i].Address; break; } } NV_ASSERT(I2cModule == NvOdmIoModule_I2c_Pmu); NV_ASSERT(I2cAddress != 0); ((Pcf50626PrivData*)hDevice->pPrivate)->hOdmI2C = NvOdmI2cOpen(I2cModule, I2cInstance); if (!((Pcf50626PrivData*)hDevice->pPrivate)->hOdmI2C) { NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Error Open I2C device. \n")); NVODMPMU_PRINTF(("[NVODM PMU]Please check PMU device I2C settings. \n")); goto fail; } ((Pcf50626PrivData*)hDevice->pPrivate)->DeviceAddr = I2cAddress; ((Pcf50626PrivData*)hDevice->pPrivate)->hOdmPmuSevice = NvOdmServicesPmuOpen(); if (!((Pcf50626PrivData*)hDevice->pPrivate)->hOdmPmuSevice) { NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Error Open PMU Odm service. \n")); goto fail; } } else { // if PMU is not presented in the database, then the platform is PMU-less. NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: The system did not doscover PMU fromthe data base. \n")); NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: If this is not intended, please check the peripheral database for PMU settings. \n")); goto fail; } if (!Pcf50626BatteryChargerSetup(hDevice)) { NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626BatteryChargerSetup() failed. \n")); goto fail; } //Check battery presence if (!Pcf50626BatteryChargerCBCMainBatt(hDevice,&((Pcf50626PrivData*)hDevice->pPrivate)->battPresence)) { NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626BatteryChargerCBCMainBatt() failed. \n")); goto fail; } // The interrupt assumes not supported until pcf50626InterruptHandler() is called. ((Pcf50626PrivData*)hDevice->pPrivate)->pmuInterruptSupported = NV_FALSE; // setup the interrupt any way. if (!Pcf50626SetupInterrupt(hDevice, &((Pcf50626PrivData*)hDevice->pPrivate)->pmuStatus)) { NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626SetupInterrupt() failed. \n")); goto fail; } // Check battery Fullness if (((Pcf50626PrivData*)hDevice->pPrivate)->battPresence == NV_TRUE) { if (!Pcf50626BatteryChargerCBCBattFul(hDevice,&status)) { NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626BatteryChargerCBCBattFul() failed. \n")); goto fail; } ((Pcf50626PrivData*)hDevice->pPrivate)->pmuStatus.batFull = status; } else { ((Pcf50626PrivData*)hDevice->pPrivate)->pmuStatus.batFull = NV_FALSE; } return NV_TRUE; fail: Pcf50626Release(hDevice); return NV_FALSE; }