From 90fef9aa1b33bdbe436ec94177d7ec834371b6a8 Mon Sep 17 00:00:00 2001 From: Inha Song Date: Wed, 15 Apr 2015 16:38:27 +0900 Subject: LOCAL / ASoC: samsung: Add pm ops to lpass driver This patch add pm ops to lpass driver. After resume, We should toggle LPASS_CORE_SW_RESET to reset lpass IPs. Signed-off-by: Inha Song --- sound/soc/samsung/lpass.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'sound') diff --git a/sound/soc/samsung/lpass.c b/sound/soc/samsung/lpass.c index 8129a8082967..c9be9e896225 100644 --- a/sound/soc/samsung/lpass.c +++ b/sound/soc/samsung/lpass.c @@ -67,6 +67,21 @@ static void lpass_enable(struct lpass_info *lpass) lpass_core_sw_reset(lpass, SW_RESET_MEM); } +static void lpass_disable(struct lpass_info *lpass) +{ + if (!lpass->reg_pmu) + return; + + /* Masks SFR, DMA, I2S Interrupt */ + writel(0, lpass->reg_sfr + SFR_LPASS_INTR_CA5_MASK); + + writel(0, lpass->reg_sfr + SFR_LPASS_INTR_CPU_MASK); + + /* Inactive related PADs from retention state */ + regmap_write(lpass->reg_pmu, + EXYNOS5433_PAD_RETENTION_AUD_OPTION_OFFSET, 0); +} + static int lpass_probe(struct platform_device *pdev) { struct lpass_info *lpass; @@ -108,16 +123,40 @@ static int lpass_probe(struct platform_device *pdev) return 0; } +static int lpass_suspend(struct device *dev) +{ + struct lpass_info *lpass = dev_get_drvdata(dev); + + lpass_disable(lpass); + + return 0; +} + +static int lpass_resume(struct device *dev) +{ + struct lpass_info *lpass = dev_get_drvdata(dev); + + lpass_enable(lpass); + + return 0; +} + static const struct of_device_id lpass_of_match[] = { { .compatible = "samsung,exynos5433-lpass", }, { }, }; MODULE_DEVICE_TABLE(of, lpass_of_match); +static const struct dev_pm_ops lpass_pm_ops = { + .suspend = lpass_suspend, + .resume = lpass_resume, +}; + static struct platform_driver lpass_driver = { .driver = { .name = "samsung-lpass", .owner = THIS_MODULE, + .pm = &lpass_pm_ops, .of_match_table = lpass_of_match, }, .probe = lpass_probe, -- cgit v1.2.3