core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
 }
 
+/* If port 6 is available as a CPU port, always prefer that as the default,
+ * otherwise don't care.
+ */
+static struct dsa_port *
+mt753x_preferred_default_local_cpu_port(struct dsa_switch *ds)
+{
+       struct dsa_port *cpu_dp = dsa_to_port(ds, 6);
+
+       if (dsa_port_is_cpu(cpu_dp))
+               return cpu_dp;
+
+       return NULL;
+}
+
 /* Setup port 6 interface mode and TRGMII TX circuit */
 static int
 mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
 const struct dsa_switch_ops mt7530_switch_ops = {
        .get_tag_protocol       = mtk_get_tag_protocol,
        .setup                  = mt753x_setup,
+       .preferred_default_local_cpu_port = mt753x_preferred_default_local_cpu_port,
        .get_strings            = mt7530_get_strings,
        .get_ethtool_stats      = mt7530_get_ethtool_stats,
        .get_sset_count         = mt7530_get_sset_count,
 
                               struct phy_device *phy);
        void    (*port_disable)(struct dsa_switch *ds, int port);
 
+       /*
+        * Compatibility between device trees defining multiple CPU ports and
+        * drivers which are not OK to use by default the numerically smallest
+        * CPU port of a switch for its local ports. This can return NULL,
+        * meaning "don't know/don't care".
+        */
+       struct dsa_port *(*preferred_default_local_cpu_port)(struct dsa_switch *ds);
+
        /*
         * Port's MAC EEE settings
         */
 
        return 0;
 }
 
+static struct dsa_port *
+dsa_switch_preferred_default_local_cpu_port(struct dsa_switch *ds)
+{
+       struct dsa_port *cpu_dp;
+
+       if (!ds->ops->preferred_default_local_cpu_port)
+               return NULL;
+
+       cpu_dp = ds->ops->preferred_default_local_cpu_port(ds);
+       if (!cpu_dp)
+               return NULL;
+
+       if (WARN_ON(!dsa_port_is_cpu(cpu_dp) || cpu_dp->ds != ds))
+               return NULL;
+
+       return cpu_dp;
+}
+
 /* Perform initial assignment of CPU ports to user ports and DSA links in the
  * fabric, giving preference to CPU ports local to each switch. Default to
  * using the first CPU port in the switch tree if the port does not have a CPU
  */
 static int dsa_tree_setup_cpu_ports(struct dsa_switch_tree *dst)
 {
-       struct dsa_port *cpu_dp, *dp;
+       struct dsa_port *preferred_cpu_dp, *cpu_dp, *dp;
 
        list_for_each_entry(cpu_dp, &dst->ports, list) {
                if (!dsa_port_is_cpu(cpu_dp))
                        continue;
 
+               preferred_cpu_dp = dsa_switch_preferred_default_local_cpu_port(cpu_dp->ds);
+               if (preferred_cpu_dp && preferred_cpu_dp != cpu_dp)
+                       continue;
+
                /* Prefer a local CPU port */
                dsa_switch_for_each_port(dp, cpu_dp->ds) {
                        /* Prefer the first local CPU port found */