瀏覽代碼

net/macb: Update device tree binding for resetting PHY using GPIO

Instead of being at the MAC level the reset gpio preperty is moved at the
PHY child node level. It is still managed by the MAC, but from the point
of view of the binding it make more sense to be part of the PHY node.

This commit also fixes a build errors if GPIOLIB is not selected.

Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Gregory CLEMENT 9 年之前
父節點
當前提交
270c499f09
共有 2 個文件被更改,包括 18 次插入5 次删除
  1. 6 2
      Documentation/devicetree/bindings/net/macb.txt
  2. 12 3
      drivers/net/ethernet/cadence/macb.c

+ 6 - 2
Documentation/devicetree/bindings/net/macb.txt

@@ -19,8 +19,8 @@ Required properties:
 	Optional elements: 'tx_clk'
 	Optional elements: 'tx_clk'
 - clocks: Phandles to input clocks.
 - clocks: Phandles to input clocks.
 
 
-Optional properties:
-- phy-reset-gpios : Should specify the gpio for phy reset
+Optional properties for PHY child node:
+- reset-gpios : Should specify the gpio for phy reset
 
 
 Examples:
 Examples:
 
 
@@ -32,4 +32,8 @@ Examples:
 		local-mac-address = [3a 0e 03 04 05 06];
 		local-mac-address = [3a 0e 03 04 05 06];
 		clock-names = "pclk", "hclk", "tx_clk";
 		clock-names = "pclk", "hclk", "tx_clk";
 		clocks = <&clkc 30>, <&clkc 30>, <&clkc 13>;
 		clocks = <&clkc 30>, <&clkc 30>, <&clkc 13>;
+		ethernet-phy@1 {
+			reg = <0x1>;
+			reset-gpios = <&pioE 6 1>;
+		};
 	};
 	};

+ 12 - 3
drivers/net/ethernet/cadence/macb.c

@@ -19,6 +19,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/netdevice.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/etherdevice.h>
@@ -28,6 +29,7 @@
 #include <linux/phy.h>
 #include <linux/phy.h>
 #include <linux/of.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_device.h>
+#include <linux/of_gpio.h>
 #include <linux/of_mdio.h>
 #include <linux/of_mdio.h>
 #include <linux/of_net.h>
 #include <linux/of_net.h>
 
 
@@ -2817,6 +2819,7 @@ static int macb_probe(struct platform_device *pdev)
 					      = macb_clk_init;
 					      = macb_clk_init;
 	int (*init)(struct platform_device *) = macb_init;
 	int (*init)(struct platform_device *) = macb_init;
 	struct device_node *np = pdev->dev.of_node;
 	struct device_node *np = pdev->dev.of_node;
+	struct device_node *phy_node;
 	const struct macb_config *macb_config = NULL;
 	const struct macb_config *macb_config = NULL;
 	struct clk *pclk, *hclk, *tx_clk;
 	struct clk *pclk, *hclk, *tx_clk;
 	unsigned int queue_mask, num_queues;
 	unsigned int queue_mask, num_queues;
@@ -2905,8 +2908,14 @@ static int macb_probe(struct platform_device *pdev)
 		macb_get_hwaddr(bp);
 		macb_get_hwaddr(bp);
 
 
 	/* Power up the PHY if there is a GPIO reset */
 	/* Power up the PHY if there is a GPIO reset */
-	bp->reset_gpio = devm_gpiod_get_optional(&bp->pdev->dev, "phy-reset",
-						 GPIOD_OUT_HIGH);
+	phy_node =  of_get_next_available_child(np, NULL);
+	if (phy_node) {
+		int gpio = of_get_named_gpio(phy_node, "reset-gpios", 0);
+		if (gpio_is_valid(gpio))
+			bp->reset_gpio = gpio_to_desc(gpio);
+		gpiod_set_value(bp->reset_gpio, GPIOD_OUT_HIGH);
+	}
+	of_node_put(phy_node);
 
 
 	err = of_get_phy_mode(np);
 	err = of_get_phy_mode(np);
 	if (err < 0) {
 	if (err < 0) {
@@ -2976,7 +2985,7 @@ static int macb_remove(struct platform_device *pdev)
 		mdiobus_free(bp->mii_bus);
 		mdiobus_free(bp->mii_bus);
 
 
 		/* Shutdown the PHY if there is a GPIO reset */
 		/* Shutdown the PHY if there is a GPIO reset */
-		gpiod_set_value(bp->reset_gpio, 0);
+		gpiod_set_value(bp->reset_gpio, GPIOD_OUT_LOW);
 
 
 		unregister_netdev(dev);
 		unregister_netdev(dev);
 		clk_disable_unprepare(bp->tx_clk);
 		clk_disable_unprepare(bp->tx_clk);