static void FactoryBusyHint(void) { /* Fix battery calibration by bumping min freq to 250 MHz in the factory. */ NvRmDfsBusyHint pFactoryHintOn[] = { { NvRmDfsClockId_Cpu, NV_WAIT_INFINITE, 250000, NV_TRUE } }; NvU32 PowerClientId = NVRM_POWER_CLIENT_TAG('F','a','c','t'); if(NvRmPowerRegister(s_hRmGlobal, 0, &PowerClientId) != NvSuccess) { printk(KERN_ERR "%s: failed to register\n", __func__); return; } if(NvRmPowerBusyHintMulti(s_hRmGlobal, PowerClientId, pFactoryHintOn, 1, /*number of hints*/ NvRmDfsBusyHintSyncMode_Async) != NvSuccess) { printk(KERN_ERR "%s: Busy Hint failed\n", __func__); } return; }
NvError NvRmPowerBusyHint ( NvRmDeviceHandle hRmDeviceHandle, NvRmDfsClockId ClockId, NvU32 ClientId, NvU32 BoostDurationMs, NvRmFreqKHz BoostKHz) { NvRmDfsBusyHint BusyHint; // Pack hint record BusyHint.ClockId = ClockId; BusyHint.BoostKHz = BoostKHz; BusyHint.BoostDurationMs = BoostDurationMs; BusyHint.BusyAttribute = NV_FALSE; return NvRmPowerBusyHintMulti(hRmDeviceHandle, ClientId, &BusyHint, 1, NvRmDfsBusyHintSyncMode_Async); }
static NvError UsbPhyDfsBusyHint( NvDdkUsbPhyHandle hUsbPhy, NvBool DfsOn, NvU32 BoostDurationMs) { NvRmDfsBusyHint pUsbHintOn[] = { { NvRmDfsClockId_Emc, NV_WAIT_INFINITE, USB_HW_MIN_SYSTEM_FREQ_KH, NV_TRUE }, { NvRmDfsClockId_Ahb, NV_WAIT_INFINITE, USB_HW_MIN_SYSTEM_FREQ_KH, NV_TRUE }, { NvRmDfsClockId_Cpu, NV_WAIT_INFINITE, USB_HW_MIN_CPU_FREQ_KH, NV_TRUE } }; NvRmDfsBusyHint pUsbHintOff[] = { { NvRmDfsClockId_Emc, 0, 0, NV_TRUE }, { NvRmDfsClockId_Ahb, 0, 0, NV_TRUE }, { NvRmDfsClockId_Cpu, 0, 0, NV_TRUE } }; NvError e = NvSuccess; NvU32 NumHints; if (hUsbPhy->IsHostMode) { // Do not enable busy hints for cpu clock in host mode NumHints = NV_ARRAY_SIZE(pUsbHintOn) - 1; } else { NumHints = NV_ARRAY_SIZE(pUsbHintOn); } pUsbHintOn[0].BoostDurationMs = BoostDurationMs; pUsbHintOn[1].BoostDurationMs = BoostDurationMs; pUsbHintOn[2].BoostDurationMs = BoostDurationMs; if (DfsOn) { if (hUsbPhy->Caps.PhyRegInController) { // Indicate USB controller is active NvRmFreqKHz PrefFreq = NvRmPowerModuleGetMaxFrequency( hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance)); NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockConfig(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, PrefFreq, PrefFreq, &PrefFreq, 1, NULL, 0)); } return NvRmPowerBusyHintMulti(hUsbPhy->hRmDevice, hUsbPhy->RmPowerClientId, pUsbHintOn, NumHints, NvRmDfsBusyHintSyncMode_Async); } else { if (hUsbPhy->Caps.PhyRegInController) { // Indicate USB controller is idle NvRmFreqKHz PrefFreq = USBC_IDLE_KHZ; NV_CHECK_ERROR_CLEANUP( NvRmPowerModuleClockConfig(hUsbPhy->hRmDevice, NVRM_MODULE_ID(NvRmModuleID_Usb2Otg, hUsbPhy->Instance), hUsbPhy->RmPowerClientId, PrefFreq, PrefFreq, &PrefFreq, 1, NULL, 0)); } return NvRmPowerBusyHintMulti(hUsbPhy->hRmDevice, hUsbPhy->RmPowerClientId, pUsbHintOff, NumHints, NvRmDfsBusyHintSyncMode_Async); } fail: return e; }