浏览代码

fec: Do not assume that PHY reset is active low

We should not assume that the PHY reset is always active low.

Retrieve this information from the device tree instead, so that the PHY reset
can work on both cases.

Reported-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Fabio Estevam 11 年之前
父节点
当前提交
7a399e3a2e
共有 1 个文件被更改,包括 10 次插入4 次删除
  1. 10 4
      drivers/net/ethernet/freescale/fec_main.c

+ 10 - 4
drivers/net/ethernet/freescale/fec_main.c

@@ -2049,6 +2049,8 @@ static void fec_reset_phy(struct platform_device *pdev)
 	int err, phy_reset;
 	int err, phy_reset;
 	int msec = 1;
 	int msec = 1;
 	struct device_node *np = pdev->dev.of_node;
 	struct device_node *np = pdev->dev.of_node;
+	enum of_gpio_flags flags;
+	bool port;
 
 
 	if (!np)
 	if (!np)
 		return;
 		return;
@@ -2058,18 +2060,22 @@ static void fec_reset_phy(struct platform_device *pdev)
 	if (msec > 1000)
 	if (msec > 1000)
 		msec = 1;
 		msec = 1;
 
 
-	phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
+	phy_reset = of_get_named_gpio_flags(np, "phy-reset-gpios", 0, &flags);
 	if (!gpio_is_valid(phy_reset))
 	if (!gpio_is_valid(phy_reset))
 		return;
 		return;
 
 
-	err = devm_gpio_request_one(&pdev->dev, phy_reset,
-				    GPIOF_OUT_INIT_LOW, "phy-reset");
+	if (flags & OF_GPIO_ACTIVE_LOW)
+		port = GPIOF_OUT_INIT_LOW;
+	else
+		port = GPIOF_OUT_INIT_HIGH;
+
+	err = devm_gpio_request_one(&pdev->dev, phy_reset, port, "phy-reset");
 	if (err) {
 	if (err) {
 		dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err);
 		dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err);
 		return;
 		return;
 	}
 	}
 	msleep(msec);
 	msleep(msec);
-	gpio_set_value(phy_reset, 1);
+	gpio_set_value(phy_reset, !port);
 }
 }
 #else /* CONFIG_OF */
 #else /* CONFIG_OF */
 static void fec_reset_phy(struct platform_device *pdev)
 static void fec_reset_phy(struct platform_device *pdev)