static int imx6_pm_domain_power_on(struct generic_pm_domain *genpd)
 {
        struct imx_pm_domain *pd = to_imx_pm_domain(genpd);
-       int i, ret, sw, sw2iso;
-       u32 val;
+       int i, ret;
+       u32 val, req;
 
        if (pd->supply) {
                ret = regulator_enable(pd->supply);
        regmap_update_bits(pd->regmap, pd->reg_offs + GPC_PGC_CTRL_OFFS,
                           0x1, 0x1);
 
-       /* Read ISO and ISO2SW power up delays */
-       regmap_read(pd->regmap, pd->reg_offs + GPC_PGC_PUPSCR_OFFS, &val);
-       sw = val & 0x3f;
-       sw2iso = (val >> 8) & 0x3f;
-
        /* Request GPC to power up domain */
-       val = BIT(pd->cntr_pdn_bit + 1);
-       regmap_update_bits(pd->regmap, GPC_CNTR, val, val);
+       req = BIT(pd->cntr_pdn_bit + 1);
+       regmap_update_bits(pd->regmap, GPC_CNTR, req, req);
 
-       /* Wait ISO + ISO2SW IPG clock cycles */
-       udelay(DIV_ROUND_UP(sw + sw2iso, pd->ipg_rate_mhz));
+       /* Wait for the PGC to handle the request */
+       ret = regmap_read_poll_timeout(pd->regmap, GPC_CNTR, val, !(val & req),
+                                      1, 50);
+       if (ret)
+               pr_err("powerup request on domain %s timed out\n", genpd->name);
+
+       /* Wait for reset to propagate through peripherals */
+       usleep_range(5, 10);
 
        /* Disable reset clocks for all devices in the domain */
        for (i = 0; i < pd->num_clks; i++)
        .rd_table = &access_table,
        .wr_table = &access_table,
        .max_register = 0x2ac,
+       .fast_io = true,
 };
 
 static struct generic_pm_domain *imx_gpc_onecell_domains[] = {