diff options
Diffstat (limited to 'drivers/clk/clk.c')
| -rw-r--r-- | drivers/clk/clk.c | 69 | 
1 files changed, 27 insertions, 42 deletions
| diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 5052541a0986..e2ec1b745243 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1330,7 +1330,7 @@ static int clk_core_determine_round_nolock(struct clk_core *core,  		return 0;  	/* -	 * At this point, core protection will be disabled if +	 * At this point, core protection will be disabled  	 * - if the provider is not protected at all  	 * - if the calling consumer is the only one which has exclusivity  	 *   over the provider @@ -2078,12 +2078,8 @@ static void clk_change_rate(struct clk_core *core)  		return;  	if (core->flags & CLK_SET_RATE_UNGATE) { -		unsigned long flags; -  		clk_core_prepare(core); -		flags = clk_enable_lock(); -		clk_core_enable(core); -		clk_enable_unlock(flags); +		clk_core_enable_lock(core);  	}  	if (core->new_parent && core->new_parent != core->parent) { @@ -2116,11 +2112,7 @@ static void clk_change_rate(struct clk_core *core)  	core->rate = clk_recalc(core, best_parent_rate);  	if (core->flags & CLK_SET_RATE_UNGATE) { -		unsigned long flags; - -		flags = clk_enable_lock(); -		clk_core_disable(core); -		clk_enable_unlock(flags); +		clk_core_disable_lock(core);  		clk_core_unprepare(core);  	} @@ -3564,8 +3556,6 @@ static int __clk_core_init(struct clk_core *core)  	 * reparenting clocks  	 */  	if (core->flags & CLK_IS_CRITICAL) { -		unsigned long flags; -  		ret = clk_core_prepare(core);  		if (ret) {  			pr_warn("%s: critical clk '%s' failed to prepare\n", @@ -3573,9 +3563,7 @@ static int __clk_core_init(struct clk_core *core)  			goto out;  		} -		flags = clk_enable_lock(); -		ret = clk_core_enable(core); -		clk_enable_unlock(flags); +		ret = clk_core_enable_lock(core);  		if (ret) {  			pr_warn("%s: critical clk '%s' failed to enable\n",  			       __func__, core->name); @@ -4357,20 +4345,19 @@ int clk_notifier_register(struct clk *clk, struct notifier_block *nb)  	/* search the list of notifiers for this clk */  	list_for_each_entry(cn, &clk_notifier_list, node)  		if (cn->clk == clk) -			break; +			goto found;  	/* if clk wasn't in the notifier list, allocate new clk_notifier */ -	if (cn->clk != clk) { -		cn = kzalloc(sizeof(*cn), GFP_KERNEL); -		if (!cn) -			goto out; +	cn = kzalloc(sizeof(*cn), GFP_KERNEL); +	if (!cn) +		goto out; -		cn->clk = clk; -		srcu_init_notifier_head(&cn->notifier_head); +	cn->clk = clk; +	srcu_init_notifier_head(&cn->notifier_head); -		list_add(&cn->node, &clk_notifier_list); -	} +	list_add(&cn->node, &clk_notifier_list); +found:  	ret = srcu_notifier_chain_register(&cn->notifier_head, nb);  	clk->core->notifier_count++; @@ -4395,32 +4382,28 @@ EXPORT_SYMBOL_GPL(clk_notifier_register);   */  int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb)  { -	struct clk_notifier *cn = NULL; -	int ret = -EINVAL; +	struct clk_notifier *cn; +	int ret = -ENOENT;  	if (!clk || !nb)  		return -EINVAL;  	clk_prepare_lock(); -	list_for_each_entry(cn, &clk_notifier_list, node) -		if (cn->clk == clk) -			break; - -	if (cn->clk == clk) { -		ret = srcu_notifier_chain_unregister(&cn->notifier_head, nb); +	list_for_each_entry(cn, &clk_notifier_list, node) { +		if (cn->clk == clk) { +			ret = srcu_notifier_chain_unregister(&cn->notifier_head, nb); -		clk->core->notifier_count--; +			clk->core->notifier_count--; -		/* XXX the notifier code should handle this better */ -		if (!cn->notifier_head.head) { -			srcu_cleanup_notifier_head(&cn->notifier_head); -			list_del(&cn->node); -			kfree(cn); +			/* XXX the notifier code should handle this better */ +			if (!cn->notifier_head.head) { +				srcu_cleanup_notifier_head(&cn->notifier_head); +				list_del(&cn->node); +				kfree(cn); +			} +			break;  		} - -	} else { -		ret = -ENOENT;  	}  	clk_prepare_unlock(); @@ -4615,6 +4598,8 @@ int of_clk_add_hw_provider(struct device_node *np,  	if (ret < 0)  		of_clk_del_provider(np); +	fwnode_dev_initialized(&np->fwnode, true); +  	return ret;  }  EXPORT_SYMBOL_GPL(of_clk_add_hw_provider); | 
