can: mcp251xfd: mcp251xfd_probe(): try to get crystal clock rate from property
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 26 May 2021 19:33:26 +0000 (22:33 +0300)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 25 Jul 2021 09:36:26 +0000 (11:36 +0200)
In some configurations, mainly ACPI-based, the clock frequency of the
device is supplied by very well established 'clock-frequency'
property. Hence, try to get it from the property at last if no other
providers are available.

Link: https://lore.kernel.org/r/20210531084444.1785397-1-mkl@pengutronix.de
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c

index 6962ab2..1544e19 100644 (file)
@@ -2860,7 +2860,7 @@ static int mcp251xfd_probe(struct spi_device *spi)
        struct gpio_desc *rx_int;
        struct regulator *reg_vdd, *reg_xceiver;
        struct clk *clk;
-       u32 freq;
+       u32 freq = 0;
        int err;
 
        if (!spi->irq)
@@ -2887,11 +2887,19 @@ static int mcp251xfd_probe(struct spi_device *spi)
                return dev_err_probe(&spi->dev, PTR_ERR(reg_xceiver),
                                     "Failed to get Transceiver regulator!\n");
 
-       clk = devm_clk_get(&spi->dev, NULL);
+       clk = devm_clk_get_optional(&spi->dev, NULL);
        if (IS_ERR(clk))
                return dev_err_probe(&spi->dev, PTR_ERR(clk),
                                     "Failed to get Oscillator (clock)!\n");
-       freq = clk_get_rate(clk);
+       if (clk) {
+               freq = clk_get_rate(clk);
+       } else {
+               err = device_property_read_u32(&spi->dev, "clock-frequency",
+                                              &freq);
+               if (err)
+                       return dev_err_probe(&spi->dev, err,
+                                            "Failed to get clock-frequency!\n");
+       }
 
        /* Sanity check */
        if (freq < MCP251XFD_SYSCLOCK_HZ_MIN ||