Message ID | 544545028263a10abd00a8fe84e370a5deb29794.1383237868.git.jani.nikula@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 31 Oct 2013 18:55:48 +0200 Jani Nikula <jani.nikula@intel.com> 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 <jani.nikula@intel.com> > --- > 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; Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.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 <jani.nikula@intel.com> > --- > 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 <joe.konno@intel.com>
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;
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 <jani.nikula@intel.com> --- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/intel_opregion.c | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-)