summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2012-07-10 22:59:48 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:13:56 -0700
commitb4e2dabb08156b2e333dbe94c9bc58cf162c4878 (patch)
treec323638c45289ae9aa6d14642ac0c7c6888320ad
parent0304d7d76c975a5bb49299d92e379557cacb7187 (diff)
ARM: tegra: clock: Add cross-clock locking option
Added an option to serialize clock operations for several clocks (in addition to individual clock locking). This option may be used, for example, when moving clocks between virtual buses or to support clocks with different dvfs tables, but common enable control. Change-Id: I88b366d4109bdb6ae952385dd84fab392715ac10 Signed-off-by: Alex Frid <afrid@nvidia.com> Reviewed-on: http://git-master/r/117247 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Rebase-Id: Rb5183f53b71e240234cda950cb6bddf07437c4db
-rw-r--r--arch/arm/mach-tegra/clock.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h
index 9ea637630d19..38ab923ef257 100644
--- a/arch/arm/mach-tegra/clock.h
+++ b/arch/arm/mach-tegra/clock.h
@@ -241,6 +241,7 @@ struct clk {
struct raw_notifier_head *rate_change_nh;
+ struct mutex *cross_clk_mutex;
struct mutex mutex;
spinlock_t spinlock;
};
@@ -380,6 +381,8 @@ static inline void clk_lock_save(struct clk *c, unsigned long *flags)
if (clk_cansleep(c)) {
*flags = 0;
mutex_lock(&c->mutex);
+ if (c->cross_clk_mutex)
+ mutex_lock(c->cross_clk_mutex);
} else {
spin_lock_irqsave(&c->spinlock, *flags);
}
@@ -387,10 +390,13 @@ static inline void clk_lock_save(struct clk *c, unsigned long *flags)
static inline void clk_unlock_restore(struct clk *c, unsigned long *flags)
{
- if (clk_cansleep(c))
+ if (clk_cansleep(c)) {
+ if (c->cross_clk_mutex)
+ mutex_unlock(c->cross_clk_mutex);
mutex_unlock(&c->mutex);
- else
+ } else {
spin_unlock_irqrestore(&c->spinlock, *flags);
+ }
}
static inline void clk_lock_init(struct clk *c)