void socfpga_get_seq_ac_init(const u32 **init, unsigned int *nelem);
 void socfpga_get_seq_inst_init(const u32 **init, unsigned int *nelem);
 const struct socfpga_sdram_rw_mgr_config *socfpga_get_sdram_rwmgr_config(void);
+const struct socfpga_sdram_io_config *socfpga_get_sdram_io_config(void);
 
 #define SDR_CTRLGRP_ADDRESS    (SOCFPGA_SDR_ADDRESS | 0x5000)
 
        u8      mem_virtual_groups_per_write_dqs;
 };
 
+struct socfpga_sdram_io_config {
+       u16     delay_per_opa_tap;
+       u8      delay_per_dchain_tap;
+       u8      delay_per_dqs_en_dchain_tap;
+       u8      dll_chain_length;
+       u8      dqdqs_out_phase_max;
+       u8      dqs_en_delay_max;
+       u8      dqs_en_delay_offset;
+       u8      dqs_en_phase_max;
+       u8      dqs_in_delay_max;
+       u8      dqs_in_reserve;
+       u8      dqs_out_reserve;
+       u8      io_in_delay_max;
+       u8      io_out1_delay_max;
+       u8      io_out2_delay_max;
+       u8      shift_dqs_en_when_shift_dqs;
+};
+
 #define SDR_CTRLGRP_CTRLCFG_NODMPINS_LSB 23
 #define SDR_CTRLGRP_CTRLCFG_NODMPINS_MASK 0x00800000
 #define SDR_CTRLGRP_CTRLCFG_DQSTRKEN_LSB 22
 
                RW_MGR_MEM_VIRTUAL_GROUPS_PER_WRITE_DQS,
 };
 
+struct socfpga_sdram_io_config io_config = {
+       .delay_per_dchain_tap           = IO_DELAY_PER_DCHAIN_TAP,
+       .delay_per_dqs_en_dchain_tap    = IO_DELAY_PER_DQS_EN_DCHAIN_TAP,
+       .delay_per_opa_tap              = IO_DELAY_PER_OPA_TAP,
+       .dll_chain_length               = IO_DLL_CHAIN_LENGTH,
+       .dqdqs_out_phase_max            = IO_DQDQS_OUT_PHASE_MAX,
+       .dqs_en_delay_max               = IO_DQS_EN_DELAY_MAX,
+       .dqs_en_delay_offset            = IO_DQS_EN_DELAY_OFFSET,
+       .dqs_en_phase_max               = IO_DQS_EN_PHASE_MAX,
+       .dqs_in_delay_max               = IO_DQS_IN_DELAY_MAX,
+       .dqs_in_reserve                 = IO_DQS_IN_RESERVE,
+       .dqs_out_reserve                = IO_DQS_OUT_RESERVE,
+       .io_in_delay_max                = IO_IO_IN_DELAY_MAX,
+       .io_out1_delay_max              = IO_IO_OUT1_DELAY_MAX,
+       .io_out2_delay_max              = IO_IO_OUT2_DELAY_MAX,
+       .shift_dqs_en_when_shift_dqs    = IO_SHIFT_DQS_EN_WHEN_SHIFT_DQS,
+};
+
 const struct socfpga_sdram_config *socfpga_get_sdram_config(void)
 {
        return &sdram_config;
 {
        return &rw_mgr_config;
 }
+
+const struct socfpga_sdram_io_config *socfpga_get_sdram_io_config(void)
+{
+       return &io_config;
+}
 
        (struct socfpga_sdr_ctrl *)SDR_CTRLGRP_ADDRESS;
 
 const struct socfpga_sdram_rw_mgr_config *rwcfg;
+const struct socfpga_sdram_io_config *iocfg;
 
 #define DELTA_D                1
 
        gbl = &my_gbl;
 
        rwcfg = socfpga_get_sdram_rwmgr_config();
+       iocfg = socfpga_get_sdram_io_config();
 
        /* Set the calibration enabled by default */
        gbl->phy_debug_mode_flags |= PHY_DEBUG_ENABLE_CAL_RPT;