summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorInha Song <ideal.song@samsung.com>2015-04-15 16:38:27 +0900
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-12-14 13:43:21 +0900
commit90fef9aa1b33bdbe436ec94177d7ec834371b6a8 (patch)
tree1a1e6aa47a427c6c71db1337c1c0f7962fbf7fd8 /sound
parent8bc75d58ba92b18a68da7332432287adffb41135 (diff)
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 <ideal.song@samsung.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/samsung/lpass.c39
1 files changed, 39 insertions, 0 deletions
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,