summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/phy/dp83867.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c
index 94cc278b3136..1b01680987c4 100644
--- a/drivers/net/phy/dp83867.c
+++ b/drivers/net/phy/dp83867.c
@@ -65,6 +65,7 @@ struct dp83867_private {
int rx_id_delay;
int tx_id_delay;
int fifo_depth;
+ int values_are_sane;
};
static int dp83867_ack_interrupt(struct phy_device *phydev)
@@ -113,15 +114,30 @@ static int dp83867_of_init(struct phy_device *phydev)
ret = of_property_read_u32(of_node, "ti,rx-internal-delay",
&dp83867->rx_id_delay);
if (ret)
- return ret;
+ goto invalid_dt;
ret = of_property_read_u32(of_node, "ti,tx-internal-delay",
&dp83867->tx_id_delay);
if (ret)
- return ret;
+ goto invalid_dt;
- return of_property_read_u32(of_node, "ti,fifo-depth",
+ ret = of_property_read_u32(of_node, "ti,fifo-depth",
&dp83867->fifo_depth);
+ if (ret)
+ goto invalid_dt;
+
+ dp83867->values_are_sane = 1;
+
+ return 0;
+
+invalid_dt:
+ phydev_err(phydev, "missing properties in device tree");
+
+ /*
+ * We can still run with a broken dt by not using any of the optional
+ * parameters, so just don't set dp83867->values_are_sane.
+ */
+ return 0;
}
#else
static int dp83867_of_init(struct phy_device *phydev)
@@ -150,6 +166,15 @@ static int dp83867_config_init(struct phy_device *phydev)
dp83867 = (struct dp83867_private *)phydev->priv;
}
+ /*
+ * With no or broken device tree, we don't have the values that we would
+ * want to configure the phy with. In that case, cross our fingers and
+ * assume that firmware did everything correctly for us or that we don't
+ * need them.
+ */
+ if (!dp83867->values_are_sane)
+ return 0;
+
if (phy_interface_is_rgmii(phydev)) {
ret = phy_write(phydev, MII_DP83867_PHYCTRL,
(dp83867->fifo_depth << DP83867_PHYCR_FIFO_DEPTH_SHIFT));