/* * ======== PMI_initVoltageControl ======== */ PMI_Status PMI_initVoltageControl(void) { unsigned state; unsigned mask; unsigned temp; /* drive BUFF_OEn low to enable I2C clock on Beta EVM boards and later... */ /* a. setup PINMUX to select GPIO function */ temp = REG(PINMUX6); REG(PINMUX6) = (temp & SELECT_6_7_4_MASK) | SELECT_GP2_FXN; /* b. make sure GPIO module is enabled */ PMI_getModuleState(0, GPIO_PSC, GPIO_LPSC, &state); if (state != GPIO_LPSC_ENABLE_STATE) { PMI_setModuleState(0, GPIO_PSC, GPIO_LPSC, GPIO_LPSC_ENABLE_STATE); } /* c. setup GPIO direction and data register to drive GP2[6] low */ REG(GPIO_DIR23) &= ~GPIO_BIT6; REG(GPIO_CLR_DATA23) |= GPIO_BIT6; /* now initialize I2C bus control... */ PMI_initI2C(); /* setup PMIC's max SLEW rate for voltage transitions */ PMI_writeI2C(PMIC_ADDR, DEFSLEW_REG, DEFSLEW_VALUE); /* setup PMIC's PGOODMASK to avoid resets during core voltage scaling */ PMI_readI2C(PMIC_ADDR, PGOODMASK_REG, &mask); mask &= ~PGOODMASK_BITS; PMI_writeI2C(PMIC_ADDR, PGOODMASK_REG, mask); return (PMI_OK); }
/* * ======== Power_releaseDependency ======== * Release a dependency that has been previously declared by * Power_setDependency. * */ Power_Status Power_releaseDependency(Power_Resource resourceID) { Power_Status status = Power_SOK; PMI_Status pmi = PMI_BUSY; Bool callStatus; UInt checks = 0; UInt state = 0; UInt refCount; UInt key; /* make sure RT has been configured ON */ if (!ti_sysbios_family_c674_Power_trackResources) { status = Power_ENOTSUPPORTED; } /* validate resource ID is within range of pre-defined resources */ else if (resourceID >= Power_RSRC_END) { status = Power_EOUTOFRANGE; } /* make sure this resource is 'valid' for DSP control */ else if ((ti_sysbios_family_c674_Power_database[resourceID].flags & VALID) == 0) { status = Power_EINVALIDVALUE; } /* else, check reference count, de-activate resource */ else { /* disable scheduling */ key = Swi_disable(); /* read reference count */ refCount = ti_sysbios_family_c674_Power_database[resourceID].count; /* if reference count already zero return an error code */ if (refCount == 0) { status = Power_ETOOMANYCALLS; } /* else, if dependencies remain simply decrement count */ else if (refCount > 1) { ti_sysbios_family_c674_Power_database[resourceID].count = refCount - 1; } /* else, one remaining dependency, and it is being released... */ else { /* if resource has special handler - call it now */ if (ti_sysbios_family_c674_Power_database[resourceID].specialHandler != NULL) { callStatus = (*ti_sysbios_family_c674_Power_database[resourceID].specialHandler) (resourceID, Power_RELEASE); } /* else, call to PMI to deactivate the resource */ else { state = ti_sysbios_family_c674_Power_database[resourceID].inactiveState; /* optionally assert force for the transition */ if ((ti_sysbios_family_c674_Power_database[resourceID].flags & FORCE_MODE) != 0) { state = state | FORCE_BIT; } /* initiate transition to inactive state */ PMI_setModuleState(0, (UInt)ti_sysbios_family_c674_Power_database[resourceID].pscNum, (UInt)ti_sysbios_family_c674_Power_database[resourceID].lpscNum, state); /* now wait for the PSC transition to complete */ while ((pmi == PMI_BUSY) && (checks++ < PSCWAITTHRESHOLD)) { pmi = PMI_getModuleState(0, (UInt)ti_sysbios_family_c674_Power_database[resourceID].pscNum, (UInt)ti_sysbios_family_c674_Power_database[resourceID].lpscNum, &state); } /* check that transitioned to inactive state */ if ((pmi == PMI_OK) && (state == (UInt)ti_sysbios_family_c674_Power_database[resourceID].inactiveState)) { callStatus = TRUE; } else { callStatus = FALSE; } } /* if returned status is good, set reference count to 0 */ if (callStatus == TRUE) { ti_sysbios_family_c674_Power_database[resourceID].count = 0; } /* else, don't modify reference count, return failure code */ else { status = Power_EFAIL; } } /* re-enable scheduling */ Swi_restore(key); } return (status); }