On Wed, Jun 15, 2022 at 01:18:55PM +0300, Andy Shevchenko wrote: > On Mon, Jun 13, 2022 at 04:00:31PM -0500, Dinh Nguyen wrote: The below won't fly, see my corrections below. > static int i2c_dw_init_socfpga_recovery_info(struct dw_i2c_dev *dev, > struct i2c_bus_recovery_info *rinfo) > { > rinfo->recover_bus = i2c_socfpga_scl_recovery; > return 0; return 1; > } > > static int i2c_dw_init_generic_recovery_info(struct dw_i2c_dev *dev, > struct i2c_bus_recovery_info *rinfo) > { > struct i2c_adapter *adap = &dev->adapter; > struct gpio_desc *gpio; > > gpio = devm_gpiod_get_optional(dev->dev, "scl", GPIOD_OUT_HIGH); > if (IS_ERR_OR_NULL(gpio)) > return PTR_ERR_OR_ZERO(gpio); > > rinfo->scl_gpiod = gpio; > > gpio = devm_gpiod_get_optional(dev->dev, "sda", GPIOD_IN); > if (IS_ERR(gpio)) > return PTR_ERR(gpio); > rinfo->sda_gpiod = gpio; > > rinfo->recover_bus = i2c_generic_scl_recovery; > > dev_info(dev->dev, "running with gpio recovery mode! scl%s", > rinfo->sda_gpiod ? ",sda" : ""); > > return 0; return 1; > } > > static int i2c_dw_init_recovery_info(struct dw_i2c_dev *dev) > { > struct i2c_bus_recovery_info *rinfo = &dev->rinfo; > struct i2c_adapter *adap = &dev->adapter; > int ret; > > switch (dev->flags & MODEL_MASK) { > case MODEL_SOCFPGA: > ret = i2c_dw_init_socfpga_recovery_info(dev, rinfo); > break; > default: > ret = i2c_dw_init_generic_recovery_info(dev, rinfo); > break; > } > if (ret) /* The recovery is optional, that's why 0 should be returned to the caller */ if (ret <= 0) > return ret; > > rinfo->prepare_recovery = i2c_dw_prepare_recovery; > rinfo->unprepare_recovery = i2c_dw_unprepare_recovery; > adap->bus_recovery_info = rinfo; > > return 0; > } -- With Best Regards, Andy Shevchenko