net: dsa: allow switch drivers to specify phy_device::dev_flags
authorFlorian Fainelli <f.fainelli@gmail.com>
Fri, 19 Sep 2014 20:07:54 +0000 (13:07 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Sep 2014 20:27:07 +0000 (16:27 -0400)
Some switch drivers (e.g: bcm_sf2) may have to communicate specific
workarounds or flags towards the PHY device driver. Allow switches
driver to be delegated that task by introducing a get_phy_flags()
callback which will do just that.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/slave.c

index c779e9bba1b3cbfac293b89e016cbcaa1bb52de0..e020b8a12b7d1091c05bd63d89c646315000c0b9 100644 (file)
@@ -181,6 +181,7 @@ struct dsa_switch_driver {
        char    *(*probe)(struct device *host_dev, int sw_addr);
        int     (*setup)(struct dsa_switch *ds);
        int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
+       u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
 
        /*
         * Access to the switch's PHY registers.
index 90c9689ed3625e41b16b5a35dd31c910a5b96325..a7997265019a8abd61bb46a50d3a157c8e1e896e 100644 (file)
@@ -371,6 +371,7 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
        struct dsa_chip_data *cd = ds->pd;
        struct device_node *phy_dn, *port_dn;
        bool phy_is_fixed = false;
+       u32 phy_flags = 0;
        int ret;
 
        port_dn = cd->port_dn[p->port];
@@ -390,9 +391,12 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
                phy_dn = port_dn;
        }
 
+       if (ds->drv->get_phy_flags)
+               phy_flags = ds->drv->get_phy_flags(ds, p->port);
+
        if (phy_dn)
                p->phy = of_phy_connect(slave_dev, phy_dn,
-                                       dsa_slave_adjust_link, 0,
+                                       dsa_slave_adjust_link, phy_flags,
                                        p->phy_interface);
 
        if (p->phy && phy_is_fixed)
@@ -480,6 +484,9 @@ dsa_slave_create(struct dsa_switch *ds, struct device *parent,
        netif_carrier_off(slave_dev);
 
        if (p->phy != NULL) {
+               if (ds->drv->get_phy_flags(ds, port))
+                       p->phy->dev_flags |= ds->drv->get_phy_flags(ds, port);
+
                phy_attach(slave_dev, dev_name(&p->phy->dev),
                           PHY_INTERFACE_MODE_GMII);