blob: 741afc4df3ff148ee1ecbd7ec318efad09ff5b7d [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 * ----------------------------------------------------------------------------
Wolfgang Denk1a459662013-07-08 09:37:19 +020011 * SPDX-License-Identifier: GPL-2.0+
Sergey Kubushync74b2102007-08-10 20:26:18 +020012 * ----------------------------------------------------------------------------
13 */
14
15#include <common.h>
16#include <i2c.h>
17#include <asm/arch/hardware.h>
Sughosh Ganud7f9b502010-11-28 20:21:27 -050018#include <asm/arch/davinci_misc.h>
Sergey Kubushync74b2102007-08-10 20:26:18 +020019
Dirk Behme66b3f242007-09-15 11:55:42 +020020DECLARE_GLOBAL_DATA_PTR;
21
Sergey Kubushync74b2102007-08-10 20:26:18 +020022int board_init(void)
23{
Sergey Kubushync74b2102007-08-10 20:26:18 +020024 /* address of boot parameters */
25 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
26
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050027 /* Configure AEMIF pins (although this should be configured at boot time
28 * with pull-up/pull-down resistors) */
29 REG(PINMUX0) = 0x00000c1f;
30
31 davinci_errata_workarounds();
Sergey Kubushync74b2102007-08-10 20:26:18 +020032
33 /* Power on required peripherals */
Sergey Kubushync74b2102007-08-10 20:26:18 +020034 lpsc_on(DAVINCI_LPSC_GPIO);
35
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020036#if !defined(CONFIG_SYS_USE_DSPLINK)
Sergey Kubushync74b2102007-08-10 20:26:18 +020037 /* Powerup the DSP */
38 dsp_on();
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020039#endif /* CONFIG_SYS_USE_DSPLINK */
Sergey Kubushync74b2102007-08-10 20:26:18 +020040
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050041 davinci_enable_uart0();
42 davinci_enable_emac();
43 davinci_enable_i2c();
Sergey Kubushync74b2102007-08-10 20:26:18 +020044
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050045 lpsc_on(DAVINCI_LPSC_TIMER1);
Sergey Kubushync74b2102007-08-10 20:26:18 +020046 timer_init();
47
48 return(0);
49}
50
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -040051int misc_init_r(void)
Sergey Kubushync74b2102007-08-10 20:26:18 +020052{
53 u_int8_t tmp[20], buf[10];
54 int i = 0;
Sergey Kubushync74b2102007-08-10 20:26:18 +020055
56 /* Set serial number from UID chip */
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050057 const u_int8_t crc_tbl[256] = {
Sergey Kubushync74b2102007-08-10 20:26:18 +020058 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
59 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
60 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
61 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
62 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
63 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
64 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
65 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
66 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
67 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
68 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
69 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
70 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
71 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
72 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
73 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
74 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
75 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
76 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
77 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
78 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
79 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
80 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
81 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
82 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
83 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
84 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
85 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
86 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
87 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
88 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
89 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
90 };
91
Sergey Kubushync74b2102007-08-10 20:26:18 +020092 /* Set serial number from UID chip */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020093 if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
94 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denkb6e7bd92010-10-05 21:17:28 +020095 setenv("serial#", "FAILED");
Sergey Kubushync74b2102007-08-10 20:26:18 +020096 } else {
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -040097 if (buf[0] != 0x70) {
98 /* Device Family Code */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020099 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denkb6e7bd92010-10-05 21:17:28 +0200100 setenv("serial#", "FAILED");
Sergey Kubushync74b2102007-08-10 20:26:18 +0200101 }
102 }
103 /* Now check CRC */
104 tmp[0] = 0;
105 for (i = 0; i < 8; i++)
106 tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
107
108 if (tmp[0] != 0) {
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200109 printf("\nUID @ 0x%02x - BAD CRC!!!\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 {
112 /* CRC OK, set "serial" env variable */
ksi@koi8.netb361acd2007-08-14 10:02:16 -0700113 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
Sergey Kubushync74b2102007-08-10 20:26:18 +0200114 buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
Wolfgang Denkb6e7bd92010-10-05 21:17:28 +0200115 setenv("serial#", (char *)&tmp[0]);
Sergey Kubushync74b2102007-08-10 20:26:18 +0200116 }
117
Sergey Kubushync74b2102007-08-10 20:26:18 +0200118 return(0);
119}