]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net: phy: fixed-phy: Drop GPIO from fixed_phy_add()
authorLinus Walleij <linus.walleij@linaro.org>
Mon, 4 Feb 2019 10:26:18 +0000 (11:26 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Feb 2019 02:33:36 +0000 (18:33 -0800)
All users of the fixed_phy_add() pass -1 as GPIO number
to the fixed phy driver, and all users of fixed_phy_register()
pass -1 as GPIO number as well, except for the device
tree MDIO bus.

Any new users should create a proper device and pass the
GPIO as a descriptor associated with the device so delete
the GPIO argument from the calls and drop the code looking
requesting a GPIO in fixed_phy_add().

In fixed phy_register(), investigate the "fixed-link"
node and pick the GPIO descriptor from "link-gpios" if
this property exists. Move the corresponding code out
of of_mdio.c as the fixed phy code anyways requires
OF to be in use.

Tested-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/device_drivers/stmicro/stmmac.txt
arch/m68k/coldfire/m5272.c
arch/mips/ar7/platform.c
arch/mips/bcm47xx/setup.c
drivers/net/dsa/dsa_loop.c
drivers/net/ethernet/broadcom/bgmac.c
drivers/net/ethernet/broadcom/genet/bcmmii.c
drivers/net/phy/fixed_phy.c
drivers/net/usb/lan78xx.c
drivers/of/of_mdio.c
include/linux/phy_fixed.h

index 2bb07078f535f623ed06773358d82f3ddd420863..1ae979fd90d251ab7b71f00fb618a0fe44a8c2f9 100644 (file)
@@ -267,7 +267,7 @@ static struct fixed_phy_status stmmac0_fixed_phy_status = {
 
 During the board's device_init we can configure the first
 MAC for fixed_link by calling:
-  fixed_phy_add(PHY_POLL, 1, &stmmac0_fixed_phy_status, -1);
+  fixed_phy_add(PHY_POLL, 1, &stmmac0_fixed_phy_status);
 and the second one, with a real PHY device attached to the bus,
 by using the stmmac_mdio_bus_data structure (to provide the id, the
 reset procedure etc).
index ad1185c68df739eb9f99d6d847e5007810205255..6b3ab583c69875e93648d7a3d0f2f528a345a6e4 100644 (file)
@@ -127,7 +127,7 @@ static struct fixed_phy_status nettel_fixed_phy_status __initdata = {
 static int __init init_BSP(void)
 {
        m5272_uarts_init();
-       fixed_phy_add(PHY_POLL, 0, &nettel_fixed_phy_status, -1);
+       fixed_phy_add(PHY_POLL, 0, &nettel_fixed_phy_status);
        return 0;
 }
 
index f09262e0a72f386c91aba072589c9f03a56ae40e..10ff07b7721ef391319959cedcb6c85be05033f4 100644 (file)
@@ -683,7 +683,7 @@ static int __init ar7_register_devices(void)
 
        if (ar7_has_high_cpmac()) {
                res = fixed_phy_add(PHY_POLL, cpmac_high.id,
-                                   &fixed_phy_status, -1);
+                                   &fixed_phy_status);
                if (!res) {
                        cpmac_get_mac(1, cpmac_high_data.dev_addr);
 
@@ -696,7 +696,7 @@ static int __init ar7_register_devices(void)
        } else
                cpmac_low_data.phy_mask = 0xffffffff;
 
-       res = fixed_phy_add(PHY_POLL, cpmac_low.id, &fixed_phy_status, -1);
+       res = fixed_phy_add(PHY_POLL, cpmac_low.id, &fixed_phy_status);
        if (!res) {
                cpmac_get_mac(0, cpmac_low_data.dev_addr);
                res = platform_device_register(&cpmac_low);
index fe3773539effe61e638ec7e277783ac24b022563..82627c264964446c1319288823c8fce02f6c9be6 100644 (file)
@@ -274,7 +274,7 @@ static int __init bcm47xx_register_bus_complete(void)
        bcm47xx_leds_register();
        bcm47xx_workarounds();
 
-       fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status, -1);
+       fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status);
        return 0;
 }
 device_initcall(bcm47xx_register_bus_complete);
index 816f34d64736fdbf5b996dab5bde45db09ab5041..17482ae09aa55e67366a535bc2b3fe27d2ce0355 100644 (file)
@@ -343,7 +343,7 @@ static int __init dsa_loop_init(void)
        unsigned int i;
 
        for (i = 0; i < NUM_FIXED_PHYS; i++)
-               phydevs[i] = fixed_phy_register(PHY_POLL, &status, -1, NULL);
+               phydevs[i] = fixed_phy_register(PHY_POLL, &status, NULL);
 
        return mdio_driver_register(&dsa_loop_drv);
 }
index 2d3a44c4022126176d5b86d0da788fb7864a7ba5..4632dd5dbad1f4fbeaad6722807428e0640e91e3 100644 (file)
@@ -1446,7 +1446,7 @@ int bgmac_phy_connect_direct(struct bgmac *bgmac)
        struct phy_device *phy_dev;
        int err;
 
-       phy_dev = fixed_phy_register(PHY_POLL, &fphy_status, -1, NULL);
+       phy_dev = fixed_phy_register(PHY_POLL, &fphy_status, NULL);
        if (!phy_dev || IS_ERR(phy_dev)) {
                dev_err(bgmac->dev, "Failed to register fixed PHY device\n");
                return -ENODEV;
index aceb9b7b55bdf9c26d26f3bc9f44a4d7574c6a89..51880d83131ac8c2ad34ff4d453a0fd5a757d4df 100644 (file)
@@ -525,7 +525,7 @@ static int bcmgenet_mii_pd_init(struct bcmgenet_priv *priv)
                        .asym_pause = 0,
                };
 
-               phydev = fixed_phy_register(PHY_POLL, &fphy_status, -1, NULL);
+               phydev = fixed_phy_register(PHY_POLL, &fphy_status, NULL);
                if (!phydev || IS_ERR(phydev)) {
                        dev_err(kdev, "failed to register fixed PHY device\n");
                        return -ENODEV;
index 47a8cb574c4506732cc412d8a39cab02744c5473..f136a23c1a35cfe8ca8093928b70d0631b7cb670 100644 (file)
@@ -18,7 +18,7 @@
 #include <linux/err.h>
 #include <linux/slab.h>
 #include <linux/of.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/seqlock.h>
 #include <linux/idr.h>
 #include <linux/netdevice.h>
@@ -38,7 +38,7 @@ struct fixed_phy {
        bool no_carrier;
        int (*link_update)(struct net_device *, struct fixed_phy_status *);
        struct list_head node;
-       int link_gpio;
+       struct gpio_desc *link_gpiod;
 };
 
 static struct platform_device *pdev;
@@ -67,8 +67,8 @@ EXPORT_SYMBOL_GPL(fixed_phy_change_carrier);
 
 static void fixed_phy_update(struct fixed_phy *fp)
 {
-       if (!fp->no_carrier && gpio_is_valid(fp->link_gpio))
-               fp->status.link = !!gpio_get_value_cansleep(fp->link_gpio);
+       if (!fp->no_carrier && fp->link_gpiod)
+               fp->status.link = !!gpiod_get_value_cansleep(fp->link_gpiod);
 }
 
 static int fixed_mdio_read(struct mii_bus *bus, int phy_addr, int reg_num)
@@ -133,9 +133,9 @@ int fixed_phy_set_link_update(struct phy_device *phydev,
 }
 EXPORT_SYMBOL_GPL(fixed_phy_set_link_update);
 
-int fixed_phy_add(unsigned int irq, int phy_addr,
-                 struct fixed_phy_status *status,
-                 int link_gpio)
+static int fixed_phy_add_gpiod(unsigned int irq, int phy_addr,
+                              struct fixed_phy_status *status,
+                              struct gpio_desc *gpiod)
 {
        int ret;
        struct fixed_mdio_bus *fmb = &platform_fmb;
@@ -156,24 +156,19 @@ int fixed_phy_add(unsigned int irq, int phy_addr,
 
        fp->addr = phy_addr;
        fp->status = *status;
-       fp->link_gpio = link_gpio;
-
-       if (gpio_is_valid(fp->link_gpio)) {
-               ret = gpio_request_one(fp->link_gpio, GPIOF_DIR_IN,
-                                      "fixed-link-gpio-link");
-               if (ret)
-                       goto err_regs;
-       }
+       fp->link_gpiod = gpiod;
 
        fixed_phy_update(fp);
 
        list_add_tail(&fp->node, &fmb->phys);
 
        return 0;
+}
 
-err_regs:
-       kfree(fp);
-       return ret;
+int fixed_phy_add(unsigned int irq, int phy_addr,
+                 struct fixed_phy_status *status) {
+
+       return fixed_phy_add_gpiod(irq, phy_addr, status, NULL);
 }
 EXPORT_SYMBOL_GPL(fixed_phy_add);
 
@@ -187,8 +182,8 @@ static void fixed_phy_del(int phy_addr)
        list_for_each_entry_safe(fp, tmp, &fmb->phys, node) {
                if (fp->addr == phy_addr) {
                        list_del(&fp->node);
-                       if (gpio_is_valid(fp->link_gpio))
-                               gpio_free(fp->link_gpio);
+                       if (fp->link_gpiod)
+                               gpiod_put(fp->link_gpiod);
                        kfree(fp);
                        ida_simple_remove(&phy_fixed_ida, phy_addr);
                        return;
@@ -196,12 +191,50 @@ static void fixed_phy_del(int phy_addr)
        }
 }
 
+#ifdef CONFIG_OF_GPIO
+static struct gpio_desc *fixed_phy_get_gpiod(struct device_node *np)
+{
+       struct device_node *fixed_link_node;
+       struct gpio_desc *gpiod;
+
+       if (!np)
+               return NULL;
+
+       fixed_link_node = of_get_child_by_name(np, "fixed-link");
+       if (!fixed_link_node)
+               return NULL;
+
+       /*
+        * As the fixed link is just a device tree node without any
+        * Linux device associated with it, we simply have obtain
+        * the GPIO descriptor from the device tree like this.
+        */
+       gpiod = gpiod_get_from_of_node(fixed_link_node, "link-gpios", 0,
+                                      GPIOD_IN, "mdio");
+       of_node_put(fixed_link_node);
+       if (IS_ERR(gpiod)) {
+               if (PTR_ERR(gpiod) == -EPROBE_DEFER)
+                       return gpiod;
+               pr_err("error getting GPIO for fixed link %pOF, proceed without\n",
+                      fixed_link_node);
+               gpiod = NULL;
+       }
+
+       return gpiod;
+}
+#else
+static struct gpio_desc *fixed_phy_get_gpiod(struct device_node *np)
+{
+       return NULL;
+}
+#endif
+
 struct phy_device *fixed_phy_register(unsigned int irq,
                                      struct fixed_phy_status *status,
-                                     int link_gpio,
                                      struct device_node *np)
 {
        struct fixed_mdio_bus *fmb = &platform_fmb;
+       struct gpio_desc *gpiod = NULL;
        struct phy_device *phy;
        int phy_addr;
        int ret;
@@ -209,12 +242,17 @@ struct phy_device *fixed_phy_register(unsigned int irq,
        if (!fmb->mii_bus || fmb->mii_bus->state != MDIOBUS_REGISTERED)
                return ERR_PTR(-EPROBE_DEFER);
 
+       /* Check if we have a GPIO associated with this fixed phy */
+       gpiod = fixed_phy_get_gpiod(np);
+       if (IS_ERR(gpiod))
+               return ERR_CAST(gpiod);
+
        /* Get the next available PHY address, up to PHY_MAX_ADDR */
        phy_addr = ida_simple_get(&phy_fixed_ida, 0, PHY_MAX_ADDR, GFP_KERNEL);
        if (phy_addr < 0)
                return ERR_PTR(phy_addr);
 
-       ret = fixed_phy_add(irq, phy_addr, status, link_gpio);
+       ret = fixed_phy_add_gpiod(irq, phy_addr, status, gpiod);
        if (ret < 0) {
                ida_simple_remove(&phy_fixed_ida, phy_addr);
                return ERR_PTR(ret);
index e96bc0c6140f38cf4d6832d51f05bc3bd4ddfef6..3d92ea6fcc02be12c00083cdc71832745c8a70fb 100644 (file)
@@ -2051,8 +2051,7 @@ static struct phy_device *lan7801_phy_init(struct lan78xx_net *dev)
        phydev = phy_find_first(dev->mdiobus);
        if (!phydev) {
                netdev_dbg(dev->net, "PHY Not Found!! Registering Fixed PHY\n");
-               phydev = fixed_phy_register(PHY_POLL, &fphy_status, -1,
-                                           NULL);
+               phydev = fixed_phy_register(PHY_POLL, &fphy_status, NULL);
                if (IS_ERR(phydev)) {
                        netdev_err(dev->net, "No PHY/fixed_PHY found\n");
                        return NULL;
index 5ad1342f568252bb8fb6b845f1ae5e0b8e24fb50..de6157357e269b7cea27166fc5b88a2475b804d9 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/phy.h>
 #include <linux/phy_fixed.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/of_irq.h>
 #include <linux/of_mdio.h>
 #include <linux/of_net.h>
@@ -463,7 +462,6 @@ int of_phy_register_fixed_link(struct device_node *np)
        struct device_node *fixed_link_node;
        u32 fixed_link_prop[5];
        const char *managed;
-       int link_gpio = -1;
 
        if (of_property_read_string(np, "managed", &managed) == 0 &&
            strcmp(managed, "in-band-status") == 0) {
@@ -485,11 +483,7 @@ int of_phy_register_fixed_link(struct device_node *np)
                status.pause = of_property_read_bool(fixed_link_node, "pause");
                status.asym_pause = of_property_read_bool(fixed_link_node,
                                                          "asym-pause");
-               link_gpio = of_get_named_gpio_flags(fixed_link_node,
-                                                   "link-gpios", 0, NULL);
                of_node_put(fixed_link_node);
-               if (link_gpio == -EPROBE_DEFER)
-                       return -EPROBE_DEFER;
 
                goto register_phy;
        }
@@ -508,8 +502,7 @@ int of_phy_register_fixed_link(struct device_node *np)
        return -ENODEV;
 
 register_phy:
-       return PTR_ERR_OR_ZERO(fixed_phy_register(PHY_POLL, &status, link_gpio,
-                                                 np));
+       return PTR_ERR_OR_ZERO(fixed_phy_register(PHY_POLL, &status, np));
 }
 EXPORT_SYMBOL(of_phy_register_fixed_link);
 
index 9525567b195113053d59d72b453f720a0c233706..c78fc203db438dd4fcf8d5d6d4513822b9c1a2ff 100644 (file)
@@ -15,11 +15,9 @@ struct device_node;
 #if IS_ENABLED(CONFIG_FIXED_PHY)
 extern int fixed_phy_change_carrier(struct net_device *dev, bool new_carrier);
 extern int fixed_phy_add(unsigned int irq, int phy_id,
-                        struct fixed_phy_status *status,
-                        int link_gpio);
+                        struct fixed_phy_status *status);
 extern struct phy_device *fixed_phy_register(unsigned int irq,
                                             struct fixed_phy_status *status,
-                                            int link_gpio,
                                             struct device_node *np);
 extern void fixed_phy_unregister(struct phy_device *phydev);
 extern int fixed_phy_set_link_update(struct phy_device *phydev,
@@ -27,14 +25,12 @@ extern int fixed_phy_set_link_update(struct phy_device *phydev,
                                           struct fixed_phy_status *));
 #else
 static inline int fixed_phy_add(unsigned int irq, int phy_id,
-                               struct fixed_phy_status *status,
-                               int link_gpio)
+                               struct fixed_phy_status *status)
 {
        return -ENODEV;
 }
 static inline struct phy_device *fixed_phy_register(unsigned int irq,
                                                struct fixed_phy_status *status,
-                                               int gpio_link,
                                                struct device_node *np)
 {
        return ERR_PTR(-ENODEV);