return reg & mask;
 }
 
+static inline void flexcan_write64(struct flexcan_priv *priv, u64 val, void __iomem *addr)
+{
+       if (upper_32_bits(val))
+               priv->write(upper_32_bits(val), addr - 4);
+       if (lower_32_bits(val))
+               priv->write(lower_32_bits(val), addr);
+}
+
 static inline u64 flexcan_read_reg_iflag_rx(struct flexcan_priv *priv)
 {
        return flexcan_read64_mask(priv, &priv->regs->iflag1, priv->rx_mask);
 }
 
+static inline u64 flexcan_read_reg_iflag_tx(struct flexcan_priv *priv)
+{
+       return flexcan_read64_mask(priv, &priv->regs->iflag1, priv->tx_mask);
+}
+
 static inline struct flexcan_priv *rx_offload_to_priv(struct can_rx_offload *offload)
 {
        return container_of(offload, struct flexcan_priv, offload);
                }
        }
 
-       reg_iflag_tx = (u64)priv->read(®s->iflag2) << 32;
+       reg_iflag_tx = flexcan_read_reg_iflag_tx(priv);
 
        /* transmission complete interrupt */
        if (reg_iflag_tx & priv->tx_mask) {
                /* after sending a RTR frame MB is in RX mode */
                priv->write(FLEXCAN_MB_CODE_TX_INACTIVE,
                            &priv->tx_mb->can_ctrl);
-               priv->write(priv->tx_mask >> 32, ®s->iflag2);
+               flexcan_write64(priv, priv->tx_mask, ®s->iflag1);
                netif_wake_queue(dev);
        }