blob: 8b615a9929c4b5b5e94dbf03c36c3cc1cf03adc2 [file] [log] [blame]
Sergey Kubushync74b2102007-08-10 20:26:18 +02001/*
2 * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
3 *
4 * Parts are shamelessly stolen from various TI sources, original copyright
5 * follows:
6 * -----------------------------------------------------------------
7 *
8 * Copyright (C) 2004 Texas Instruments.
9 *
10 * ----------------------------------------------------------------------------
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 * ----------------------------------------------------------------------------
25 */
26
27#include <common.h>
28#include <i2c.h>
29#include <asm/arch/hardware.h>
Sughosh Ganud7f9b502010-11-28 20:21:27 -050030#include <asm/arch/davinci_misc.h>
Sergey Kubushync74b2102007-08-10 20:26:18 +020031
Dirk Behme66b3f242007-09-15 11:55:42 +020032DECLARE_GLOBAL_DATA_PTR;
33
Sergey Kubushync74b2102007-08-10 20:26:18 +020034int board_init(void)
35{
Sergey Kubushync74b2102007-08-10 20:26:18 +020036 /* arch number of the board */
37 gd->bd->bi_arch_number = MACH_TYPE_SCHMOOGIE;
38
39 /* address of boot parameters */
40 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
41
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050042 /* Configure AEMIF pins (although this should be configured at boot time
43 * with pull-up/pull-down resistors) */
44 REG(PINMUX0) = 0x00000c1f;
45
46 davinci_errata_workarounds();
Sergey Kubushync74b2102007-08-10 20:26:18 +020047
48 /* Power on required peripherals */
Sergey Kubushync74b2102007-08-10 20:26:18 +020049 lpsc_on(DAVINCI_LPSC_GPIO);
50
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020051#if !defined(CONFIG_SYS_USE_DSPLINK)
Sergey Kubushync74b2102007-08-10 20:26:18 +020052 /* Powerup the DSP */
53 dsp_on();
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020054#endif /* CONFIG_SYS_USE_DSPLINK */
Sergey Kubushync74b2102007-08-10 20:26:18 +020055
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050056 davinci_enable_uart0();
57 davinci_enable_emac();
58 davinci_enable_i2c();
Sergey Kubushync74b2102007-08-10 20:26:18 +020059
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050060 lpsc_on(DAVINCI_LPSC_TIMER1);
Sergey Kubushync74b2102007-08-10 20:26:18 +020061 timer_init();
62
63 return(0);
64}
65
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -040066int misc_init_r(void)
Sergey Kubushync74b2102007-08-10 20:26:18 +020067{
68 u_int8_t tmp[20], buf[10];
69 int i = 0;
Sergey Kubushync74b2102007-08-10 20:26:18 +020070
71 /* Set serial number from UID chip */
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050072 const u_int8_t crc_tbl[256] = {
Sergey Kubushync74b2102007-08-10 20:26:18 +020073 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
74 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
75 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
76 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
77 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
78 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
79 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
80 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
81 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
82 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
83 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
84 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
85 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
86 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
87 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
88 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
89 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
90 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
91 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
92 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
93 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
94 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
95 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
96 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
97 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
98 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
99 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
100 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
101 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
102 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
103 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
104 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
105 };
106
Sergey Kubushync74b2102007-08-10 20:26:18 +0200107 /* Set serial number from UID chip */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200108 if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
109 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denkb6e7bd92010-10-05 21:17:28 +0200110 setenv("serial#", "FAILED");
Sergey Kubushync74b2102007-08-10 20:26:18 +0200111 } else {
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -0400112 if (buf[0] != 0x70) {
113 /* Device Family Code */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200114 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denkb6e7bd92010-10-05 21:17:28 +0200115 setenv("serial#", "FAILED");
Sergey Kubushync74b2102007-08-10 20:26:18 +0200116 }
117 }
118 /* Now check CRC */
119 tmp[0] = 0;
120 for (i = 0; i < 8; i++)
121 tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
122
123 if (tmp[0] != 0) {
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200124 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denkb6e7bd92010-10-05 21:17:28 +0200125 setenv("serial#", "FAILED");
Sergey Kubushync74b2102007-08-10 20:26:18 +0200126 } else {
127 /* CRC OK, set "serial" env variable */
ksi@koi8.netb361acd2007-08-14 10:02:16 -0700128 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
Sergey Kubushync74b2102007-08-10 20:26:18 +0200129 buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
Wolfgang Denkb6e7bd92010-10-05 21:17:28 +0200130 setenv("serial#", (char *)&tmp[0]);
Sergey Kubushync74b2102007-08-10 20:26:18 +0200131 }
132
Sergey Kubushync74b2102007-08-10 20:26:18 +0200133 return(0);
134}