On 18/10/2019 at 16:11, Michael Tretter wrote: > The tx_clk, rx_clk, and tsu_clk are optional. Currently the macb driver > marks clock as not available if it receives an error when trying to get > a clock. This is wrong, because a clock controller might return > -EPROBE_DEFER if a clock is not available, but will eventually become > available. > > In these cases, the driver would probe successfully but will never be > able to adjust the clocks, because the clocks were not available during > probe, but became available later. > > For example, the clock controller for the ZynqMP is implemented in the > PMU firmware and the clocks are only available after the firmware driver > has been probed. > > Use devm_clk_get_optional() in instead of devm_clk_get() to get the > optional clock and propagate all errors to the calling function. > > Signed-off-by: Michael Tretter <m.tret...@pengutronix.de>
Acked-by: Nicolas Ferre <nicolas.fe...@microchip.com> Tested-by: Nicolas Ferre <nicolas.fe...@microchip.com> (for the record: on sama5d3 xplained GMAC and MACB interfaces) Thank you Michael. Best regards, Nicolas > --- > drivers/net/ethernet/cadence/macb_main.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/ethernet/cadence/macb_main.c > b/drivers/net/ethernet/cadence/macb_main.c > index 8e8d557901a9..1e1b774e1953 100644 > --- a/drivers/net/ethernet/cadence/macb_main.c > +++ b/drivers/net/ethernet/cadence/macb_main.c > @@ -3405,17 +3405,17 @@ static int macb_clk_init(struct platform_device > *pdev, struct clk **pclk, > return err; > } > > - *tx_clk = devm_clk_get(&pdev->dev, "tx_clk"); > + *tx_clk = devm_clk_get_optional(&pdev->dev, "tx_clk"); > if (IS_ERR(*tx_clk)) > - *tx_clk = NULL; > + return PTR_ERR(*tx_clk); > > - *rx_clk = devm_clk_get(&pdev->dev, "rx_clk"); > + *rx_clk = devm_clk_get_optional(&pdev->dev, "rx_clk"); > if (IS_ERR(*rx_clk)) > - *rx_clk = NULL; > + return PTR_ERR(*rx_clk); > > - *tsu_clk = devm_clk_get(&pdev->dev, "tsu_clk"); > + *tsu_clk = devm_clk_get_optional(&pdev->dev, "tsu_clk"); > if (IS_ERR(*tsu_clk)) > - *tsu_clk = NULL; > + return PTR_ERR(*tsu_clk); > > err = clk_prepare_enable(*pclk); > if (err) { > -- Nicolas Ferre