summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-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;