Commit bd5e2ea2 authored by Stephen Boyd's avatar Stephen Boyd
Browse files

Merge branch 'clk-at91' into clk-next

* clk-at91:
  clk: at91: programmable: remove unneeded register read
  clk: at91: optimize clk_round_rate() for AUDIO_PLL
  clk: at91: enable AUDIOPLL as source for PCKx on SAMA5D2
parents efb1e0b0 97d010dc
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -340,7 +340,12 @@ static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
	pr_debug("A PLL/PMC: %s, rate = %lu (parent_rate = %lu)\n", __func__,
		 rate, *parent_rate);

	for (div = 1; div <= AUDIO_PLL_QDPMC_MAX; div++) {
	if (!rate)
		return 0;

	best_parent_rate = clk_round_rate(pclk->clk, 1);
	div = max(best_parent_rate / rate, 1UL);
	for (; div <= AUDIO_PLL_QDPMC_MAX; div++) {
		best_parent_rate = clk_round_rate(pclk->clk, rate * div);
		tmp_rate = best_parent_rate / div;
		tmp_diff = abs(rate - tmp_rate);
@@ -350,6 +355,8 @@ static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
			best_rate = tmp_rate;
			best_diff = tmp_diff;
			tmp_qd = div;
			if (!best_diff)
				break;	/* got exact match */
		}
	}

+0 −3
Original line number Diff line number Diff line
@@ -132,11 +132,8 @@ static int clk_programmable_set_rate(struct clk_hw *hw, unsigned long rate,
	struct clk_programmable *prog = to_clk_programmable(hw);
	const struct clk_programmable_layout *layout = prog->layout;
	unsigned long div = parent_rate / rate;
	unsigned int pckr;
	int shift = 0;

	regmap_read(prog->regmap, AT91_PMC_PCKR(prog->id), &pckr);

	if (!div)
		return -EINVAL;

+2 −1
Original line number Diff line number Diff line
@@ -241,13 +241,14 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
	parent_names[2] = "plladivck";
	parent_names[3] = "utmick";
	parent_names[4] = "masterck";
	parent_names[5] = "audiopll_pmcck";
	for (i = 0; i < 3; i++) {
		char name[6];

		snprintf(name, sizeof(name), "prog%d", i);

		hw = at91_clk_register_programmable(regmap, name,
						    parent_names, 5, i,
						    parent_names, 6, i,
						    &at91sam9x5_programmable_layout);
		if (IS_ERR(hw))
			goto err_free;