static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) { int i; mutex_lock(&pd->pmu->mutex); if (rockchip_pmu_domain_is_on(pd) != power_on) { for (i = 0; i < pd->num_clks; i++) clk_enable(pd->clks[i]); if (!power_on) { rockchip_pmu_save_qos(pd); /* if powering down, idle request to NIU first */ rockchip_pmu_set_idle_request(pd, true); } rockchip_do_pmu_set_power_domain(pd, power_on); if (power_on) { /* if powering up, leave idle mode */ rockchip_pmu_set_idle_request(pd, false); rockchip_pmu_restore_qos(pd); } for (i = pd->num_clks - 1; i >= 0; i--) clk_disable(pd->clks[i]); } mutex_unlock(&pd->pmu->mutex); return 0; }
static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd, bool on) { struct rockchip_pmu *pmu = pd->pmu; regmap_update_bits(pmu->regmap, pmu->info->pwr_offset, pd->info->pwr_mask, on ? 0 : -1U); dsb(sy); while (rockchip_pmu_domain_is_on(pd) != on) cpu_relax(); }
static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) { struct rockchip_pmu *pmu = pd->pmu; int ret; mutex_lock(&pmu->mutex); if (rockchip_pmu_domain_is_on(pd) != power_on) { ret = clk_bulk_enable(pd->num_clks, pd->clks); if (ret < 0) { dev_err(pmu->dev, "failed to enable clocks\n"); mutex_unlock(&pmu->mutex); return ret; } if (!power_on) { rockchip_pmu_save_qos(pd); /* if powering down, idle request to NIU first */ rockchip_pmu_set_idle_request(pd, true); } rockchip_do_pmu_set_power_domain(pd, power_on); if (power_on) { /* if powering up, leave idle mode */ rockchip_pmu_set_idle_request(pd, false); rockchip_pmu_restore_qos(pd); } clk_bulk_disable(pd->num_clks, pd->clks); } mutex_unlock(&pmu->mutex); return 0; }