static u8 clk_pll_get_parent(struct clk_hw *hwclk) { u32 pll_src; struct socfpga_pll *socfpgaclk = to_socfpga_clk(hwclk); pll_src = readl(socfpgaclk->hw.reg); return (pll_src >> CLK_MGR_PLL_CLK_SRC_SHIFT) & CLK_MGR_PLL_CLK_SRC_MASK; }
static void clk_socfpga_disable(struct clk *clk) { struct socfpga_pll *socfpga_clk = to_socfpga_clk(clk); u32 val; val = readl(socfpga_clk->reg); val &= ~(1 << socfpga_clk->bit_idx); writel(val, socfpga_clk->reg); }
static int clk_pll_get_parent(struct clk *clk) { struct socfpga_pll *socfpgaclk = to_socfpga_clk(clk); u32 pll_src; pll_src = readl(socfpgaclk->reg); return (pll_src >> CLK_MGR_PLL_CLK_SRC_SHIFT) & CLK_MGR_PLL_CLK_SRC_MASK; }
static int clk_socfpga_enable(struct clk *clk) { struct socfpga_pll *socfpga_clk = to_socfpga_clk(clk); u32 val; val = readl(socfpga_clk->reg); val |= 1 << socfpga_clk->bit_idx; writel(val, socfpga_clk->reg); return 0; }
static unsigned long clk_pll_recalc_rate(struct clk *clk, unsigned long parent_rate) { struct socfpga_pll *socfpgaclk = to_socfpga_clk(clk); unsigned long divf, divq, reg; unsigned long long vco_freq; /* read VCO1 reg for numerator and denominator */ reg = readl(socfpgaclk->reg + 0x4); divf = (reg & SOCFPGA_PLL_DIVF_MASK) >> SOCFPGA_PLL_DIVF_SHIFT; divq = (reg & SOCFPGA_PLL_DIVQ_MASK) >> SOCFPGA_PLL_DIVQ_SHIFT; vco_freq = (unsigned long long)parent_rate * (divf + 1); do_div(vco_freq, (1 + divq)); return (unsigned long)vco_freq; }
static unsigned long clk_pll_recalc_rate(struct clk_hw *hwclk, unsigned long parent_rate) { struct socfpga_pll *socfpgaclk = to_socfpga_clk(hwclk); unsigned long divf, divq, reg; unsigned long long vco_freq; unsigned long bypass; reg = readl(socfpgaclk->hw.reg); bypass = readl(clk_mgr_base_addr + CLKMGR_BYPASS); if (bypass & MAINPLL_BYPASS) return parent_rate; divf = (reg & SOCFPGA_PLL_DIVF_MASK) >> SOCFPGA_PLL_DIVF_SHIFT; divq = (reg & SOCFPGA_PLL_DIVQ_MASK) >> SOCFPGA_PLL_DIVQ_SHIFT; vco_freq = (unsigned long long)parent_rate * (divf + 1); do_div(vco_freq, (1 + divq)); return (unsigned long)vco_freq; }