blob: 52d00e42060d136c8fbdb0f468850a23f855d4ac [file] [log] [blame]
Sergey Kubushyne8f39122007-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 Ganu80995f92010-11-28 20:21:27 -050030#include <asm/arch/davinci_misc.h>
Sergey Kubushyne8f39122007-08-10 20:26:18 +020031
Dirk Behmef2b171c2007-09-15 11:55:42 +020032DECLARE_GLOBAL_DATA_PTR;
33
Sergey Kubushyne8f39122007-08-10 20:26:18 +020034int board_init(void)
35{
Sergey Kubushyne8f39122007-08-10 20:26:18 +020036 /* address of boot parameters */
37 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
38
Hugo Villeneuvec9a21372008-11-21 14:35:56 -050039 /* Configure AEMIF pins (although this should be configured at boot time
40 * with pull-up/pull-down resistors) */
41 REG(PINMUX0) = 0x00000c1f;
42
43 davinci_errata_workarounds();
Sergey Kubushyne8f39122007-08-10 20:26:18 +020044
45 /* Power on required peripherals */
Sergey Kubushyne8f39122007-08-10 20:26:18 +020046 lpsc_on(DAVINCI_LPSC_GPIO);
47
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020048#if !defined(CONFIG_SYS_USE_DSPLINK)
Sergey Kubushyne8f39122007-08-10 20:26:18 +020049 /* Powerup the DSP */
50 dsp_on();
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020051#endif /* CONFIG_SYS_USE_DSPLINK */
Sergey Kubushyne8f39122007-08-10 20:26:18 +020052
Hugo Villeneuvec9a21372008-11-21 14:35:56 -050053 davinci_enable_uart0();
54 davinci_enable_emac();
55 davinci_enable_i2c();
Sergey Kubushyne8f39122007-08-10 20:26:18 +020056
Hugo Villeneuvec9a21372008-11-21 14:35:56 -050057 lpsc_on(DAVINCI_LPSC_TIMER1);
Sergey Kubushyne8f39122007-08-10 20:26:18 +020058 timer_init();
59
60 return(0);
61}
62
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -040063int misc_init_r(void)
Sergey Kubushyne8f39122007-08-10 20:26:18 +020064{
65 u_int8_t tmp[20], buf[10];
66 int i = 0;
Sergey Kubushyne8f39122007-08-10 20:26:18 +020067
68 /* Set serial number from UID chip */
Hugo Villeneuvec9a21372008-11-21 14:35:56 -050069 const u_int8_t crc_tbl[256] = {
Sergey Kubushyne8f39122007-08-10 20:26:18 +020070 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
71 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
72 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
73 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
74 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
75 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
76 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
77 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
78 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
79 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
80 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
81 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
82 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
83 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
84 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
85 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
86 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
87 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
88 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
89 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
90 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
91 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
92 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
93 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
94 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
95 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
96 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
97 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
98 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
99 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
100 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
101 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
102 };
103
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200104 /* Set serial number from UID chip */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200105 if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
106 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denke577b652010-10-05 21:17:28 +0200107 setenv("serial#", "FAILED");
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200108 } else {
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -0400109 if (buf[0] != 0x70) {
110 /* Device Family Code */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200111 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denke577b652010-10-05 21:17:28 +0200112 setenv("serial#", "FAILED");
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200113 }
114 }
115 /* Now check CRC */
116 tmp[0] = 0;
117 for (i = 0; i < 8; i++)
118 tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
119
120 if (tmp[0] != 0) {
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200121 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denke577b652010-10-05 21:17:28 +0200122 setenv("serial#", "FAILED");
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200123 } else {
124 /* CRC OK, set "serial" env variable */
ksi@koi8.net1d41ce42007-08-14 10:02:16 -0700125 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200126 buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
Wolfgang Denke577b652010-10-05 21:17:28 +0200127 setenv("serial#", (char *)&tmp[0]);
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200128 }
129
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200130 return(0);
131}