| From 94ac07fc430e69587f2b796e3e17299ba6cd5393 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> |
| Date: Mon, 16 Sep 2013 17:38:28 +0300 |
| Subject: drm/i915: Add intel_display_power_{get, put} to request power for |
| specific domains |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Add APIs to get/put power well references for specific purposes. |
| |
| v2: Split the i915_request change to another patch |
| |
| Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 6765625e0b677a86dbd533f045ab4e52e2761d79) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_drv.h | 4 +++ |
| drivers/gpu/drm/i915/intel_pm.c | 63 ++++++++++++++++++++++++++++++++++++++++ |
| 2 files changed, 67 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h |
| index a75deb8b1d60..3a7ef151f24a 100644 |
| --- a/drivers/gpu/drm/i915/intel_drv.h |
| +++ b/drivers/gpu/drm/i915/intel_drv.h |
| @@ -763,6 +763,10 @@ extern void i915_remove_power_well(struct drm_device *dev); |
| |
| extern bool intel_display_power_enabled(struct drm_device *dev, |
| enum intel_display_power_domain domain); |
| +extern void intel_display_power_get(struct drm_device *dev, |
| + enum intel_display_power_domain domain); |
| +extern void intel_display_power_put(struct drm_device *dev, |
| + enum intel_display_power_domain domain); |
| extern void intel_init_power_well(struct drm_device *dev); |
| extern void intel_set_power_well(struct drm_device *dev, bool enable); |
| extern void intel_resume_power_well(struct drm_device *dev); |
| diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c |
| index a48fc2129bbb..147334dc3956 100644 |
| --- a/drivers/gpu/drm/i915/intel_pm.c |
| +++ b/drivers/gpu/drm/i915/intel_pm.c |
| @@ -5345,6 +5345,69 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable) |
| } |
| } |
| |
| +void intel_display_power_get(struct drm_device *dev, |
| + enum intel_display_power_domain domain) |
| +{ |
| + struct drm_i915_private *dev_priv = dev->dev_private; |
| + struct i915_power_well *power_well = &dev_priv->power_well; |
| + |
| + if (!HAS_POWER_WELL(dev)) |
| + return; |
| + |
| + switch (domain) { |
| + case POWER_DOMAIN_PIPE_A: |
| + case POWER_DOMAIN_TRANSCODER_EDP: |
| + return; |
| + case POWER_DOMAIN_PIPE_B: |
| + case POWER_DOMAIN_PIPE_C: |
| + case POWER_DOMAIN_PIPE_A_PANEL_FITTER: |
| + case POWER_DOMAIN_PIPE_B_PANEL_FITTER: |
| + case POWER_DOMAIN_PIPE_C_PANEL_FITTER: |
| + case POWER_DOMAIN_TRANSCODER_A: |
| + case POWER_DOMAIN_TRANSCODER_B: |
| + case POWER_DOMAIN_TRANSCODER_C: |
| + spin_lock_irq(&power_well->lock); |
| + if (!power_well->count++) |
| + __intel_set_power_well(power_well->device, true); |
| + spin_unlock_irq(&power_well->lock); |
| + return; |
| + default: |
| + BUG(); |
| + } |
| +} |
| + |
| +void intel_display_power_put(struct drm_device *dev, |
| + enum intel_display_power_domain domain) |
| +{ |
| + struct drm_i915_private *dev_priv = dev->dev_private; |
| + struct i915_power_well *power_well = &dev_priv->power_well; |
| + |
| + if (!HAS_POWER_WELL(dev)) |
| + return; |
| + |
| + switch (domain) { |
| + case POWER_DOMAIN_PIPE_A: |
| + case POWER_DOMAIN_TRANSCODER_EDP: |
| + return; |
| + case POWER_DOMAIN_PIPE_B: |
| + case POWER_DOMAIN_PIPE_C: |
| + case POWER_DOMAIN_PIPE_A_PANEL_FITTER: |
| + case POWER_DOMAIN_PIPE_B_PANEL_FITTER: |
| + case POWER_DOMAIN_PIPE_C_PANEL_FITTER: |
| + case POWER_DOMAIN_TRANSCODER_A: |
| + case POWER_DOMAIN_TRANSCODER_B: |
| + case POWER_DOMAIN_TRANSCODER_C: |
| + spin_lock_irq(&power_well->lock); |
| + WARN_ON(!power_well->count); |
| + if (!--power_well->count) |
| + __intel_set_power_well(power_well->device, false); |
| + spin_unlock_irq(&power_well->lock); |
| + return; |
| + default: |
| + BUG(); |
| + } |
| +} |
| + |
| static struct i915_power_well *hsw_pwr; |
| |
| /* Display audio driver power well request */ |
| -- |
| 1.8.5.rc3 |
| |