[alsa-devel] [PATCH v3 1/4] ASoC: fsl_sai: Add driver suspend and resume to support MEGA Fast

Nicolin Chen nicoleotsuka at gmail.com
Tue Aug 11 11:12:21 CEST 2015


On Fri, Aug 07, 2015 at 02:21:05PM +0800, Zidan Wang wrote:
> For i.MX6 SoloX, there is a mode of the SoC to shutdown all power source of
> modules during system suspend and resume procedure. Thus, SAI needs to save
> all the values of registers before the system suspend and restore them after
> the system resume.
> 
> Signed-off-by: Zidan Wang <zidan.wang at freescale.com>

Have you tested this series based on the for-next branch?

I'm having trouble with suspend/resume test on my imx6sx-sdb.
Both broonie/for-next and linux-next/master hanged after suspend
even without this PATCH -- There should be some other patches
that broke the suspend/resume. Do you know which one?

Nicolin

> ---
>  sound/soc/fsl/fsl_sai.c | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
> 
> diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
> index a18fd92..5c737f1 100644
> --- a/sound/soc/fsl/fsl_sai.c
> +++ b/sound/soc/fsl/fsl_sai.c
> @@ -637,6 +637,8 @@ static bool fsl_sai_readable_reg(struct device *dev, unsigned int reg)
>  static bool fsl_sai_volatile_reg(struct device *dev, unsigned int reg)
>  {
>  	switch (reg) {
> +	case FSL_SAI_TCSR:
> +	case FSL_SAI_RCSR:
>  	case FSL_SAI_TFR:
>  	case FSL_SAI_RFR:
>  	case FSL_SAI_TDR:
> @@ -681,6 +683,7 @@ static const struct regmap_config fsl_sai_regmap_config = {
>  	.readable_reg = fsl_sai_readable_reg,
>  	.volatile_reg = fsl_sai_volatile_reg,
>  	.writeable_reg = fsl_sai_writeable_reg,
> +	.cache_type = REGCACHE_FLAT,
>  };
>  
>  static int fsl_sai_probe(struct platform_device *pdev)
> @@ -802,10 +805,40 @@ static const struct of_device_id fsl_sai_ids[] = {
>  	{ /* sentinel */ }
>  };
>  
> +#if CONFIG_PM_SLEEP
> +static int fsl_sai_suspend(struct device *dev)
> +{
> +	struct fsl_sai *sai = dev_get_drvdata(dev);
> +
> +	regcache_cache_only(sai->regmap, true);
> +	regcache_mark_dirty(sai->regmap);
> +
> +	return 0;
> +}
> +
> +static int fsl_sai_resume(struct device *dev)
> +{
> +	struct fsl_sai *sai = dev_get_drvdata(dev);
> +
> +	regcache_cache_only(sai->regmap, false);
> +	regmap_write(sai->regmap, FSL_SAI_TCSR, FSL_SAI_CSR_SR);
> +	regmap_write(sai->regmap, FSL_SAI_RCSR, FSL_SAI_CSR_SR);
> +	msleep(1);
> +	regmap_write(sai->regmap, FSL_SAI_TCSR, 0);
> +	regmap_write(sai->regmap, FSL_SAI_RCSR, 0);
> +	return regcache_sync(sai->regmap);
> +}
> +#endif /* CONFIG_PM_SLEEP */
> +
> +static const struct dev_pm_ops fsl_sai_pm_ops = {
> +	SET_SYSTEM_SLEEP_PM_OPS(fsl_sai_suspend, fsl_sai_resume)
> +};
> +
>  static struct platform_driver fsl_sai_driver = {
>  	.probe = fsl_sai_probe,
>  	.driver = {
>  		.name = "fsl-sai",
> +		.pm = &fsl_sai_pm_ops,
>  		.of_match_table = fsl_sai_ids,
>  	},
>  };
> -- 
> 1.9.1
> 


More information about the Alsa-devel mailing list