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;
}
Пример #2
0
NvBool 
Pcf50626RtcAlarmIntEnable(
    NvOdmPmuDeviceHandle hDevice, 
    NvBool Enable)
{
    NvBool  Status = NV_FALSE;
    NvU8    Mask;

    if ((Status = Pcf50626I2cRead8(hDevice, PCF50626_INT1M_ADDR, &Mask)) == NV_TRUE)
    {
        (Mask = Enable? (Mask & ~0x8):(Mask|0x8));
        Status = Pcf50626I2cWrite8 (hDevice, PCF50626_INT1M_ADDR, Mask);
    }

    return Status;
}
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;
}