arm: mx5: Add fuse supply enable in fsl_iim
authorSergey Alyoshin <alyoshin.s@gmail.com>
Tue, 17 Dec 2013 19:24:54 +0000 (23:24 +0400)
committerStefano Babic <sbabic@denx.de>
Fri, 3 Jan 2014 14:44:06 +0000 (15:44 +0100)
Enable fuse supply before fuse programming and disable after.

Signed-off-by: Sergey Alyoshin <alyoshin.s@gmail.com>
Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
arch/arm/cpu/armv7/mx5/clock.c
arch/arm/include/asm/arch-mx5/clock.h
arch/arm/include/asm/arch-mx5/crm_regs.h
drivers/misc/fsl_iim.c

index fb3b1281999b080ed0582154ef8b36e2eecbc1e8..bf52f0d19e546e0b98b2717b25618c4c6711e92b 100644 (file)
@@ -749,6 +749,18 @@ void enable_nfc_clk(unsigned char enable)
                MXC_CCM_CCGR5_EMI_ENFC(cg));
 }
 
+#ifdef CONFIG_FSL_IIM
+void enable_efuse_prog_supply(bool enable)
+{
+       if (enable)
+               setbits_le32(&mxc_ccm->cgpr,
+                            MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE);
+       else
+               clrbits_le32(&mxc_ccm->cgpr,
+                            MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE);
+}
+#endif
+
 /* Config main_bus_clock for periphs */
 static int config_periph_clk(u32 ref, u32 freq)
 {
index 9ee79aede38a13c112f3af639a541806d5d123d9..3db4112d1f4abfae6ec4cbdb53a6bfc01a310d42 100644 (file)
@@ -53,5 +53,6 @@ void enable_usboh3_clk(bool enable);
 void mxc_set_sata_internal_clock(void);
 int enable_i2c_clk(unsigned char enable, unsigned i2c_num);
 void enable_nfc_clk(unsigned char enable);
+void enable_efuse_prog_supply(bool enable);
 
 #endif /* __ASM_ARCH_CLOCK_H */
index 392881c0e7ba179e61088ecd046fd5622583cdc2..efe57e07ea31c39f2196817c2f8aedf59fde8d84 100644 (file)
@@ -305,6 +305,9 @@ struct mxc_ccm_reg {
 /* Define the bits in register CCDR */
 #define MXC_CCM_CCDR_IPU_HS_MASK                       (0x1 << 17)
 
+/* Define the bits in register CGPR */
+#define MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE            (1 << 4)
+
 /* Define the bits in register CCGRx */
 #define MXC_CCM_CCGR_CG_MASK                           0x3
 #define MXC_CCM_CCGR_CG_OFF                            0x0
index 44ae7b1028cc4285954dd9980e2264accd25cc21..36433a74f85f37e2f7877856853328d3d38527cf 100644 (file)
@@ -16,6 +16,9 @@
 #ifndef CONFIG_MPC512X
 #include <asm/arch/imx-regs.h>
 #endif
+#if defined(CONFIG_MX51) || defined(CONFIG_MX53)
+#include <asm/arch/clock.h>
+#endif
 
 /* FSL IIM-specific constants */
 #define STAT_BUSY              0x80
@@ -93,6 +96,10 @@ struct fsl_iim {
        } bank[8];
 };
 
+#if !defined(CONFIG_MX51) && !defined(CONFIG_MX53)
+#define enable_efuse_prog_supply(enable)
+#endif
+
 static int prepare_access(struct fsl_iim **regs, u32 bank, u32 word, int assert,
                                const char *caller)
 {
@@ -237,12 +244,16 @@ int fuse_prog(u32 bank, u32 word, u32 val)
        if (ret)
                return ret;
 
+       enable_efuse_prog_supply(1);
        for (bit = 0; val; bit++, val >>= 1)
                if (val & 0x01) {
                        ret = prog_bit(regs, bank, word, bit);
-                       if (ret)
+                       if (ret) {
+                               enable_efuse_prog_supply(0);
                                return ret;
+                       }
                }
+       enable_efuse_prog_supply(0);
 
        return 0;
 }