]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - patches/0113-ENGR00123488-MX53-Board-Identification.patch
imported Ka-Ro specific additions to U-Boot 2009.08 for TX28
[karo-tx-uboot.git] / patches / 0113-ENGR00123488-MX53-Board-Identification.patch
1 From a0e1ec967f99d08ce0a48c45a509959453e5f3a7 Mon Sep 17 00:00:00 2001
2 From: Jason Liu <r64343@freescale.com>
3 Date: Fri, 14 May 2010 16:08:22 +0800
4 Subject: [PATCH] ENGR00123488  MX53 Board Identification
5
6 The CPU_ID0 analog voltage level is obtained by reading ADC
7 channel 12 of the LTC2495 and the CPU_ID1 analog voltage
8 level is obtained by reading ADC channel 13.
9
10 The ADC data register value read from the LTC2495 is a 24 bit value.
11 For example, an ADC value that reads between 0xB3CF3E and 0xB9E79E
12 indicates a 130k ohm resistor is populated on the daughtercard,
13 which corresponds to ID level 20
14
15 By using CPU_ID0, CPU_ID1 to identify the board for example:
16 CPU_ID0 = 21, CPU_ID1 = 15, MX53-EVK with DDR2 1GByte RevB
17
18 Signed-off-by:Jason Liu <r64343@freescale.com>
19 ---
20  board/freescale/mx53_evk/mx53_evk.c |  170 ++++++++++++++++++++++++++++++++++-
21  1 files changed, 167 insertions(+), 3 deletions(-)
22
23 diff --git a/board/freescale/mx53_evk/mx53_evk.c b/board/freescale/mx53_evk/mx53_evk.c
24 index 9526b2d..6be0b37 100644
25 --- a/board/freescale/mx53_evk/mx53_evk.c
26 +++ b/board/freescale/mx53_evk/mx53_evk.c
27 @@ -282,6 +282,168 @@ void setup_core_voltages(void)
28         /* Raise the core frequency to 800MHz */
29         writel(0x0, CCM_BASE_ADDR + CLKCTL_CACRR);
30  }
31 +
32 +static int __read_adc_channel(unsigned int chan)
33 +{
34 +       unsigned char buf[4] = { 0 };
35 +
36 +       buf[0] = (0xb0 | ((chan & 0x1) << 3) | ((chan >> 1) & 0x7));
37 +
38 +       /* LTC2495 need 410ms delay */
39 +       udelay(410000);
40 +
41 +       if (i2c_write(0x14, chan, 0, &buf[0], 1)) {
42 +               printf("%s:i2c_write:error\n", __func__);
43 +               return -1;
44 +       }
45 +
46 +       /* LTC2495 need 410ms delay*/
47 +       udelay(410000);
48 +
49 +       if (i2c_read(0x14, chan, 0, &buf[0], 3)) {
50 +               printf("%s:i2c_read:error\n", __func__);
51 +               return -1;
52 +       }
53 +
54 +       return buf[0] << 16 | buf[1] << 8 | buf[2];
55 +}
56 +
57 +static int __lookup_board_id(int adc_val)
58 +{
59 +       int id;
60 +
61 +       if (adc_val < 0x3FFFC0)
62 +               id = 0;
63 +       else if (adc_val < 0x461863)
64 +               id = 1;
65 +       else if (adc_val < 0x4C30C4)
66 +               id = 2;
67 +       else if (adc_val < 0x524926)
68 +               id = 3;
69 +       else if (adc_val < 0x586187)
70 +               id = 4;
71 +       else if (adc_val < 0x5E79E9)
72 +               id = 5;
73 +       else if (adc_val < 0x64924A)
74 +               id = 6;
75 +       else if (adc_val < 0x6AAAAC)
76 +               id = 7;
77 +       else if (adc_val < 0x70C30D)
78 +               id = 8;
79 +       else if (adc_val < 0x76DB6F)
80 +               id = 9;
81 +       else if (adc_val < 0x7CF3D0)
82 +               id = 10;
83 +       else if (adc_val < 0x830C32)
84 +               id = 11;
85 +       else if (adc_val < 0x892493)
86 +               id = 12;
87 +       else if (adc_val < 0x8F3CF5)
88 +               id = 13;
89 +       else if (adc_val < 0x955556)
90 +               id = 14;
91 +       else if (adc_val < 0x9B6DB8)
92 +               id = 15;
93 +       else if (adc_val < 0xA18619)
94 +               id = 16;
95 +       else if (adc_val < 0xA79E7B)
96 +               id = 17;
97 +       else if (adc_val < 0xADB6DC)
98 +               id = 18;
99 +       else if (adc_val < 0xB3CF3E)
100 +               id = 19;
101 +       else if (adc_val < 0xB9E79F)
102 +               id = 20;
103 +       else if (adc_val < 0xC00000)
104 +               id = 21;
105 +               else
106 +               return -1;
107 +
108 +       return id;
109 +}
110 +
111 +static int __print_board_info(int id0, int id1)
112 +{
113 +       int ret = 0;
114 +
115 +       switch (id0) {
116 +       case 21:
117 +               switch (id1) {
118 +               case 15:
119 +                       printf("MX53-EVK with DDR2 1GByte RevB\n");
120 +
121 +                       break;
122 +               case 18:
123 +                       printf("MX53-EVK with DDR2 2GByte RevA1\n");
124 +
125 +                       break;
126 +               case 19:
127 +                       printf("MX53-EVK with DDR2 2GByte RevA2\n");
128 +                       break;
129 +               default:
130 +                       printf("Unkown board id1:%d\n", id1);
131 +                       ret = -1;
132 +
133 +                       break;
134 +               }
135 +
136 +               break;
137 +       case 11:
138 +               switch (id1) {
139 +               case 1:
140 +                       printf("MX53 1.5V DDR3 x8 CPU Card, Rev. A\n");
141 +
142 +                       break;
143 +               case 11:
144 +                       printf("MX53 1.8V DDR2 x8 CPU Card, Rev. A\n");
145 +
146 +                       break;
147 +               default:
148 +                       printf("Unkown board id1:%d\n", id1);
149 +                       ret = -1;
150 +
151 +                       break;
152 +               }
153 +
154 +               break;
155 +       default:
156 +               printf("Unkown board id0:%d\n", id0);
157 +
158 +               break;
159 +       }
160 +
161 +       return ret;
162 +}
163 +
164 +int identify_board_id(void)
165 +{
166 +       int ret = 0;
167 +       int bd_id0, bd_id1;
168 +
169 +#define CPU_CHANNEL_ID0 0xc
170 +#define CPU_CHANNEL_ID1 0xd
171 +
172 +       ret = bd_id0 = __read_adc_channel(CPU_CHANNEL_ID0);
173 +       if (ret < 0)
174 +               return ret;
175 +
176 +       ret = bd_id1 = __read_adc_channel(CPU_CHANNEL_ID1);
177 +       if (ret < 0)
178 +               return ret;
179 +
180 +       ret = bd_id0 = __lookup_board_id(bd_id0);
181 +       if (ret < 0)
182 +               return ret;
183 +
184 +       ret = bd_id1 = __lookup_board_id(bd_id1);
185 +       if (ret < 0)
186 +               return ret;
187 +
188 +       ret = __print_board_info(bd_id0, bd_id1);
189 +
190 +       return ret;
191 +
192 +}
193  #endif
194  
195  void spi_io_init(struct imx_spi_dev_t *dev)
196 @@ -520,10 +682,12 @@ int board_late_init(void)
197  
198  int checkboard(void)
199  {
200 -       printf("Board: MX53 EVK ");
201 -
202 -       printf("1.0 [");
203 +       printf("Board:   ");
204  
205 +#ifdef CONFIG_I2C_MXC
206 +       identify_board_id();
207 +#endif
208 +       printf("Boot Reason: [");
209  
210         switch (__REG(SRC_BASE_ADDR + 0x8)) {
211         case 0x0001:
212 -- 
213 1.5.4.4
214