diff options
-rw-r--r-- | sound/soc/fsl/fsl_asrc.c | 3 | ||||
-rw-r--r-- | sound/soc/fsl/fsl_asrc_m2m.c | 25 |
2 files changed, 28 insertions, 0 deletions
diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c index ede17dddae6a..c1db84d6756a 100644 --- a/sound/soc/fsl/fsl_asrc.c +++ b/sound/soc/fsl/fsl_asrc.c @@ -1235,10 +1235,13 @@ static int fsl_asrc_suspend(struct device *dev) static int fsl_asrc_resume(struct device *dev) { + struct fsl_asrc *asrc_priv = dev_get_drvdata(dev); int ret; ret = pm_runtime_force_resume(dev); + fsl_asrc_m2m_resume(asrc_priv); + return ret; } #endif /* CONFIG_PM_SLEEP */ diff --git a/sound/soc/fsl/fsl_asrc_m2m.c b/sound/soc/fsl/fsl_asrc_m2m.c index 2684518d26ee..9c5a2a2805f4 100644 --- a/sound/soc/fsl/fsl_asrc_m2m.c +++ b/sound/soc/fsl/fsl_asrc_m2m.c @@ -1021,3 +1021,28 @@ static void fsl_asrc_m2m_suspend(struct fsl_asrc *asrc_priv) spin_unlock_irqrestore(&asrc_priv->lock, lock_flags); } } + +static void fsl_asrc_m2m_resume(struct fsl_asrc *asrc_priv) +{ + struct fsl_asrc_pair *pair; + struct fsl_asrc_m2m *m2m; + unsigned long lock_flags; + enum asrc_pair_index index; + int i, j; + + for (i = 0; i < ASRC_PAIR_MAX_NUM; i++) { + spin_lock_irqsave(&asrc_priv->lock, lock_flags); + pair = asrc_priv->pair[i]; + if (!pair || !pair->private) { + spin_unlock_irqrestore(&asrc_priv->lock, lock_flags); + continue; + } + m2m = pair->private; + index = pair->index; + + for (j = 0; j < pair->channels * 4; j++) + regmap_write(asrc_priv->regmap, REG_ASRDI(index), 0); + + spin_unlock_irqrestore(&asrc_priv->lock, lock_flags); + } +} |