blob: 741afc4df3ff148ee1ecbd7ec318efad09ff5b7d [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 * ----------------------------------------------------------------------------
Wolfgang Denkd79de1d2013-07-08 09:37:19 +020011 * SPDX-License-Identifier: GPL-2.0+
Sergey Kubushyne8f39122007-08-10 20:26:18 +020012 * ----------------------------------------------------------------------------
13 */
14
15#include <common.h>
16#include <i2c.h>
17#include <asm/arch/hardware.h>
Sughosh Ganu80995f92010-11-28 20:21:27 -050018#include <asm/arch/davinci_misc.h>
Sergey Kubushyne8f39122007-08-10 20:26:18 +020019
Dirk Behmef2b171c2007-09-15 11:55:42 +020020DECLARE_GLOBAL_DATA_PTR;
21
Sergey Kubushyne8f39122007-08-10 20:26:18 +020022int board_init(void)
23{
Sergey Kubushyne8f39122007-08-10 20:26:18 +020024 /* address of boot parameters */
25 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
26
Hugo Villeneuvec9a21372008-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 Kubushyne8f39122007-08-10 20:26:18 +020032
33 /* Power on required peripherals */
Sergey Kubushyne8f39122007-08-10 20:26:18 +020034 lpsc_on(DAVINCI_LPSC_GPIO);
35
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020036#if !defined(CONFIG_SYS_USE_DSPLINK)
Sergey Kubushyne8f39122007-08-10 20:26:18 +020037 /* Powerup the DSP */
38 dsp_on();
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020039#endif /* CONFIG_SYS_USE_DSPLINK */
Sergey Kubushyne8f39122007-08-10 20:26:18 +020040
Hugo Villeneuvec9a21372008-11-21 14:35:56 -050041 davinci_enable_uart0();
42 davinci_enable_emac();
43 davinci_enable_i2c();
Sergey Kubushyne8f39122007-08-10 20:26:18 +020044
Hugo Villeneuvec9a21372008-11-21 14:35:56 -050045 lpsc_on(DAVINCI_LPSC_TIMER1);
Sergey Kubushyne8f39122007-08-10 20:26:18 +020046 timer_init();
47
48 return(0);
49}
50
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -040051int misc_init_r(void)
Sergey Kubushyne8f39122007-08-10 20:26:18 +020052{
53 u_int8_t tmp[20], buf[10];
54 int i = 0;
Sergey Kubushyne8f39122007-08-10 20:26:18 +020055
56 /* Set serial number from UID chip */
Hugo Villeneuvec9a21372008-11-21 14:35:56 -050057 const u_int8_t crc_tbl[256] = {
Sergey Kubushyne8f39122007-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 Kubushyne8f39122007-08-10 20:26:18 +020092 /* Set serial number from UID chip */
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Denke577b652010-10-05 21:17:28 +020095 setenv("serial#", "FAILED");
Sergey Kubushyne8f39122007-08-10 20:26:18 +020096 } else {
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -040097 if (buf[0] != 0x70) {
98 /* Device Family Code */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020099 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denke577b652010-10-05 21:17:28 +0200100 setenv("serial#", "FAILED");
Sergey Kubushyne8f39122007-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-VILLARD03836942008-10-16 15:01:15 +0200109 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
Wolfgang Denke577b652010-10-05 21:17:28 +0200110 setenv("serial#", "FAILED");
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200111 } else {
112 /* CRC OK, set "serial" env variable */
ksi@koi8.net1d41ce42007-08-14 10:02:16 -0700113 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200114 buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
Wolfgang Denke577b652010-10-05 21:17:28 +0200115 setenv("serial#", (char *)&tmp[0]);
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200116 }
117
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200118 return(0);
119}