val = mt7530_read(priv, MT753X_MTRAP);
 
-       val |= MT7530_CHG_TRAP | MT7530_P5_MAC_SEL | MT7530_P5_DIS;
-       val &= ~MT7530_P5_RGMII_MODE & ~MT7530_P5_PHY0_SEL;
+       val &= ~MT7530_P5_PHY0_SEL & ~MT7530_P5_MAC_SEL & ~MT7530_P5_RGMII_MODE;
 
        switch (priv->p5_mode) {
        /* MUX_PHY_P0: P0 -> P5 -> SoC MAC */
 
        /* MUX_PHY_P4: P4 -> P5 -> SoC MAC */
        case MUX_PHY_P4:
-               val &= ~MT7530_P5_MAC_SEL & ~MT7530_P5_DIS;
-
                /* Setup the MAC by default for the cpu port */
                mt7530_write(priv, MT753X_PMCR_P(5), 0x56300);
                break;
 
        /* GMAC5: P5 -> SoC MAC or external PHY */
        default:
-               val &= ~MT7530_P5_DIS;
+               val |= MT7530_P5_MAC_SEL;
                break;
        }
 
 
        mutex_unlock(&priv->reg_mutex);
 
+       if (priv->id != ID_MT7530 && priv->id != ID_MT7621)
+               return 0;
+
+       if (port == 5)
+               mt7530_clear(priv, MT753X_MTRAP, MT7530_P5_DIS);
+       else if (port == 6)
+               mt7530_clear(priv, MT753X_MTRAP, MT7530_P6_DIS);
+
        return 0;
 }
 
                   PCR_MATRIX_CLR);
 
        mutex_unlock(&priv->reg_mutex);
+
+       if (priv->id != ID_MT7530 && priv->id != ID_MT7621)
+               return;
+
+       if (port == 5)
+               mt7530_set(priv, MT753X_MTRAP, MT7530_P5_DIS);
+       else if (port == 6)
+               mt7530_set(priv, MT753X_MTRAP, MT7530_P6_DIS);
 }
 
 static int
                mt7530_rmw(priv, MT7530_TRGMII_RD(i),
                           RD_TAP_MASK, RD_TAP(16));
 
-       /* Enable port 6 */
-       val = mt7530_read(priv, MT753X_MTRAP);
-       val &= ~MT7530_P6_DIS & ~MT7530_PHY_INDIRECT_ACCESS;
-       val |= MT7530_CHG_TRAP;
-       mt7530_write(priv, MT753X_MTRAP, val);
+       /* Allow modifying the trap and directly access PHY registers via the
+        * MDIO bus the switch is on.
+        */
+       mt7530_rmw(priv, MT753X_MTRAP, MT7530_CHG_TRAP |
+                  MT7530_PHY_INDIRECT_ACCESS, MT7530_CHG_TRAP);
 
        if ((val & MT7530_XTAL_MASK) == MT7530_XTAL_40MHZ)
                mt7530_pll_setup(priv);
                        break;
                }
 
-               if (priv->p5_mode == MUX_PHY_P0 || priv->p5_mode == MUX_PHY_P4)
+               if (priv->p5_mode == MUX_PHY_P0 ||
+                   priv->p5_mode == MUX_PHY_P4) {
+                       mt7530_clear(priv, MT753X_MTRAP, MT7530_P5_DIS);
                        mt7530_setup_port5(ds, interface);
+               }
        }
 
 #ifdef CONFIG_GPIOLIB