Commit | Line | Data |
---|---|---|
6136a232 WG |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* | |
3 | * Copyright (C) 2022 MediaTek Inc. All rights reserved. | |
4 | * | |
5 | * Author: Weijie Gao <weijie.gao@mediatek.com> | |
6 | */ | |
7 | ||
8 | #include <linux/types.h> | |
9 | #include <cpu.h> | |
10 | #include <dm.h> | |
11 | #include <regmap.h> | |
12 | #include <syscon.h> | |
13 | #include <asm/global_data.h> | |
14 | #include <linux/err.h> | |
15 | #include <linux/io.h> | |
16 | ||
17 | DECLARE_GLOBAL_DATA_PTR; | |
18 | ||
19 | struct mtk_cpu_plat { | |
20 | struct regmap *hwver; | |
21 | }; | |
22 | ||
23 | static int mtk_cpu_get_desc(const struct udevice *dev, char *buf, int size) | |
24 | { | |
25 | struct mtk_cpu_plat *plat = dev_get_plat(dev); | |
26 | uint val; | |
27 | ||
28 | regmap_read(plat->hwver, 0, &val); | |
29 | ||
30 | snprintf(buf, size, "MediaTek MT%04X", val); | |
31 | ||
32 | return 0; | |
33 | } | |
34 | ||
35 | static int mtk_cpu_get_count(const struct udevice *dev) | |
36 | { | |
37 | return 1; | |
38 | } | |
39 | ||
40 | static int mtk_cpu_get_vendor(const struct udevice *dev, char *buf, int size) | |
41 | { | |
42 | snprintf(buf, size, "MediaTek"); | |
43 | ||
44 | return 0; | |
45 | } | |
46 | ||
47 | static int mtk_cpu_probe(struct udevice *dev) | |
48 | { | |
49 | struct mtk_cpu_plat *plat = dev_get_plat(dev); | |
50 | struct ofnode_phandle_args args; | |
51 | int ret; | |
52 | ||
53 | ret = dev_read_phandle_with_args(dev, "mediatek,hwver", NULL, 0, 0, | |
54 | &args); | |
55 | if (ret) | |
56 | return ret; | |
57 | ||
58 | plat->hwver = syscon_node_to_regmap(args.node); | |
59 | if (IS_ERR(plat->hwver)) | |
60 | return PTR_ERR(plat->hwver); | |
61 | ||
62 | return 0; | |
63 | } | |
64 | ||
65 | static const struct cpu_ops mtk_cpu_ops = { | |
66 | .get_desc = mtk_cpu_get_desc, | |
67 | .get_count = mtk_cpu_get_count, | |
68 | .get_vendor = mtk_cpu_get_vendor, | |
69 | }; | |
70 | ||
71 | static const struct udevice_id mtk_cpu_ids[] = { | |
72 | { .compatible = "arm,cortex-a7" }, | |
73 | { .compatible = "arm,cortex-a53" }, | |
74 | { .compatible = "arm,cortex-a73" }, | |
75 | { /* sentinel */ } | |
76 | }; | |
77 | ||
78 | U_BOOT_DRIVER(cpu_mtk) = { | |
79 | .name = "mtk-cpu", | |
80 | .id = UCLASS_CPU, | |
81 | .of_match = mtk_cpu_ids, | |
82 | .ops = &mtk_cpu_ops, | |
83 | .probe = mtk_cpu_probe, | |
84 | .plat_auto = sizeof(struct mtk_cpu_plat), | |
85 | .flags = DM_FLAG_PRE_RELOC, | |
86 | }; |