diff options
Diffstat (limited to 'drivers/clk/clkdev.c')
| -rw-r--r-- | drivers/clk/clkdev.c | 30 | 
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c index 8c4435c53f09..2afc8df8acff 100644 --- a/drivers/clk/clkdev.c +++ b/drivers/clk/clkdev.c @@ -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) { @@ -70,25 +72,26 @@ static struct clk_lookup *clk_find(const char *dev_id, const char *con_id)  	return cl;  } -static struct clk *__clk_get_sys(struct device *dev, const char *dev_id, -				 const char *con_id) +struct clk_hw *clk_find_hw(const char *dev_id, const char *con_id)  {  	struct clk_lookup *cl; -	struct clk *clk = NULL; +	struct clk_hw *hw = ERR_PTR(-ENOENT);  	mutex_lock(&clocks_mutex); -  	cl = clk_find(dev_id, con_id); -	if (!cl) -		goto out; - -	clk = clk_hw_create_clk(dev, cl->clk_hw, dev_id, con_id); -	if (IS_ERR(clk)) -		cl = NULL; -out: +	if (cl) +		hw = cl->clk_hw;  	mutex_unlock(&clocks_mutex); -	return cl ? clk : ERR_PTR(-ENOENT); +	return hw; +} + +static struct clk *__clk_get_sys(struct device *dev, const char *dev_id, +				 const char *con_id) +{ +	struct clk_hw *hw = clk_find_hw(dev_id, con_id); + +	return clk_hw_create_clk(dev, hw, dev_id, con_id);  }  struct clk *clk_get_sys(const char *dev_id, const char *con_id) @@ -402,7 +405,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);  |