Hi Roger, On 04/20/2017 07:11 AM, Roger Quadros wrote: > Some boards [1] leave the PHYs at an invalid state > during system power-up or reset thus causing unreliability > issues with the PHY which manifests as PHY not being detected > or link not functional. To fix this, these PHYs need to be RESET > via a GPIO connected to the PHY's RESET pin. > > Some boards have a single GPIO controlling the PHY RESET pin of all > PHYs on the bus whereas some others have separate GPIOs controlling > individual PHY RESETs. > > In both cases, the RESET de-assertion cannot be done in the PHY driver > as the PHY will not probe till its reset is de-asserted. > So do the RESET de-assertion in the MDIO bus driver. > > [1] - am572x-idk, am571x-idk, a437x-idk > > Signed-off-by: Roger Quadros <rogerq@xxxxxx> A few comments on the binding and the code, sorry for this late review. > +Example : > +This example shows these optional properties, plus other properties > +required for the TI Davinci MDIO driver. > + > + davinci_mdio: ethernet@0x5c030000 { > + compatible = "ti,davinci_mdio"; > + reg = <0x5c030000 0x1000>; > + #address-cells = <1>; > + #size-cells = <0>; > + > + reset-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; > + reset-delay-us = <2>; /* PHY datasheet states 1uS min */ us is micro seconds, uS is micro siemens. > + > + ethphy0: ethernet-phy@1 { > + reg = <1>; > + }; > + > + ethphy1: ethernet-phy@3 { > + reg = <3>; > + }; > + }; > > + /* de-assert bus level PHY GPIO resets */ > + for (i = 0; i < bus->num_reset_gpios; i++) { > + gpiod = devm_gpiod_get_index(&bus->dev, "reset", i, > + GPIOD_OUT_LOW); > + if (IS_ERR(gpiod)) { > + err = PTR_ERR(gpiod); > + if (err != -ENOENT) { > + pr_err("mii_bus %s couldn't get reset GPIO\n", > + bus->id); Could we use dev_err(&bus->dev) here to better identify which MDIO bus is returning the problem? > + return err; Should we somehow "unwind" the reset lines we were able to successfully take out of reset and therefore put back into reset state? How about mdiobus_unregister()? Should we have similar code there, if not for correctness to be more power efficient? > + } > + } else { > + gpiod_set_value_cansleep(gpiod, 1); > + udelay(bus->reset_delay_us); > + gpiod_set_value_cansleep(gpiod, 0); Does that work even if the polarity of the reset line is active low? Thanks! -- Florian -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html