lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 3/4] i2c: core: treat EPROBE_DEFER when acquiring SCL/SDA GPIOs
    Date
    Even if I2C bus GPIO recovery is optional, devm_gpiod_get() can return
    -EPROBE_DEFER, so we should at least treat that. This ends up with
    i2c_register_adapter() to be able to return -EPROBE_DEFER.

    Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
    ---
    drivers/i2c/i2c-core-base.c | 22 ++++++++++++++++------
    1 file changed, 16 insertions(+), 6 deletions(-)

    diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
    index 4ee29fec4e93..f8d9f2048ca8 100644
    --- a/drivers/i2c/i2c-core-base.c
    +++ b/drivers/i2c/i2c-core-base.c
    @@ -368,15 +368,16 @@ static int i2c_gpio_init_recovery(struct i2c_adapter *adap)
    return i2c_gpio_init_generic_recovery(adap);
    }

    -static void i2c_init_recovery(struct i2c_adapter *adap)
    +static int i2c_init_recovery(struct i2c_adapter *adap)
    {
    struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
    char *err_str;

    if (!bri)
    - return;
    + return 0;

    - i2c_gpio_init_recovery(adap);
    + if (i2c_gpio_init_recovery(adap) == -EPROBE_DEFER)
    + return -EPROBE_DEFER;

    if (!bri->recover_bus) {
    err_str = "no recover_bus() found";
    @@ -392,7 +393,7 @@ static void i2c_init_recovery(struct i2c_adapter *adap)
    if (gpiod_get_direction(bri->sda_gpiod) == 0)
    bri->set_sda = set_sda_gpio_value;
    }
    - return;
    + return 0;
    }

    if (bri->recover_bus == i2c_generic_scl_recovery) {
    @@ -407,10 +408,12 @@ static void i2c_init_recovery(struct i2c_adapter *adap)
    }
    }

    - return;
    + return 0;
    err:
    dev_err(&adap->dev, "Not using recovery: %s\n", err_str);
    adap->bus_recovery_info = NULL;
    +
    + return 0;
    }

    static int i2c_smbus_host_notify_to_irq(const struct i2c_client *client)
    @@ -1476,7 +1479,9 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
    "Failed to create compatibility class link\n");
    #endif

    - i2c_init_recovery(adap);
    + res = i2c_init_recovery(adap);
    + if (res == -EPROBE_DEFER)
    + goto out_link;

    /* create pre-declared device nodes */
    of_i2c_register_devices(adap);
    @@ -1493,6 +1498,11 @@ static int i2c_register_adapter(struct i2c_adapter *adap)

    return 0;

    +out_link:
    +#ifdef CONFIG_I2C_COMPAT
    + class_compat_remove_link(i2c_adapter_compat_class, &adap->dev,
    + adap->dev.parent);
    +#endif
    out_reg:
    init_completion(&adap->dev_released);
    device_unregister(&adap->dev);
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-19 16:21    [W:4.138 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site