static void power_gate_toggle_request(uint32_t id, int request) { printk(BIOS_INFO, "%sing power partition %d.\n", power_gate_string[request], id); int part_powered = partition_powered(id); if (request == part_powered) { printk(BIOS_INFO, "Partition %d already %sed.\n", id, power_gate_string[request]); return; } uint32_t pwrgate_toggle = read32(&pmc->pwrgate_toggle); pwrgate_toggle &= ~(PMC_PWRGATE_TOGGLE_PARTID_MASK); pwrgate_toggle |= (id << PMC_PWRGATE_TOGGLE_PARTID_SHIFT); pwrgate_toggle |= PMC_PWRGATE_TOGGLE_START; write32(&pmc->pwrgate_toggle, pwrgate_toggle); // Wait for the request to be accepted. while (read32(&pmc->pwrgate_toggle) & PMC_PWRGATE_TOGGLE_START) ; printk(BIOS_INFO, "Power gate toggle request accepted.\n"); while (1) { part_powered = partition_powered(id); if (request == part_powered) { printk(BIOS_INFO, "Partition %d %sed.\n", id, power_gate_string[request]); return; } } }
static void power_ungate_partition(uint32_t id) { printk(BIOS_INFO, "Ungating power partition %d.\n", id); if (!partition_powered(id)) { uint32_t pwrgate_toggle = read32(&pmc->pwrgate_toggle); pwrgate_toggle &= ~(PMC_PWRGATE_TOGGLE_PARTID_MASK); pwrgate_toggle |= (id << PMC_PWRGATE_TOGGLE_PARTID_SHIFT); pwrgate_toggle |= PMC_PWRGATE_TOGGLE_START; write32(&pmc->pwrgate_toggle, pwrgate_toggle); // Wait for the request to be accepted. while (read32(&pmc->pwrgate_toggle) & PMC_PWRGATE_TOGGLE_START) ; printk(BIOS_DEBUG, "Power gate toggle request accepted.\n"); // Wait for the partition to be powered. while (!partition_powered(id)) ; // Wait for clamp off. while (partition_clamp_on(id)) ; } printk(BIOS_INFO, "Ungated power partition %d.\n", id); }