blob: 3504a2ec19fa1d1a2ffc311f25e4bf183f5817cb [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>
30#include <asm/arch/emac_defs.h>
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -040031#include "../common/psc.h"
32#include "../common/misc.h"
Sergey Kubushyne8f39122007-08-10 20:26:18 +020033
Dirk Behmef2b171c2007-09-15 11:55:42 +020034DECLARE_GLOBAL_DATA_PTR;
35
Sergey Kubushyne8f39122007-08-10 20:26:18 +020036int board_init(void)
37{
Sergey Kubushyne8f39122007-08-10 20:26:18 +020038 /* arch number of the board */
39 gd->bd->bi_arch_number = MACH_TYPE_SCHMOOGIE;
40
41 /* address of boot parameters */
42 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
43
44 /* Workaround for TMS320DM6446 errata 1.3.22 */
45 REG(PSC_SILVER_BULLET) = 0;
46
47 /* Power on required peripherals */
48 lpsc_on(DAVINCI_LPSC_EMAC);
49 lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER);
50 lpsc_on(DAVINCI_LPSC_MDIO);
51 lpsc_on(DAVINCI_LPSC_I2C);
52 lpsc_on(DAVINCI_LPSC_UART0);
53 lpsc_on(DAVINCI_LPSC_TIMER1);
54 lpsc_on(DAVINCI_LPSC_GPIO);
55
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020056#if !defined(CONFIG_SYS_USE_DSPLINK)
Sergey Kubushyne8f39122007-08-10 20:26:18 +020057 /* Powerup the DSP */
58 dsp_on();
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020059#endif /* CONFIG_SYS_USE_DSPLINK */
Sergey Kubushyne8f39122007-08-10 20:26:18 +020060
61 /* Bringup UART0 out of reset */
62 REG(UART0_PWREMU_MGMT) = 0x0000e003;
63
64 /* Enable GIO3.3V cells used for EMAC */
65 REG(VDD3P3V_PWDN) = 0;
66
67 /* Enable UART0 MUX lines */
68 REG(PINMUX1) |= 1;
69
70 /* Enable EMAC and AEMIF pins */
71 REG(PINMUX0) = 0x80000c1f;
72
73 /* Enable I2C pin Mux */
74 REG(PINMUX1) |= (1 << 7);
75
76 /* Set the Bus Priority Register to appropriate value */
77 REG(VBPR) = 0x20;
78
79 timer_init();
80
81 return(0);
82}
83
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -040084int misc_init_r(void)
Sergey Kubushyne8f39122007-08-10 20:26:18 +020085{
86 u_int8_t tmp[20], buf[10];
87 int i = 0;
Sergey Kubushyne8f39122007-08-10 20:26:18 +020088
89 /* Set serial number from UID chip */
90 u_int8_t crc_tbl[256] = {
91 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
92 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
93 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
94 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
95 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
96 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
97 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
98 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
99 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
100 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
101 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
102 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
103 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
104 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
105 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
106 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
107 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
108 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
109 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
110 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
111 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
112 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
113 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
114 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
115 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
116 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
117 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
118 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
119 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
120 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
121 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
122 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
123 };
124
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -0400125 dv_display_clk_infos();
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200126
127 /* Set serial number from UID chip */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200128 if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
129 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200130 forceenv("serial#", "FAILED");
131 } else {
Hugo Villeneuve4e352ef2008-07-11 15:10:13 -0400132 if (buf[0] != 0x70) {
133 /* Device Family Code */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200134 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200135 forceenv("serial#", "FAILED");
136 }
137 }
138 /* Now check CRC */
139 tmp[0] = 0;
140 for (i = 0; i < 8; i++)
141 tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
142
143 if (tmp[0] != 0) {
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200144 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200145 forceenv("serial#", "FAILED");
146 } else {
147 /* CRC OK, set "serial" env variable */
ksi@koi8.net1d41ce42007-08-14 10:02:16 -0700148 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200149 buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
150 forceenv("serial#", (char *)&tmp[0]);
151 }
152
Hugo Villeneuve15e55e02008-07-11 15:10:11 -0400153 if (!eth_hw_init())
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200154 printf("ethernet init failed!\n");
Sergey Kubushyne8f39122007-08-10 20:26:18 +0200155
156 return(0);
157}