* [PATCH 0/5] drm/i915: backlight locking, cleanup
@ 2013-04-02 12:48 Jani Nikula
2013-04-02 12:48 ` [PATCH 1/5] drm/i915: group backlight related stuff into a struct Jani Nikula
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Jani Nikula @ 2013-04-02 12:48 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
I think these should DTRT, but with backlight and BIOS you never seem to
know...
BR,
Jani.
Jani Nikula (5):
drm/i915: group backlight related stuff into a struct
drm/i915: protect backlight enable and level with spinlock
drm/i915: don't pretend we support ASLE ALS, PFIT, or PFMB
drm/i915/opregion: don't pretend we did something when we didn't
drm/i915: drop code duplication in favor of asle interrupt handler
drivers/gpu/drm/i915/i915_drv.h | 13 ++++---
drivers/gpu/drm/i915/i915_irq.c | 4 +--
drivers/gpu/drm/i915/intel_opregion.c | 60 ++++-----------------------------
drivers/gpu/drm/i915/intel_panel.c | 60 +++++++++++++++++++++------------
4 files changed, 55 insertions(+), 82 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/5] drm/i915: group backlight related stuff into a struct
2013-04-02 12:48 [PATCH 0/5] drm/i915: backlight locking, cleanup Jani Nikula
@ 2013-04-02 12:48 ` Jani Nikula
2013-04-02 13:49 ` Daniel Vetter
2013-04-02 12:48 ` [PATCH 2/5] drm/i915: protect backlight enable and level with spinlock Jani Nikula
` (3 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Jani Nikula @ 2013-04-02 12:48 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
No functional changes.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 11 +++++----
drivers/gpu/drm/i915/intel_panel.c | 44 ++++++++++++++++++------------------
2 files changed, 29 insertions(+), 26 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 2962a9a..5e38a2c 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -939,9 +939,14 @@ typedef struct drm_i915_private {
struct intel_overlay *overlay;
unsigned int sprite_scaling_enabled;
+ /* backlight */
+ struct {
+ int level;
+ bool enabled;
+ struct backlight_device *device;
+ } backlight;
+
/* LVDS info */
- int backlight_level; /* restore backlight to this value */
- bool backlight_enabled;
struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */
struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */
@@ -1043,8 +1048,6 @@ typedef struct drm_i915_private {
*/
struct work_struct console_resume_work;
- struct backlight_device *backlight;
-
struct drm_property *broadcast_rgb_property;
struct drm_property *force_audio_property;
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 21f415a..0e7e873 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -286,11 +286,11 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- dev_priv->backlight_level = level;
- if (dev_priv->backlight)
- dev_priv->backlight->props.brightness = level;
+ dev_priv->backlight.level = level;
+ if (dev_priv->backlight.device)
+ dev_priv->backlight.device->props.brightness = level;
- if (dev_priv->backlight_enabled)
+ if (dev_priv->backlight.enabled)
intel_panel_actually_set_backlight(dev, level);
}
@@ -298,7 +298,7 @@ void intel_panel_disable_backlight(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- dev_priv->backlight_enabled = false;
+ dev_priv->backlight.enabled = false;
intel_panel_actually_set_backlight(dev, 0);
if (INTEL_INFO(dev)->gen >= 4) {
@@ -321,15 +321,15 @@ void intel_panel_enable_backlight(struct drm_device *dev,
{
struct drm_i915_private *dev_priv = dev->dev_private;
- if (dev_priv->backlight_level == 0) {
- dev_priv->backlight_level = intel_panel_get_max_backlight(dev);
- if (dev_priv->backlight)
- dev_priv->backlight->props.brightness =
- dev_priv->backlight_level;
+ if (dev_priv->backlight.level == 0) {
+ dev_priv->backlight.level = intel_panel_get_max_backlight(dev);
+ if (dev_priv->backlight.device)
+ dev_priv->backlight.device->props.brightness =
+ dev_priv->backlight.level;
}
- dev_priv->backlight_enabled = true;
- intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
+ dev_priv->backlight.enabled = true;
+ intel_panel_actually_set_backlight(dev, dev_priv->backlight.level);
if (INTEL_INFO(dev)->gen >= 4) {
uint32_t reg, tmp;
@@ -371,15 +371,15 @@ set_level:
* when BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1 are written.
*/
if (!intel_panel_get_backlight(dev))
- intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
+ intel_panel_actually_set_backlight(dev, dev_priv->backlight.level);
}
static void intel_panel_init_backlight(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- dev_priv->backlight_level = intel_panel_get_backlight(dev);
- dev_priv->backlight_enabled = dev_priv->backlight_level != 0;
+ dev_priv->backlight.level = intel_panel_get_backlight(dev);
+ dev_priv->backlight.enabled = dev_priv->backlight.level != 0;
}
enum drm_connector_status
@@ -433,21 +433,21 @@ int intel_panel_setup_backlight(struct drm_connector *connector)
memset(&props, 0, sizeof(props));
props.type = BACKLIGHT_RAW;
- props.brightness = dev_priv->backlight_level;
+ props.brightness = dev_priv->backlight.level;
props.max_brightness = _intel_panel_get_max_backlight(dev);
if (props.max_brightness == 0) {
DRM_DEBUG_DRIVER("Failed to get maximum backlight value\n");
return -ENODEV;
}
- dev_priv->backlight =
+ dev_priv->backlight.device =
backlight_device_register("intel_backlight",
&connector->kdev, dev,
&intel_panel_bl_ops, &props);
- if (IS_ERR(dev_priv->backlight)) {
+ if (IS_ERR(dev_priv->backlight.device)) {
DRM_ERROR("Failed to register backlight: %ld\n",
- PTR_ERR(dev_priv->backlight));
- dev_priv->backlight = NULL;
+ PTR_ERR(dev_priv->backlight.device));
+ dev_priv->backlight.device = NULL;
return -ENODEV;
}
return 0;
@@ -456,8 +456,8 @@ int intel_panel_setup_backlight(struct drm_connector *connector)
void intel_panel_destroy_backlight(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- if (dev_priv->backlight)
- backlight_device_unregister(dev_priv->backlight);
+ if (dev_priv->backlight.device)
+ backlight_device_unregister(dev_priv->backlight.device);
}
#else
int intel_panel_setup_backlight(struct drm_connector *connector)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/5] drm/i915: protect backlight enable and level with spinlock
2013-04-02 12:48 [PATCH 0/5] drm/i915: backlight locking, cleanup Jani Nikula
2013-04-02 12:48 ` [PATCH 1/5] drm/i915: group backlight related stuff into a struct Jani Nikula
@ 2013-04-02 12:48 ` Jani Nikula
2013-04-02 13:39 ` Daniel Vetter
2013-04-02 12:48 ` [PATCH 3/5] drm/i915: don't pretend we support ASLE ALS, PFIT, or PFMB Jani Nikula
` (2 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Jani Nikula @ 2013-04-02 12:48 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
Backlight is fiddled both through backlight sysfs files and asle
interrupts. Protect the relevant data.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 1 +
drivers/gpu/drm/i915/intel_panel.c | 16 ++++++++++++++++
2 files changed, 17 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 5e38a2c..2e59610 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -943,6 +943,7 @@ typedef struct drm_i915_private {
struct {
int level;
bool enabled;
+ spinlock_t lock;
struct backlight_device *device;
} backlight;
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 0e7e873..2a95297 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -285,6 +285,9 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level
void intel_panel_set_backlight(struct drm_device *dev, u32 level)
{
struct drm_i915_private *dev_priv = dev->dev_private;
+ unsigned long flags;
+
+ spin_lock_irqsave(&dev_priv->backlight.lock, flags);
dev_priv->backlight.level = level;
if (dev_priv->backlight.device)
@@ -292,11 +295,16 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
if (dev_priv->backlight.enabled)
intel_panel_actually_set_backlight(dev, level);
+
+ spin_unlock_irqrestore(&dev_priv->backlight.lock, flags);
}
void intel_panel_disable_backlight(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
+ unsigned long flags;
+
+ spin_lock_irqsave(&dev_priv->backlight.lock, flags);
dev_priv->backlight.enabled = false;
intel_panel_actually_set_backlight(dev, 0);
@@ -314,12 +322,17 @@ void intel_panel_disable_backlight(struct drm_device *dev)
I915_WRITE(BLC_PWM_PCH_CTL1, tmp);
}
}
+
+ spin_unlock_irqrestore(&dev_priv->backlight.lock, flags);
}
void intel_panel_enable_backlight(struct drm_device *dev,
enum pipe pipe)
{
struct drm_i915_private *dev_priv = dev->dev_private;
+ unsigned long flags;
+
+ spin_lock_irqsave(&dev_priv->backlight.lock, flags);
if (dev_priv->backlight.level == 0) {
dev_priv->backlight.level = intel_panel_get_max_backlight(dev);
@@ -372,12 +385,15 @@ set_level:
*/
if (!intel_panel_get_backlight(dev))
intel_panel_actually_set_backlight(dev, dev_priv->backlight.level);
+
+ spin_unlock_irqrestore(&dev_priv->backlight.lock, flags);
}
static void intel_panel_init_backlight(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
+ spin_lock_init(&dev_priv->backlight.lock);
dev_priv->backlight.level = intel_panel_get_backlight(dev);
dev_priv->backlight.enabled = dev_priv->backlight.level != 0;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/5] drm/i915: don't pretend we support ASLE ALS, PFIT, or PFMB
2013-04-02 12:48 [PATCH 0/5] drm/i915: backlight locking, cleanup Jani Nikula
2013-04-02 12:48 ` [PATCH 1/5] drm/i915: group backlight related stuff into a struct Jani Nikula
2013-04-02 12:48 ` [PATCH 2/5] drm/i915: protect backlight enable and level with spinlock Jani Nikula
@ 2013-04-02 12:48 ` Jani Nikula
2013-04-02 12:48 ` [PATCH 4/5] drm/i915/opregion: don't pretend we did something when we didn't Jani Nikula
2013-04-02 12:48 ` [PATCH 5/5] drm/i915: drop code duplication in favor of asle interrupt handler Jani Nikula
4 siblings, 0 replies; 8+ messages in thread
From: Jani Nikula @ 2013-04-02 12:48 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
In theory, this should prevent the BIOS from requesting them from us, and
this should be the right thing.
In practice, this is not always the case, and might surprise the BIOS.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/intel_opregion.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 4d33874..a622fd0 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -282,9 +282,7 @@ void intel_opregion_enable_asle(struct drm_device *dev)
if (IS_MOBILE(dev))
intel_enable_asle(dev);
- iowrite32(ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN |
- ASLE_PFMB_EN,
- &asle->tche);
+ iowrite32(ASLE_BLC_EN, &asle->tche);
iowrite32(1, &asle->ardy);
}
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/5] drm/i915/opregion: don't pretend we did something when we didn't
2013-04-02 12:48 [PATCH 0/5] drm/i915: backlight locking, cleanup Jani Nikula
` (2 preceding siblings ...)
2013-04-02 12:48 ` [PATCH 3/5] drm/i915: don't pretend we support ASLE ALS, PFIT, or PFMB Jani Nikula
@ 2013-04-02 12:48 ` Jani Nikula
2013-04-02 12:48 ` [PATCH 5/5] drm/i915: drop code duplication in favor of asle interrupt handler Jani Nikula
4 siblings, 0 replies; 8+ messages in thread
From: Jani Nikula @ 2013-04-02 12:48 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
In theory, the BIOS should not even request these from us now that we
aren't claiming we support these, but when it does anyway, don't pretend it
succeeded. It should be the right thing to do, but might confuse the BIOS.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/intel_opregion.c | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index a622fd0..c3a288e 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -174,29 +174,22 @@ static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi)
{
/* alsi is the current ALS reading in lux. 0 indicates below sensor
range, 0xffff indicates above sensor range. 1-0xfffe are valid */
- return 0;
+ DRM_DEBUG_DRIVER("Illum is not supported\n");
+ return ASLE_ALS_ILLUM_FAILED;
}
static u32 asle_set_pwm_freq(struct drm_device *dev, u32 pfmb)
{
- struct drm_i915_private *dev_priv = dev->dev_private;
- if (pfmb & ASLE_PFMB_PWM_VALID) {
- u32 blc_pwm_ctl = I915_READ(BLC_PWM_CTL);
- u32 pwm = pfmb & ASLE_PFMB_PWM_MASK;
- blc_pwm_ctl &= BACKLIGHT_DUTY_CYCLE_MASK;
- pwm = pwm >> 9;
- /* FIXME - what do we do with the PWM? */
- }
- return 0;
+ DRM_DEBUG_DRIVER("PWM freq is not supported\n");
+ return ASLE_PWM_FREQ_FAILED;
}
static u32 asle_set_pfit(struct drm_device *dev, u32 pfit)
{
/* Panel fitting is currently controlled by the X code, so this is a
noop until modesetting support works fully */
- if (!(pfit & ASLE_PFIT_VALID))
- return ASLE_PFIT_FAILED;
- return 0;
+ DRM_DEBUG_DRIVER("Pfit is not supported\n");
+ return ASLE_PFIT_FAILED;
}
void intel_opregion_asle_intr(struct drm_device *dev)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/5] drm/i915: drop code duplication in favor of asle interrupt handler
2013-04-02 12:48 [PATCH 0/5] drm/i915: backlight locking, cleanup Jani Nikula
` (3 preceding siblings ...)
2013-04-02 12:48 ` [PATCH 4/5] drm/i915/opregion: don't pretend we did something when we didn't Jani Nikula
@ 2013-04-02 12:48 ` Jani Nikula
4 siblings, 0 replies; 8+ messages in thread
From: Jani Nikula @ 2013-04-02 12:48 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula
With the previous work asle and gse interrupt handlers should now be
functionally the same. Drop the duplicated code.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 1 -
drivers/gpu/drm/i915/i915_irq.c | 4 ++--
drivers/gpu/drm/i915/intel_opregion.c | 37 ---------------------------------
3 files changed, 2 insertions(+), 40 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 2e59610..968a76e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1801,7 +1801,6 @@ extern int intel_opregion_setup(struct drm_device *dev);
extern void intel_opregion_init(struct drm_device *dev);
extern void intel_opregion_fini(struct drm_device *dev);
extern void intel_opregion_asle_intr(struct drm_device *dev);
-extern void intel_opregion_gse_intr(struct drm_device *dev);
extern void intel_opregion_enable_asle(struct drm_device *dev);
#else
static inline void intel_opregion_init(struct drm_device *dev) { return; }
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 4c5bdd0..76cd3f2 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -790,7 +790,7 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg)
dp_aux_irq_handler(dev);
if (de_iir & DE_GSE_IVB)
- intel_opregion_gse_intr(dev);
+ intel_opregion_asle_intr(dev);
for (i = 0; i < 3; i++) {
if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i)))
@@ -882,7 +882,7 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
dp_aux_irq_handler(dev);
if (de_iir & DE_GSE)
- intel_opregion_gse_intr(dev);
+ intel_opregion_asle_intr(dev);
if (de_iir & DE_PIPEA_VBLANK)
drm_handle_vblank(dev, 0);
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index c3a288e..3e22cea 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -224,43 +224,6 @@ void intel_opregion_asle_intr(struct drm_device *dev)
iowrite32(asle_stat, &asle->aslc);
}
-void intel_opregion_gse_intr(struct drm_device *dev)
-{
- struct drm_i915_private *dev_priv = dev->dev_private;
- struct opregion_asle __iomem *asle = dev_priv->opregion.asle;
- u32 asle_stat = 0;
- u32 asle_req;
-
- if (!asle)
- return;
-
- asle_req = ioread32(&asle->aslc) & ASLE_REQ_MSK;
-
- if (!asle_req) {
- DRM_DEBUG_DRIVER("non asle set request??\n");
- return;
- }
-
- if (asle_req & ASLE_SET_ALS_ILLUM) {
- DRM_DEBUG_DRIVER("Illum is not supported\n");
- asle_stat |= ASLE_ALS_ILLUM_FAILED;
- }
-
- if (asle_req & ASLE_SET_BACKLIGHT)
- asle_stat |= asle_set_backlight(dev, ioread32(&asle->bclp));
-
- if (asle_req & ASLE_SET_PFIT) {
- DRM_DEBUG_DRIVER("Pfit is not supported\n");
- asle_stat |= ASLE_PFIT_FAILED;
- }
-
- if (asle_req & ASLE_SET_PWM_FREQ) {
- DRM_DEBUG_DRIVER("PWM freq is not supported\n");
- asle_stat |= ASLE_PWM_FREQ_FAILED;
- }
-
- iowrite32(asle_stat, &asle->aslc);
-}
#define ASLE_ALS_EN (1<<0)
#define ASLE_BLC_EN (1<<1)
#define ASLE_PFIT_EN (1<<2)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/5] drm/i915: protect backlight enable and level with spinlock
2013-04-02 12:48 ` [PATCH 2/5] drm/i915: protect backlight enable and level with spinlock Jani Nikula
@ 2013-04-02 13:39 ` Daniel Vetter
0 siblings, 0 replies; 8+ messages in thread
From: Daniel Vetter @ 2013-04-02 13:39 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
On Tue, Apr 02, 2013 at 03:48:10PM +0300, Jani Nikula wrote:
> Backlight is fiddled both through backlight sysfs files and asle
> interrupts. Protect the relevant data.
It's also used by our modeset code in the lvds/edp enable/disable hooks.
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Besides the panel code there's also the register save/restore code in
i915_suspend.c. I think that also needs to be protected with this new
spinlock.
That will get a bit ugly though, since that code is also used for ums and
in that case we won't set up the backlight code and so not initialize the
spinlock. Either splatter really ugly if (DRIVER_MODESET) checks or make
two copies of that stuff ...
Cheers, Daniel
> ---
> drivers/gpu/drm/i915/i915_drv.h | 1 +
> drivers/gpu/drm/i915/intel_panel.c | 16 ++++++++++++++++
> 2 files changed, 17 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 5e38a2c..2e59610 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -943,6 +943,7 @@ typedef struct drm_i915_private {
> struct {
> int level;
> bool enabled;
> + spinlock_t lock;
> struct backlight_device *device;
> } backlight;
>
> diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
> index 0e7e873..2a95297 100644
> --- a/drivers/gpu/drm/i915/intel_panel.c
> +++ b/drivers/gpu/drm/i915/intel_panel.c
> @@ -285,6 +285,9 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level
> void intel_panel_set_backlight(struct drm_device *dev, u32 level)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&dev_priv->backlight.lock, flags);
>
> dev_priv->backlight.level = level;
> if (dev_priv->backlight.device)
> @@ -292,11 +295,16 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
>
> if (dev_priv->backlight.enabled)
> intel_panel_actually_set_backlight(dev, level);
> +
> + spin_unlock_irqrestore(&dev_priv->backlight.lock, flags);
> }
>
> void intel_panel_disable_backlight(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&dev_priv->backlight.lock, flags);
>
> dev_priv->backlight.enabled = false;
> intel_panel_actually_set_backlight(dev, 0);
> @@ -314,12 +322,17 @@ void intel_panel_disable_backlight(struct drm_device *dev)
> I915_WRITE(BLC_PWM_PCH_CTL1, tmp);
> }
> }
> +
> + spin_unlock_irqrestore(&dev_priv->backlight.lock, flags);
> }
>
> void intel_panel_enable_backlight(struct drm_device *dev,
> enum pipe pipe)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&dev_priv->backlight.lock, flags);
>
> if (dev_priv->backlight.level == 0) {
> dev_priv->backlight.level = intel_panel_get_max_backlight(dev);
> @@ -372,12 +385,15 @@ set_level:
> */
> if (!intel_panel_get_backlight(dev))
> intel_panel_actually_set_backlight(dev, dev_priv->backlight.level);
> +
> + spin_unlock_irqrestore(&dev_priv->backlight.lock, flags);
> }
>
> static void intel_panel_init_backlight(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> + spin_lock_init(&dev_priv->backlight.lock);
> dev_priv->backlight.level = intel_panel_get_backlight(dev);
> dev_priv->backlight.enabled = dev_priv->backlight.level != 0;
> }
> --
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/5] drm/i915: group backlight related stuff into a struct
2013-04-02 12:48 ` [PATCH 1/5] drm/i915: group backlight related stuff into a struct Jani Nikula
@ 2013-04-02 13:49 ` Daniel Vetter
0 siblings, 0 replies; 8+ messages in thread
From: Daniel Vetter @ 2013-04-02 13:49 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
On Tue, Apr 02, 2013 at 03:48:09PM +0300, Jani Nikula wrote:
> No functional changes.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Queued for -next, thanks for the patch.
-Daniel
> ---
> drivers/gpu/drm/i915/i915_drv.h | 11 +++++----
> drivers/gpu/drm/i915/intel_panel.c | 44 ++++++++++++++++++------------------
> 2 files changed, 29 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 2962a9a..5e38a2c 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -939,9 +939,14 @@ typedef struct drm_i915_private {
> struct intel_overlay *overlay;
> unsigned int sprite_scaling_enabled;
>
> + /* backlight */
> + struct {
> + int level;
> + bool enabled;
> + struct backlight_device *device;
> + } backlight;
> +
> /* LVDS info */
> - int backlight_level; /* restore backlight to this value */
> - bool backlight_enabled;
> struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */
> struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */
>
> @@ -1043,8 +1048,6 @@ typedef struct drm_i915_private {
> */
> struct work_struct console_resume_work;
>
> - struct backlight_device *backlight;
> -
> struct drm_property *broadcast_rgb_property;
> struct drm_property *force_audio_property;
>
> diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
> index 21f415a..0e7e873 100644
> --- a/drivers/gpu/drm/i915/intel_panel.c
> +++ b/drivers/gpu/drm/i915/intel_panel.c
> @@ -286,11 +286,11 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> - dev_priv->backlight_level = level;
> - if (dev_priv->backlight)
> - dev_priv->backlight->props.brightness = level;
> + dev_priv->backlight.level = level;
> + if (dev_priv->backlight.device)
> + dev_priv->backlight.device->props.brightness = level;
>
> - if (dev_priv->backlight_enabled)
> + if (dev_priv->backlight.enabled)
> intel_panel_actually_set_backlight(dev, level);
> }
>
> @@ -298,7 +298,7 @@ void intel_panel_disable_backlight(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> - dev_priv->backlight_enabled = false;
> + dev_priv->backlight.enabled = false;
> intel_panel_actually_set_backlight(dev, 0);
>
> if (INTEL_INFO(dev)->gen >= 4) {
> @@ -321,15 +321,15 @@ void intel_panel_enable_backlight(struct drm_device *dev,
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> - if (dev_priv->backlight_level == 0) {
> - dev_priv->backlight_level = intel_panel_get_max_backlight(dev);
> - if (dev_priv->backlight)
> - dev_priv->backlight->props.brightness =
> - dev_priv->backlight_level;
> + if (dev_priv->backlight.level == 0) {
> + dev_priv->backlight.level = intel_panel_get_max_backlight(dev);
> + if (dev_priv->backlight.device)
> + dev_priv->backlight.device->props.brightness =
> + dev_priv->backlight.level;
> }
>
> - dev_priv->backlight_enabled = true;
> - intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
> + dev_priv->backlight.enabled = true;
> + intel_panel_actually_set_backlight(dev, dev_priv->backlight.level);
>
> if (INTEL_INFO(dev)->gen >= 4) {
> uint32_t reg, tmp;
> @@ -371,15 +371,15 @@ set_level:
> * when BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1 are written.
> */
> if (!intel_panel_get_backlight(dev))
> - intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
> + intel_panel_actually_set_backlight(dev, dev_priv->backlight.level);
> }
>
> static void intel_panel_init_backlight(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> - dev_priv->backlight_level = intel_panel_get_backlight(dev);
> - dev_priv->backlight_enabled = dev_priv->backlight_level != 0;
> + dev_priv->backlight.level = intel_panel_get_backlight(dev);
> + dev_priv->backlight.enabled = dev_priv->backlight.level != 0;
> }
>
> enum drm_connector_status
> @@ -433,21 +433,21 @@ int intel_panel_setup_backlight(struct drm_connector *connector)
>
> memset(&props, 0, sizeof(props));
> props.type = BACKLIGHT_RAW;
> - props.brightness = dev_priv->backlight_level;
> + props.brightness = dev_priv->backlight.level;
> props.max_brightness = _intel_panel_get_max_backlight(dev);
> if (props.max_brightness == 0) {
> DRM_DEBUG_DRIVER("Failed to get maximum backlight value\n");
> return -ENODEV;
> }
> - dev_priv->backlight =
> + dev_priv->backlight.device =
> backlight_device_register("intel_backlight",
> &connector->kdev, dev,
> &intel_panel_bl_ops, &props);
>
> - if (IS_ERR(dev_priv->backlight)) {
> + if (IS_ERR(dev_priv->backlight.device)) {
> DRM_ERROR("Failed to register backlight: %ld\n",
> - PTR_ERR(dev_priv->backlight));
> - dev_priv->backlight = NULL;
> + PTR_ERR(dev_priv->backlight.device));
> + dev_priv->backlight.device = NULL;
> return -ENODEV;
> }
> return 0;
> @@ -456,8 +456,8 @@ int intel_panel_setup_backlight(struct drm_connector *connector)
> void intel_panel_destroy_backlight(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> - if (dev_priv->backlight)
> - backlight_device_unregister(dev_priv->backlight);
> + if (dev_priv->backlight.device)
> + backlight_device_unregister(dev_priv->backlight.device);
> }
> #else
> int intel_panel_setup_backlight(struct drm_connector *connector)
> --
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-04-02 13:46 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-02 12:48 [PATCH 0/5] drm/i915: backlight locking, cleanup Jani Nikula
2013-04-02 12:48 ` [PATCH 1/5] drm/i915: group backlight related stuff into a struct Jani Nikula
2013-04-02 13:49 ` Daniel Vetter
2013-04-02 12:48 ` [PATCH 2/5] drm/i915: protect backlight enable and level with spinlock Jani Nikula
2013-04-02 13:39 ` Daniel Vetter
2013-04-02 12:48 ` [PATCH 3/5] drm/i915: don't pretend we support ASLE ALS, PFIT, or PFMB Jani Nikula
2013-04-02 12:48 ` [PATCH 4/5] drm/i915/opregion: don't pretend we did something when we didn't Jani Nikula
2013-04-02 12:48 ` [PATCH 5/5] drm/i915: drop code duplication in favor of asle interrupt handler Jani Nikula
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox