Commit 8f76216c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'clk-fixes-for-linus' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/clk/linux

Pull clk fixes from Stephen Boyd:
 "Two fixes for the NKMP clks on Allwinner SoCs, a locking fix for
  clkdev where we forgot to hold a lock while iterating a list that can
  change, and finally a build fix that adds some stubs for clk APIs that
  are used by devfreq drivers on platforms without the clk APIs"

* tag 'clk-fixes-for-linus' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/clk/linux:
  clk: Add missing stubs for a few functions
  clkdev: Hold clocks_mutex while iterating clocks list
  clk: sunxi-ng: nkmp: Explain why zero width check is needed
  clk: sunxi-ng: nkmp: Avoid GENMASK(-1, 0)
parents 46572f78 b88c9f41
...@@ -46,6 +46,8 @@ static struct clk_lookup *clk_find(const char *dev_id, const char *con_id) ...@@ -46,6 +46,8 @@ static struct clk_lookup *clk_find(const char *dev_id, const char *con_id)
if (con_id) if (con_id)
best_possible += 1; best_possible += 1;
lockdep_assert_held(&clocks_mutex);
list_for_each_entry(p, &clocks, node) { list_for_each_entry(p, &clocks, node) {
match = 0; match = 0;
if (p->dev_id) { if (p->dev_id) {
...@@ -402,7 +404,10 @@ void devm_clk_release_clkdev(struct device *dev, const char *con_id, ...@@ -402,7 +404,10 @@ void devm_clk_release_clkdev(struct device *dev, const char *con_id,
struct clk_lookup *cl; struct clk_lookup *cl;
int rval; int rval;
mutex_lock(&clocks_mutex);
cl = clk_find(dev_id, con_id); cl = clk_find(dev_id, con_id);
mutex_unlock(&clocks_mutex);
WARN_ON(!cl); WARN_ON(!cl);
rval = devres_release(dev, devm_clkdev_release, rval = devres_release(dev, devm_clkdev_release,
devm_clk_match_clkdev, cl); devm_clk_match_clkdev, cl);
......
...@@ -167,7 +167,7 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate, ...@@ -167,7 +167,7 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate) unsigned long parent_rate)
{ {
struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw); struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw);
u32 n_mask, k_mask, m_mask, p_mask; u32 n_mask = 0, k_mask = 0, m_mask = 0, p_mask = 0;
struct _ccu_nkmp _nkmp; struct _ccu_nkmp _nkmp;
unsigned long flags; unsigned long flags;
u32 reg; u32 reg;
...@@ -186,10 +186,24 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate, ...@@ -186,10 +186,24 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate,
ccu_nkmp_find_best(parent_rate, rate, &_nkmp); ccu_nkmp_find_best(parent_rate, rate, &_nkmp);
n_mask = GENMASK(nkmp->n.width + nkmp->n.shift - 1, nkmp->n.shift); /*
k_mask = GENMASK(nkmp->k.width + nkmp->k.shift - 1, nkmp->k.shift); * If width is 0, GENMASK() macro may not generate expected mask (0)
m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1, nkmp->m.shift); * as it falls under undefined behaviour by C standard due to shifts
p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1, nkmp->p.shift); * which are equal or greater than width of left operand. This can
* be easily avoided by explicitly checking if width is 0.
*/
if (nkmp->n.width)
n_mask = GENMASK(nkmp->n.width + nkmp->n.shift - 1,
nkmp->n.shift);
if (nkmp->k.width)
k_mask = GENMASK(nkmp->k.width + nkmp->k.shift - 1,
nkmp->k.shift);
if (nkmp->m.width)
m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1,
nkmp->m.shift);
if (nkmp->p.width)
p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1,
nkmp->p.shift);
spin_lock_irqsave(nkmp->common.lock, flags); spin_lock_irqsave(nkmp->common.lock, flags);
......
...@@ -811,6 +811,22 @@ static inline bool clk_has_parent(struct clk *clk, struct clk *parent) ...@@ -811,6 +811,22 @@ static inline bool clk_has_parent(struct clk *clk, struct clk *parent)
return true; return true;
} }
static inline int clk_set_rate_range(struct clk *clk, unsigned long min,
unsigned long max)
{
return 0;
}
static inline int clk_set_min_rate(struct clk *clk, unsigned long rate)
{
return 0;
}
static inline int clk_set_max_rate(struct clk *clk, unsigned long rate)
{
return 0;
}
static inline int clk_set_parent(struct clk *clk, struct clk *parent) static inline int clk_set_parent(struct clk *clk, struct clk *parent)
{ {
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment