On Tue, 21 Aug 2012, Daniel Vetter <daniel.vetter at ffwll.ch> wrote: > Now that we have also have a workaround for crt to fallback to > bitbanging in some cases and then restore gmbus again, we need to > ensure that we don't try to enable gmbus on broken hw (like i830M). > Previously only sdvo had a bit-banging fallback, and sdvo is gen3+ > only, so no issue with that. > > Enforce this by tracking separately whether gmbus even could work. > > This issue has been introduced in > > commit f1a2f5b7c5f0941d23eef0a095c0b99bf8d051e6 > Author: Jani Nikula <jani.nikula at intel.com> > Date: Mon Aug 13 13:22:35 2012 +0300 > > drm/i915: fall back to bit-banging if GMBUS fails in CRT EDID > reads > > Found by code-inspection, no bug report afaik. I don't see how my patch could enable or try GMBUS if force_bit has been set to true. On i830 the first attempt will be bit-banging, as before, and there will be no fallback because bit-banging is already enabled. I don't think this patch is necessary, but by all means prove me wrong. ;) BR, Jani. > > Cc: Jani Nikula <jani.nikula at intel.com> > Cc: stable at vger.kernel.org > Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/intel_i2c.c | 5 ++++- > 2 files changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index a2382a1..365df4c 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -382,6 +382,7 @@ struct intel_fbc_work; > struct intel_gmbus { > struct i2c_adapter adapter; > bool force_bit; > + bool always_bit; > u32 reg0; > u32 gpio_reg; > struct i2c_algo_bit_data bit_algo; > diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c > index b9755f6..e79f316 100644 > --- a/drivers/gpu/drm/i915/intel_i2c.c > +++ b/drivers/gpu/drm/i915/intel_i2c.c > @@ -492,7 +492,7 @@ int intel_setup_gmbus(struct drm_device *dev) > > /* gmbus seems to be broken on i830 */ > if (IS_I830(dev)) > - bus->force_bit = true; > + bus->always_bit = bus->force_bit = true; > > intel_gpio_setup(bus, port); > > @@ -533,6 +533,9 @@ void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit) > { > struct intel_gmbus *bus = to_intel_gmbus(adapter); > > + if (bus->always_bit) > + force_bit = true; > + > bus->force_bit = force_bit; > } > > -- > 1.7.10.4