Message ID | 1a113c0f-4ee3-e61a-8927-b5e8b558822c@mentor.com |
---|---|
State | New |
Headers | show |
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.
On 09/29/2016 09:46 AM, Viresh Kumar wrote: > 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. If you look at the top I agree that this solution may be only one platform specific, but it fixes the broken driver of i.MX I2C bus controller. Why do you get an impression that it looks like a hack? > I would rather wait for an answer to my query first, which I asked in a separate > email. > Why pinctrl_select_state() is not done in gpio_request_one()? Because the first function gets pin mux/config setting and the second does not. How do you intend to get pin mux/config setting in gpio_request_one()? Anyway I don't see any problems in pinctrl or gpio subsystems, the bugs must be addressed and fixed in i2c. -- With best wishes, Vladimir -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 29-09-16, 15:16, Vladimir Zapolskiy wrote: > If you look at the top I agree that this solution may be only one platform > specific, but it fixes the broken driver of i.MX I2C bus controller. Yeah, I saw that.. > Why do you get an impression that it looks like a hack? Because we have to reorder things to make it work on a platform. This may break things on other platforms and we don't know about it yet. > Why pinctrl_select_state() is not done in gpio_request_one()? Because > the first function gets pin mux/config setting and the second does not. > How do you intend to get pin mux/config setting in gpio_request_one()? Lets see what Linus has to say on this.. > Anyway I don't see any problems in pinctrl or gpio subsystems, the bugs > must be addressed and fixed in i2c. I think it can be a gpio driver specific thing as well and not really subsystem level one.
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);