]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/hal/arm/mx25/var/v2_0/src/cmds.c
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / hal / arm / mx25 / var / v2_0 / src / cmds.c
index 95fcc0deef11c629142642451c8a972c7f807c47..edf5c94031c6d9ff281b289e3e0892ddd34a501f 100644 (file)
@@ -1,8 +1,8 @@
 //==========================================================================
 //
-//      cmds.c
+//             cmds.c
 //
-//      SoC [platform] specific RedBoot commands
+//             SoC [platform] specific RedBoot commands
 //
 //==========================================================================
 //####ECOSGPLCOPYRIGHTBEGIN####
 #include <redboot.h>
 #include <cyg/hal/hal_intr.h>
 #include <cyg/hal/plf_mmap.h>
-#include <cyg/hal/hal_soc.h>         // Hardware definitions
+#include <cyg/hal/hal_soc.h>           // Hardware definitions
 #include <cyg/hal/hal_cache.h>
 
 #define IIM_FUSE_DEBUG
 
-typedef unsigned long long  u64;
-typedef unsigned int        u32;
-typedef unsigned short      u16;
-typedef unsigned char       u8;
+typedef unsigned long long     u64;
+typedef unsigned int           u32;
+typedef unsigned short         u16;
+typedef unsigned char          u8;
 
 u32 pll_clock(enum plls pll);
 u32 get_main_clock(enum main_clocks clk);
@@ -58,8 +58,8 @@ u32 get_peri_clock(enum peri_clocks clk);
 static void clock_setup(int argc, char *argv[]);
 
 RedBoot_cmd("clock",
-            "Setup/Display clock\nSyntax:",
-            "[<ARM core clock in MHz> [:<ARM-AHB clock divider>]\n\
+                       "Setup/Display clock\nSyntax:",
+                       "[<ARM core clock in MHz> [:<ARM-AHB clock divider>]\n\
 If a selection is zero or no divider is specified, the optimal divider values\n\
 will be chosen. Examples:\n\
    [clock]         -> Show various clocks\n\
@@ -69,91 +69,97 @@ will be chosen. Examples:\n\
    [clock 199:3]   -> Core=199.5 AHB=66.5(Core/3)  IPG=33.25(AHB/2)\n\
    [clock 133:2]   -> Core=133   AHB=66.5(Core/2)  IPG=33.25(AHB/2)\n\
                       Core range: 532-133, AHB range: 133-66.5, IPG is always AHB/2\n",
-            clock_setup
-           );
+                       clock_setup
+                  );
 
 void clock_spi_enable(unsigned int spi_clk)
 {
-    diag_printf("%s: stubbed\n", __func__);
+       diag_printf("%s: stubbed\n", __func__);
 }
 
 static void clock_setup(int argc,char *argv[])
 {
-    u32 i, data[2], temp, core_clk, ahb_div, cctl, arm_src, arm_div;
-
-    if (argc == 1)
-        goto print_clock;
-
-    for (i = 0;  i < 2;  i++) {
-        if (!parse_num(*(&argv[1]), (unsigned long *)&temp, &argv[1], ":")) {
-            diag_printf("Error: Invalid parameter\n");
-            return;
-        }
-        data[i] = temp;
-    }
-
-    core_clk = data[0];
-    ahb_div = data[1] - 1;
-
-    if (core_clk / (ahb_div + 1) > 133 ||
-       core_clk / (ahb_div + 1) < 66) {
-       diag_printf("Illegal AHB divider value specified\n");
-       return;
-    }
-
-    switch (core_clk) {
-    case 532:
-       arm_src = 0;
-       arm_div = 1 - 1;
-       break;
-    case 399:
-       arm_src = 1;
-       arm_div = 1 - 1;
-       break;
-    case 199:
-    case 200:
-       arm_src = 1;
-       arm_div = 2 - 1;
-       break;
-    case 133:
-       arm_src = 1;
-       arm_div = 3 - 1;
-       break;
-    default:
-       diag_printf("Illegal core clock value specified\n");
-       return;
-    }
-
-    cctl = readl(CCM_BASE_ADDR + CLKCTL_CCTL);
-    cctl &= ~0xF0004000;
-    cctl |= arm_div << 30;
-    cctl |= ahb_div << 28;
-    cctl |= arm_src << 14;
-    writel(cctl, CCM_BASE_ADDR + CLKCTL_CCTL);
-
-    diag_printf("\n<<<New clock settings>>>\n");
-
-    // Now printing clocks
+       u32 i, data[2], core_clk, ahb_div, cctl, arm_src, arm_div;
+               unsigned long temp;
+
+       if (argc == 1)
+               goto print_clock;
+
+       for (i = 0;     i < 2; i++) {
+               if (!parse_num(argv[1], &temp, &argv[1], ":")) {
+                       diag_printf("Error: Invalid parameter\n");
+                       return;
+               }
+               data[i] = temp;
+       }
+
+       core_clk = data[0];
+       ahb_div = data[1] - 1;
+
+       if (core_clk / (ahb_div + 1) > 133 ||
+               core_clk / (ahb_div + 1) < 66) {
+               diag_printf("Illegal AHB divider value specified\n");
+               return;
+       }
+
+       switch (core_clk) {
+       case 532:
+               arm_src = 0;
+               arm_div = 1 - 1;
+               break;
+       case 399:
+               arm_src = 1;
+               arm_div = 1 - 1;
+               break;
+       case 199:
+       case 200:
+               arm_src = 1;
+               arm_div = 2 - 1;
+               break;
+       case 133:
+               arm_src = 1;
+               arm_div = 3 - 1;
+               break;
+       default:
+               diag_printf("Illegal core clock value specified\n");
+               return;
+       }
+
+       cyg_hal_plf_serial_stop();
+
+       cctl = readl(CCM_BASE_ADDR + CLKCTL_CCTL);
+       cctl &= ~0xF0004000;
+       cctl |= arm_div << 30;
+       cctl |= ahb_div << 28;
+       cctl |= arm_src << 14;
+       writel(cctl, CCM_BASE_ADDR + CLKCTL_CCTL);
+
+       hal_delay_us(10000);
+       cyg_hal_plf_serial_init();
+
+       diag_printf("\n<<<New clock settings>>>\n");
+
+       // Now printing clocks
 print_clock:
-    diag_printf("\nMPLL\t\tUPLL\n");
-    diag_printf("=========================\n");
-    diag_printf("%-16d%-16d\n\n", pll_clock(MCU_PLL), pll_clock(USB_PLL));
-    diag_printf("CPU\t\tAHB\t\tIPG\n");
-    diag_printf("========================================\n");
-    diag_printf("%-16d%-16d%-16d\n\n",
-                get_main_clock(CPU_CLK),
-                get_main_clock(AHB_CLK),
-                get_main_clock(IPG_CLK));
-
-    diag_printf("UART\n");
-    diag_printf("========\n");
-    diag_printf("%-16d\n\n",
-                get_peri_clock(PER_UART_CLK));
-
-    diag_printf("SPI\n");
-    diag_printf("========\n");
-    diag_printf("%-16d\n\n",
-                get_peri_clock(SPI1_CLK));
+       diag_printf("\nMPLL\t\tUPLL\n");
+       diag_printf("=========================\n");
+       diag_printf("%-16d%-16d\n\n", pll_clock(MCU_PLL), pll_clock(USB_PLL));
+       diag_printf("CPU\t\tAHB\t\tIPG\n");
+       diag_printf("========================================\n");
+       diag_printf("%-16d%-16d%-16d\n\n",
+                               get_main_clock(CPU_CLK),
+                               get_main_clock(AHB_CLK),
+                               get_main_clock(IPG_CLK));
+
+       diag_printf("UART\n");
+       diag_printf("========\n");
+       diag_printf("%-16d\n\n",
+                               get_peri_clock(PER_UART_CLK));
+
+       diag_printf("SPI\n");
+       diag_printf("========\n");
+       diag_printf("%-16d\n\n",
+                               get_peri_clock(SPI1_CLK));
 }
 
 /*!
@@ -161,21 +167,26 @@ print_clock:
  */
 u32 pll_clock(enum plls pll)
 {
-    u64 mfi, mfn, mfd, pdf, ref_clk, pll_out;
-    u64 reg = readl(pll);
-
-    pdf = (reg >> 26) & 0xF;
-    mfd = (reg >> 16) & 0x3FF;
-    mfi = (reg >> 10) & 0xF;
-    mfi = (mfi <= 5) ? 5: mfi;
-    mfn = reg & 0x3FF;
-
-    ref_clk = PLL_REF_CLK;
-
-    pll_out = (2 * ref_clk * mfi + ((2 * ref_clk * mfn) / (mfd + 1))) /
-              (pdf + 1);
-
-    return (u32)pll_out;
+       int mfi, mfn, mfd, pdf;
+       u32 pll_out;
+       u32 reg = readl(pll);
+       u64 ref_clk;
+
+       pdf = (reg >> 26) & 0xF;
+       mfd = (reg >> 16) & 0x3FF;
+       mfi = (reg >> 10) & 0xF;
+       if (mfi < 5) {
+               mfi = 5;
+       }
+       mfn = reg & 0x3FF;
+       if (mfn >= 512) {
+               mfn = 1024 - mfn;
+       }
+       ref_clk = PLL_REF_CLK;
+
+       pll_out = (2 * ref_clk * mfi + ((2 * ref_clk * mfn) / (mfd + 1))) /
+               (pdf + 1);
+       return pll_out;
 }
 
 /*!
@@ -183,32 +194,32 @@ u32 pll_clock(enum plls pll)
  */
 u32 get_main_clock(enum main_clocks clk)
 {
-    u32 cctl = readl(CCM_BASE_ADDR + CLKCTL_CCTL);
-    u32 ahb_div;
-    u32 ret_val = 0;
-
-    switch (clk) {
-    case CPU_CLK:
-        ret_val = pll_clock(MCU_PLL);
-        if (cctl & CRM_CCTL_ARM_SRC) {
-                ret_val *= 3;
-                ret_val /= 4;
-        }
-        break;
-    case AHB_CLK:
-        ahb_div = ((cctl >> CRM_CCTL_AHB_OFFSET) & 3) + 1;
-        ret_val = get_main_clock(CPU_CLK) / ahb_div;
-        break;
-    case IPG_CLK:
-    case IPG_PER_CLK:
-        ret_val = get_main_clock(AHB_CLK) / 2;
-        break;
-    default:
-        diag_printf("Unknown clock: %d\n", clk);
-        break;
-    }
-
-    return ret_val;
+       u32 cctl = readl(CCM_BASE_ADDR + CLKCTL_CCTL);
+       u32 div;
+       u32 ret_val = 0;
+
+       switch (clk) {
+       case CPU_CLK:
+               ret_val = pll_clock(MCU_PLL);
+               if (cctl & CRM_CCTL_ARM_SRC) {
+                       ret_val = (ret_val * 3) / 4;
+               }
+               div = ((cctl >> CRM_CCTL_ARM_OFFSET) & 3) + 1;
+               ret_val /= div;
+               break;
+       case AHB_CLK:
+               div = ((cctl >> CRM_CCTL_AHB_OFFSET) & 3) + 1;
+               ret_val = get_main_clock(CPU_CLK) / div;
+               break;
+       case IPG_CLK:
+       case IPG_PER_CLK:
+               ret_val = get_main_clock(AHB_CLK) / 2;
+               break;
+       default:
+               diag_printf("Unknown clock: %d\n", clk);
+       }
+
+       return ret_val;
 }
 
 /*!
@@ -216,272 +227,277 @@ u32 get_main_clock(enum main_clocks clk)
  */
 u32 get_peri_clock(enum peri_clocks clk)
 {
-    u32 ret_val = 0;
-    u32 pcdr, div;
-
-    switch (clk) {
-    case PER_UART_CLK:
-        pcdr = readl(CCM_BASE_ADDR + CLKCTL_PCDR3);
-        div = (pcdr >> 24) + 1;
-        ret_val = get_main_clock(AHB_CLK) / div;
-        break;
-    case SPI1_CLK:
-    case SPI2_CLK:
-        ret_val = get_main_clock(IPG_CLK);
-        break;
-    default:
-        diag_printf("%s(): This clock: %d not supported yet \n",
-                    __FUNCTION__, clk);
-        break;
-    }
-    return ret_val;
+       u32 ret_val = 0;
+       u32 pcdr, div;
+
+       switch (clk) {
+       case PER_UART_CLK:
+               pcdr = readl(CCM_BASE_ADDR + CLKCTL_PCDR3);
+               div = (pcdr >> 24) + 1;
+               ret_val = get_main_clock(AHB_CLK) / div;
+               break;
+       case SPI1_CLK:
+       case SPI2_CLK:
+               ret_val = get_main_clock(IPG_CLK);
+               break;
+       default:
+               diag_printf("%s(): This clock: %d not supported yet\n",
+                                       __FUNCTION__, clk);
+       }
+       return ret_val;
 }
 
 
-#define IIM_ERR_SHIFT       8
-#define POLL_FUSE_PRGD      (IIM_STAT_PRGD | (IIM_ERR_PRGE << IIM_ERR_SHIFT))
-#define POLL_FUSE_SNSD      (IIM_STAT_SNSD | (IIM_ERR_SNSE << IIM_ERR_SHIFT))
+#define IIM_ERR_SHIFT          8
+#define POLL_FUSE_PRGD         (IIM_STAT_PRGD | (IIM_ERR_PRGE << IIM_ERR_SHIFT))
+#define POLL_FUSE_SNSD         (IIM_STAT_SNSD | (IIM_ERR_SNSE << IIM_ERR_SHIFT))
 
 static void fuse_op_start(void)
 {
-    /* Do not generate interrupt */
-    writel(0, IIM_BASE_ADDR + IIM_STATM_OFF);
-    // clear the status bits and error bits
-    writel(0x3, IIM_BASE_ADDR + IIM_STAT_OFF);
-    writel(0xFE, IIM_BASE_ADDR + IIM_ERR_OFF);
+       /* Do not generate interrupt */
+       writel(0, IIM_BASE_ADDR + IIM_STATM_OFF);
+       // clear the status bits and error bits
+       writel(0x3, IIM_BASE_ADDR + IIM_STAT_OFF);
+       writel(0xFE, IIM_BASE_ADDR + IIM_ERR_OFF);
 }
 
 /*
  * The action should be either:
- *          POLL_FUSE_PRGD
+ *                     POLL_FUSE_PRGD
  * or:
- *          POLL_FUSE_SNSD
+ *                     POLL_FUSE_SNSD
  */
 static int poll_fuse_op_done(int action)
 {
 
-    u32 status, error;
-
-    if (action != POLL_FUSE_PRGD && action != POLL_FUSE_SNSD) {
-        diag_printf("%s(%d) invalid operation\n", __FUNCTION__, action);
-        return -1;
-    }
-
-    /* Poll busy bit till it is NOT set */
-    while ((readl(IIM_BASE_ADDR + IIM_STAT_OFF) & IIM_STAT_BUSY) != 0 ) {
-    }
-
-    /* Test for successful write */
-    status = readl(IIM_BASE_ADDR + IIM_STAT_OFF);
-    error = readl(IIM_BASE_ADDR + IIM_ERR_OFF);
-
-    if ((status & action) != 0 && (error & (action >> IIM_ERR_SHIFT)) == 0) {
-        if (error) {
-            diag_printf("Even though the operation seems successful...\n");
-            diag_printf("There are some error(s) at addr=0x%x: 0x%x\n",
-                        (IIM_BASE_ADDR + IIM_ERR_OFF), error);
-        }
-        return 0;
-    }
-    diag_printf("%s(%d) failed\n", __FUNCTION__, action);
-    diag_printf("status address=0x%x, value=0x%x\n",
-                (IIM_BASE_ADDR + IIM_STAT_OFF), status);
-    diag_printf("There are some error(s) at addr=0x%x: 0x%x\n",
-                (IIM_BASE_ADDR + IIM_ERR_OFF), error);
-    return -1;
+       u32 status, error;
+
+       if (action != POLL_FUSE_PRGD && action != POLL_FUSE_SNSD) {
+               diag_printf("%s(%d) invalid operation\n", __FUNCTION__, action);
+               return -1;
+       }
+
+       /* Poll busy bit till it is NOT set */
+       while ((readl(IIM_BASE_ADDR + IIM_STAT_OFF) & IIM_STAT_BUSY) != 0 ) {
+       }
+
+       /* Test for successful write */
+       status = readl(IIM_BASE_ADDR + IIM_STAT_OFF);
+       error = readl(IIM_BASE_ADDR + IIM_ERR_OFF);
+
+       if ((status & action) != 0 && (error & (action >> IIM_ERR_SHIFT)) == 0) {
+               if (error) {
+                       diag_printf("Even though the operation seems successful...\n");
+                       diag_printf("There are some error(s) at addr=0x%02lx: 0x%02x\n",
+                                               (IIM_BASE_ADDR + IIM_ERR_OFF), error);
+               }
+               return 0;
+       }
+       diag_printf("%s(%d) failed\n", __FUNCTION__, action);
+       diag_printf("status address=0x%02lx, value=0x%02x\n",
+                               (IIM_BASE_ADDR + IIM_STAT_OFF), status);
+       diag_printf("There are some error(s) at addr=0x%02lx: 0x%02x\n",
+                               (IIM_BASE_ADDR + IIM_ERR_OFF), error);
+       return -1;
 }
 
 static void sense_fuse(int bank, int row, int bit)
 {
+    int ret;
     int addr, addr_l, addr_h, reg_addr;
 
-    fuse_op_start();
+       fuse_op_start();
 
-    addr = ((bank << 11) | (row << 3) | (bit & 0x7));
-    /* Set IIM Program Upper Address */
-    addr_h = (addr >> 8) & 0x000000FF;
-    /* Set IIM Program Lower Address */
-    addr_l = (addr & 0x000000FF);
+       addr = ((bank << 11) | (row << 3) | (bit & 0x7));
+       /* Set IIM Program Upper Address */
+       addr_h = (addr >> 8) & 0x000000FF;
+       /* Set IIM Program Lower Address */
+       addr_l = (addr & 0x000000FF);
 
 #ifdef IIM_FUSE_DEBUG
-    diag_printf("%s: addr_h=0x%x, addr_l=0x%x\n",
-                __FUNCTION__, addr_h, addr_l);
+       diag_printf("%s: addr_h=0x%02x, addr_l=0x%02x\n",
+                               __FUNCTION__, addr_h, addr_l);
 #endif
-    writel(addr_h, IIM_BASE_ADDR + IIM_UA_OFF);
-    writel(addr_l, IIM_BASE_ADDR + IIM_LA_OFF);
-    /* Start sensing */
-    writel(0x8, IIM_BASE_ADDR + IIM_FCTL_OFF);
-    if (poll_fuse_op_done(POLL_FUSE_SNSD) != 0) {
-        diag_printf("%s(bank: %d, row: %d, bit: %d failed\n",
-                    __FUNCTION__, bank, row, bit);
-    }
-    reg_addr = IIM_BASE_ADDR + IIM_SDAT_OFF;
-    diag_printf("fuses at (bank:%d, row:%d) = 0x%x\n", bank, row, readl(reg_addr));
+       writel(addr_h, IIM_BASE_ADDR + IIM_UA_OFF);
+       writel(addr_l, IIM_BASE_ADDR + IIM_LA_OFF);
+       /* Start sensing */
+       writel(0x8, IIM_BASE_ADDR + IIM_FCTL_OFF);
+       if ((ret = poll_fuse_op_done(POLL_FUSE_SNSD)) != 0) {
+               diag_printf("%s(bank: %d, row: %d, bit: %d failed\n",
+                                       __FUNCTION__, bank, row, bit);
+       }
+       reg_addr = IIM_BASE_ADDR + IIM_SDAT_OFF;
+       if (ret == 0)
+               diag_printf("fuses at (bank:%d, row:%d) = 0x%02x\n", bank, row, readl(reg_addr));
 }
 
 void do_fuse_read(int argc, char *argv[])
 {
-    int bank, row;
-
-    if (argc == 1) {
-        diag_printf("Useage: fuse_read <bank> <row>\n");
-        return;
-    } else if (argc == 3) {
-        if (!parse_num(*(&argv[1]), (unsigned long *)&bank, &argv[1], " ")) {
-                diag_printf("Error: Invalid parameter\n");
-            return;
-        }
-        if (!parse_num(*(&argv[2]), (unsigned long *)&row, &argv[2], " ")) {
-                diag_printf("Error: Invalid parameter\n");
-                return;
-            }
-
-        diag_printf("Read fuse at bank:%d row:%d\n", bank, row);
-        sense_fuse(bank, row, 0);
-
-    } else {
-        diag_printf("Passing in wrong arguments: %d\n", argc);
-        diag_printf("Useage: fuse_read <bank> <row>\n");
-    }
+       unsigned long bank, row;
+
+       if (argc == 1) {
+               diag_printf("Useage: fuse_read <bank> <row>\n");
+               return;
+       } else if (argc == 3) {
+               if (!parse_num(argv[1], &bank, &argv[1], " ")) {
+                       diag_printf("Error: Invalid parameter\n");
+                       return;
+               }
+               if (!parse_num(argv[2], &row, &argv[2], " ")) {
+                       diag_printf("Error: Invalid parameter\n");
+                       return;
+               }
+
+               diag_printf("Read fuse at bank:%ld row:%ld\n", bank, row);
+               sense_fuse(bank, row, 0);
+
+       } else {
+               diag_printf("Passing in wrong arguments: %d\n", argc);
+               diag_printf("Useage: fuse_read <bank> <row>\n");
+       }
 }
 
 /* Blow fuses based on the bank, row and bit positions (all 0-based)
 */
-static int fuse_blow(int bank,int row,int bit)
+int fuse_blow(int bank,int row,int bit)
 {
-    int addr, addr_l, addr_h, ret = -1;
+       int addr, addr_l, addr_h, ret = -1;
 
-    fuse_op_start();
+       fuse_op_start();
 
-    /* Disable IIM Program Protect */
-    writel(0xAA, IIM_BASE_ADDR + IIM_PREG_P_OFF);
+       /* Disable IIM Program Protect */
+       writel(0xAA, IIM_BASE_ADDR + IIM_PREG_P_OFF);
 
-    addr = ((bank << 11) | (row << 3) | (bit & 0x7));
-    /* Set IIM Program Upper Address */
-    addr_h = (addr >> 8) & 0x000000FF;
-    /* Set IIM Program Lower Address */
-    addr_l = (addr & 0x000000FF);
+       addr = ((bank << 11) | (row << 3) | (bit & 0x7));
+       /* Set IIM Program Upper Address */
+       addr_h = (addr >> 8) & 0x000000FF;
+       /* Set IIM Program Lower Address */
+       addr_l = (addr & 0x000000FF);
 
 #ifdef IIM_FUSE_DEBUG
-    diag_printf("blowing addr_h=0x%x, addr_l=0x%x\n", addr_h, addr_l);
+       diag_printf("blowing addr_h=0x%02x, addr_l=0x%02x\n", addr_h, addr_l);
 #endif
 
-    writel(addr_h, IIM_BASE_ADDR + IIM_UA_OFF);
-    writel(addr_l, IIM_BASE_ADDR + IIM_LA_OFF);
-    /* Start Programming */
-    writel(0x71, IIM_BASE_ADDR + IIM_FCTL_OFF);
-    if (poll_fuse_op_done(POLL_FUSE_PRGD) == 0) {
-        ret = 0;
-    }
-
-    /* Enable IIM Program Protect */
-    writel(0x0, IIM_BASE_ADDR + IIM_PREG_P_OFF);
-    return ret;
+       writel(addr_h, IIM_BASE_ADDR + IIM_UA_OFF);
+       writel(addr_l, IIM_BASE_ADDR + IIM_LA_OFF);
+       /* Start Programming */
+       writel(0x71, IIM_BASE_ADDR + IIM_FCTL_OFF);
+       if (poll_fuse_op_done(POLL_FUSE_PRGD) == 0) {
+               ret = 0;
+       }
+
+       /* Enable IIM Program Protect */
+       writel(0x0, IIM_BASE_ADDR + IIM_PREG_P_OFF);
+       return ret;
 }
 
 /*
  * This command is added for burning IIM fuses
  */
 RedBoot_cmd("fuse_read",
-            "read some fuses",
-            "<bank> <row>",
-            do_fuse_read
-           );
+                       "read some fuses",
+                       "<bank> <row>",
+                       do_fuse_read
+                  );
 
 RedBoot_cmd("fuse_blow",
-            "blow some fuses",
-            "<bank> <row> <value>",
-            do_fuse_blow
-           );
+                       "blow some fuses",
+                       "<bank> <row> <value>",
+                       do_fuse_blow
+                  );
 
-#define         INIT_STRING              "12345678"
+#define                        INIT_STRING                             "12345678"
 static char ready_to_blow[] = INIT_STRING;
 
 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;
-    }
+       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;
+       }
 }
 
 void do_fuse_blow(int argc, char *argv[])
 {
-    int bank, row, value, i;
-
-    if (argc == 1) {
-        diag_printf("It is too dangeous for you to use this command.\n");
-        return;
-    } else if (argc == 2) {
-        if (strcasecmp(argv[1], "nandboot") == 0) {
-            quick_itoa(readl(EPIT_BASE_ADDR + EPITCNR), ready_to_blow);
-            diag_printf("%s\n", ready_to_blow);
-        }
-        return;
-    } else if (argc == 3) {
-        if (strcasecmp(argv[1], "nandboot") == 0 &&
-            strcasecmp(argv[2], ready_to_blow) == 0) {
+       unsigned long bank, row, value;
+               int i;
+
+       if (argc == 1) {
+               diag_printf("It is too dangeous for you to use this command.\n");
+               return;
+       } else if (argc == 2) {
+               if (strcasecmp(argv[1], "nandboot") == 0) {
+                       quick_itoa(readl(EPIT_BASE_ADDR + EPITCNR), ready_to_blow);
+                       diag_printf("%s\n", ready_to_blow);
+               }
+               return;
+       } else if (argc == 3) {
+               if (strcasecmp(argv[1], "nandboot") == 0 &&
+                       strcasecmp(argv[2], ready_to_blow) == 0) {
 #if defined(CYGPKG_HAL_ARM_MXC91131) || defined(CYGPKG_HAL_ARM_MX21) || defined(CYGPKG_HAL_ARM_MX27) || defined(CYGPKG_HAL_ARM_MX31) ||defined(CYGPKG_HAL_ARM_MX35) || defined(CYGPKG_HAL_ARM_MX25)
-            diag_printf("No need to blow any fuses for NAND boot on this platform\n\n");
+                       diag_printf("No need to blow any fuses for NAND boot on this platform\n\n");
 #else
 #error "Are you sure you want this?"
-            diag_printf("Ready to burn NAND boot fuses\n");
-            if (fuse_blow(0, 16, 1) != 0 || fuse_blow(0, 16, 7) != 0) {
-                diag_printf("NAND BOOT fuse blown failed miserably ...\n");
-            } else {
-                diag_printf("NAND BOOT fuse blown successfully ...\n");
-            }
-        } else {
-            diag_printf("Not ready: %s, %s\n", argv[1], argv[2]);
+                       diag_printf("Ready to burn NAND boot fuses\n");
+                       if (fuse_blow(0, 16, 1) != 0 || fuse_blow(0, 16, 7) != 0) {
+                               diag_printf("NAND BOOT fuse blown failed miserably ...\n");
+                       } else {
+                               diag_printf("NAND BOOT fuse blown successfully ...\n");
+                       }
+               } else {
+                       diag_printf("Not ready: %s, %s\n", argv[1], argv[2]);
 #endif
-        }
-    } else if (argc == 4) {
-        if (!parse_num(*(&argv[1]), (unsigned long *)&bank, &argv[1], " ")) {
-                diag_printf("Error: Invalid parameter\n");
-                return;
-        }
-        if (!parse_num(*(&argv[2]), (unsigned long *)&row, &argv[2], " ")) {
-                diag_printf("Error: Invalid parameter\n");
-                return;
-        }
-        if (!parse_num(*(&argv[3]), (unsigned long *)&value, &argv[3], " ")) {
-                diag_printf("Error: Invalid parameter\n");
-                return;
-        }
-
-        diag_printf("Blowing fuse at bank:%d row:%d value:%d\n",
-                    bank, row, value);
-        for (i = 0; i < 8; i++) {
-            if (((value >> i) & 0x1) == 0) {
-                continue;
-            }
-            if (fuse_blow(bank, row, i) != 0) {
-                diag_printf("fuse_blow(bank: %d, row: %d, bit: %d failed\n",
-                            bank, row, i);
-            } else {
-                diag_printf("fuse_blow(bank: %d, row: %d, bit: %d successful\n",
-                            bank, row, i);
-            }
-        }
-        sense_fuse(bank, row, 0);
-
-    } else {
-        diag_printf("Passing in wrong arguments: %d\n", argc);
-    }
-    /* Reset to default string */
-    strcpy(ready_to_blow, INIT_STRING);;
+               }
+       } else if (argc == 4) {
+               if (!parse_num(argv[1], &bank, &argv[1], " ")) {
+                               diag_printf("Error: Invalid fuse bank\n");
+                               return;
+               }
+               if (!parse_num(argv[2], &row, &argv[2], " ")) {
+                               diag_printf("Error: Invalid fuse row\n");
+                               return;
+               }
+               if (!parse_num(argv[3], &value, &argv[3], " ")) {
+                               diag_printf("Error: Invalid value\n");
+                               return;
+               }
+               if (!verify_action("Confirm to blow fuse at bank:%ld row:%ld value:0x%02lx (%ld)",
+                                                  bank, row, value)) {
+                       diag_printf("fuse_blow canceled\n");
+                       return;
+               }
+
+               diag_printf("Blowing fuse at bank:%ld row:%ld value:%ld\n",
+                                       bank, row, value);
+               for (i = 0; i < 8; i++) {
+                       if (((value >> i) & 0x1) == 0) {
+                               continue;
+                       }
+                       if (fuse_blow(bank, row, i) != 0) {
+                               diag_printf("fuse_blow(bank: %ld, row: %ld, bit: %d failed\n",
+                                                       bank, row, i);
+                       } else {
+                               diag_printf("fuse_blow(bank: %ld, row: %ld, bit: %d successful\n",
+                                                       bank, row, i);
+                       }
+               }
+               sense_fuse(bank, row, 0);
+       } else {
+               diag_printf("Passing in wrong arguments: %d\n", argc);
+       }
+       /* Reset to default string */
+       strcpy(ready_to_blow, INIT_STRING);
 }
 
 /* precondition: m>0 and n>0.  Let g=gcd(m,n). */
 int gcd(int m, int n)
 {
-    int t;
-    while(m > 0) {
-        if(n > m) {t = m; m = n; n = t;} /* swap */
-        m -= n;
-    }
-    return n;
+       int t;
+       while (m > 0) {
+               if (n > m) {t = m; m = n; n = t;} /* swap */
+               m -= n;
+       }
+       return n;
 }
-