blob: 50eb598ff2686142c364a6688b47650e5c64d5fe [file] [log] [blame]
Chandan Nath1c959692011-10-14 02:58:22 +00001/*
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 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +020012 * SPDX-License-Identifier: GPL-2.0+
Chandan Nath1c959692011-10-14 02:58:22 +000013 */
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>
Tom Rini52437072013-08-30 16:28:46 -040020#include <power/tps65910.h>
Chandan Nath1c959692011-10-14 02:58:22 +000021
22struct ctrl_stat *cstat = (struct ctrl_stat *)CTRL_BASE;
23
24/**
25 * get_cpu_rev(void) - extract rev info
26 */
27u32 get_cpu_rev(void)
28{
29 u32 id;
30 u32 rev;
31
32 id = readl(DEVICE_ID);
33 rev = (id >> 28) & 0xff;
34
35 return rev;
36}
37
38/**
39 * get_cpu_type(void) - extract cpu info
40 */
41u32 get_cpu_type(void)
42{
43 u32 id = 0;
44 u32 partnum;
45
46 id = readl(DEVICE_ID);
47 partnum = (id >> 12) & 0xffff;
48
49 return partnum;
50}
51
52/**
53 * get_board_rev() - setup to pass kernel board revision information
54 * returns:(bit[0-3] sub version, higher bit[7-4] is higher version)
55 */
56u32 get_board_rev(void)
57{
58 return BOARD_REV_ID;
59}
60
61/**
62 * get_device_type(): tell if GP/HS/EMU/TST
63 */
64u32 get_device_type(void)
65{
66 int mode;
67 mode = readl(&cstat->statusreg) & (DEVICE_MASK);
68 return mode >>= 8;
69}
70
71/**
72 * get_sysboot_value(void) - return SYS_BOOT[4:0]
73 */
74u32 get_sysboot_value(void)
75{
76 int mode;
77 mode = readl(&cstat->statusreg) & (SYSBOOT_MASK);
78 return mode;
79}
80
81#ifdef CONFIG_DISPLAY_CPUINFO
82/**
83 * Print CPU information
84 */
85int print_cpuinfo(void)
86{
87 char *cpu_s, *sec_s;
Chandan Nath1c959692011-10-14 02:58:22 +000088
89 switch (get_cpu_type()) {
90 case AM335X:
91 cpu_s = "AM335X";
92 break;
Matt Porter691fbe32013-03-15 10:07:06 +000093 case TI81XX:
94 cpu_s = "TI81XX";
95 break;
Chandan Nath1c959692011-10-14 02:58:22 +000096 default:
97 cpu_s = "Unknown cpu type";
98 break;
99 }
100
101 switch (get_device_type()) {
102 case TST_DEVICE:
103 sec_s = "TST";
104 break;
105 case EMU_DEVICE:
106 sec_s = "EMU";
107 break;
108 case HS_DEVICE:
109 sec_s = "HS";
110 break;
111 case GP_DEVICE:
112 sec_s = "GP";
113 break;
114 default:
115 sec_s = "?";
116 }
117
Tom Rini7a62e442013-04-25 16:46:04 -0400118 printf("%s-%s rev %d\n", cpu_s, sec_s, get_cpu_rev());
Chandan Nath1c959692011-10-14 02:58:22 +0000119
120 return 0;
121}
122#endif /* CONFIG_DISPLAY_CPUINFO */
Tom Rini52437072013-08-30 16:28:46 -0400123
124#ifdef CONFIG_AM33XX
125int am335x_get_efuse_mpu_max_freq(struct ctrl_dev *cdev)
126{
127 int sil_rev;
128
129 sil_rev = readl(&cdev->deviceid) >> 28;
130
131 if (sil_rev == 1)
132 /* PG 2.0, efuse may not be set. */
133 return MPUPLL_M_800;
134 else if (sil_rev >= 2) {
135 /* Check what the efuse says our max speed is. */
136 int efuse_arm_mpu_max_freq;
137 efuse_arm_mpu_max_freq = readl(&cdev->efuse_sma);
138 switch ((efuse_arm_mpu_max_freq & DEVICE_ID_MASK)) {
139 case AM335X_ZCZ_1000:
140 return MPUPLL_M_1000;
141 case AM335X_ZCZ_800:
142 return MPUPLL_M_800;
143 case AM335X_ZCZ_720:
144 return MPUPLL_M_720;
145 case AM335X_ZCZ_600:
146 case AM335X_ZCE_600:
147 return MPUPLL_M_600;
148 case AM335X_ZCZ_300:
149 case AM335X_ZCE_300:
150 return MPUPLL_M_300;
151 }
152 }
153
154 /* PG 1.0 or otherwise unknown, use the PG1.0 max */
155 return MPUPLL_M_720;
156}
157
158int am335x_get_tps65910_mpu_vdd(int sil_rev, int frequency)
159{
160 /* For PG2.1 and later, we have one set of values. */
161 if (sil_rev >= 2) {
162 switch (frequency) {
163 case MPUPLL_M_1000:
164 return TPS65910_OP_REG_SEL_1_3_2_5;
165 case MPUPLL_M_800:
166 return TPS65910_OP_REG_SEL_1_2_6;
167 case MPUPLL_M_720:
168 return TPS65910_OP_REG_SEL_1_2_0;
169 case MPUPLL_M_600:
170 case MPUPLL_M_300:
171 return TPS65910_OP_REG_SEL_1_1_3;
172 }
173 }
174
175 /* Default to PG1.0/PG2.0 values. */
176 return TPS65910_OP_REG_SEL_1_1_3;
177}
178#endif