|
|
@@ -424,8 +424,11 @@ int uniphier_aio_dai_suspend(struct snd_soc_dai *dai)
|
|
|
{
|
|
|
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;
|
|
|
}
|
|
|
@@ -439,13 +442,15 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai)
|
|
|
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);
|
|
|
@@ -458,7 +463,7 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai)
|
|
|
|
|
|
ret = aio_init(sub);
|
|
|
if (ret)
|
|
|
- goto err_out_clock;
|
|
|
+ goto err_out_reset;
|
|
|
|
|
|
if (!sub->setting)
|
|
|
continue;
|
|
|
@@ -466,11 +471,16 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai)
|
|
|
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;
|
|
|
}
|
|
|
@@ -619,6 +629,7 @@ int uniphier_aio_probe(struct platform_device *pdev)
|
|
|
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);
|