ARM DaVinci: Add common peripherals and modules enable functions.
[platform/kernel/u-boot.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 "../common/psc.h"
31 #include "../common/misc.h"
32
33 DECLARE_GLOBAL_DATA_PTR;
34
35 int board_init(void)
36 {
37         /* arch number of the board */
38         gd->bd->bi_arch_number = MACH_TYPE_SCHMOOGIE;
39
40         /* address of boot parameters */
41         gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
42
43         /* Configure AEMIF pins (although this should be configured at boot time
44          * with pull-up/pull-down resistors) */
45         REG(PINMUX0) = 0x00000c1f;
46
47         davinci_errata_workarounds();
48
49         /* Power on required peripherals */
50         lpsc_on(DAVINCI_LPSC_GPIO);
51
52 #if !defined(CONFIG_SYS_USE_DSPLINK)
53         /* Powerup the DSP */
54         dsp_on();
55 #endif /* CONFIG_SYS_USE_DSPLINK */
56
57         davinci_enable_uart0();
58         davinci_enable_emac();
59         davinci_enable_i2c();
60
61         lpsc_on(DAVINCI_LPSC_TIMER1);
62         timer_init();
63
64         return(0);
65 }
66
67 int misc_init_r(void)
68 {
69         u_int8_t        tmp[20], buf[10];
70         int             i = 0;
71
72         /* Set serial number from UID chip */
73         const u_int8_t  crc_tbl[256] = {
74                         0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
75                         0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
76                         0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
77                         0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
78                         0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
79                         0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
80                         0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
81                         0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
82                         0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
83                         0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
84                         0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
85                         0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
86                         0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
87                         0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
88                         0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
89                         0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
90                         0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
91                         0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
92                         0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
93                         0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
94                         0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
95                         0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
96                         0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
97                         0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
98                         0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
99                         0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
100                         0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
101                         0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
102                         0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
103                         0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
104                         0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
105                         0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
106                 };
107
108         dv_display_clk_infos();
109
110         /* Set serial number from UID chip */
111         if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
112                 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
113                 forceenv("serial#", "FAILED");
114         } else {
115                 if (buf[0] != 0x70) {
116                         /* Device Family Code */
117                         printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
118                         forceenv("serial#", "FAILED");
119                 }
120         }
121         /* Now check CRC */
122         tmp[0] = 0;
123         for (i = 0; i < 8; i++)
124                 tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
125
126         if (tmp[0] != 0) {
127                 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
128                 forceenv("serial#", "FAILED");
129         } else {
130                 /* CRC OK, set "serial" env variable */
131                 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
132                         buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
133                 forceenv("serial#", (char *)&tmp[0]);
134         }
135
136         if (!eth_hw_init())
137                 printf("ethernet init failed!\n");
138
139         return(0);
140 }