diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm/mach-ux500/clock-db8500.c | 18 | ||||
| -rw-r--r-- | arch/arm/mach-ux500/clock.c | 21 |
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; |
