0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/clk.h>
0012 #include <linux/of_address.h>
0013
0014 #include "clk-exynos-arm64.h"
0015
0016
0017 #define GATE_MANUAL BIT(20)
0018 #define GATE_ENABLE_HWACG BIT(28)
0019
0020
0021 #define GATE_OFF_START 0x2000
0022 #define GATE_OFF_END 0x2fff
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 static void __init exynos_arm64_init_clocks(struct device_node *np,
0033 const unsigned long *reg_offs, size_t reg_offs_len)
0034 {
0035 void __iomem *reg_base;
0036 size_t i;
0037
0038 reg_base = of_iomap(np, 0);
0039 if (!reg_base)
0040 panic("%s: failed to map registers\n", __func__);
0041
0042 for (i = 0; i < reg_offs_len; ++i) {
0043 void __iomem *reg = reg_base + reg_offs[i];
0044 u32 val;
0045
0046
0047 if (reg_offs[i] < GATE_OFF_START || reg_offs[i] > GATE_OFF_END)
0048 continue;
0049
0050 val = readl(reg);
0051 val |= GATE_MANUAL;
0052 val &= ~GATE_ENABLE_HWACG;
0053 writel(val, reg);
0054 }
0055
0056 iounmap(reg_base);
0057 }
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 void __init exynos_arm64_register_cmu(struct device *dev,
0073 struct device_node *np, const struct samsung_cmu_info *cmu)
0074 {
0075
0076 if (cmu->clk_name) {
0077 struct clk *parent_clk;
0078
0079 if (dev)
0080 parent_clk = clk_get(dev, cmu->clk_name);
0081 else
0082 parent_clk = of_clk_get_by_name(np, cmu->clk_name);
0083
0084 if (IS_ERR(parent_clk)) {
0085 pr_err("%s: could not find bus clock %s; err = %ld\n",
0086 __func__, cmu->clk_name, PTR_ERR(parent_clk));
0087 } else {
0088 clk_prepare_enable(parent_clk);
0089 }
0090 }
0091
0092 exynos_arm64_init_clocks(np, cmu->clk_regs, cmu->nr_clk_regs);
0093 samsung_cmu_register_one(np, cmu);
0094 }