summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/soc/fsl/fsl_asrc.c3
-rw-r--r--sound/soc/fsl/fsl_asrc_m2m.c25
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);
+ }
+}