return 0;
 }
 
-void __recalibrate_iodelay(struct pad_conf_entry const *pad, int npads,
-                          struct iodelay_cfg_entry const *iodelay,
-                          int niodelays)
+int __recalibrate_iodelay_start(void)
 {
        int ret = 0;
 
        /* IO recalibration should be done only from SRAM */
        if (OMAP_INIT_CONTEXT_SPL != omap_hw_init_context()) {
                puts("IODELAY recalibration called from invalid context - use only from SPL in SRAM\n");
-               return;
+               return -1;
        }
 
        /* unlock IODELAY CONFIG registers */
                goto err;
 
        ret = update_delay_mechanism((*ctrl)->iodelay_config_base);
-       if (ret)
-               goto err;
 
-       /* Configure Mux settings */
-       do_set_mux32((*ctrl)->control_padconf_core_base, pad, npads);
+err:
+       return ret;
+}
 
-       /* Configure Manual IO timing modes */
-       ret = do_set_iodelay((*ctrl)->iodelay_config_base, iodelay, niodelays);
-       if (ret)
-               goto err;
+void __recalibrate_iodelay_end(int ret)
+{
 
-       ret = isolate_io(DEISOLATE_IO);
+       /* IO recalibration should be done only from SRAM */
+       if (OMAP_INIT_CONTEXT_SPL != omap_hw_init_context()) {
+               puts("IODELAY recalibration called from invalid context - use only from SPL in SRAM\n");
+               return;
+       }
+
+       if (!ret)
+               ret = isolate_io(DEISOLATE_IO);
 
-err:
        /* lock IODELAY CONFIG registers */
        writel(CFG_IODELAY_LOCK_KEY, (*ctrl)->iodelay_config_base +
               CFG_REG_8_OFFSET);
+
        /*
         * UART cannot be used during IO recalibration sequence as IOs are in
         * isolation. So error handling and debug prints are done after
        case ERR_FPDE:
                puts("IODELAY: FPDE calculation failed\n");
                break;
+       case -1:
+               puts("IODELAY: Wrong Context call?\n");
+               break;
        default:
                debug("IODELAY: IO delay recalibration successfully completed\n");
        }
+
+       return;
+}
+
+void __recalibrate_iodelay(struct pad_conf_entry const *pad, int npads,
+                          struct iodelay_cfg_entry const *iodelay,
+                          int niodelays)
+{
+       int ret = 0;
+
+       /* IO recalibration should be done only from SRAM */
+       if (OMAP_INIT_CONTEXT_SPL != omap_hw_init_context()) {
+               puts("IODELAY recalibration called from invalid context - use only from SPL in SRAM\n");
+               return;
+       }
+
+       ret = __recalibrate_iodelay_start();
+       if (ret)
+               goto err;
+
+       /* Configure Mux settings */
+       do_set_mux32((*ctrl)->control_padconf_core_base, pad, npads);
+
+       /* Configure Manual IO timing modes */
+       ret = do_set_iodelay((*ctrl)->iodelay_config_base, iodelay, niodelays);
+       if (ret)
+               goto err;
+
+err:
+       __recalibrate_iodelay_end(ret);
+
 }