mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-06 02:24:14 +08:00
clk: at91: modify PMC peripheral clock to deal with newer register layout
As some more information is added to the PCR register, we'd better use a copy of its content and modify just the peripheral-related bits. Implement a read-modify-write for the enable() and disable() callbacks. Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
This commit is contained in:
parent
96ef36e9c4
commit
36844bdf65
@ -161,14 +161,18 @@ static int clk_sam9x5_peripheral_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_sam9x5_peripheral *periph = to_clk_sam9x5_peripheral(hw);
|
||||
struct at91_pmc *pmc = periph->pmc;
|
||||
u32 tmp;
|
||||
|
||||
if (periph->id < PERIPHERAL_ID_MIN)
|
||||
return 0;
|
||||
|
||||
pmc_write(pmc, AT91_PMC_PCR, (periph->id & AT91_PMC_PCR_PID_MASK) |
|
||||
AT91_PMC_PCR_CMD |
|
||||
AT91_PMC_PCR_DIV(periph->div) |
|
||||
AT91_PMC_PCR_EN);
|
||||
pmc_lock(pmc);
|
||||
pmc_write(pmc, AT91_PMC_PCR, (periph->id & AT91_PMC_PCR_PID_MASK));
|
||||
tmp = pmc_read(pmc, AT91_PMC_PCR) & ~AT91_PMC_PCR_DIV_MASK;
|
||||
pmc_write(pmc, AT91_PMC_PCR, tmp | AT91_PMC_PCR_DIV(periph->div)
|
||||
| AT91_PMC_PCR_CMD
|
||||
| AT91_PMC_PCR_EN);
|
||||
pmc_unlock(pmc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -176,12 +180,16 @@ static void clk_sam9x5_peripheral_disable(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_sam9x5_peripheral *periph = to_clk_sam9x5_peripheral(hw);
|
||||
struct at91_pmc *pmc = periph->pmc;
|
||||
u32 tmp;
|
||||
|
||||
if (periph->id < PERIPHERAL_ID_MIN)
|
||||
return;
|
||||
|
||||
pmc_write(pmc, AT91_PMC_PCR, (periph->id & AT91_PMC_PCR_PID_MASK) |
|
||||
AT91_PMC_PCR_CMD);
|
||||
pmc_lock(pmc);
|
||||
pmc_write(pmc, AT91_PMC_PCR, (periph->id & AT91_PMC_PCR_PID_MASK));
|
||||
tmp = pmc_read(pmc, AT91_PMC_PCR) & ~AT91_PMC_PCR_EN;
|
||||
pmc_write(pmc, AT91_PMC_PCR, tmp | AT91_PMC_PCR_CMD);
|
||||
pmc_unlock(pmc);
|
||||
}
|
||||
|
||||
static int clk_sam9x5_peripheral_is_enabled(struct clk_hw *hw)
|
||||
|
Loading…
Reference in New Issue
Block a user