Hi!

> Adding Freeze Controller driver. All HPS IOs need to be
> in freeze state during pin mux or IO buffer configuration.
> It is to avoid any glitch which might happen
> during the configuration from propagating to external devices.

Thanks for the patch.

(What version is it against? Aha, it depends on previous patches,
right?)

AFAICT: 

FREEZE_CONTROLLER_FSM_HW is unused and can be removed.

frzctrl_channel_freeze[] is write-only and can be removed.

Local variables do not need frzctrl_ prefix.

[I have fixed those, suggested incremental diff is attached. Please
review & apply to your tree.]

Is it really neccessary to introduce get_timer_count_masked? Replace
the delays with udelay(1) and it should still work?

Thanks,
                                                                Pavel

diff --git a/arch/arm/cpu/armv7/socfpga/freeze_controller.c 
b/arch/arm/cpu/armv7/socfpga/freeze_controller.c
index af612c9..058d9b5 100644
--- a/arch/arm/cpu/armv7/socfpga/freeze_controller.c
+++ b/arch/arm/cpu/armv7/socfpga/freeze_controller.c
@@ -9,226 +9,183 @@
 #include <asm/io.h>
 #include <asm/arch/freeze_controller.h>
 #include <asm/arch/timer.h>
+#include <asm/errno.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+
+
 static const struct socfpga_freeze_controller *freeze_controller_base =
                (void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
 
-/*
- * Default state from cold reset is FREEZE_ALL; the global
- * flag is set to TRUE to indicate the IO banks are frozen
- */
-static uint32_t frzctrl_channel_freeze[FREEZE_CHANNEL_NUM]
-       = { FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN,
-       FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN};
-
-/* Get current state of freeze channel 1 (VIO) */
-static inline u32 sys_mgr_frzctrl_frzchn1_state_get(void)
-{
-       u32 frzchn1_state;
-       frzchn1_state = readl(&freeze_controller_base->hwctrl);
-       frzchn1_state = SYSMGR_FRZCTRL_HWCTRL_VIO1STATE_GET(frzchn1_state);
-       return frzchn1_state;
-}
 
 /* Freeze HPS IOs */
 u32 sys_mgr_frzctrl_freeze_req(FreezeChannelSelect channel_id,
-       FreezeControllerFSMSelect fsm_select)
+                              FreezeControllerFSMSelect fsm_select)
 {
-       u32 frzctrl_ioctrl_reg_offset;
-       u32 frzctrl_reg_value;
-       u32 frzctrl_reg_cfg_mask;
+       u32 ioctrl_reg_offset;
+       u32 reg_value;
+       u32 reg_cfg_mask;
        u32 i;
 
-       if (FREEZE_CONTROLLER_FSM_SW == fsm_select) {
-
-               /* select software FSM */
-               writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW,
-                       &freeze_controller_base->src);
-
-               /* Freeze channel ID checking and base address */
-               switch (channel_id) {
-               case FREEZE_CHANNEL_0:
-               case FREEZE_CHANNEL_1:
-               case FREEZE_CHANNEL_2:
-                       frzctrl_ioctrl_reg_offset = (u32)(
-                               &freeze_controller_base->vioctrl +
-                               (channel_id << SYSMGR_FRZCTRL_VIOCTRL_SHIFT));
-
-                       /*
-                        * Assert active low enrnsl, plniotri
-                        * and niotri signals
-                        */
-                       frzctrl_reg_cfg_mask =
-                               SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK
-                               | SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
-                               | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
-                       clrbits_le32(frzctrl_ioctrl_reg_offset,
-                               frzctrl_reg_cfg_mask);
-
-                       /*
-                        * Note: Delay for 20ns at min
-                        * Assert active low bhniotri signal and de-assert
-                        * active high csrdone
-                        */
-                       frzctrl_reg_cfg_mask
-                               = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
-                               | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
-                       clrbits_le32(frzctrl_ioctrl_reg_offset,
-                               frzctrl_reg_cfg_mask);
-
-                       /* Set global flag to indicate channel is frozen */
-                       frzctrl_channel_freeze[channel_id] =
-                               FREEZE_CTRL_FROZEN;
-                       break;
-
-               case FREEZE_CHANNEL_3:
-                       /*
-                        * Assert active low enrnsl, plniotri and
-                        * niotri signals
-                        */
-                       frzctrl_reg_cfg_mask
-                               = SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK
-                               | SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
-                               | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
-                       clrbits_le32(&freeze_controller_base->hioctrl,
-                               frzctrl_reg_cfg_mask);
-
-                       /*
-                        * Note: Delay for 40ns at min
-                        * assert active low bhniotri & nfrzdrv signals,
-                        * de-assert active high csrdone and assert
-                        * active high frzreg and nfrzdrv signals
-                        */
-                       frzctrl_reg_value =
-                               readl(&freeze_controller_base->hioctrl);
-                       frzctrl_reg_cfg_mask
-                               = SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
-                               | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK;
-                       frzctrl_reg_value
-                               = (frzctrl_reg_value & ~frzctrl_reg_cfg_mask)
-                               | SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK
-                               | SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
-                       writel(frzctrl_reg_value,
-                               &freeze_controller_base->hioctrl);
-
-                       /*
-                        * Note: Delay for 40ns at min
-                        * assert active high reinit signal and de-assert
-                        * active high pllbiasen signals
-                        */
-                       frzctrl_reg_value =
-                               readl(&freeze_controller_base->hioctrl);
-                       frzctrl_reg_value
-                               = (frzctrl_reg_value &
-                               ~SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK)
-                               | SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK;
-                       writel(frzctrl_reg_value,
-                               &freeze_controller_base->hioctrl);
-
-                       /* Set global flag to indicate channel is frozen */
-                       frzctrl_channel_freeze[channel_id] =
-                               FREEZE_CTRL_FROZEN;
-                       break;
-
-               default:
-                       return 1;
-               }
-       } else if (FREEZE_CONTROLLER_FSM_HW == fsm_select) {
-
-               /* select hardware FSM */
-               writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_HW,
-                       &freeze_controller_base->src);
-
-               /* write to hwctrl reg to enable freeze req */
-               setbits_le32(&freeze_controller_base->hwctrl,
-                       SYSMGR_FRZCTRL_HWCTRL_VIO1REQ_MASK);
-
-               i = 0;
-               while (SYSMGR_FRZCTRL_HWCTRL_VIO1STATE_ENUM_FROZEN
-                       != sys_mgr_frzctrl_frzchn1_state_get()) {
-                       i++;
-                       if (SYSMGR_FRZCTRL_LOOP_PARAM < i)
-                               return 1;
-               } /* while ( not frozen) */
-
-               /* Set global flag to indicate channel is frozen */
-               frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_FROZEN;
-       } else {
-               return 1;
-       } /* if-else (fsm_select) */
+       if (FREEZE_CONTROLLER_FSM_SW != fsm_select)
+               return -EINVAL;
+
+       /* select software FSM */
+       writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW,
+              &freeze_controller_base->src);
+
+       /* Freeze channel ID checking and base address */
+       switch (channel_id) {
+       case FREEZE_CHANNEL_0:
+       case FREEZE_CHANNEL_1:
+       case FREEZE_CHANNEL_2:
+               ioctrl_reg_offset = (u32)(
+                       &freeze_controller_base->vioctrl +
+                       (channel_id << SYSMGR_FRZCTRL_VIOCTRL_SHIFT));
+
+               /*
+                * Assert active low enrnsl, plniotri
+                * and niotri signals
+                */
+               reg_cfg_mask =
+                       SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK
+                       | SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
+                       | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
+               clrbits_le32(ioctrl_reg_offset,
+                            reg_cfg_mask);
+
+               /*
+                * Note: Delay for 20ns at min
+                * Assert active low bhniotri signal and de-assert
+                * active high csrdone
+                */
+               reg_cfg_mask
+                       = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
+                       | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
+               clrbits_le32(ioctrl_reg_offset,
+                            reg_cfg_mask);
+               break;
+
+       case FREEZE_CHANNEL_3:
+               /*
+                * Assert active low enrnsl, plniotri and
+                * niotri signals
+                */
+               reg_cfg_mask
+                       = SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK
+                       | SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
+                       | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
+               clrbits_le32(&freeze_controller_base->hioctrl,
+                            reg_cfg_mask);
+
+               /*
+                * Note: Delay for 40ns at min
+                * assert active low bhniotri & nfrzdrv signals,
+                * de-assert active high csrdone and assert
+                * active high frzreg and nfrzdrv signals
+                */
+               reg_value =
+                       readl(&freeze_controller_base->hioctrl);
+               reg_cfg_mask
+                       = SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
+                       | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK;
+               reg_value
+                       = (reg_value & ~reg_cfg_mask)
+                       | SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK
+                       | SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
+               writel(reg_value,
+                      &freeze_controller_base->hioctrl);
+
+               /*
+                * Note: Delay for 40ns at min
+                * assert active high reinit signal and de-assert
+                * active high pllbiasen signals
+                */
+               reg_value =
+                       readl(&freeze_controller_base->hioctrl);
+               reg_value
+                       = (reg_value &
+                          ~SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK)
+                       | SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK;
+               writel(reg_value,
+                      &freeze_controller_base->hioctrl);
+               break;
+
+       default:
+               return -EINVAL;
+       }
 
        return 0;
 }
 
 /* Unfreeze/Thaw HPS IOs */
 u32 sys_mgr_frzctrl_thaw_req(FreezeChannelSelect channel_id,
-       FreezeControllerFSMSelect fsm_select)
+                            FreezeControllerFSMSelect fsm_select)
 {
-       u32 frzctrl_ioctrl_reg_offset;
-       u32 frzctrl_reg_cfg_mask;
-       u32 frzctrl_reg_value;
+       u32 ioctrl_reg_offset;
+       u32 reg_cfg_mask;
+       u32 reg_value;
        u32 i;
        u32 start_count, clk_cycles_count;
 
-       if (FREEZE_CONTROLLER_FSM_SW == fsm_select) {
-               /* select software FSM */
-               writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW,
-                       &freeze_controller_base->src);
+       if (FREEZE_CONTROLLER_FSM_SW != fsm_select) {
+               return -EINVAL;
+       }
+
+
+       /* select software FSM */
+       writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW,
+              &freeze_controller_base->src);
 
        /* Freeze channel ID checking and base address */
        switch (channel_id) {
        case FREEZE_CHANNEL_0:
        case FREEZE_CHANNEL_1:
        case FREEZE_CHANNEL_2:
-               frzctrl_ioctrl_reg_offset
+               ioctrl_reg_offset
                        = (u32)(&freeze_controller_base->vioctrl
-                       + (channel_id << SYSMGR_FRZCTRL_VIOCTRL_SHIFT));
+                               + (channel_id << SYSMGR_FRZCTRL_VIOCTRL_SHIFT));
 
                /*
                 * Assert active low bhniotri signal and
                 * de-assert active high csrdone
                 */
-               frzctrl_reg_cfg_mask
+               reg_cfg_mask
                        = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
                        | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
-               setbits_le32(frzctrl_ioctrl_reg_offset,
-                       frzctrl_reg_cfg_mask);
+               setbits_le32(ioctrl_reg_offset,
+                            reg_cfg_mask);
 
                /*
                 * Note: Delay for 20ns at min
                 * de-assert active low plniotri and niotri signals
                 */
-               frzctrl_reg_cfg_mask
+               reg_cfg_mask
                        = SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
                        | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
-               setbits_le32(frzctrl_ioctrl_reg_offset,
-                       frzctrl_reg_cfg_mask);
+               setbits_le32(ioctrl_reg_offset,
+                            reg_cfg_mask);
 
                /*
                 * Note: Delay for 20ns at min
                 * de-assert active low enrnsl signal
                 */
-               setbits_le32(frzctrl_ioctrl_reg_offset,
-                       SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK);
-
-               /* Set global flag to indicate channel is thawed */
-               frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
-
+               setbits_le32(ioctrl_reg_offset,
+                            SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK);
                break;
 
        case FREEZE_CHANNEL_3:
                /* de-assert active high reinit signal */
                clrbits_le32(&freeze_controller_base->hioctrl,
-                       SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK);
+                            SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK);
 
                /*
                 * Note: Delay for 40ns at min
                 * assert active high pllbiasen signals
                 */
                setbits_le32(&freeze_controller_base->hioctrl,
-                       SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK);
+                            SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK);
 
                /* Delay 1000 intosc. intosc is based on eosc1 */
                reset_timer_count();
@@ -238,18 +195,18 @@ u32 sys_mgr_frzctrl_thaw_req(FreezeChannelSelect 
channel_id,
                        clk_cycles_count =
                                get_timer_count(start_count);
                } while (clk_cycles_count <
-                       SYSMGR_FRZCTRL_INTOSC_1000);
+                        SYSMGR_FRZCTRL_INTOSC_1000);
 
                /*
                 * de-assert active low bhniotri signals,
                 * assert active high csrdone and nfrzdrv signal
                 */
-               frzctrl_reg_value = readl(&freeze_controller_base->hioctrl);
-               frzctrl_reg_value = (frzctrl_reg_value
-                       | SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
-                       | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK)
+               reg_value = readl(&freeze_controller_base->hioctrl);
+               reg_value = (reg_value
+                                    | SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
+                                    | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK)
                        & ~SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
-               writel(frzctrl_reg_value, &freeze_controller_base->hioctrl);
+               writel(reg_value, &freeze_controller_base->hioctrl);
 
                /* Delay 33 intosc */
                reset_timer_count();
@@ -259,63 +216,35 @@ u32 sys_mgr_frzctrl_thaw_req(FreezeChannelSelect 
channel_id,
                        clk_cycles_count =
                                get_timer_count(start_count);
                } while (clk_cycles_count <
-                       SYSMGR_FRZCTRL_INTOSC_33);
+                        SYSMGR_FRZCTRL_INTOSC_33);
 
                /* de-assert active low plniotri and niotri signals */
-               frzctrl_reg_cfg_mask
+               reg_cfg_mask
                        = SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
                        | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
 
                setbits_le32(&freeze_controller_base->hioctrl,
-                       frzctrl_reg_cfg_mask);
+                            reg_cfg_mask);
 
                /*
                 * Note: Delay for 40ns at min
                 * de-assert active high frzreg signal
                 */
                clrbits_le32(&freeze_controller_base->hioctrl,
-                       SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK);
+                            SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK);
 
                /*
                 * Note: Delay for 40ns at min
                 * de-assert active low enrnsl signal
                 */
                setbits_le32(&freeze_controller_base->hioctrl,
-                       SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK);
-
-               /* Set global flag to indicate channel is thawed */
-               frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
-
+                            SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK);
                break;
 
        default:
-               return 1;
+               return -EINVAL;
        }
 
-       } else if (FREEZE_CONTROLLER_FSM_HW == fsm_select) {
-
-               /* select hardware FSM */
-               writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_HW,
-                       &freeze_controller_base->src);
-
-               /* write to hwctrl reg to enable thaw req; 0: thaw */
-               clrbits_le32(&freeze_controller_base->hwctrl,
-                       SYSMGR_FRZCTRL_HWCTRL_VIO1REQ_MASK);
-
-               i = 0;
-               while (SYSMGR_FRZCTRL_HWCTRL_VIO1STATE_ENUM_THAWED
-                       != sys_mgr_frzctrl_frzchn1_state_get()) {
-                       i++;
-                       if (SYSMGR_FRZCTRL_LOOP_PARAM < i)
-                               return 1;
-               } /* while (not thaw) */
-
-               /* Set global flag to indicate channel is thawed */
-               frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
-       } else {
-               return 1;
-       } /* if-else (fsm_select) */
-
        return 0;
 }
 

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to