* (C) Copyright 2003
* Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
*
+ * Adapted for U-Boot version 2012-04-01 by Lothar Waßmann <LW@KARO-electronics.de>
+ *
* See file CREDITS for list of people who contributed to this
* project.
*
* MA 02111-1307 USA
*/
-#include <linux/types.h>
-#include <asm/io.h>
-#include <asm/imx_iim.h>
#include <common.h>
#include <net.h>
+#include <linux/types.h>
+#include <asm/io.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/imx_iim.h>
-static const struct iim_regs *imx_iim =
- (struct iim_regs *)IMX_IIM_BASE;
+static struct iim_regs *imx_iim = (void *)IMX_IIM_BASE;
-static void quick_itoa(u32 num, char *a)
-{
- int i, j, k;
- for (i = 0; i <= 7; i++) {
- j = (num >> (4 * i)) & 0xf;
- k = (j < 10) ? '0' : ('a' - 0xa);
- a[i] = j + k;
- }
-}
-
-/* slen - streng length, e.g.: 23 -> slen=2; abcd -> slen=4 */
+/* slen - string length, e.g.: 23 -> slen=2; abcd -> slen=4 */
/* only convert hex value as string input. so "12" is 0x12. */
static u32 quick_atoi(char *a, u32 slen)
{
static void fuse_op_start(void)
{
/* Do not generate interrupt */
- writel(0, &(imx_iim->statm));
+ writel(0, &imx_iim->statm);
/* clear the status bits and error bits */
- writel(0x3, &(imx_iim->stat));
- writel(0xfe, &(imx_iim->err));
+ writel(0x3, &imx_iim->stat);
+ writel(0xfe, &imx_iim->err);
}
/*
}
/* Poll busy bit till it is NOT set */
- while ((readl(&(imx_iim->stat)) & IIM_STAT_BUSY) != 0)
+ while ((readl(&imx_iim->stat) & IIM_STAT_BUSY) != 0)
;
/* Test for successful write */
- status = readl(&(imx_iim->stat));
- error = readl(&(imx_iim->err));
+ status = readl(&imx_iim->stat);
+ error = readl(&imx_iim->err);
if ((status & action) != 0 && \
(error & (action >> IIM_ERR_SHIFT)) == 0) {
printf("Even though the operation"
"seems successful...\n");
printf("There are some error(s) "
- "at addr=0x%x: 0x%x\n",
- (u32)&(imx_iim->err), error);
+ "at addr=%p: 0x%x\n",
+ &imx_iim->err, error);
}
return 0;
}
printf("%s(%d) failed\n", __func__, action);
- printf("status address=0x%x, value=0x%x\n",
- (u32)&(imx_iim->stat), status);
- printf("There are some error(s) at addr=0x%x: 0x%x\n",
- (u32)&(imx_iim->err), error);
+ printf("status address=%p, value=0x%x\n",
+ &imx_iim->stat, status);
+ printf("There are some error(s) at addr=%p: 0x%x\n",
+ &imx_iim->err, error);
return -1;
}
static u32 sense_fuse(s32 bank, s32 row, s32 bit)
{
- s32 addr, addr_l, addr_h, reg_addr;
+ s32 addr, addr_l, addr_h;
+ void *reg_addr;
fuse_op_start();
printf("%s: addr_h=0x%x, addr_l=0x%x\n",
__func__, addr_h, addr_l);
#endif
- writel(addr_h, &(imx_iim->ua));
- writel(addr_l, &(imx_iim->la));
+ writel(addr_h, &imx_iim->ua);
+ writel(addr_l, &imx_iim->la);
/* Start sensing */
- writel(0x8, &(imx_iim->fctl));
+ writel(0x8, &imx_iim->fctl);
if (poll_fuse_op_done(POLL_FUSE_SNSD) != 0) {
printf("%s(bank: %d, row: %d, bit: %d failed\n",
__func__, bank, row, bit);
}
- reg_addr = &(imx_iim->sdat);
+ reg_addr = &imx_iim->sdat;
return readl(reg_addr);
}
fuse_op_start();
/* Disable IIM Program Protect */
- writel(0xaa, &(imx_iim->preg_p));
+ writel(0xaa, &imx_iim->preg_p);
addr = ((bank << 11) | (row << 3) | (bit & 0x7));
/* Set IIM Program Upper Address */
printf("blowing addr_h=0x%x, addr_l=0x%x\n", addr_h, addr_l);
#endif
- writel(addr_h, &(imx_iim->ua));
- writel(addr_l, &(imx_iim->la));
+ writel(addr_h, &imx_iim->ua);
+ writel(addr_l, &imx_iim->la);
/* Start Programming */
- writel(0x31, &(imx_iim->fctl));
+ writel(0x31, &imx_iim->fctl);
if (poll_fuse_op_done(POLL_FUSE_PRGD) == 0)
ret = 0;
/* Enable IIM Program Protect */
- writel(0x0, &(imx_iim->preg_p));
+ writel(0x0, &imx_iim->preg_p);
return ret;
}
return err;
}
-static int iim_read_mac_addr(u8 *data)
-{
- s32 bank = CONFIG_IIM_MAC_BANK;
- s32 row = CONFIG_IIM_MAC_ROW;
-
- data[0] = sense_fuse(bank, row, 0) ;
- data[1] = sense_fuse(bank, row + 1, 0) ;
- data[2] = sense_fuse(bank, row + 2, 0) ;
- data[3] = sense_fuse(bank, row + 3, 0) ;
- data[4] = sense_fuse(bank, row + 4, 0) ;
- data[5] = sense_fuse(bank, row + 5, 0) ;
-
- if (!memcmp(data, "\0\0\0\0\0\0", 6))
- return 0;
- else
- return 1;
-}
-
int iim_blow_func(char *func_name, char *func_val)
{
u32 value, i;
char val[3];
s32 err = 0;
- if (0 == strcmp(func_name, "scc")) {
+ if (strcmp(func_name, "scc") == 0) {
/* fuse_blow scc
C3D153EDFD2EA9982226EF5047D3B9A0B9C7138EA87C028401D28C2C2C0B9AA2 */
printf("Ready to burn SCC fuses\n");
i, value); */
fuse_blow_row(2, i, value);
- if ((++s)[0] == '\0') {
+ if (*(++s) == '\0') {
printf("ERROR: Odd string input\n");
err = -1;
break;
}
- if ((++s)[0] == '\0') {
+ if (*(++s) == '\0') {
printf("Successful\n");
break;
}
}
- } else if (0 == strcmp(func_name, "srk")) {
+ } else if (strcmp(func_name, "srk") == 0) {
/* fuse_blow srk
418bccd09b53bee1ab59e2662b3c7877bc0094caee201052add49be8780dff95 */
printf("Ready to burn SRK key fuses\n");
/* ... */
fuse_blow_row(3, i, value);
- if ((++s)[0] == '\0') {
+ if (*(++s) == '\0') {
printf("ERROR: Odd string input\n");
err = -1;
break;
}
- if ((++s)[0] == '\0') {
+ if (*(++s) == '\0') {
printf("Successful\n");
break;
}
}
}
- } else if (0 == strcmp(func_name, "fecmac")) {
+ } else if (strcmp(func_name, "fecmac") == 0) {
u8 ea[6] = { 0 };
- if (NULL == func_val) {
+ if (func_val == NULL) {
/* Read the Mac address and print it */
- iim_read_mac_addr(ea);
+ imx_get_mac_from_fuse(0, ea);
printf("FEC MAC address: ");
printf("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n\n",