Skip to content

Commit

Permalink
drm/i915: move opregion asle request handling to a work queue
Browse files Browse the repository at this point in the history
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>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Jani Nikula authored and Daniel Vetter committed Nov 6, 2013
1 parent 7b5562d commit 91a60f2
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
20 changes: 18 additions & 2 deletions drivers/gpu/drm/i915/intel_opregion.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 91a60f2

Please sign in to comment.