[alsa-devel] [PATCH] ASoC: davinci-mcasp: add support for suspend and resume
Gururaja Hebbar
gururaja.hebbar at ti.com
Thu Oct 3 08:48:58 CEST 2013
On Tuesday 01 October 2013 06:20 PM, Daniel Mack wrote:
> When the system returns from suspend, it looses its configuration. Most
> of it is restored by running a normal audio stream startup, but the DAI
> format is left unset as that's configured on the audio device creation.
>
> Hence, it suffices here to care for the registers which are touched by
> davinci_mcasp_set_dai_fmt() and restore them when the system is resumed.
I believe you have confirmed below are the only registers/fields which
will lose context across suspend/resume.
Regards
Gururaja
>
> Signed-off-by: Daniel Mack <zonque at gmail.com>
> ---
> sound/soc/davinci/davinci-mcasp.c | 39 +++++++++++++++++++++++++++++++++++++++
> sound/soc/davinci/davinci-mcasp.h | 12 ++++++++++++
> 2 files changed, 51 insertions(+)
>
> diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
> index 591f853..5023da7 100644
> --- a/sound/soc/davinci/davinci-mcasp.c
> +++ b/sound/soc/davinci/davinci-mcasp.c
> @@ -1272,12 +1272,51 @@ static int davinci_mcasp_remove(struct platform_device *pdev)
> return 0;
> }
>
> +#ifdef CONFIG_PM_SLEEP
> +static int davinci_mcasp_suspend(struct device *dev)
> +{
> + struct davinci_audio_dev *a = dev_get_drvdata(dev);
> + void __iomem *base = a->base;
> +
> + a->context.txfmtctl = mcasp_get_reg(base + DAVINCI_MCASP_TXFMCTL_REG);
> + a->context.rxfmtctl = mcasp_get_reg(base + DAVINCI_MCASP_RXFMCTL_REG);
> + a->context.txfmt = mcasp_get_reg(base + DAVINCI_MCASP_TXFMT_REG);
> + a->context.rxfmt = mcasp_get_reg(base + DAVINCI_MCASP_RXFMT_REG);
> + a->context.aclkxctl = mcasp_get_reg(base + DAVINCI_MCASP_ACLKXCTL_REG);
> + a->context.aclkrctl = mcasp_get_reg(base + DAVINCI_MCASP_ACLKRCTL_REG);
> + a->context.pdir = mcasp_get_reg(base + DAVINCI_MCASP_PDIR_REG);
> +
> + return 0;
> +}
> +
> +static int davinci_mcasp_resume(struct device *dev)
> +{
> + struct davinci_audio_dev *a = dev_get_drvdata(dev);
> + void __iomem *base = a->base;
> +
> + mcasp_set_reg(base + DAVINCI_MCASP_TXFMCTL_REG, a->context.txfmtctl);
> + mcasp_set_reg(base + DAVINCI_MCASP_RXFMCTL_REG, a->context.rxfmtctl);
> + mcasp_set_reg(base + DAVINCI_MCASP_TXFMT_REG, a->context.txfmt);
> + mcasp_set_reg(base + DAVINCI_MCASP_RXFMT_REG, a->context.rxfmt);
> + mcasp_set_reg(base + DAVINCI_MCASP_ACLKXCTL_REG, a->context.aclkxctl);
> + mcasp_set_reg(base + DAVINCI_MCASP_ACLKRCTL_REG, a->context.aclkrctl);
> + mcasp_set_reg(base + DAVINCI_MCASP_PDIR_REG, a->context.pdir);
> +
> + return 0;
> +}
> +#endif
> +
> +SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
> + davinci_mcasp_suspend,
> + davinci_mcasp_resume);
> +
> static struct platform_driver davinci_mcasp_driver = {
> .probe = davinci_mcasp_probe,
> .remove = davinci_mcasp_remove,
> .driver = {
> .name = "davinci-mcasp",
> .owner = THIS_MODULE,
> + .pm = &davinci_mcasp_pm_ops,
> .of_match_table = mcasp_dt_ids,
> },
> };
> diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h
> index a9ac0c1..a2e27e1 100644
> --- a/sound/soc/davinci/davinci-mcasp.h
> +++ b/sound/soc/davinci/davinci-mcasp.h
> @@ -43,6 +43,18 @@ struct davinci_audio_dev {
> /* McASP FIFO related */
> u8 txnumevt;
> u8 rxnumevt;
> +
> +#ifdef CONFIG_PM_SLEEP
> + struct {
> + u32 txfmtctl;
> + u32 rxfmtctl;
> + u32 txfmt;
> + u32 rxfmt;
> + u32 aclkxctl;
> + u32 aclkrctl;
> + u32 pdir;
> + } context;
> +#endif
> };
>
> #endif /* DAVINCI_MCASP_H */
>
More information about the Alsa-devel
mailing list