3 * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com.
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29 #include <asm/arch/hardware.h>
30 #include <asm/arch/spr_emi.h>
31 #include <asm/arch/spr_defs.h>
35 #define SRAM_REL 0xD2801000
37 DECLARE_GLOBAL_DATA_PTR
;
39 #if defined(CONFIG_CMD_NET)
40 static int i2c_read_mac(uchar
*buffer
);
45 /* Store complete RAM size and return */
46 gd
->ram_size
= get_ram_size(PHYS_SDRAM_1
, PHYS_SDRAM_1_MAXSIZE
);
51 void dram_init_banksize(void)
53 gd
->bd
->bi_dram
[0].start
= PHYS_SDRAM_1
;
54 gd
->bd
->bi_dram
[0].size
= gd
->ram_size
;
59 #if defined(CONFIG_CMD_NET)
62 if (!eth_getenv_enetaddr("ethaddr", mac_id
) && !i2c_read_mac(mac_id
))
63 eth_setenv_enetaddr("ethaddr", mac_id
);
65 setenv("verify", "n");
67 #if defined(CONFIG_SPEAR_USBTTY)
68 setenv("stdin", "usbtty");
69 setenv("stdout", "usbtty");
70 setenv("stderr", "usbtty");
75 #ifdef CONFIG_SPEAR_EMI
76 struct cust_emi_para
{
84 /* EMI timing setting of m28w640hc of linux kernel */
85 const struct cust_emi_para emi_timing_m28w640hc
= {
93 /* EMI timing setting of bootrom */
94 const struct cust_emi_para emi_timing_bootrom
= {
102 void spear_emi_init(void)
104 const struct cust_emi_para
*p
= &emi_timing_m28w640hc
;
105 struct emi_regs
*emi_regs_p
= (struct emi_regs
*)CONFIG_SPEAR_EMIBASE
;
107 unsigned int val
, tmp
;
109 val
= readl(CONFIG_SPEAR_RASBASE
);
111 if (val
& EMI_ACKMSK
)
116 writel(tmp
, &emi_regs_p
->ack
);
118 for (cs
= 0; cs
< CONFIG_SYS_MAX_FLASH_BANKS
; cs
++) {
119 writel(p
->tap
, &emi_regs_p
->bank_regs
[cs
].tap
);
120 writel(p
->tsdp
, &emi_regs_p
->bank_regs
[cs
].tsdp
);
121 writel(p
->tdpw
, &emi_regs_p
->bank_regs
[cs
].tdpw
);
122 writel(p
->tdpr
, &emi_regs_p
->bank_regs
[cs
].tdpr
);
123 writel(p
->tdcs
, &emi_regs_p
->bank_regs
[cs
].tdcs
);
124 writel(EMI_CNTL_ENBBYTERW
| ((val
& 0x18) >> 3),
125 &emi_regs_p
->bank_regs
[cs
].control
);
130 int spear_board_init(ulong mach_type
)
132 gd
->bd
->bi_arch_number
= mach_type
;
134 /* adress of boot parameters */
135 gd
->bd
->bi_boot_params
= CONFIG_BOOT_PARAMS_ADDR
;
137 #ifdef CONFIG_SPEAR_EMI
143 #if defined(CONFIG_CMD_NET)
144 static int i2c_read_mac(uchar
*buffer
)
148 i2c_read(CONFIG_I2C_CHIPADDRESS
, MAGIC_OFF
, 1, buf
, MAGIC_LEN
);
150 /* Check if mac in i2c memory is valid */
151 if ((buf
[0] == MAGIC_BYTE0
) && (buf
[1] == MAGIC_BYTE1
)) {
152 /* Valid mac address is saved in i2c eeprom */
153 i2c_read(CONFIG_I2C_CHIPADDRESS
, MAC_OFF
, 1, buffer
, MAC_LEN
);
160 static int write_mac(uchar
*mac
)
164 buf
[0] = (u8
)MAGIC_BYTE0
;
165 buf
[1] = (u8
)MAGIC_BYTE1
;
166 i2c_write(CONFIG_I2C_CHIPADDRESS
, MAGIC_OFF
, 1, buf
, MAGIC_LEN
);
168 buf
[0] = (u8
)~MAGIC_BYTE0
;
169 buf
[1] = (u8
)~MAGIC_BYTE1
;
171 i2c_read(CONFIG_I2C_CHIPADDRESS
, MAGIC_OFF
, 1, buf
, MAGIC_LEN
);
173 /* check if valid MAC address is saved in I2C EEPROM or not? */
174 if ((buf
[0] == MAGIC_BYTE0
) && (buf
[1] == MAGIC_BYTE1
)) {
175 i2c_write(CONFIG_I2C_CHIPADDRESS
, MAC_OFF
, 1, mac
, MAC_LEN
);
176 puts("I2C EEPROM written with mac address \n");
180 puts("I2C EEPROM writing failed\n");
185 int do_chip_config(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
187 void (*sram_setfreq
) (unsigned int, unsigned int);
188 unsigned int frequency
;
189 #if defined(CONFIG_CMD_NET)
190 unsigned char mac
[6];
193 if ((argc
> 3) || (argc
< 2))
194 return cmd_usage(cmdtp
);
196 if ((!strcmp(argv
[1], "cpufreq")) || (!strcmp(argv
[1], "ddrfreq"))) {
198 frequency
= simple_strtoul(argv
[2], NULL
, 0);
200 if (frequency
> 333) {
201 printf("Frequency is limited to 333MHz\n");
205 sram_setfreq
= memcpy((void *)SRAM_REL
, setfreq
, setfreq_sz
);
207 if (!strcmp(argv
[1], "cpufreq")) {
208 sram_setfreq(CPU
, frequency
);
209 printf("CPU frequency changed to %u\n", frequency
);
211 sram_setfreq(DDR
, frequency
);
212 printf("DDR frequency changed to %u\n", frequency
);
217 #if defined(CONFIG_CMD_NET)
218 } else if (!strcmp(argv
[1], "ethaddr")) {
221 char *e
, *s
= argv
[2];
222 for (reg
= 0; reg
< 6; ++reg
) {
223 mac
[reg
] = s
? simple_strtoul(s
, &e
, 16) : 0;
225 s
= (*e
) ? e
+ 1 : e
;
231 } else if (!strcmp(argv
[1], "print")) {
232 #if defined(CONFIG_CMD_NET)
233 if (!i2c_read_mac(mac
)) {
234 printf("Ethaddr (from i2c mem) = %pM\n", mac
);
236 printf("Ethaddr (from i2c mem) = Not set\n");
242 return cmd_usage(cmdtp
);
245 U_BOOT_CMD(chip_config
, 3, 1, do_chip_config
,
247 "chip_config cpufreq/ddrfreq frequency\n"
248 #if defined(CONFIG_CMD_NET)
249 "chip_config ethaddr XX:XX:XX:XX:XX:XX\n"
251 "chip_config print");