drm/i915/i2c: Track users of GMBUS force-bit
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 10 Nov 2012 15:58:21 +0000 (15:58 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 13 Nov 2012 15:10:04 +0000 (16:10 +0100)
This fixes a regression for SDVO from

commit fbfcc4f3a0cf8bbde87646b74241faa8e37426bf
Author: Jani Nikula <jani.nikula@intel.com>
Date:   Mon Oct 22 16:12:18 2012 +0300

    drm/i915/sdvo: restore i2c adapter config on intel_sdvo_init() failures

As SDVOB and SDVOC are multiplexed on the same pin, if a chipset does
not have the second SDVO encoder, it will then remove the force-bit
setting on the common i2c adapter during teardown. All subsequent
attempts of trying to use GMBUS with SDVOB then fail.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
[danvet: fixup inversion in the debug printout, noticed by Jani
Nikulai.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_i2c.c

index f316916fe65e43a4ce6cfb9e845461a8774940f7..db6d71c8997e9c52eb21530f302501ce0785514a 100644 (file)
@@ -390,7 +390,7 @@ struct intel_fbc_work;
 
 struct intel_gmbus {
        struct i2c_adapter adapter;
-       bool force_bit;
+       u32 force_bit;
        u32 reg0;
        u32 gpio_reg;
        struct i2c_algo_bit_data bit_algo;
index c2c6dbc0971cd0e11e50c5113ef98029e6abc882..3ef5af15b8124e0e672b62943b7ec26ed0022261 100644 (file)
@@ -432,7 +432,7 @@ timeout:
        I915_WRITE(GMBUS0 + reg_offset, 0);
 
        /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
-       bus->force_bit = true;
+       bus->force_bit = 1;
        ret = i2c_bit_algo.master_xfer(adapter, msgs, num);
 
 out:
@@ -491,7 +491,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->force_bit = 1;
 
                intel_gpio_setup(bus, port);
 
@@ -532,7 +532,10 @@ void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
 {
        struct intel_gmbus *bus = to_intel_gmbus(adapter);
 
-       bus->force_bit = force_bit;
+       bus->force_bit += force_bit ? 1 : -1;
+       DRM_DEBUG_KMS("%sabling bit-banging on %s. force bit now %d\n",
+                     force_bit ? "en" : "dis", adapter->name,
+                     bus->force_bit);
 }
 
 void intel_teardown_gmbus(struct drm_device *dev)