mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	clk: Look for parents with clkdev based clk_lookups
In addition to looking for DT based parents, support clkdev based clk_lookups. This should allow non-DT based clk drivers to participate in the parent lookup process. Cc: Miquel Raynal <miquel.raynal@bootlin.com> Cc: Jerome Brunet <jbrunet@baylibre.com> Cc: Russell King <linux@armlinux.org.uk> Cc: Michael Turquette <mturquette@baylibre.com> Cc: Jeffrey Hugo <jhugo@codeaurora.org> Cc: Chen-Yu Tsai <wens@csie.org> Tested-by: Jeffrey Hugo <jhugo@codeaurora.org> Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
		
							parent
							
								
									fc0c209c14
								
							
						
					
					
						commit
						dde4eff47c
					
				
					 3 changed files with 21 additions and 10 deletions
				
			
		| 
						 | 
					@ -324,14 +324,15 @@ static struct clk_core *clk_core_lookup(const char *name)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * clk_core_get - Find the parent of a clk using a clock specifier in DT
 | 
					 * clk_core_get - Find the clk_core parent of a clk
 | 
				
			||||||
 * @core: clk to find parent of
 | 
					 * @core: clk to find parent of
 | 
				
			||||||
 * @name: name to search for in 'clock-names' of device providing clk
 | 
					 * @name: name to search for
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This is the preferred method for clk providers to find the parent of a
 | 
					 * This is the preferred method for clk providers to find the parent of a
 | 
				
			||||||
 * clk when that parent is external to the clk controller. The parent_names
 | 
					 * clk when that parent is external to the clk controller. The parent_names
 | 
				
			||||||
 * array is indexed and treated as a local name matching a string in the device
 | 
					 * array is indexed and treated as a local name matching a string in the device
 | 
				
			||||||
 * node's 'clock-names' property. This allows clk providers to use their own
 | 
					 * node's 'clock-names' property or as the 'con_id' matching the device's
 | 
				
			||||||
 | 
					 * dev_name() in a clk_lookup. This allows clk providers to use their own
 | 
				
			||||||
 * namespace instead of looking for a globally unique parent string.
 | 
					 * namespace instead of looking for a globally unique parent string.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * For example the following DT snippet would allow a clock registered by the
 | 
					 * For example the following DT snippet would allow a clock registered by the
 | 
				
			||||||
| 
						 | 
					@ -359,15 +360,23 @@ static struct clk_core *clk_core_lookup(const char *name)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static struct clk_core *clk_core_get(struct clk_core *core, const char *name)
 | 
					static struct clk_core *clk_core_get(struct clk_core *core, const char *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_hw *hw;
 | 
						struct clk_hw *hw = ERR_PTR(-ENOENT);
 | 
				
			||||||
 | 
						struct device *dev = core->dev;
 | 
				
			||||||
 | 
						const char *dev_id = dev ? dev_name(dev) : NULL;
 | 
				
			||||||
	struct device_node *np = core->of_node;
 | 
						struct device_node *np = core->of_node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!np)
 | 
						if (np)
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							hw = of_clk_get_hw(np, -1, name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* TODO: Support clkdev clk_lookups */
 | 
						/*
 | 
				
			||||||
	hw = of_clk_get_hw(np, -1, name);
 | 
						 * If the DT search above couldn't find the provider or the provider
 | 
				
			||||||
	if (IS_ERR_OR_NULL(hw))
 | 
						 * didn't know about this clk, fallback to looking up via clkdev based
 | 
				
			||||||
 | 
						 * clk_lookups
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (PTR_ERR(hw) == -ENOENT)
 | 
				
			||||||
 | 
							hw = clk_find_hw(dev_id, name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (IS_ERR(hw))
 | 
				
			||||||
		return ERR_CAST(hw);
 | 
							return ERR_CAST(hw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return hw->core;
 | 
						return hw->core;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,8 @@ static inline struct clk_hw *of_clk_get_hw(struct device_node *np,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct clk_hw *clk_find_hw(const char *dev_id, const char *con_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_COMMON_CLK
 | 
					#ifdef CONFIG_COMMON_CLK
 | 
				
			||||||
struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw,
 | 
					struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw,
 | 
				
			||||||
			      const char *dev_id, const char *con_id);
 | 
								      const char *dev_id, const char *con_id);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ static struct clk_lookup *clk_find(const char *dev_id, const char *con_id)
 | 
				
			||||||
	return cl;
 | 
						return cl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct clk_hw *clk_find_hw(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_lookup *cl;
 | 
				
			||||||
	struct clk_hw *hw = ERR_PTR(-ENOENT);
 | 
						struct clk_hw *hw = ERR_PTR(-ENOENT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue