summaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
authorRickard Andersson <rickard.andersson@stericsson.com>2011-04-01 10:38:22 +0200
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 15:15:06 +0200
commit006b02032f159e955c7d8cf31ebde3e64feaa3e6 (patch)
tree4dd69bd8f18128b81f5967f38308bef602582d96 /arch/arm
parent0d3644b8626deaff53292cae6d5dde346e6f40f6 (diff)
mach-ux500: clock: correct AB8500 internal clock handling
Change settings for AB internal clock handling. Now the internal clock used by the AB ASIC is always sysclk if both sysclk and ulpclk are present. ST-Ericsson Linux next: - ST-Ericsson ID: 325090 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I4b3f8ed5dd2158954bb1bd40795a6a55cc38512f Signed-off-by: Rickard Andersson <rickard.andersson@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/19683 Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com> Tested-by: Mattias NILSSON <mattias.i.nilsson@stericsson.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-ux500/clock-db8500.c18
-rw-r--r--arch/arm/mach-ux500/clock.c21
2 files changed, 15 insertions, 24 deletions
diff --git a/arch/arm/mach-ux500/clock-db8500.c b/arch/arm/mach-ux500/clock-db8500.c
index 874e8617197..57db0226b3c 100644
--- a/arch/arm/mach-ux500/clock-db8500.c
+++ b/arch/arm/mach-ux500/clock-db8500.c
@@ -145,7 +145,8 @@ static int ab_ulpclk_enable(struct clk *clk)
if (err)
return err;
return ab8500_sysctrl_set(AB8500_SYSULPCLKCTRL1,
- AB8500_SYSULPCLKCTRL1_ULPCLKREQ);
+ (AB8500_SYSULPCLKCTRL1_ULPCLKREQ |
+ AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK));
}
static void ab_ulpclk_disable(struct clk *clk)
@@ -185,24 +186,9 @@ static void audioclk_disable(struct clk *clk)
}
}
-static int audioclk_set_parent(struct clk *clk, struct clk *parent)
-{
- if (parent->ops == &sysclk_ops) {
- return ab8500_sysctrl_clear(AB8500_SYSULPCLKCTRL1,
- AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK);
- } else if (parent->ops == &ab_ulpclk_ops) {
- return ab8500_sysctrl_write(AB8500_SYSULPCLKCTRL1,
- AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK,
- (1 << AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_SHIFT));
- } else {
- return -EINVAL;
- }
-}
-
static struct clkops audioclk_ops = {
.enable = audioclk_enable,
.disable = audioclk_disable,
- .set_parent = audioclk_set_parent,
};
/* Primary camera clock operations */
diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c
index 2fa1aba0fe1..4963eba3b33 100644
--- a/arch/arm/mach-ux500/clock.c
+++ b/arch/arm/mach-ux500/clock.c
@@ -246,7 +246,7 @@ EXPORT_SYMBOL(clk_set_rate);
int clk_set_parent(struct clk *clk, struct clk *parent)
{
- int err = -EINVAL;
+ int err = 0;
unsigned long flags;
struct clk **p;
@@ -259,15 +259,20 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
__clk_lock(clk, NO_LOCK, &flags);
- if (clk->enabled) {
- err = -EINVAL;
- } else {
- if ((clk->ops != NULL) && (clk->ops->set_parent != NULL))
- err = clk->ops->set_parent(clk, parent);
- if (!err)
- clk->parent = parent;
+ if ((clk->ops != NULL) && (clk->ops->set_parent != NULL)) {
+ err = clk->ops->set_parent(clk, parent);
+ if (err)
+ goto unlock_and_return;
+ } else if (clk->enabled) {
+ err = __clk_enable(parent, clk->mutex);
+ if (err)
+ goto unlock_and_return;
+ __clk_disable(clk->parent, clk->mutex);
}
+ clk->parent = parent;
+
+unlock_and_return:
__clk_unlock(clk, NO_LOCK, flags);
return err;