mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	clk: composite: Add hw based registration APIs
Add registration APIs in the clk composite code to return struct clk_hw pointers instead of struct clk pointers. This way we hide the struct clk pointer from providers unless they need to use consumer facing APIs. Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
This commit is contained in:
		
							parent
							
								
									39b44cff4a
								
							
						
					
					
						commit
						49cb392d36
					
				
					 2 changed files with 40 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -184,17 +184,18 @@ static void clk_composite_disable(struct clk_hw *hw)
 | 
			
		|||
	gate_ops->disable(gate_hw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct clk *clk_register_composite(struct device *dev, const char *name,
 | 
			
		||||
struct clk_hw *clk_hw_register_composite(struct device *dev, const char *name,
 | 
			
		||||
			const char * const *parent_names, int num_parents,
 | 
			
		||||
			struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
 | 
			
		||||
			struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
 | 
			
		||||
			struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
 | 
			
		||||
			unsigned long flags)
 | 
			
		||||
{
 | 
			
		||||
	struct clk *clk;
 | 
			
		||||
	struct clk_hw *hw;
 | 
			
		||||
	struct clk_init_data init;
 | 
			
		||||
	struct clk_composite *composite;
 | 
			
		||||
	struct clk_ops *clk_composite_ops;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	composite = kzalloc(sizeof(*composite), GFP_KERNEL);
 | 
			
		||||
	if (!composite)
 | 
			
		||||
| 
						 | 
				
			
			@ -204,12 +205,13 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
 | 
			
		|||
	init.flags = flags | CLK_IS_BASIC;
 | 
			
		||||
	init.parent_names = parent_names;
 | 
			
		||||
	init.num_parents = num_parents;
 | 
			
		||||
	hw = &composite->hw;
 | 
			
		||||
 | 
			
		||||
	clk_composite_ops = &composite->ops;
 | 
			
		||||
 | 
			
		||||
	if (mux_hw && mux_ops) {
 | 
			
		||||
		if (!mux_ops->get_parent) {
 | 
			
		||||
			clk = ERR_PTR(-EINVAL);
 | 
			
		||||
			hw = ERR_PTR(-EINVAL);
 | 
			
		||||
			goto err;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -224,7 +226,7 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
 | 
			
		|||
 | 
			
		||||
	if (rate_hw && rate_ops) {
 | 
			
		||||
		if (!rate_ops->recalc_rate) {
 | 
			
		||||
			clk = ERR_PTR(-EINVAL);
 | 
			
		||||
			hw = ERR_PTR(-EINVAL);
 | 
			
		||||
			goto err;
 | 
			
		||||
		}
 | 
			
		||||
		clk_composite_ops->recalc_rate = clk_composite_recalc_rate;
 | 
			
		||||
| 
						 | 
				
			
			@ -253,7 +255,7 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
 | 
			
		|||
	if (gate_hw && gate_ops) {
 | 
			
		||||
		if (!gate_ops->is_enabled || !gate_ops->enable ||
 | 
			
		||||
		    !gate_ops->disable) {
 | 
			
		||||
			clk = ERR_PTR(-EINVAL);
 | 
			
		||||
			hw = ERR_PTR(-EINVAL);
 | 
			
		||||
			goto err;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -267,22 +269,41 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
 | 
			
		|||
	init.ops = clk_composite_ops;
 | 
			
		||||
	composite->hw.init = &init;
 | 
			
		||||
 | 
			
		||||
	clk = clk_register(dev, &composite->hw);
 | 
			
		||||
	if (IS_ERR(clk))
 | 
			
		||||
	ret = clk_hw_register(dev, hw);
 | 
			
		||||
	if (ret) {
 | 
			
		||||
		hw = ERR_PTR(ret);
 | 
			
		||||
		goto err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (composite->mux_hw)
 | 
			
		||||
		composite->mux_hw->clk = clk;
 | 
			
		||||
		composite->mux_hw->clk = hw->clk;
 | 
			
		||||
 | 
			
		||||
	if (composite->rate_hw)
 | 
			
		||||
		composite->rate_hw->clk = clk;
 | 
			
		||||
		composite->rate_hw->clk = hw->clk;
 | 
			
		||||
 | 
			
		||||
	if (composite->gate_hw)
 | 
			
		||||
		composite->gate_hw->clk = clk;
 | 
			
		||||
		composite->gate_hw->clk = hw->clk;
 | 
			
		||||
 | 
			
		||||
	return clk;
 | 
			
		||||
	return hw;
 | 
			
		||||
 | 
			
		||||
err:
 | 
			
		||||
	kfree(composite);
 | 
			
		||||
	return clk;
 | 
			
		||||
	return hw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct clk *clk_register_composite(struct device *dev, const char *name,
 | 
			
		||||
			const char * const *parent_names, int num_parents,
 | 
			
		||||
			struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
 | 
			
		||||
			struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
 | 
			
		||||
			struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
 | 
			
		||||
			unsigned long flags)
 | 
			
		||||
{
 | 
			
		||||
	struct clk_hw *hw;
 | 
			
		||||
 | 
			
		||||
	hw = clk_hw_register_composite(dev, name, parent_names, num_parents,
 | 
			
		||||
			mux_hw, mux_ops, rate_hw, rate_ops, gate_hw, gate_ops,
 | 
			
		||||
			flags);
 | 
			
		||||
	if (IS_ERR(hw))
 | 
			
		||||
		return ERR_CAST(hw);
 | 
			
		||||
	return hw->clk;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -638,6 +638,13 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
 | 
			
		|||
		struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
 | 
			
		||||
		struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
 | 
			
		||||
		unsigned long flags);
 | 
			
		||||
struct clk_hw *clk_hw_register_composite(struct device *dev, const char *name,
 | 
			
		||||
		const char * const *parent_names, int num_parents,
 | 
			
		||||
		struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
 | 
			
		||||
		struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
 | 
			
		||||
		struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
 | 
			
		||||
		unsigned long flags);
 | 
			
		||||
void clk_hw_unregister_composite(struct clk_hw *hw);
 | 
			
		||||
 | 
			
		||||
/***
 | 
			
		||||
 * struct clk_gpio_gate - gpio gated clock
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue