forked from Minki/linux
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. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEE9L57QeeUxqYDyoaDrQKIl8bklSUFAlzLUg0RHHNib3lkQGtl cm5lbC5vcmcACgkQrQKIl8bklSWi/BAA2HPnkz1tAGNVDrzhzbbliSkz3BxLIq7w 9SBE7rnaYomTV7YQzof9/uk4rr+qh2e7Of2O9t2kxHTNVfoJ7ZO3M51hwIiamQxA w14goUYIBuj8sS8g1neYMkYPou9mwY0nBxKZIqu2UaULqAvDvcvENrJiJk4+N8QJ 1/HTO1zZk5sTW+rXgcHCOWyfUSVuHRKp61Y7j84ZqttGrFyo2xjHHQEJjWWnuBuD ocERvmJ33p3mfLrDka4tA+Xmv6sIFieECl1xq46DzUJvd6xwcyf61jWPXSPvFnx9 wiORtHpXsHQPXrp00tlEEIqtLN9hg9sx1S5U9mwyf8iuV+2Y/oe9NUcgBhFPmRcu X8myaIIN2yWwrr/UE9J77FDbz80Oo4aEIj9+CvxpWvOSExvvhDKOcOo6kE6MPWuV IMjZrv4BbNIxUn6gNzHdvpNdord5CsQ3CvEUR/Ohy4s4bdAK074T4WWxGJzf/NHr oX2d5/fEkBBVqvum+Vjr9oqyDruzim47O/qF2rKTc7c6miNGtAHhuJG8oh3tm2vL pW88T2OdHLjN7nPTvQZiwRxL2DEXSRXi00YG/sS7LRQ/6b4cwNLrhohSxtXXKdc9 CPK2lAJRLZyhbRv9UK3TO/PSbWXSc/X5ED0XFnO5088jrYQ8DnkPhQL8HJHZME6/ QIxRfCo/lYY= =VQZe -----END PGP SIGNATURE----- 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)
This commit is contained in:
commit
8f76216c80
@ -46,6 +46,8 @@ static struct clk_lookup *clk_find(const char *dev_id, const char *con_id)
|
||||
if (con_id)
|
||||
best_possible += 1;
|
||||
|
||||
lockdep_assert_held(&clocks_mutex);
|
||||
|
||||
list_for_each_entry(p, &clocks, node) {
|
||||
match = 0;
|
||||
if (p->dev_id) {
|
||||
@ -402,7 +404,10 @@ void devm_clk_release_clkdev(struct device *dev, const char *con_id,
|
||||
struct clk_lookup *cl;
|
||||
int rval;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
cl = clk_find(dev_id, con_id);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
WARN_ON(!cl);
|
||||
rval = devres_release(dev, devm_clkdev_release,
|
||||
devm_clk_match_clkdev, cl);
|
||||
|
@ -167,7 +167,7 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
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;
|
||||
unsigned long flags;
|
||||
u32 reg;
|
||||
@ -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);
|
||||
|
||||
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);
|
||||
m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1, nkmp->m.shift);
|
||||
p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1, nkmp->p.shift);
|
||||
/*
|
||||
* If width is 0, GENMASK() macro may not generate expected mask (0)
|
||||
* as it falls under undefined behaviour by C standard due to shifts
|
||||
* 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);
|
||||
|
||||
|
@ -811,6 +811,22 @@ static inline bool clk_has_parent(struct clk *clk, struct clk *parent)
|
||||
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)
|
||||
{
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user