@@ -566,16 +566,17 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
if (rc)
goto error_dma_cfg_alloc;
- /* clock setup */
- if (!of_device_is_compatible(np, "snps,dwc-qos-ethernet-4.10")) {
- plat->stmmac_clk = devm_clk_get(&pdev->dev,
- STMMAC_RESOURCE_NAME);
- if (IS_ERR(plat->stmmac_clk)) {
- dev_warn(&pdev->dev, "Cannot get CSR clock\n");
- plat->stmmac_clk = NULL;
- }
- clk_prepare_enable(plat->stmmac_clk);
+ /* All clocks are optional since the sub-drivers may use the platform
+ * clocks pointers to preserve their own clock-descriptors.
+ */
+ plat->stmmac_clk = devm_clk_get_optional(&pdev->dev,
+ STMMAC_RESOURCE_NAME);
+ if (IS_ERR(plat->stmmac_clk)) {
+ rc = PTR_ERR(plat->stmmac_clk);
+ dev_err_probe(&pdev->dev, rc, "Cannot get CSR clock\n");
+ goto error_dma_cfg_alloc;
}
+ clk_prepare_enable(plat->stmmac_clk);
plat->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
if (IS_ERR(plat->pclk)) {
The "stmmaceth" clock is expected to be optional by the current driver design, but there are several problems in the implementation. First if the clock is specified, but failed to be requested due to an internal error or due to not being ready yet for configuration, then the DT-probe procedure will just proceed with further initializations. It is erroneous in both cases. Secondly if we'd use the clock API, which expect the clock being optional we wouldn't have needed to avoid the clock request procedure for the "snps,dwc-qos-ethernet-4.10"-compatible devices to prevent the error message from being printed. All of that can be fixed by using the devm_clk_get_optional() method here provided by the common clock framework. Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru> --- .../ethernet/stmicro/stmmac/stmmac_platform.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)