diff options
author | Sumit Bhattacharya <sumitb@nvidia.com> | 2011-11-11 19:01:19 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:50:01 -0800 |
commit | f4fbf45d89ba27da05f37b35d0a67308df2a2a22 (patch) | |
tree | 8d30abdaf077c03f13359c6c300fab7d9d7fcd7e /sound | |
parent | 7285d4751fa2048bbe5e4981ac1afda09770ec89 (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')
-rw-r--r-- | sound/soc/tegra/tegra_asoc_utils.c | 14 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_asoc_utils.h | 3 |
2 files changed, 17 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; diff --git a/sound/soc/tegra/tegra_asoc_utils.h b/sound/soc/tegra/tegra_asoc_utils.h index 9d8471861d6e..72d3994a935f 100644 --- a/sound/soc/tegra/tegra_asoc_utils.h +++ b/sound/soc/tegra/tegra_asoc_utils.h @@ -34,10 +34,13 @@ struct tegra_asoc_utils_data { struct clk *clk_out1; int set_baseclock; int set_mclk; + int lock_count; }; int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate, int mclk); +void tegra_asoc_utils_lock_clk_rate(struct tegra_asoc_utils_data *data, + int lock); int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data, struct device *dev); void tegra_asoc_utils_fini(struct tegra_asoc_utils_data *data); |