]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/arm/cpu/armv7/am33xx/sys_info.c
merged tx6dl-devel into denx master branch
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / am33xx / sys_info.c
1 /*
2  * sys_info.c
3  *
4  * System information functions
5  *
6  * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
7  *
8  * Derived from Beagle Board and 3430 SDP code by
9  *      Richard Woodruff <r-woodruff2@ti.com>
10  *      Syed Mohammed Khasim <khasim@ti.com>
11  *
12  * SPDX-License-Identifier:     GPL-2.0+
13  */
14
15 #include <common.h>
16 #include <asm/io.h>
17 #include <asm/arch/sys_proto.h>
18 #include <asm/arch/cpu.h>
19 #include <asm/arch/clock.h>
20
21 struct ctrl_stat *cstat = (struct ctrl_stat *)CTRL_BASE;
22
23 /**
24  * get_cpu_rev(void) - extract rev info
25  */
26 u32 get_cpu_rev(void)
27 {
28         u32 id;
29         u32 rev;
30
31         id = readl(DEVICE_ID);
32         rev = (id >> 28) & 0xff;
33
34         return rev;
35 }
36
37 /**
38  * get_cpu_type(void) - extract cpu info
39  */
40 u32 get_cpu_type(void)
41 {
42         u32 id = 0;
43         u32 partnum;
44
45         id = readl(DEVICE_ID);
46         partnum = (id >> 12) & 0xffff;
47
48         return partnum;
49 }
50
51 /**
52  * get_board_rev() - setup to pass kernel board revision information
53  * returns:(bit[0-3] sub version, higher bit[7-4] is higher version)
54  */
55 u32 get_board_rev(void)
56 {
57         return BOARD_REV_ID;
58 }
59
60 /**
61  * get_device_type(): tell if GP/HS/EMU/TST
62  */
63 u32 get_device_type(void)
64 {
65         int mode;
66         mode = readl(&cstat->statusreg) & DEVICE_MASK;
67         return mode >>= 8;
68 }
69
70 /**
71  * get_sysboot_value(void) - return SYS_BOOT[4:0]
72  */
73 u32 get_sysboot_value(void)
74 {
75         int mode;
76         mode = readl(&cstat->statusreg) & SYSBOOT_MASK;
77         return mode;
78 }
79
80 #ifdef CONFIG_DISPLAY_CPUINFO
81 #define SYSBOOT_FREQ_SHIFT      22
82 #define SYSBOOT_FREQ_MASK       (3 << SYSBOOT_FREQ_SHIFT)
83
84 static unsigned long bootfreqs[] = {
85         19200000,
86         24000000,
87         25000000,
88         26000000,
89 };
90
91 static u32 get_sysboot_freq(void)
92 {
93         int mode;
94         mode = readl(&cstat->statusreg) & SYSBOOT_FREQ_MASK;
95         return bootfreqs[mode >> SYSBOOT_FREQ_SHIFT];
96 }
97
98 /**
99  * Print CPU information
100  */
101 int print_cpuinfo(void)
102 {
103         char *cpu_s, *sec_s;
104         unsigned long clk;
105         const struct cm_wkuppll *cmwkup = (struct cm_wkuppll *)CM_WKUP;
106
107         switch (get_cpu_type()) {
108         case AM335X:
109                 cpu_s = "AM335X";
110                 break;
111         case TI81XX:
112                 cpu_s = "TI81XX";
113                 break;
114         default:
115                 cpu_s = "Unknown cpu type";
116         }
117
118         switch (get_device_type()) {
119         case TST_DEVICE:
120                 sec_s = "TST";
121                 break;
122         case EMU_DEVICE:
123                 sec_s = "EMU";
124                 break;
125         case HS_DEVICE:
126                 sec_s = "HS";
127                 break;
128         case GP_DEVICE:
129                 sec_s = "GP";
130                 break;
131         default:
132                 sec_s = "?";
133         }
134
135         printf("%s-%s rev %d\n", cpu_s, sec_s, get_cpu_rev());
136
137         clk = get_sysboot_freq();
138         printf("OSC clk: %4lu.%03lu MHz\n",
139                 clk / 1000000, clk / 1000 % 1000);
140         clk = clk_get_rate(cmwkup, mpu);
141         printf("MPU clk: %4lu.%03lu MHz\n",
142                 clk / 1000000, clk / 1000 % 1000);
143         clk = clk_get_rate(cmwkup, ddr);
144         printf("DDR clk: %4lu.%03lu MHz\n",
145                 clk / 1000000, clk / 1000 % 1000);
146         clk = clk_get_rate(cmwkup, per);
147         printf("PER clk: %4lu.%03lu MHz\n",
148                 clk / 1000000, clk / 1000 % 1000);
149 #ifdef CONFIG_LCD
150         clk = clk_get_rate(cmwkup, disp);
151         printf("LCD clk: %4lu.%03lu MHz\n",
152                 clk / 1000000, clk / 1000 % 1000);
153 #endif
154
155         return 0;
156 }
157 #endif  /* CONFIG_DISPLAY_CPUINFO */