static bool rockchip_pmu_domain_is_on(struct rockchip_pm_domain *pd) { struct rockchip_pmu *pmu = pd->pmu; unsigned int val; /* check idle status for idle-only domains */ if (pd->info->status_mask == 0) return !rockchip_pmu_domain_is_idle(pd); regmap_read(pmu->regmap, pmu->info->status_offset, &val); /* 1'b0: power on, 1'b1: power off */ return !(val & pd->info->status_mask); }
static int rockchip_pmu_set_idle_request(struct rockchip_pm_domain *pd, bool idle) { const struct rockchip_domain_info *pd_info = pd->info; struct rockchip_pmu *pmu = pd->pmu; unsigned int val; regmap_update_bits(pmu->regmap, pmu->info->req_offset, pd_info->req_mask, idle ? -1U : 0); dsb(sy); do { regmap_read(pmu->regmap, pmu->info->ack_offset, &val); } while ((val & pd_info->ack_mask) != (idle ? pd_info->ack_mask : 0)); while (rockchip_pmu_domain_is_idle(pd) != idle) cpu_relax(); return 0; }