summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorJorge Eduardo Candelaria <jorge.candelaria@ti.com>2010-10-28 08:24:48 -0500
committerSebastien Jan <s-jan@ti.com>2010-12-17 10:48:16 +0100
commit4edd596897a9dff1481b5f1a1cf7ab85c1d87535 (patch)
treec54ab8f7289070ead15bd0216fea9f0132e0e2b7 /sound
parent54c1638bc95c2ce575e9a55c2802cbad5e58047b (diff)
ASoC: abe-dsp: Prepare aess for OFF
The context is lost during transition to OFF. To recover, we need to reload PMEM in ABE. This patch is based on McBSP and McPDM drivers. Change-Id: Ia40650cbb3174e89f6d4342090e245c110a96f9a Signed-off-by: Jorge Eduardo Candelaria <jorge.candelaria@ti.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/omap/omap-abe-dsp.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/sound/soc/omap/omap-abe-dsp.c b/sound/soc/omap/omap-abe-dsp.c
index bc4d95a36bd3..1dda164fe44f 100644
--- a/sound/soc/omap/omap-abe-dsp.c
+++ b/sound/soc/omap/omap-abe-dsp.c
@@ -167,6 +167,8 @@ struct abe_data {
u16 router[16];
+ int loss_count;
+
struct snd_pcm_substream *psubs;
#ifdef CONFIG_DEBUG_FS
@@ -2221,9 +2223,59 @@ static struct snd_soc_platform_driver omap_aess_platform = {
.stream_event = aess_stream_event,
};
+#if CONFIG_PM
+static int aess_suspend(struct device *dev)
+{
+ struct platform_device *pdev;
+ struct omap4_abe_dsp_pdata *pdata;
+ struct abe_data *abe = dev_get_drvdata(dev);
+
+ pdev = to_platform_device(dev);
+ pdata = pdev->dev.platform_data;
+
+ if (pdata->get_context_loss_count)
+ abe->loss_count = pdata->get_context_loss_count(dev);
+
+ return 0;
+}
+
+static int aess_resume(struct device *dev)
+{
+ struct platform_device *pdev;
+ struct omap4_abe_dsp_pdata *pdata;
+ struct abe_data *abe = dev_get_drvdata(dev);
+ int loss_count = 0;
+
+ pdev = to_platform_device(dev);
+ pdata = pdev->dev.platform_data;
+
+ if (pdata->get_context_loss_count)
+ loss_count = pdata->get_context_loss_count(dev);
+
+ pm_runtime_get_sync(&pdev->dev);
+
+ if (loss_count != abe->loss_count)
+ abe_reload_fw();
+
+ pm_runtime_put_sync(&pdev->dev);
+
+ return 0;
+}
+
+#else
+#define aess_runtime_suspend NULL
+#define aess_runtime_resume NULL
+#endif
+
+static const struct dev_pm_ops aess_pm_ops = {
+ .suspend = aess_suspend,
+ .resume = aess_resume,
+};
+
static int __devinit abe_engine_probe(struct platform_device *pdev)
{
struct resource *res;
+ struct omap4_abe_dsp_pdata *pdata = pdev->dev.platform_data;
int ret = -EINVAL, i;
abe = kzalloc(sizeof(struct abe_data), GFP_KERNEL);
@@ -2255,7 +2307,7 @@ static int __devinit abe_engine_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev);
- abe->abe_pdata = pdev->dev.platform_data;
+ abe->abe_pdata = pdata;
abe->pdev = pdev;
mutex_init(&abe->mutex);
@@ -2298,6 +2350,7 @@ static struct platform_driver omap_aess_driver = {
.driver = {
.name = "omap-aess-audio",
.owner = THIS_MODULE,
+ .pm = &aess_pm_ops,
},
.probe = abe_engine_probe,
.remove = __devexit_p(abe_engine_remove),