]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/davinci/schmoogie/schmoogie.c
rename CFG_ macros to CONFIG_SYS
[karo-tx-uboot.git] / board / davinci / schmoogie / schmoogie.c
1 /*
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>
31 #include "../common/psc.h"
32 #include "../common/misc.h"
33
34 DECLARE_GLOBAL_DATA_PTR;
35
36 int board_init(void)
37 {
38         /* 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
56 #if !defined(CONFIG_SYS_USE_DSPLINK)
57         /* Powerup the DSP */
58         dsp_on();
59 #endif /* CONFIG_SYS_USE_DSPLINK */
60
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
84 int misc_init_r(void)
85 {
86         u_int8_t        tmp[20], buf[10];
87         int             i = 0;
88
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
125         dv_display_clk_infos();
126
127         /* Set serial number from UID chip */
128         if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
129                 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
130                 forceenv("serial#", "FAILED");
131         } else {
132                 if (buf[0] != 0x70) {
133                         /* Device Family Code */
134                         printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
135                         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) {
144                 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
145                 forceenv("serial#", "FAILED");
146         } else {
147                 /* CRC OK, set "serial" env variable */
148                 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
149                         buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
150                 forceenv("serial#", (char *)&tmp[0]);
151         }
152
153         if (!eth_hw_init())
154                 printf("ethernet init failed!\n");
155
156         return(0);
157 }