From: Jani Nikula <jani.nikula@intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Subject: Re: [PATCH] drm/i915/i2c: Track users of GMBUS force-bit
Date: Mon, 12 Nov 2012 09:37:06 +0200 [thread overview]
Message-ID: <87mwyn5l25.fsf@intel.com> (raw)
In-Reply-To: <1352563101-1701-1-git-send-email-chris@chris-wilson.co.uk>
On Sat, 10 Nov 2012, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> 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>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 2 +-
> drivers/gpu/drm/i915/intel_i2c.c | 9 ++++++---
> 2 files changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index c2daad1..cf407b1 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -394,7 +394,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;
> diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
> index 84b68a6..f8ca0be 100644
> --- a/drivers/gpu/drm/i915/intel_i2c.c
> +++ b/drivers/gpu/drm/i915/intel_i2c.c
> @@ -482,7 +482,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:
> @@ -542,7 +542,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);
>
> @@ -583,7 +583,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 ? "dis" : "en", adapter->name,
> + bus->force_bit);
To be honest, I think this creates a mine for someone to step on.
bus->force_bit is checked using if (bus->force_bit). So in the default
state, doing either intel_gmbus_force_bit(true) *or*
intel_gmbus_force_bit(false) will enable force_bit.
bus->force_bit is implicitly set to 1 on timeout and IS_I830(), so you
also can't assume a neat pair of intel_gmbus_force_bit()s will always
work.
So, good piece of debugging there (and sorry about causing that in the
first place!) but I think we should be more careful with the
implementation. Maybe changing the ifs to (bus->force_bit > 0) and
always using intel_gmbus_force_bit() also internally (instead of setting
to true) are enough, but perhaps you have even better ideas.
BR,
Jani.
> }
>
> void intel_teardown_gmbus(struct drm_device *dev)
> --
> 1.7.10.4
next prev parent reply other threads:[~2012-11-12 7:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-10 15:58 [PATCH] drm/i915/i2c: Track users of GMBUS force-bit Chris Wilson
2012-11-10 20:52 ` Daniel Vetter
2012-11-12 7:37 ` Jani Nikula [this message]
2012-11-13 14:39 ` Jani Nikula
2012-11-13 15:12 ` Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87mwyn5l25.fsf@intel.com \
--to=jani.nikula@intel.com \
--cc=chris@chris-wilson.co.uk \
--cc=intel-gfx@lists.freedesktop.org \
--cc=mika.kuoppala@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.