i2c: mv64xxx: handle probe deferral for the clock
authorThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Fri, 22 Apr 2016 13:19:52 +0000 (15:19 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Wed, 27 Apr 2016 17:03:02 +0000 (19:03 +0200)
If a clock is registered by a platform driver and not by the
OF_CLK_DECLARE() mechanism, it might show up after the first attempt
to probe i2c-mv64xxx. In order to solve this, we need to handle
-EPROBE_PREFER as a special return value of devm_clk_get(), and return
the same error code from probe().

This gives us three situations:

 - There is no reference to a clock in the DT. In this case,
   devm_clk_get() returns an error that is not -EPROBE_DEFER
   (something like -ENODEV), and we continue the probing without
   enabling the clock.

 - There is a reference to the clock in the DT, and the clock is
   ready. devm_clk_get() returns a valid reference to the clock, and
   we prepare/enable it.

 - There is a reference to the clock in the DT, but the clock is not
   ready. devm_clk_get() returns -EPROBE_DEFER, and we exit from
   probe() with the same error code so that probe() is tried again
   later.

This is needed for Marvell Armada 7K/8K, where the clock driver is a
platform driver.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-mv64xxx.c

index 43207f5..4c6282a 100644 (file)
@@ -910,6 +910,8 @@ mv64xxx_i2c_probe(struct platform_device *pd)
 #if defined(CONFIG_HAVE_CLK)
        /* Not all platforms have a clk */
        drv_data->clk = devm_clk_get(&pd->dev, NULL);
+       if (IS_ERR(drv_data->clk) && PTR_ERR(drv_data->clk) == -EPROBE_DEFER)
+               return -EPROBE_DEFER;
        if (!IS_ERR(drv_data->clk)) {
                clk_prepare(drv_data->clk);
                clk_enable(drv_data->clk);