static void clk_audio_pll_pmc_disable(struct clk_hw *hw) { struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw); struct at91_pmc *pmc = apmc_ck->pmc; u32 tmp; pmc_lock(pmc); tmp = pmc_read(pmc, AT91_PMC_AUDIO_PLL0) & ~AT91_PMC_AUDIO_PLL_PMCEN; pmc_write(pmc, AT91_PMC_AUDIO_PLL0, tmp); pmc_unlock(pmc); }
/* make sure that pll is in reset state beforehand */ static int clk_audio_pll_prepare(struct clk_hw *hw) { struct clk_audio_frac *fck = to_clk_audio_frac(hw); struct at91_pmc *pmc = fck->pmc; u32 tmp; pmc_lock(pmc); tmp = pmc_read(pmc, AT91_PMC_AUDIO_PLL0) & ~AT91_PMC_AUDIO_PLL_RESETN; pmc_write(pmc, AT91_PMC_AUDIO_PLL0, tmp); pmc_unlock(pmc); return 0; }
static void clk_audio_pll_disable(struct clk_hw *hw) { struct clk_audio_frac *fck = to_clk_audio_frac(hw); struct at91_pmc *pmc = fck->pmc; u32 tmp; pmc_lock(pmc); tmp = pmc_read(pmc, AT91_PMC_AUDIO_PLL0) & ~AT91_PMC_AUDIO_PLL_PLLEN; pmc_write(pmc, AT91_PMC_AUDIO_PLL0, tmp); /* do it in 2 separated writes */ pmc_write(pmc, AT91_PMC_AUDIO_PLL0, tmp & ~AT91_PMC_AUDIO_PLL_RESETN); pmc_unlock(pmc); }
static int clk_audio_pll_pmc_enable(struct clk_hw *hw) { struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw); struct at91_pmc *pmc = apmc_ck->pmc; u32 tmp; pmc_lock(pmc); tmp = pmc_read(pmc, AT91_PMC_AUDIO_PLL0) & ~AT91_PMC_AUDIO_PLL_QDPMC_MASK; tmp |= AT91_PMC_AUDIO_PLL_PMCEN | AT91_PMC_AUDIO_PLL_QDPMC(apmc_ck->qdpmc); pmc_write(pmc, AT91_PMC_AUDIO_PLL0, tmp); pmc_unlock(pmc); return 0; }
static int clk_sama5d4_h32mx_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate) { struct clk_sama5d4_h32mx *h32mxclk = to_clk_sama5d4_h32mx(hw); struct at91_pmc *pmc = h32mxclk->pmc; u32 tmp; if (parent_rate != rate && (parent_rate / 2) != rate) return -EINVAL; pmc_lock(pmc); tmp = pmc_read(pmc, AT91_PMC_MCKR) & ~AT91_PMC_H32MXDIV; if ((parent_rate / 2) == rate) tmp |= AT91_PMC_H32MXDIV; pmc_write(pmc, AT91_PMC_MCKR, tmp); pmc_unlock(pmc); return 0; }
static int clk_audio_pll_enable(struct clk_hw *hw) { struct clk_audio_frac *fck = to_clk_audio_frac(hw); struct at91_pmc *pmc = fck->pmc; u32 tmp, tmp2; pmc_lock(pmc); tmp = pmc_read(pmc, AT91_PMC_AUDIO_PLL0); pmc_write(pmc, AT91_PMC_AUDIO_PLL0, tmp | AT91_PMC_AUDIO_PLL_RESETN); tmp2 = pmc_read(pmc, AT91_PMC_AUDIO_PLL1) & ~AT91_PMC_AUDIO_PLL_FRACR_MASK; pmc_write(pmc, AT91_PMC_AUDIO_PLL1, tmp2 | fck->fracr); /* * reset and enabled have to be done in 2 separated writes * for AT91_PMC_AUDIO_PLL0 */ tmp &= ~AT91_PMC_AUDIO_PLL_ND_MASK; pmc_write(pmc, AT91_PMC_AUDIO_PLL0, tmp | AT91_PMC_AUDIO_PLL_RESETN | AT91_PMC_AUDIO_PLL_PLLEN | AT91_PMC_AUDIO_PLL_ND(fck->nd)); pmc_unlock(pmc); return 0; }