From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joe Konno Subject: Re: [PATCH 1/7] drm/i915: move opregion asle request handling to a work queue Date: Wed, 06 Nov 2013 09:07:55 -0800 Message-ID: <527A776B.7070206@linux.intel.com> References: <544545028263a10abd00a8fe84e370a5deb29794.1383237868.git.jani.nikula@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id 6D177F9EBB for ; Wed, 6 Nov 2013 09:08:54 -0800 (PST) In-Reply-To: <544545028263a10abd00a8fe84e370a5deb29794.1383237868.git.jani.nikula@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org On 10/31/2013 09:55 AM, Jani Nikula wrote: > Doing this has been long overdue anyway, but now we really need it in > preparation for per connector backlight handling. > > Signed-off-by: Jani Nikula > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/intel_opregion.c | 20 ++++++++++++++++++-- > 2 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 2c1921d..6308711 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -242,6 +242,7 @@ struct intel_opregion { > struct opregion_asle __iomem *asle; > void __iomem *vbt; > u32 __iomem *lid_state; > + struct work_struct asle_work; > }; > #define OPREGION_SIZE (8*1024) > > diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c > index b82050c..892d520 100644 > --- a/drivers/gpu/drm/i915/intel_opregion.c > +++ b/drivers/gpu/drm/i915/intel_opregion.c > @@ -486,9 +486,13 @@ static u32 asle_isct_state(struct drm_device *dev) > return ASLC_ISCT_STATE_FAILED; > } > > -void intel_opregion_asle_intr(struct drm_device *dev) > +static void asle_work(struct work_struct *work) > { > - struct drm_i915_private *dev_priv = dev->dev_private; > + struct intel_opregion *opregion = > + container_of(work, struct intel_opregion, asle_work); > + struct drm_i915_private *dev_priv = > + container_of(opregion, struct drm_i915_private, opregion); > + struct drm_device *dev = dev_priv->dev; > struct opregion_asle __iomem *asle = dev_priv->opregion.asle; > u32 aslc_stat = 0; > u32 aslc_req; > @@ -535,6 +539,14 @@ void intel_opregion_asle_intr(struct drm_device *dev) > iowrite32(aslc_stat, &asle->aslc); > } > > +void intel_opregion_asle_intr(struct drm_device *dev) > +{ > + struct drm_i915_private *dev_priv = dev->dev_private; > + > + if (dev_priv->opregion.asle) > + schedule_work(&dev_priv->opregion.asle_work); > +} > + > #define ACPI_EV_DISPLAY_SWITCH (1<<0) > #define ACPI_EV_LID (1<<1) > #define ACPI_EV_DOCK (1<<2) > @@ -735,6 +747,8 @@ void intel_opregion_fini(struct drm_device *dev) > if (opregion->asle) > iowrite32(ASLE_ARDY_NOT_READY, &opregion->asle->ardy); > > + cancel_work_sync(&dev_priv->opregion.asle_work); > + > if (opregion->acpi) { > iowrite32(0, &opregion->acpi->drdy); > > @@ -828,6 +842,8 @@ int intel_opregion_setup(struct drm_device *dev) > return -ENOTSUPP; > } > > + INIT_WORK(&opregion->asle_work, asle_work); > + > base = acpi_os_ioremap(asls, OPREGION_SIZE); > if (!base) > return -ENOMEM; > Tested-by: Joe Konno