}
return -ENOENT;
}
+
+//for div 1 2 4 2*n
+static int clksel_set_rate_even(struct clk *clk, unsigned long rate)
+{
+ u32 div;
+ for (div = 2; div < clk->div_max; div += 2) {
+ u32 new_rate = clk->parent->rate / div;
+ if (new_rate <= rate) {
+ set_cru_bits_w_msk(div - 1, clk->div_mask, clk->div_shift, clk->clksel_con);
+ clk->rate = new_rate;
+ pr_debug("%s for clock %s to rate %ld (even div = %d)\n",
+ __func__, clk->name, rate, div);
+ return 0;
+ }
+ }
+ return -ENOENT;
+}
+
static u32 clk_get_freediv(unsigned long rate_out, unsigned long rate ,u32 div_max)
{
u32 div;
.parent = &hclk_periph,
.mode = gate_mode,
.recalc = clksel_recalc_div,
- .set_rate = clksel_set_rate_freediv,
+ .set_rate = clksel_set_rate_even,
.gate_idx = CLK_GATE_MMC0,
.clksel_con =CRU_CLKSELS_CON(11),
CRU_DIV_SET(0x3f,0,64),
.parent = &hclk_periph,
.mode = gate_mode,
.recalc = clksel_recalc_div,
- .set_rate = clksel_set_rate_freediv,
+ .set_rate = clksel_set_rate_even,
.gate_idx = CLK_GATE_SDIO,
.clksel_con =CRU_CLKSELS_CON(12),
CRU_DIV_SET(0x3f,0,64),
//clk_set_parent_nolock(&clk_gpu, &general_pll_clk);
clk_set_rate_nolock(&clk_uart0, 49500000);
+ clk_set_rate_nolock(&clk_sdmmc, 24750000);
+ clk_set_rate_nolock(&clk_sdio, 24750000);
}
static struct clk def_ops_clk={