static NvError PwmPowerConfigure(NvRmPwmHandle hPwm, NvBool IsEnablePower) { NvError status = NvSuccess; if (IsEnablePower == NV_TRUE) { if (!hPwm->PowerEnabled) { // Enable power status = NvRmPowerVoltageControl(hPwm->RmDeviceHandle, NVRM_MODULE_ID(NvRmModuleID_Pwm, 0), s_PwmPowerID, NvRmVoltsUnspecified, NvRmVoltsUnspecified, NULL, 0, NULL); if (status == NvSuccess) { // Enable the clock to the pwm controller status = NvRmPowerModuleClockControl(hPwm->RmDeviceHandle, NVRM_MODULE_ID(NvRmModuleID_Pwm, 0), s_PwmPowerID, NV_TRUE); hPwm->PowerEnabled = NV_TRUE; } } } else { if (hPwm->PowerEnabled) { // Disable the clock to the pwm controller status = NvRmPowerModuleClockControl(hPwm->RmDeviceHandle, NVRM_MODULE_ID(NvRmModuleID_Pwm, 0), s_PwmPowerID, NV_FALSE); if(status == NvSuccess) { // Disable power status = NvRmPowerVoltageControl(hPwm->RmDeviceHandle, NVRM_MODULE_ID(NvRmModuleID_Pwm, 0), s_PwmPowerID, NvRmVoltsOff, NvRmVoltsOff, NULL, 0, NULL); hPwm->PowerEnabled = NV_FALSE; } } } return status; }
NvError NvDdkUsbPhyPowerDown( NvDdkUsbPhyHandle hUsbPhy, NvBool IsHostMode, NvBool IsDpd) { NvError e = NvSuccess; NvDdkUsbPhyIoctl_VBusStatusOutputArgs VBusStatus; NvU32 TimeOut = USB_PHY_HW_TIMEOUT_US; NV_ASSERT(hUsbPhy); NvOsMutexLock(hUsbPhy->ThreadSafetyMutex); if (!hUsbPhy->IsPhyPoweredUp) { NvOsMutexUnlock(hUsbPhy->ThreadSafetyMutex); return e; } /* Allow saving register context for the USB host if it is a ULPI interface or if the lowest power state is LP1 */ if (hUsbPhy->pProperty->UsbMode == NvOdmUsbModeType_Host) { hUsbPhy->SaveContext(hUsbPhy); } /* Turn on/off the vbus for host mode */ hUsbPhy->IsHostMode = IsHostMode; if (IsHostMode) { UsbPrivEnableVbus(hUsbPhy, NV_FALSE); /* Wait till Vbus is turned off */ do { NvOsWaitUS(1000); TimeOut -= 1000; e = hUsbPhy->Ioctl(hUsbPhy, NvDdkUsbPhyIoctlType_VBusStatus, NULL, &VBusStatus); } while (VBusStatus.VBusDetected && TimeOut); } // Power down the USB Phy NV_CHECK_ERROR_CLEANUP(hUsbPhy->PowerDown(hUsbPhy)); // On AP20 H-CLK should not be turned off // This is required to detect the sensor interrupts. // However, phy can be programmed to put in the low power mode if (!hUsbPhy->Caps.PhyRegInController) { // Disable the clock NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NV_FALSE)); } // Disable power NV_CHECK_ERROR_CLEANUP( NvRmPowerVoltageControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NvRmVoltsOff, NvRmVoltsOff, NULL, 0, NULL)); /* Turn off the USB busy hints */ UsbPhyDfsBusyHint(hUsbPhy, NV_FALSE, NV_WAIT_INFINITE); if (hUsbPhy->TurnOffPowerRail) { NvOdmEnableUsbPhyPowerRail(NV_FALSE); NvOdmEnableOtgCircuitry(NV_FALSE); } hUsbPhy->IsPhyPoweredUp = NV_FALSE; fail: NvOsMutexUnlock(hUsbPhy->ThreadSafetyMutex); return e; }
void NvDdkUsbPhyClose( NvDdkUsbPhyHandle hUsbPhy) { if (!hUsbPhy) return; NvOsMutexLock(s_UsbPhyMutex); if (!hUsbPhy->RefCount) { NvOsMutexUnlock(s_UsbPhyMutex); return; } --hUsbPhy->RefCount; if (hUsbPhy->RefCount) { NvOsMutexUnlock(s_UsbPhyMutex); return; } NvRmSetModuleTristate( hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), NV_TRUE); NvOsMutexLock(hUsbPhy->ThreadSafetyMutex); if (hUsbPhy->RmPowerClientId) { if (hUsbPhy->IsPhyPoweredUp) { NV_ASSERT_SUCCESS( NvRmPowerModuleClockControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NV_FALSE)); //NvOsDebugPrintf("NvDdkUsbPhyClose::VOLTAGE OFF\n"); NV_ASSERT_SUCCESS( NvRmPowerVoltageControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NvRmVoltsOff, NvRmVoltsOff, NULL, 0, NULL)); hUsbPhy->IsPhyPoweredUp = NV_FALSE; } // Unregister driver from Power Manager NvRmPowerUnRegister(hUsbPhy->hRmDevice, hUsbPhy->RmPowerClientId); NvOsSemaphoreDestroy(hUsbPhy->hPwrEventSem); } NvOsMutexUnlock(hUsbPhy->ThreadSafetyMutex); NvOsMutexDestroy(hUsbPhy->ThreadSafetyMutex); if (hUsbPhy->CloseHwInterface) { hUsbPhy->CloseHwInterface(hUsbPhy); } if ((hUsbPhy->pProperty->UsbMode == NvOdmUsbModeType_Host) || (hUsbPhy->pProperty->UsbMode == NvOdmUsbModeType_OTG)) { UsbPrivEnableVbus(hUsbPhy, NV_FALSE); } NvOdmEnableUsbPhyPowerRail(NV_FALSE); NvRmPhysicalMemUnmap( (void*)hUsbPhy->UsbVirAdr, hUsbPhy->UsbBankSize); NvRmPhysicalMemUnmap( (void*)hUsbPhy->MiscVirAdr, hUsbPhy->MiscBankSize); NvOsMemset(hUsbPhy, 0, sizeof(NvDdkUsbPhy)); NvOsMutexUnlock(s_UsbPhyMutex); }
NvError NvDdkUsbPhyPowerUp( NvDdkUsbPhyHandle hUsbPhy, NvBool IsHostMode, NvBool IsDpd) { NvError e = NvSuccess; NV_ASSERT(hUsbPhy); NvOsMutexLock(hUsbPhy->ThreadSafetyMutex); if (hUsbPhy->IsPhyPoweredUp) { NvOsMutexUnlock(hUsbPhy->ThreadSafetyMutex); return e; } if (hUsbPhy->TurnOffPowerRail) { NvOdmEnableUsbPhyPowerRail(NV_TRUE); } // Enable power for USB module NV_CHECK_ERROR_CLEANUP( NvRmPowerVoltageControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NvRmVoltsUnspecified, NvRmVoltsUnspecified, NULL, 0, NULL)); // On Ap20 We will not turn off the H-Clk so not required to turn on if (!hUsbPhy->Caps.PhyRegInController) { NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NV_TRUE)); } // Power up the Phy NV_CHECK_ERROR_CLEANUP(hUsbPhy->PowerUp(hUsbPhy)); /* Allow restoring register context for the USB host if it is a ULPI interface or if the lowest power state is LP1 */ if (hUsbPhy->pProperty->UsbMode == NvOdmUsbModeType_Host) { hUsbPhy->RestoreContext(hUsbPhy); } hUsbPhy->IsHostMode = IsHostMode; if (IsHostMode) { UsbPrivEnableVbus(hUsbPhy, NV_TRUE); } else { /* Turn on the USB busy hints */ UsbPhyDfsBusyHint(hUsbPhy, NV_TRUE, NV_WAIT_INFINITE); } hUsbPhy->IsPhyPoweredUp = NV_TRUE; fail: NvOsMutexUnlock(hUsbPhy->ThreadSafetyMutex); return e; }
static NvError UsbPhyInitialize( NvDdkUsbPhyHandle hUsbPhy) { NvError e = NvSuccess; NvRmFreqKHz CurrentFreq = 0; NvRmFreqKHz PrefFreqList[3] = {12000, 60000, NvRmFreqUnspecified}; // NvOsDebugPrintf("UsbPhyInitialize::VOLTAGE ON, instance %d\n", // hUsbPhy->Instance); // request power NV_CHECK_ERROR_CLEANUP( NvRmPowerVoltageControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NvRmVoltsUnspecified, NvRmVoltsUnspecified, NULL, 0, NULL)); // Enable clock to the USB controller and Phy NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NV_TRUE)); if (!hUsbPhy->Caps.PhyRegInController) { if (hUsbPhy->pProperty->UsbInterfaceType == NvOdmUsbInterfaceType_UlpiNullPhy) { /* Request for 60MHz clk */ NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockConfig(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, PrefFreqList[1], PrefFreqList[1], &PrefFreqList[1], 1, &CurrentFreq, 0)); } else { /* Request for 12 MHz clk */ NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockConfig(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, PrefFreqList[0], PrefFreqList[0], &PrefFreqList[0], 1, &CurrentFreq, 0)); } } // else { /* No need for actual clock configuration - all USB PLL frequencies are available concurrently in this case. */ } // Reset controller NvRmModuleReset(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance)); // On AP20 H-CLK should not be turned off // This is required to detect the sensor interrupts. // However, phy can be programmed to put in the low power mode if (!hUsbPhy->Caps.PhyRegInController) { // Disable the clock NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NV_FALSE)); } // Disable power NV_CHECK_ERROR_CLEANUP( NvRmPowerVoltageControl(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, NvRmVoltsOff, NvRmVoltsOff, NULL, 0, NULL)); // if we are not turning off the power rail during power up and down // then turn on only once during the initalization. if (!hUsbPhy->TurnOffPowerRail) { NvOdmEnableUsbPhyPowerRail(NV_TRUE); } fail: return e; }