summaryrefslogtreecommitdiff
path: root/sound/soc/tegra/tegra_asoc_utils.c
diff options
context:
space:
mode:
authorSumit Bhattacharya <sumitb@nvidia.com>2011-11-11 19:01:19 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:50:01 -0800
commitf4fbf45d89ba27da05f37b35d0a67308df2a2a22 (patch)
tree8d30abdaf077c03f13359c6c300fab7d9d7fcd7e /sound/soc/tegra/tegra_asoc_utils.c
parent7285d4751fa2048bbe5e4981ac1afda09770ec89 (diff)
ASoC: Tegra: Don't allow PLL rate change while it is in use
Expose a new API to lock pll_a, pll_a_out0 and mclk rates. Any dai-link which sets any of these clocks should call this API from hwparam() to lock these rates and should release the lock once dai-link shutdown is called. When lock is held by any dai-link request for change in any of these clocks will not be granted. Bug 872652 Change-Id: I583b4849acde7e588531e60c6c5cd5156badb4f2 Signed-off-by: Sumit Bhattacharya <sumitb@nvidia.com> Reviewed-on: http://git-master/r/63828 Reviewed-by: Scott Peterson <speterson@nvidia.com> Rebase-Id: R044806997c82a11115a6a110196ac82402aceca5
Diffstat (limited to 'sound/soc/tegra/tegra_asoc_utils.c')
-rw-r--r--sound/soc/tegra/tegra_asoc_utils.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/sound/soc/tegra/tegra_asoc_utils.c b/sound/soc/tegra/tegra_asoc_utils.c
index 5b3ee2308f48..c517bd04e2da 100644
--- a/sound/soc/tegra/tegra_asoc_utils.c
+++ b/sound/soc/tegra/tegra_asoc_utils.c
@@ -66,6 +66,10 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate,
if (!clk_change)
return 0;
+ /* Don't change rate if already one dai-link is using it */
+ if (data->lock_count)
+ return -EINVAL;
+
data->set_baseclock = 0;
data->set_mclk = 0;
@@ -112,6 +116,16 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate,
}
EXPORT_SYMBOL_GPL(tegra_asoc_utils_set_rate);
+void tegra_asoc_utils_lock_clk_rate(struct tegra_asoc_utils_data *data,
+ int lock)
+{
+ if (lock)
+ data->lock_count++;
+ else if (data->lock_count)
+ data->lock_count--;
+}
+EXPORT_SYMBOL_GPL(tegra_asoc_utils_lock_clk_rate);
+
int tegra_asoc_utils_clk_enable(struct tegra_asoc_utils_data *data)
{
int err;