|
|
@@ -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));
|