aspeed: Make SCU lock/unlock functions part of SCU API

Make functions for locking and unlocking SCU part of SCU API.
Many drivers need to modify settings in SCU and thus need to unlock it
first. This change makes it possible.

Signed-off-by: Maxim Sloyko <maxims@google.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
maxims@google.com 2017-04-17 12:00:23 -07:00 committed by Tom Rini
parent 1eb0a464b7
commit 413353b30b
3 changed files with 31 additions and 16 deletions

View File

@ -120,6 +120,20 @@ int ast_get_clk(struct udevice **devp);
*/
void *ast_get_scu(void);
/**
* ast_scu_unlock() - unlock protected registers
*
* @scu, pointer to ast2500_scu
*/
void ast_scu_unlock(struct ast2500_scu *scu);
/**
* ast_scu_lock() - lock protected registers
*
* @scu, pointer to ast2500_scu
*/
void ast_scu_lock(struct ast2500_scu *scu);
#endif /* __ASSEMBLY__ */
#endif /* _ASM_ARCH_SCU_AST2500_H */

View File

@ -6,6 +6,7 @@
#include <common.h>
#include <dm.h>
#include <asm/io.h>
#include <asm/arch/scu_ast2500.h>
int ast_get_clk(struct udevice **devp)
@ -28,3 +29,17 @@ void *ast_get_scu(void)
return priv->scu;
}
void ast_scu_unlock(struct ast2500_scu *scu)
{
writel(SCU_UNLOCK_VALUE, &scu->protection_key);
while (!readl(&scu->protection_key))
;
}
void ast_scu_lock(struct ast2500_scu *scu)
{
writel(~SCU_UNLOCK_VALUE, &scu->protection_key);
while (readl(&scu->protection_key))
;
}

View File

@ -132,20 +132,6 @@ static ulong ast2500_clk_get_rate(struct clk *clk)
return rate;
}
static void ast2500_scu_unlock(struct ast2500_scu *scu)
{
writel(SCU_UNLOCK_VALUE, &scu->protection_key);
while (!readl(&scu->protection_key))
;
}
static void ast2500_scu_lock(struct ast2500_scu *scu)
{
writel(~SCU_UNLOCK_VALUE, &scu->protection_key);
while (readl(&scu->protection_key))
;
}
static ulong ast2500_configure_ddr(struct ast2500_scu *scu, ulong rate)
{
ulong clkin = ast2500_get_clkin(scu);
@ -197,9 +183,9 @@ static ulong ast2500_configure_ddr(struct ast2500_scu *scu, ulong rate)
| (best_num << SCU_MPLL_NUM_SHIFT)
| (best_denum << SCU_MPLL_DENUM_SHIFT);
ast2500_scu_unlock(scu);
ast_scu_unlock(scu);
writel(mpll_reg, &scu->m_pll_param);
ast2500_scu_lock(scu);
ast_scu_lock(scu);
return ast2500_get_mpll_rate(clkin, mpll_reg);
}