forked from mirrors/linux
		
	clk: Change clk_ops->determine_rate to return a clk_hw as the best parent
This is in preparation for clock providers to not have to deal with struct clk. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Reviewed-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Michael Turquette <mturquette@linaro.org>
This commit is contained in:
		
							parent
							
								
									61c7cddfad
								
							
						
					
					
						commit
						646cafc6aa
					
				
					 14 changed files with 65 additions and 49 deletions
				
			
		| 
						 | 
					@ -74,7 +74,7 @@ the operations defined in clk.h:
 | 
				
			||||||
		long		(*determine_rate)(struct clk_hw *hw,
 | 
							long		(*determine_rate)(struct clk_hw *hw,
 | 
				
			||||||
						unsigned long rate,
 | 
											unsigned long rate,
 | 
				
			||||||
						unsigned long *best_parent_rate,
 | 
											unsigned long *best_parent_rate,
 | 
				
			||||||
						struct clk **best_parent_clk);
 | 
											struct clk_hw **best_parent_clk);
 | 
				
			||||||
		int		(*set_parent)(struct clk_hw *hw, u8 index);
 | 
							int		(*set_parent)(struct clk_hw *hw, u8 index);
 | 
				
			||||||
		u8		(*get_parent)(struct clk_hw *hw);
 | 
							u8		(*get_parent)(struct clk_hw *hw);
 | 
				
			||||||
		int		(*set_rate)(struct clk_hw *hw,
 | 
							int		(*set_rate)(struct clk_hw *hw,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -375,7 +375,7 @@ static long alchemy_calc_div(unsigned long rate, unsigned long prate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate,
 | 
					static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
					unsigned long *best_parent_rate,
 | 
										unsigned long *best_parent_rate,
 | 
				
			||||||
					struct clk **best_parent_clk,
 | 
										struct clk_hw **best_parent_clk,
 | 
				
			||||||
					int scale, int maxdiv)
 | 
										int scale, int maxdiv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk *pc, *bpc, *free;
 | 
						struct clk *pc, *bpc, *free;
 | 
				
			||||||
| 
						 | 
					@ -454,7 +454,7 @@ static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*best_parent_rate = bpr;
 | 
						*best_parent_rate = bpr;
 | 
				
			||||||
	*best_parent_clk = bpc;
 | 
						*best_parent_clk = __clk_get_hw(bpc);
 | 
				
			||||||
	return br;
 | 
						return br;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -548,7 +548,7 @@ static unsigned long alchemy_clk_fgv1_recalc(struct clk_hw *hw,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long alchemy_clk_fgv1_detr(struct clk_hw *hw, unsigned long rate,
 | 
					static long alchemy_clk_fgv1_detr(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
					unsigned long *best_parent_rate,
 | 
										unsigned long *best_parent_rate,
 | 
				
			||||||
					struct clk **best_parent_clk)
 | 
										struct clk_hw **best_parent_clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return alchemy_clk_fgcs_detr(hw, rate, best_parent_rate,
 | 
						return alchemy_clk_fgcs_detr(hw, rate, best_parent_rate,
 | 
				
			||||||
				     best_parent_clk, 2, 512);
 | 
									     best_parent_clk, 2, 512);
 | 
				
			||||||
| 
						 | 
					@ -680,7 +680,7 @@ static unsigned long alchemy_clk_fgv2_recalc(struct clk_hw *hw,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long alchemy_clk_fgv2_detr(struct clk_hw *hw, unsigned long rate,
 | 
					static long alchemy_clk_fgv2_detr(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
					unsigned long *best_parent_rate,
 | 
										unsigned long *best_parent_rate,
 | 
				
			||||||
					struct clk **best_parent_clk)
 | 
										struct clk_hw **best_parent_clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct alchemy_fgcs_clk *c = to_fgcs_clk(hw);
 | 
						struct alchemy_fgcs_clk *c = to_fgcs_clk(hw);
 | 
				
			||||||
	int scale, maxdiv;
 | 
						int scale, maxdiv;
 | 
				
			||||||
| 
						 | 
					@ -899,7 +899,7 @@ static int alchemy_clk_csrc_setr(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long alchemy_clk_csrc_detr(struct clk_hw *hw, unsigned long rate,
 | 
					static long alchemy_clk_csrc_detr(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
					unsigned long *best_parent_rate,
 | 
										unsigned long *best_parent_rate,
 | 
				
			||||||
					struct clk **best_parent_clk)
 | 
										struct clk_hw **best_parent_clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct alchemy_fgcs_clk *c = to_fgcs_clk(hw);
 | 
						struct alchemy_fgcs_clk *c = to_fgcs_clk(hw);
 | 
				
			||||||
	int scale = c->dt[2] == 3 ? 1 : 2; /* au1300 check */
 | 
						int scale = c->dt[2] == 3 ? 1 : 2; /* au1300 check */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ static unsigned long clk_programmable_recalc_rate(struct clk_hw *hw,
 | 
				
			||||||
static long clk_programmable_determine_rate(struct clk_hw *hw,
 | 
					static long clk_programmable_determine_rate(struct clk_hw *hw,
 | 
				
			||||||
					    unsigned long rate,
 | 
										    unsigned long rate,
 | 
				
			||||||
					    unsigned long *best_parent_rate,
 | 
										    unsigned long *best_parent_rate,
 | 
				
			||||||
					    struct clk **best_parent_clk)
 | 
										    struct clk_hw **best_parent_hw)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk *parent = NULL;
 | 
						struct clk *parent = NULL;
 | 
				
			||||||
	long best_rate = -EINVAL;
 | 
						long best_rate = -EINVAL;
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,7 @@ static long clk_programmable_determine_rate(struct clk_hw *hw,
 | 
				
			||||||
		if (best_rate < 0 || (rate - tmp_rate) < (rate - best_rate)) {
 | 
							if (best_rate < 0 || (rate - tmp_rate) < (rate - best_rate)) {
 | 
				
			||||||
			best_rate = tmp_rate;
 | 
								best_rate = tmp_rate;
 | 
				
			||||||
			*best_parent_rate = parent_rate;
 | 
								*best_parent_rate = parent_rate;
 | 
				
			||||||
			*best_parent_clk = parent;
 | 
								*best_parent_hw = __clk_get_hw(parent);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!best_rate)
 | 
							if (!best_rate)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1032,7 +1032,7 @@ static long kona_peri_clk_round_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		unsigned long *best_parent_rate, struct clk **best_parent)
 | 
							unsigned long *best_parent_rate, struct clk_hw **best_parent)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct kona_clk *bcm_clk = to_kona_clk(hw);
 | 
						struct kona_clk *bcm_clk = to_kona_clk(hw);
 | 
				
			||||||
	struct clk *clk = hw->clk;
 | 
						struct clk *clk = hw->clk;
 | 
				
			||||||
| 
						 | 
					@ -1075,7 +1075,7 @@ static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		if (delta < best_delta) {
 | 
							if (delta < best_delta) {
 | 
				
			||||||
			best_delta = delta;
 | 
								best_delta = delta;
 | 
				
			||||||
			best_rate = other_rate;
 | 
								best_rate = other_rate;
 | 
				
			||||||
			*best_parent = parent;
 | 
								*best_parent = __clk_get_hw(parent);
 | 
				
			||||||
			*best_parent_rate = parent_rate;
 | 
								*best_parent_rate = parent_rate;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ static unsigned long clk_composite_recalc_rate(struct clk_hw *hw,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
					unsigned long *best_parent_rate,
 | 
										unsigned long *best_parent_rate,
 | 
				
			||||||
					struct clk **best_parent_p)
 | 
										struct clk_hw **best_parent_p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_composite *composite = to_clk_composite(hw);
 | 
						struct clk_composite *composite = to_clk_composite(hw);
 | 
				
			||||||
	const struct clk_ops *rate_ops = composite->rate_ops;
 | 
						const struct clk_ops *rate_ops = composite->rate_ops;
 | 
				
			||||||
| 
						 | 
					@ -80,8 +80,9 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		*best_parent_p = NULL;
 | 
							*best_parent_p = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (__clk_get_flags(hw->clk) & CLK_SET_RATE_NO_REPARENT) {
 | 
							if (__clk_get_flags(hw->clk) & CLK_SET_RATE_NO_REPARENT) {
 | 
				
			||||||
			*best_parent_p = clk_get_parent(mux_hw->clk);
 | 
								parent = clk_get_parent(mux_hw->clk);
 | 
				
			||||||
			*best_parent_rate = __clk_get_rate(*best_parent_p);
 | 
								*best_parent_p = __clk_get_hw(parent);
 | 
				
			||||||
 | 
								*best_parent_rate = __clk_get_rate(parent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return rate_ops->round_rate(rate_hw, rate,
 | 
								return rate_ops->round_rate(rate_hw, rate,
 | 
				
			||||||
						    best_parent_rate);
 | 
											    best_parent_rate);
 | 
				
			||||||
| 
						 | 
					@ -103,7 +104,7 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (!rate_diff || !*best_parent_p
 | 
								if (!rate_diff || !*best_parent_p
 | 
				
			||||||
				       || best_rate_diff > rate_diff) {
 | 
									       || best_rate_diff > rate_diff) {
 | 
				
			||||||
				*best_parent_p = parent;
 | 
									*best_parent_p = __clk_get_hw(parent);
 | 
				
			||||||
				*best_parent_rate = parent_rate;
 | 
									*best_parent_rate = parent_rate;
 | 
				
			||||||
				best_rate_diff = rate_diff;
 | 
									best_rate_diff = rate_diff;
 | 
				
			||||||
				best_rate = tmp_rate;
 | 
									best_rate = tmp_rate;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -702,7 +702,7 @@ struct clk *__clk_lookup(const char *name)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
			      unsigned long *best_parent_rate,
 | 
								      unsigned long *best_parent_rate,
 | 
				
			||||||
			      struct clk **best_parent_p)
 | 
								      struct clk_hw **best_parent_p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk *clk = hw->clk, *parent, *best_parent = NULL;
 | 
						struct clk *clk = hw->clk, *parent, *best_parent = NULL;
 | 
				
			||||||
	int i, num_parents;
 | 
						int i, num_parents;
 | 
				
			||||||
| 
						 | 
					@ -738,7 +738,7 @@ long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	if (best_parent)
 | 
						if (best_parent)
 | 
				
			||||||
		*best_parent_p = best_parent;
 | 
							*best_parent_p = best_parent->hw;
 | 
				
			||||||
	*best_parent_rate = best;
 | 
						*best_parent_rate = best;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return best;
 | 
						return best;
 | 
				
			||||||
| 
						 | 
					@ -946,6 +946,7 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long parent_rate = 0;
 | 
						unsigned long parent_rate = 0;
 | 
				
			||||||
	struct clk *parent;
 | 
						struct clk *parent;
 | 
				
			||||||
 | 
						struct clk_hw *parent_hw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!clk)
 | 
						if (!clk)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					@ -954,10 +955,11 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate)
 | 
				
			||||||
	if (parent)
 | 
						if (parent)
 | 
				
			||||||
		parent_rate = parent->rate;
 | 
							parent_rate = parent->rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (clk->ops->determine_rate)
 | 
						if (clk->ops->determine_rate) {
 | 
				
			||||||
 | 
							parent_hw = parent ? parent->hw : NULL;
 | 
				
			||||||
		return clk->ops->determine_rate(clk->hw, rate, &parent_rate,
 | 
							return clk->ops->determine_rate(clk->hw, rate, &parent_rate,
 | 
				
			||||||
						&parent);
 | 
											&parent_hw);
 | 
				
			||||||
	else if (clk->ops->round_rate)
 | 
						} else if (clk->ops->round_rate)
 | 
				
			||||||
		return clk->ops->round_rate(clk->hw, rate, &parent_rate);
 | 
							return clk->ops->round_rate(clk->hw, rate, &parent_rate);
 | 
				
			||||||
	else if (clk->flags & CLK_SET_RATE_PARENT)
 | 
						else if (clk->flags & CLK_SET_RATE_PARENT)
 | 
				
			||||||
		return __clk_round_rate(clk->parent, rate);
 | 
							return __clk_round_rate(clk->parent, rate);
 | 
				
			||||||
| 
						 | 
					@ -1345,6 +1347,7 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk *top = clk;
 | 
						struct clk *top = clk;
 | 
				
			||||||
	struct clk *old_parent, *parent;
 | 
						struct clk *old_parent, *parent;
 | 
				
			||||||
 | 
						struct clk_hw *parent_hw;
 | 
				
			||||||
	unsigned long best_parent_rate = 0;
 | 
						unsigned long best_parent_rate = 0;
 | 
				
			||||||
	unsigned long new_rate;
 | 
						unsigned long new_rate;
 | 
				
			||||||
	int p_index = 0;
 | 
						int p_index = 0;
 | 
				
			||||||
| 
						 | 
					@ -1360,9 +1363,11 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* find the closest rate and parent clk/rate */
 | 
						/* find the closest rate and parent clk/rate */
 | 
				
			||||||
	if (clk->ops->determine_rate) {
 | 
						if (clk->ops->determine_rate) {
 | 
				
			||||||
 | 
							parent_hw = parent ? parent->hw : NULL;
 | 
				
			||||||
		new_rate = clk->ops->determine_rate(clk->hw, rate,
 | 
							new_rate = clk->ops->determine_rate(clk->hw, rate,
 | 
				
			||||||
						    &best_parent_rate,
 | 
											    &best_parent_rate,
 | 
				
			||||||
						    &parent);
 | 
											    &parent_hw);
 | 
				
			||||||
 | 
							parent = parent_hw->clk;
 | 
				
			||||||
	} else if (clk->ops->round_rate) {
 | 
						} else if (clk->ops->round_rate) {
 | 
				
			||||||
		new_rate = clk->ops->round_rate(clk->hw, rate,
 | 
							new_rate = clk->ops->round_rate(clk->hw, rate,
 | 
				
			||||||
						&best_parent_rate);
 | 
											&best_parent_rate);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -296,7 +296,7 @@ static unsigned long mmc_clk_recalc_rate(struct clk_hw *hw,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long mmc_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long mmc_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
			      unsigned long *best_parent_rate,
 | 
								      unsigned long *best_parent_rate,
 | 
				
			||||||
			      struct clk **best_parent_p)
 | 
								      struct clk_hw **best_parent_p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_mmc *mclk = to_mmc(hw);
 | 
						struct clk_mmc *mclk = to_mmc(hw);
 | 
				
			||||||
	unsigned long best = 0;
 | 
						unsigned long best = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -203,7 +203,7 @@ static int _set_rate(struct mmp_clk_mix *mix, u32 mux_val, u32 div_val,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
					unsigned long *best_parent_rate,
 | 
										unsigned long *best_parent_rate,
 | 
				
			||||||
					struct clk **best_parent_clk)
 | 
										struct clk_hw **best_parent_clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mmp_clk_mix *mix = to_clk_mix(hw);
 | 
						struct mmp_clk_mix *mix = to_clk_mix(hw);
 | 
				
			||||||
	struct mmp_clk_mix_clk_table *item;
 | 
						struct mmp_clk_mix_clk_table *item;
 | 
				
			||||||
| 
						 | 
					@ -264,7 +264,7 @@ static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
found:
 | 
					found:
 | 
				
			||||||
	*best_parent_rate = parent_rate_best;
 | 
						*best_parent_rate = parent_rate_best;
 | 
				
			||||||
	*best_parent_clk = parent_best;
 | 
						*best_parent_clk = __clk_get_hw(parent_best);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mix_rate_best;
 | 
						return mix_rate_best;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,7 +141,7 @@ struct pll_freq_tbl *find_freq(const struct pll_freq_tbl *f, unsigned long rate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long
 | 
					static long
 | 
				
			||||||
clk_pll_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					clk_pll_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		       unsigned long *p_rate, struct clk **p)
 | 
							       unsigned long *p_rate, struct clk_hw **p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_pll *pll = to_clk_pll(hw);
 | 
						struct clk_pll *pll = to_clk_pll(hw);
 | 
				
			||||||
	const struct pll_freq_tbl *f;
 | 
						const struct pll_freq_tbl *f;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -368,16 +368,17 @@ clk_dyn_rcg_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long _freq_tbl_determine_rate(struct clk_hw *hw,
 | 
					static long _freq_tbl_determine_rate(struct clk_hw *hw,
 | 
				
			||||||
		const struct freq_tbl *f, unsigned long rate,
 | 
							const struct freq_tbl *f, unsigned long rate,
 | 
				
			||||||
		unsigned long *p_rate, struct clk **p)
 | 
							unsigned long *p_rate, struct clk_hw **p_hw)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long clk_flags;
 | 
						unsigned long clk_flags;
 | 
				
			||||||
 | 
						struct clk *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f = qcom_find_freq(f, rate);
 | 
						f = qcom_find_freq(f, rate);
 | 
				
			||||||
	if (!f)
 | 
						if (!f)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_flags = __clk_get_flags(hw->clk);
 | 
						clk_flags = __clk_get_flags(hw->clk);
 | 
				
			||||||
	*p = clk_get_parent_by_index(hw->clk, f->src);
 | 
						p = clk_get_parent_by_index(hw->clk, f->src);
 | 
				
			||||||
	if (clk_flags & CLK_SET_RATE_PARENT) {
 | 
						if (clk_flags & CLK_SET_RATE_PARENT) {
 | 
				
			||||||
		rate = rate * f->pre_div;
 | 
							rate = rate * f->pre_div;
 | 
				
			||||||
		if (f->n) {
 | 
							if (f->n) {
 | 
				
			||||||
| 
						 | 
					@ -387,15 +388,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw,
 | 
				
			||||||
			rate = tmp;
 | 
								rate = tmp;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		rate =  __clk_get_rate(*p);
 | 
							rate =  __clk_get_rate(p);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						*p_hw = __clk_get_hw(p);
 | 
				
			||||||
	*p_rate = rate;
 | 
						*p_rate = rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return f->freq;
 | 
						return f->freq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		unsigned long *p_rate, struct clk **p)
 | 
							unsigned long *p_rate, struct clk_hw **p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_rcg *rcg = to_clk_rcg(hw);
 | 
						struct clk_rcg *rcg = to_clk_rcg(hw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -403,7 +405,7 @@ static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		unsigned long *p_rate, struct clk **p)
 | 
							unsigned long *p_rate, struct clk_hw **p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
 | 
						struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -411,13 +413,15 @@ static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_rcg_bypass_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_rcg_bypass_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		unsigned long *p_rate, struct clk **p)
 | 
							unsigned long *p_rate, struct clk_hw **p_hw)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_rcg *rcg = to_clk_rcg(hw);
 | 
						struct clk_rcg *rcg = to_clk_rcg(hw);
 | 
				
			||||||
	const struct freq_tbl *f = rcg->freq_tbl;
 | 
						const struct freq_tbl *f = rcg->freq_tbl;
 | 
				
			||||||
 | 
						struct clk *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*p = clk_get_parent_by_index(hw->clk, f->src);
 | 
						p = clk_get_parent_by_index(hw->clk, f->src);
 | 
				
			||||||
	*p_rate = __clk_round_rate(*p, rate);
 | 
						*p_hw = __clk_get_hw(p);
 | 
				
			||||||
 | 
						*p_rate = __clk_round_rate(p, rate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return *p_rate;
 | 
						return *p_rate;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -175,16 +175,17 @@ clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long _freq_tbl_determine_rate(struct clk_hw *hw,
 | 
					static long _freq_tbl_determine_rate(struct clk_hw *hw,
 | 
				
			||||||
		const struct freq_tbl *f, unsigned long rate,
 | 
							const struct freq_tbl *f, unsigned long rate,
 | 
				
			||||||
		unsigned long *p_rate, struct clk **p)
 | 
							unsigned long *p_rate, struct clk_hw **p_hw)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long clk_flags;
 | 
						unsigned long clk_flags;
 | 
				
			||||||
 | 
						struct clk *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f = qcom_find_freq(f, rate);
 | 
						f = qcom_find_freq(f, rate);
 | 
				
			||||||
	if (!f)
 | 
						if (!f)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_flags = __clk_get_flags(hw->clk);
 | 
						clk_flags = __clk_get_flags(hw->clk);
 | 
				
			||||||
	*p = clk_get_parent_by_index(hw->clk, f->src);
 | 
						p = clk_get_parent_by_index(hw->clk, f->src);
 | 
				
			||||||
	if (clk_flags & CLK_SET_RATE_PARENT) {
 | 
						if (clk_flags & CLK_SET_RATE_PARENT) {
 | 
				
			||||||
		if (f->pre_div) {
 | 
							if (f->pre_div) {
 | 
				
			||||||
			rate /= 2;
 | 
								rate /= 2;
 | 
				
			||||||
| 
						 | 
					@ -198,15 +199,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw,
 | 
				
			||||||
			rate = tmp;
 | 
								rate = tmp;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		rate =  __clk_get_rate(*p);
 | 
							rate =  __clk_get_rate(p);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						*p_hw = __clk_get_hw(p);
 | 
				
			||||||
	*p_rate = rate;
 | 
						*p_rate = rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return f->freq;
 | 
						return f->freq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_rcg2_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_rcg2_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
		unsigned long *p_rate, struct clk **p)
 | 
							unsigned long *p_rate, struct clk_hw **p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
						struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -359,7 +361,7 @@ static int clk_edp_pixel_set_rate_and_parent(struct clk_hw *hw,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
				 unsigned long *p_rate, struct clk **p)
 | 
									 unsigned long *p_rate, struct clk_hw **p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
						struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
				
			||||||
	const struct freq_tbl *f = rcg->freq_tbl;
 | 
						const struct freq_tbl *f = rcg->freq_tbl;
 | 
				
			||||||
| 
						 | 
					@ -371,7 +373,7 @@ static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
	u32 hid_div;
 | 
						u32 hid_div;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Force the correct parent */
 | 
						/* Force the correct parent */
 | 
				
			||||||
	*p = clk_get_parent_by_index(hw->clk, f->src);
 | 
						*p = __clk_get_hw(clk_get_parent_by_index(hw->clk, f->src));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (src_rate == 810000000)
 | 
						if (src_rate == 810000000)
 | 
				
			||||||
		frac = frac_table_810m;
 | 
							frac = frac_table_810m;
 | 
				
			||||||
| 
						 | 
					@ -410,18 +412,20 @@ const struct clk_ops clk_edp_pixel_ops = {
 | 
				
			||||||
EXPORT_SYMBOL_GPL(clk_edp_pixel_ops);
 | 
					EXPORT_SYMBOL_GPL(clk_edp_pixel_ops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_byte_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_byte_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
			 unsigned long *p_rate, struct clk **p)
 | 
								 unsigned long *p_rate, struct clk_hw **p_hw)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
						struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
				
			||||||
	const struct freq_tbl *f = rcg->freq_tbl;
 | 
						const struct freq_tbl *f = rcg->freq_tbl;
 | 
				
			||||||
	unsigned long parent_rate, div;
 | 
						unsigned long parent_rate, div;
 | 
				
			||||||
	u32 mask = BIT(rcg->hid_width) - 1;
 | 
						u32 mask = BIT(rcg->hid_width) - 1;
 | 
				
			||||||
 | 
						struct clk *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rate == 0)
 | 
						if (rate == 0)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*p = clk_get_parent_by_index(hw->clk, f->src);
 | 
						p = clk_get_parent_by_index(hw->clk, f->src);
 | 
				
			||||||
	*p_rate = parent_rate = __clk_round_rate(*p, rate);
 | 
						*p_hw = __clk_get_hw(p);
 | 
				
			||||||
 | 
						*p_rate = parent_rate = __clk_round_rate(p, rate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
 | 
						div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
 | 
				
			||||||
	div = min_t(u32, div, mask);
 | 
						div = min_t(u32, div, mask);
 | 
				
			||||||
| 
						 | 
					@ -472,14 +476,16 @@ static const struct frac_entry frac_table_pixel[] = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
				 unsigned long *p_rate, struct clk **p)
 | 
									 unsigned long *p_rate, struct clk_hw **p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
						struct clk_rcg2 *rcg = to_clk_rcg2(hw);
 | 
				
			||||||
	unsigned long request, src_rate;
 | 
						unsigned long request, src_rate;
 | 
				
			||||||
	int delta = 100000;
 | 
						int delta = 100000;
 | 
				
			||||||
	const struct freq_tbl *f = rcg->freq_tbl;
 | 
						const struct freq_tbl *f = rcg->freq_tbl;
 | 
				
			||||||
	const struct frac_entry *frac = frac_table_pixel;
 | 
						const struct frac_entry *frac = frac_table_pixel;
 | 
				
			||||||
	struct clk *parent = *p = clk_get_parent_by_index(hw->clk, f->src);
 | 
						struct clk *parent = clk_get_parent_by_index(hw->clk, f->src);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*p = __clk_get_hw(parent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (; frac->num; frac++) {
 | 
						for (; frac->num; frac++) {
 | 
				
			||||||
		request = (rate * frac->den) / frac->num;
 | 
							request = (rate * frac->den) / frac->num;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ static long clk_factors_round_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
				       unsigned long *best_parent_rate,
 | 
									       unsigned long *best_parent_rate,
 | 
				
			||||||
				       struct clk **best_parent_p)
 | 
									       struct clk_hw **best_parent_p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clk *clk = hw->clk, *parent, *best_parent = NULL;
 | 
						struct clk *clk = hw->clk, *parent, *best_parent = NULL;
 | 
				
			||||||
	int i, num_parents;
 | 
						int i, num_parents;
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (best_parent)
 | 
						if (best_parent)
 | 
				
			||||||
		*best_parent_p = best_parent;
 | 
							*best_parent_p = __clk_get_hw(best_parent);
 | 
				
			||||||
	*best_parent_rate = best;
 | 
						*best_parent_rate = best;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return best_child_rate;
 | 
						return best_child_rate;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,7 +46,7 @@ static unsigned long ar100_recalc_rate(struct clk_hw *hw,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
				 unsigned long *best_parent_rate,
 | 
									 unsigned long *best_parent_rate,
 | 
				
			||||||
				 struct clk **best_parent_clk)
 | 
									 struct clk_hw **best_parent_clk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int nparents = __clk_get_num_parents(hw->clk);
 | 
						int nparents = __clk_get_num_parents(hw->clk);
 | 
				
			||||||
	long best_rate = -EINVAL;
 | 
						long best_rate = -EINVAL;
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		tmp_rate = (parent_rate >> shift) / div;
 | 
							tmp_rate = (parent_rate >> shift) / div;
 | 
				
			||||||
		if (!*best_parent_clk || tmp_rate > best_rate) {
 | 
							if (!*best_parent_clk || tmp_rate > best_rate) {
 | 
				
			||||||
			*best_parent_clk = parent;
 | 
								*best_parent_clk = __clk_get_hw(parent);
 | 
				
			||||||
			*best_parent_rate = parent_rate;
 | 
								*best_parent_rate = parent_rate;
 | 
				
			||||||
			best_rate = tmp_rate;
 | 
								best_rate = tmp_rate;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -176,7 +176,7 @@ struct clk_ops {
 | 
				
			||||||
					unsigned long *parent_rate);
 | 
										unsigned long *parent_rate);
 | 
				
			||||||
	long		(*determine_rate)(struct clk_hw *hw, unsigned long rate,
 | 
						long		(*determine_rate)(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
					unsigned long *best_parent_rate,
 | 
										unsigned long *best_parent_rate,
 | 
				
			||||||
					struct clk **best_parent_clk);
 | 
										struct clk_hw **best_parent_hw);
 | 
				
			||||||
	int		(*set_parent)(struct clk_hw *hw, u8 index);
 | 
						int		(*set_parent)(struct clk_hw *hw, u8 index);
 | 
				
			||||||
	u8		(*get_parent)(struct clk_hw *hw);
 | 
						u8		(*get_parent)(struct clk_hw *hw);
 | 
				
			||||||
	int		(*set_rate)(struct clk_hw *hw, unsigned long rate,
 | 
						int		(*set_rate)(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
| 
						 | 
					@ -551,7 +551,7 @@ bool __clk_is_enabled(struct clk *clk);
 | 
				
			||||||
struct clk *__clk_lookup(const char *name);
 | 
					struct clk *__clk_lookup(const char *name);
 | 
				
			||||||
long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
					long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
 | 
				
			||||||
			      unsigned long *best_parent_rate,
 | 
								      unsigned long *best_parent_rate,
 | 
				
			||||||
			      struct clk **best_parent_p);
 | 
								      struct clk_hw **best_parent_p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * FIXME clock api without lock protection
 | 
					 * FIXME clock api without lock protection
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue