summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/clock.h
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 /arch/arm/mach-tegra/clock.h
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
Diffstat (limited to 'arch/arm/mach-tegra/clock.h')
-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)