From 81b5f0ecbdd62527057a7514ec36eb5a93ee7336 Mon Sep 17 00:00:00 2001 From: Dara Ramesh Date: Fri, 27 Jun 2014 15:56:29 +0530 Subject: [PATCH] ASoC: tegra-alt: t210: add pinmux support for i2s This change is for adding dap pinmux support for i2s devices through device tree. pinmux states (tristate enable/disable) are dynamically controlled based on PM runtime state. bug 200016630 Change-Id: I63cda853a6e20858984b14d6111697edec1b66f1 Signed-off-by: Dara Ramesh Reviewed-on: http://git-master/r/432150 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Sumit Bhattacharya Reviewed-by: Songhee Baek Reviewed-by: Laxman Dewangan --- sound/soc/tegra-alt/tegra210_i2s_alt.c | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/sound/soc/tegra-alt/tegra210_i2s_alt.c b/sound/soc/tegra-alt/tegra210_i2s_alt.c index 01199e08..8531816c 100644 --- a/sound/soc/tegra-alt/tegra210_i2s_alt.c +++ b/sound/soc/tegra-alt/tegra210_i2s_alt.c @@ -82,6 +82,13 @@ static int tegra210_i2s_set_clock_rate(struct device *dev, int clock_rate) static int tegra210_i2s_runtime_suspend(struct device *dev) { struct tegra210_i2s *i2s = dev_get_drvdata(dev); + int ret; + + if (!IS_ERR(i2s->pin_idle_state)) { + ret = pinctrl_select_state(i2s->pinctrl, i2s->pin_idle_state); + if (ret < 0) + dev_err(dev, "setting dap pinctrl idle state failed\n"); + } regcache_cache_only(i2s->regmap, true); clk_disable_unprepare(i2s->clk_i2s); @@ -94,6 +101,13 @@ static int tegra210_i2s_runtime_resume(struct device *dev) struct tegra210_i2s *i2s = dev_get_drvdata(dev); int ret; + if (!IS_ERR(i2s->pin_default_state)) { + ret = pinctrl_select_state(i2s->pinctrl, + i2s->pin_default_state); + if (ret < 0) + dev_err(dev, "setting dap pinctrl default state failed\n"); + } + ret = clk_prepare_enable(i2s->clk_i2s); if (ret) { dev_err(dev, "clk_enable failed: %d\n", ret); @@ -591,6 +605,33 @@ static int tegra210_i2s_platform_probe(struct platform_device *pdev) goto err_pll_a_out0_clk_put; } + i2s->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR(i2s->pinctrl)) { + dev_warn(&pdev->dev, "Missing pinctrl device\n"); + goto err_dap; + } + + i2s->pin_default_state = pinctrl_lookup_state(i2s->pinctrl, + "dap_active"); + if (IS_ERR(i2s->pin_default_state)) { + dev_warn(&pdev->dev, "Missing dap-active state\n"); + goto err_dap; + } + + i2s->pin_idle_state = pinctrl_lookup_state(i2s->pinctrl, + "dap_inactive"); + if (IS_ERR(i2s->pin_idle_state)) { + dev_warn(&pdev->dev, "Missing dap-inactive state\n"); + goto err_dap; + } + + ret = pinctrl_select_state(i2s->pinctrl, i2s->pin_idle_state); + if (ret < 0) { + dev_err(&pdev->dev, "setting state failed\n"); + goto err_dap; + } + +err_dap: pm_runtime_enable(&pdev->dev); if (!pm_runtime_enabled(&pdev->dev)) { ret = tegra210_i2s_runtime_resume(&pdev->dev);