blob: 50d7f99b2643927487e4a3a5e59e8045296cb0cf [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
maxims@google.com2d5a2ad2017-01-18 13:44:56 -08002/*
3 * Copyright (C) 2016 Google, Inc
maxims@google.com2d5a2ad2017-01-18 13:44:56 -08004 */
5
maxims@google.com2d5a2ad2017-01-18 13:44:56 -08006#include <dm.h>
maxims@google.comadea66c2017-04-17 12:00:23 -07007#include <asm/io.h>
maxims@google.com2d5a2ad2017-01-18 13:44:56 -08008#include <asm/arch/scu_ast2500.h>
Simon Glassd66c5f72020-02-03 07:36:15 -07009#include <linux/err.h>
maxims@google.com2d5a2ad2017-01-18 13:44:56 -080010
11int ast_get_clk(struct udevice **devp)
12{
13 return uclass_get_device_by_driver(UCLASS_CLK,
Simon Glass65130cd2020-12-28 20:34:56 -070014 DM_DRIVER_GET(aspeed_ast2500_scu), devp);
maxims@google.com2d5a2ad2017-01-18 13:44:56 -080015}
16
17void *ast_get_scu(void)
18{
19 struct ast2500_clk_priv *priv;
20 struct udevice *dev;
21 int ret;
22
23 ret = ast_get_clk(&dev);
24 if (ret)
25 return ERR_PTR(ret);
26
27 priv = dev_get_priv(dev);
28
29 return priv->scu;
30}
maxims@google.comadea66c2017-04-17 12:00:23 -070031
32void ast_scu_unlock(struct ast2500_scu *scu)
33{
34 writel(SCU_UNLOCK_VALUE, &scu->protection_key);
35 while (!readl(&scu->protection_key))
36 ;
37}
38
39void ast_scu_lock(struct ast2500_scu *scu)
40{
41 writel(~SCU_UNLOCK_VALUE, &scu->protection_key);
42 while (readl(&scu->protection_key))
43 ;
44}