On 28-09-16, 15:07, Vladimir Zapolskiy wrote:
I would expect that the change below improves the situation, but I didn't
perform any tests and here the core change is governed by the accepted
i.MX i2c bus driver specific changes, thus conceptually it may be incorrect:
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index da3a02ef4a31..3a4f59c3c3e6 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -697,9 +697,6 @@ static int i2c_generic_recovery(struct i2c_adapter *adap)
struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
int i = 0, val = 1, ret = 0;
- if (bri->prepare_recovery)
- bri->prepare_recovery(adap);
-
bri->set_scl(adap, val);
ndelay(RECOVERY_NDELAY);
@@ -725,22 +722,34 @@ static int i2c_generic_recovery(struct i2c_adapter *adap)
ndelay(RECOVERY_NDELAY);
}
- if (bri->unprepare_recovery)
- bri->unprepare_recovery(adap);
-
return ret;
}
int i2c_generic_scl_recovery(struct i2c_adapter *adap)
{
- return i2c_generic_recovery(adap);
+ struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
+ int ret;
+
+ if (bri->prepare_recovery)
+ bri->prepare_recovery(adap);
+
+ ret = i2c_generic_recovery(adap);
+
+ if (bri->unprepare_recovery)
+ bri->unprepare_recovery(adap);
+
+ return ret;
}
EXPORT_SYMBOL_GPL(i2c_generic_scl_recovery);
int i2c_generic_gpio_recovery(struct i2c_adapter *adap)
{
+ struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
int ret;
+ if (bri->prepare_recovery)
+ bri->prepare_recovery(adap);
+
ret = i2c_get_gpios_for_recovery(adap);
if (ret)
return ret;
@@ -748,6 +757,9 @@ int i2c_generic_gpio_recovery(struct i2c_adapter *adap)
ret = i2c_generic_recovery(adap);
i2c_put_gpios_for_recovery(adap);
+ if (bri->unprepare_recovery)
+ bri->unprepare_recovery(adap);
+
return ret;
}
EXPORT_SYMBOL_GPL(i2c_generic_gpio_recovery);
That looks to like a hack made just to make things work on one platform.
I would rather wait for an answer to my query first, which I asked in a separate
email.