1979d74d9Sryan_chen // SPDX-License-Identifier: GPL-2.0+
2979d74d9Sryan_chen /*
3979d74d9Sryan_chen * Copyright (C) ASPEED Technology Inc.
4979d74d9Sryan_chen */
5979d74d9Sryan_chen
6979d74d9Sryan_chen #include <common.h>
7979d74d9Sryan_chen #include <clk.h>
8979d74d9Sryan_chen #include <dm.h>
9979d74d9Sryan_chen #include <errno.h>
10979d74d9Sryan_chen #include <fdtdec.h>
11979d74d9Sryan_chen #include <asm/io.h>
12979d74d9Sryan_chen #include <asm/arch/ahbc_aspeed.h>
13*6bd31712SChin-Ting Kuo #include <linux/types.h>
14979d74d9Sryan_chen
15017e7cecSryan_chen #define AHBC_UNLOCK 0xaeed1a03
16979d74d9Sryan_chen struct aspeed_ahbc_priv {
17979d74d9Sryan_chen struct aspeed_ahbc_reg *ahbc;
18979d74d9Sryan_chen };
19979d74d9Sryan_chen
aspeed_ahbc_remap_enable(struct aspeed_ahbc_reg * ahbc)20979d74d9Sryan_chen extern void aspeed_ahbc_remap_enable(struct aspeed_ahbc_reg *ahbc)
21979d74d9Sryan_chen {
22*6bd31712SChin-Ting Kuo uint32_t tmp_val;
23*6bd31712SChin-Ting Kuo
24*6bd31712SChin-Ting Kuo tmp_val = readl(&ahbc->addr_remap);
25*6bd31712SChin-Ting Kuo tmp_val |= 0x20;
26017e7cecSryan_chen writel(AHBC_UNLOCK, &ahbc->protection_key);
27*6bd31712SChin-Ting Kuo writel(tmp_val, &ahbc->addr_remap);
28017e7cecSryan_chen writel(0x1, &ahbc->protection_key);
29979d74d9Sryan_chen }
30979d74d9Sryan_chen
aspeed_ahbc_probe(struct udevice * dev)31979d74d9Sryan_chen static int aspeed_ahbc_probe(struct udevice *dev)
32979d74d9Sryan_chen {
33979d74d9Sryan_chen struct aspeed_ahbc_priv *priv = dev_get_priv(dev);
34979d74d9Sryan_chen
35979d74d9Sryan_chen debug("%s(dev=%p) \n", __func__, dev);
36979d74d9Sryan_chen
37979d74d9Sryan_chen priv->ahbc = devfdt_get_addr_ptr(dev);
38979d74d9Sryan_chen if (IS_ERR(priv->ahbc))
39979d74d9Sryan_chen return PTR_ERR(priv->ahbc);
40979d74d9Sryan_chen
41979d74d9Sryan_chen return 0;
42979d74d9Sryan_chen }
43979d74d9Sryan_chen
44979d74d9Sryan_chen static const struct udevice_id aspeed_ahbc_ids[] = {
45979d74d9Sryan_chen { .compatible = "aspeed,aspeed-ahbc" },
46979d74d9Sryan_chen { }
47979d74d9Sryan_chen };
48979d74d9Sryan_chen
49979d74d9Sryan_chen U_BOOT_DRIVER(aspeed_ahbc) = {
50979d74d9Sryan_chen .name = "aspeed_ahbc",
51979d74d9Sryan_chen .id = UCLASS_MISC,
52979d74d9Sryan_chen .of_match = aspeed_ahbc_ids,
53979d74d9Sryan_chen .probe = aspeed_ahbc_probe,
54979d74d9Sryan_chen .priv_auto_alloc_size = sizeof(struct aspeed_ahbc_priv),
55979d74d9Sryan_chen };
56