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 <dramesh@nvidia.com>
Reviewed-on: http://git-master/r/432150
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-by: Songhee Baek <sbaek@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
This commit is contained in:
Dara Ramesh
2014-06-27 15:56:29 +05:30
committed by Sameer Pujar
parent b097ef0c7b
commit 81b5f0ecbd

View File

@@ -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) static int tegra210_i2s_runtime_suspend(struct device *dev)
{ {
struct tegra210_i2s *i2s = dev_get_drvdata(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); regcache_cache_only(i2s->regmap, true);
clk_disable_unprepare(i2s->clk_i2s); 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); struct tegra210_i2s *i2s = dev_get_drvdata(dev);
int ret; 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); ret = clk_prepare_enable(i2s->clk_i2s);
if (ret) { if (ret) {
dev_err(dev, "clk_enable failed: %d\n", 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; 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); pm_runtime_enable(&pdev->dev);
if (!pm_runtime_enabled(&pdev->dev)) { if (!pm_runtime_enabled(&pdev->dev)) {
ret = tegra210_i2s_runtime_resume(&pdev->dev); ret = tegra210_i2s_runtime_resume(&pdev->dev);