diff options
-rw-r--r-- | sound/soc/omap/omap-mcpdm.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c index 11bd07cdce22..74d6e6fdcfd0 100644 --- a/sound/soc/omap/omap-mcpdm.c +++ b/sound/soc/omap/omap-mcpdm.c | |||
@@ -66,6 +66,9 @@ struct omap_mcpdm { | |||
66 | /* McPDM needs to be restarted due to runtime reconfiguration */ | 66 | /* McPDM needs to be restarted due to runtime reconfiguration */ |
67 | bool restart; | 67 | bool restart; |
68 | 68 | ||
69 | /* pm state for suspend/resume handling */ | ||
70 | int pm_active_count; | ||
71 | |||
69 | struct snd_dmaengine_dai_dma_data dma_data[2]; | 72 | struct snd_dmaengine_dai_dma_data dma_data[2]; |
70 | }; | 73 | }; |
71 | 74 | ||
@@ -422,12 +425,55 @@ static int omap_mcpdm_remove(struct snd_soc_dai *dai) | |||
422 | return 0; | 425 | return 0; |
423 | } | 426 | } |
424 | 427 | ||
428 | #ifdef CONFIG_PM_SLEEP | ||
429 | static int omap_mcpdm_suspend(struct snd_soc_dai *dai) | ||
430 | { | ||
431 | struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); | ||
432 | |||
433 | if (dai->active) { | ||
434 | omap_mcpdm_stop(mcpdm); | ||
435 | omap_mcpdm_close_streams(mcpdm); | ||
436 | } | ||
437 | |||
438 | mcpdm->pm_active_count = 0; | ||
439 | while (pm_runtime_active(mcpdm->dev)) { | ||
440 | pm_runtime_put_sync(mcpdm->dev); | ||
441 | mcpdm->pm_active_count++; | ||
442 | } | ||
443 | |||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | static int omap_mcpdm_resume(struct snd_soc_dai *dai) | ||
448 | { | ||
449 | struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); | ||
450 | |||
451 | if (mcpdm->pm_active_count) { | ||
452 | while (mcpdm->pm_active_count--) | ||
453 | pm_runtime_get_sync(mcpdm->dev); | ||
454 | |||
455 | if (dai->active) { | ||
456 | omap_mcpdm_open_streams(mcpdm); | ||
457 | omap_mcpdm_start(mcpdm); | ||
458 | } | ||
459 | } | ||
460 | |||
461 | |||
462 | return 0; | ||
463 | } | ||
464 | #else | ||
465 | #define omap_mcpdm_suspend NULL | ||
466 | #define omap_mcpdm_resume NULL | ||
467 | #endif | ||
468 | |||
425 | #define OMAP_MCPDM_RATES (SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) | 469 | #define OMAP_MCPDM_RATES (SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) |
426 | #define OMAP_MCPDM_FORMATS SNDRV_PCM_FMTBIT_S32_LE | 470 | #define OMAP_MCPDM_FORMATS SNDRV_PCM_FMTBIT_S32_LE |
427 | 471 | ||
428 | static struct snd_soc_dai_driver omap_mcpdm_dai = { | 472 | static struct snd_soc_dai_driver omap_mcpdm_dai = { |
429 | .probe = omap_mcpdm_probe, | 473 | .probe = omap_mcpdm_probe, |
430 | .remove = omap_mcpdm_remove, | 474 | .remove = omap_mcpdm_remove, |
475 | .suspend = omap_mcpdm_suspend, | ||
476 | .resume = omap_mcpdm_resume, | ||
431 | .probe_order = SND_SOC_COMP_ORDER_LATE, | 477 | .probe_order = SND_SOC_COMP_ORDER_LATE, |
432 | .remove_order = SND_SOC_COMP_ORDER_EARLY, | 478 | .remove_order = SND_SOC_COMP_ORDER_EARLY, |
433 | .playback = { | 479 | .playback = { |