{
        struct uniphier_aio *aio = uniphier_priv(dai);
 
-       reset_control_assert(aio->chip->rst);
-       clk_disable_unprepare(aio->chip->clk);
+       aio->chip->num_wup_aios--;
+       if (!aio->chip->num_wup_aios) {
+               reset_control_assert(aio->chip->rst);
+               clk_disable_unprepare(aio->chip->clk);
+       }
 
        return 0;
 }
        if (!aio->chip->active)
                return 0;
 
-       ret = clk_prepare_enable(aio->chip->clk);
-       if (ret)
-               return ret;
+       if (!aio->chip->num_wup_aios) {
+               ret = clk_prepare_enable(aio->chip->clk);
+               if (ret)
+                       return ret;
 
-       ret = reset_control_deassert(aio->chip->rst);
-       if (ret)
-               goto err_out_clock;
+               ret = reset_control_deassert(aio->chip->rst);
+               if (ret)
+                       goto err_out_clock;
+       }
 
        aio_iecout_set_enable(aio->chip, true);
        aio_chip_init(aio->chip);
 
                ret = aio_init(sub);
                if (ret)
-                       goto err_out_clock;
+                       goto err_out_reset;
 
                if (!sub->setting)
                        continue;
                aio_port_reset(sub);
                aio_src_reset(sub);
        }
+       aio->chip->num_wup_aios++;
 
        return 0;
 
+err_out_reset:
+       if (!aio->chip->num_wup_aios)
+               reset_control_assert(aio->chip->rst);
 err_out_clock:
-       clk_disable_unprepare(aio->chip->clk);
+       if (!aio->chip->num_wup_aios)
+               clk_disable_unprepare(aio->chip->clk);
 
        return ret;
 }
                return PTR_ERR(chip->rst);
 
        chip->num_aios = chip->chip_spec->num_dais;
+       chip->num_wup_aios = chip->num_aios;
        chip->aios = devm_kcalloc(dev,
                                  chip->num_aios, sizeof(struct uniphier_aio),
                                  GFP_KERNEL);