} else if (dma_has_cap(DMA_MEMCPY, cap) &&
                   dma_has_cap(DMA_SLAVE, cap)) {
                d40c->dma_cfg = dma40_memcpy_conf_phy;
+
+               /* Generate interrrupt at end of transfer or relink. */
+               d40c->dst_def_cfg |= BIT(D40_SREG_CFG_TIM_POS);
+
+               /* Generate interrupt on error. */
+               d40c->src_def_cfg |= BIT(D40_SREG_CFG_EIM_POS);
+               d40c->dst_def_cfg |= BIT(D40_SREG_CFG_EIM_POS);
+
        } else {
                chan_err(d40c, "No memcpy\n");
                return -EINVAL;
        }
 
        pm_runtime_get_sync(d40c->base->dev);
-       /* Fill in basic CFG register values */
-       d40_phy_cfg(&d40c->dma_cfg, &d40c->src_def_cfg,
-                   &d40c->dst_def_cfg, chan_is_logical(d40c));
 
        d40_set_prio_realtime(d40c);
 
        if (chan_is_logical(d40c))
                d40_log_cfg(cfg, &d40c->log_def.lcsp1, &d40c->log_def.lcsp3);
        else
-               d40_phy_cfg(cfg, &d40c->src_def_cfg,
-                           &d40c->dst_def_cfg, false);
+               d40_phy_cfg(cfg, &d40c->src_def_cfg, &d40c->dst_def_cfg);
 
        /* These settings will take precedence later */
        d40c->runtime_addr = config_addr;
 
 
 }
 
-/* Sets up SRC and DST CFG register for both logical and physical channels */
-void d40_phy_cfg(struct stedma40_chan_cfg *cfg,
-                u32 *src_cfg, u32 *dst_cfg, bool is_log)
+void d40_phy_cfg(struct stedma40_chan_cfg *cfg, u32 *src_cfg, u32 *dst_cfg)
 {
        u32 src = 0;
        u32 dst = 0;
 
-       if (!is_log) {
-               /* Physical channel */
-               if ((cfg->dir ==  STEDMA40_PERIPH_TO_MEM) ||
-                   (cfg->dir == STEDMA40_PERIPH_TO_PERIPH)) {
-                       /* Set master port to 1 */
-                       src |= 1 << D40_SREG_CFG_MST_POS;
-                       src |= D40_TYPE_TO_EVENT(cfg->dev_type);
-
-                       if (cfg->src_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL)
-                               src |= 1 << D40_SREG_CFG_PHY_TM_POS;
-                       else
-                               src |= 3 << D40_SREG_CFG_PHY_TM_POS;
-               }
-               if ((cfg->dir ==  STEDMA40_MEM_TO_PERIPH) ||
-                   (cfg->dir == STEDMA40_PERIPH_TO_PERIPH)) {
-                       /* Set master port to 1 */
-                       dst |= 1 << D40_SREG_CFG_MST_POS;
-                       dst |= D40_TYPE_TO_EVENT(cfg->dev_type);
-
-                       if (cfg->dst_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL)
-                               dst |= 1 << D40_SREG_CFG_PHY_TM_POS;
-                       else
-                               dst |= 3 << D40_SREG_CFG_PHY_TM_POS;
-               }
-               /* Interrupt on end of transfer for destination */
-               dst |= 1 << D40_SREG_CFG_TIM_POS;
-
-               /* Generate interrupt on error */
-               src |= 1 << D40_SREG_CFG_EIM_POS;
-               dst |= 1 << D40_SREG_CFG_EIM_POS;
-
-               /* PSIZE */
-               if (cfg->src_info.psize != STEDMA40_PSIZE_PHY_1) {
-                       src |= 1 << D40_SREG_CFG_PHY_PEN_POS;
-                       src |= cfg->src_info.psize << D40_SREG_CFG_PSIZE_POS;
-               }
-               if (cfg->dst_info.psize != STEDMA40_PSIZE_PHY_1) {
-                       dst |= 1 << D40_SREG_CFG_PHY_PEN_POS;
-                       dst |= cfg->dst_info.psize << D40_SREG_CFG_PSIZE_POS;
-               }
-
-               /* Element size */
-               src |= cfg->src_info.data_width << D40_SREG_CFG_ESIZE_POS;
-               dst |= cfg->dst_info.data_width << D40_SREG_CFG_ESIZE_POS;
-
-               /* Set the priority bit to high for the physical channel */
-               if (cfg->high_priority) {
-                       src |= 1 << D40_SREG_CFG_PRI_POS;
-                       dst |= 1 << D40_SREG_CFG_PRI_POS;
-               }
+       if ((cfg->dir ==  STEDMA40_PERIPH_TO_MEM) ||
+           (cfg->dir == STEDMA40_PERIPH_TO_PERIPH)) {
+               /* Set master port to 1 */
+               src |= 1 << D40_SREG_CFG_MST_POS;
+               src |= D40_TYPE_TO_EVENT(cfg->dev_type);
+
+               if (cfg->src_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL)
+                       src |= 1 << D40_SREG_CFG_PHY_TM_POS;
+               else
+                       src |= 3 << D40_SREG_CFG_PHY_TM_POS;
+       }
+       if ((cfg->dir ==  STEDMA40_MEM_TO_PERIPH) ||
+           (cfg->dir == STEDMA40_PERIPH_TO_PERIPH)) {
+               /* Set master port to 1 */
+               dst |= 1 << D40_SREG_CFG_MST_POS;
+               dst |= D40_TYPE_TO_EVENT(cfg->dev_type);
+
+               if (cfg->dst_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL)
+                       dst |= 1 << D40_SREG_CFG_PHY_TM_POS;
+               else
+                       dst |= 3 << D40_SREG_CFG_PHY_TM_POS;
+       }
+       /* Interrupt on end of transfer for destination */
+       dst |= 1 << D40_SREG_CFG_TIM_POS;
+
+       /* Generate interrupt on error */
+       src |= 1 << D40_SREG_CFG_EIM_POS;
+       dst |= 1 << D40_SREG_CFG_EIM_POS;
+
+       /* PSIZE */
+       if (cfg->src_info.psize != STEDMA40_PSIZE_PHY_1) {
+               src |= 1 << D40_SREG_CFG_PHY_PEN_POS;
+               src |= cfg->src_info.psize << D40_SREG_CFG_PSIZE_POS;
+       }
+       if (cfg->dst_info.psize != STEDMA40_PSIZE_PHY_1) {
+               dst |= 1 << D40_SREG_CFG_PHY_PEN_POS;
+               dst |= cfg->dst_info.psize << D40_SREG_CFG_PSIZE_POS;
+       }
+
+       /* Element size */
+       src |= cfg->src_info.data_width << D40_SREG_CFG_ESIZE_POS;
+       dst |= cfg->dst_info.data_width << D40_SREG_CFG_ESIZE_POS;
+
+       /* Set the priority bit to high for the physical channel */
+       if (cfg->high_priority) {
+               src |= 1 << D40_SREG_CFG_PRI_POS;
+               dst |= 1 << D40_SREG_CFG_PRI_POS;
        }
 
        if (cfg->src_info.big_endian)