On Die, 2009-12-08 at 12:24 +0100, Rafał Miłecki wrote:
W dniu 8 grudnia 2009 12:03 użytkownik Michel Dänzer
mic...@daenzer.net napisał:
On Tue, 2009-12-08 at 11:32 +0100, Rafał Miłecki wrote:
2009/12/8 Michel Dänzer mic...@daenzer.net:
From: Michel Dänzer daen...@vmware.com
Allows e.g. power management daemons to control the backlight level.
Inspired
by the corresponding code in radeonfb.
Signed-off-by: Michel Dänzer daen...@vmware.com
I posted something similar but AFAIR got response we don't want this
until fixing backlight class design.
Unfortunately I'm not aware of any other available method to control the
backlight on Apple PowerPC laptops. I'm open for suggestions though how
this code could be disabled when another method is available.
It's not that we don't want solution you wrote. It's absolutely
wanted. But we need to improve backlight class because we start
register many devices that control same display which drivers us to
inconsistency.
Please, check http://marc.info/?t=12593682454r=1w=2
Hopefully I'll find some time to do that before .33 and we will able
to include our patches then.
Any news on this?
Per demand from IRC, I'm posting the patch rebased against a newer
kernel tree.
commit f380d3bc243ade263c4dc034ce0873fbe9d96f75
Author: Michel Dänzer daen...@vmware.com
Date: Thu Feb 25 16:47:00 2010 +0100
drm/radeon/kms: Expose backlight class device for legacy LVDS encoder.
Allows e.g. power management daemons to control the backlight level.
Inspired
by the corresponding code in radeonfb.
Signed-off-by: Michel Dänzer daen...@vmware.com
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig
index 1c02d23..9746fee 100644
--- a/drivers/gpu/drm/radeon/Kconfig
+++ b/drivers/gpu/drm/radeon/Kconfig
@@ -1,6 +1,7 @@
config DRM_RADEON_KMS
bool Enable modesetting on radeon by default - NEW DRIVER
depends on DRM_RADEON
+ select BACKLIGHT_CLASS_DEVICE
help
Choose this option if you want kernel modesetting enabled by default.
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
index cf389ce..fbc2df3 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
@@ -29,6 +29,10 @@
#include radeon.h
#include atom.h
+#ifdef CONFIG_PMAC_BACKLIGHT
+#include asm/backlight.h
+#endif
+
static void radeon_legacy_encoder_disable(struct drm_encoder *encoder)
{
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
@@ -39,7 +43,7 @@ static void radeon_legacy_encoder_disable(struct drm_encoder
*encoder)
radeon_encoder-active_device = 0;
}
-static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
+static void radeon_legacy_lvds_update(struct drm_encoder *encoder, int mode)
{
struct drm_device *dev = encoder-dev;
struct radeon_device *rdev = dev-dev_private;
@@ -47,15 +51,23 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder
*encoder, int mode)
uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man;
int panel_pwr_delay = 2000;
bool is_mac = false;
+ uint8_t backlight_level;
DRM_DEBUG(\n);
+ lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL);
+ backlight_level = (lvds_gen_cntl RADEON_LVDS_BL_MOD_LEVEL_SHIFT)
0xff;
+
if (radeon_encoder-enc_priv) {
if (rdev-is_atom_bios) {
struct radeon_encoder_atom_dig *lvds =
radeon_encoder-enc_priv;
panel_pwr_delay = lvds-panel_pwr_delay;
+ if (lvds-bl_dev)
+ backlight_level = lvds-backlight_level;
} else {
struct radeon_encoder_lvds *lvds =
radeon_encoder-enc_priv;
panel_pwr_delay = lvds-panel_pwr_delay;
+ if (lvds-bl_dev)
+ backlight_level = lvds-backlight_level;
}
}
@@ -82,11 +94,13 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder
*encoder, int mode)
lvds_pll_cntl = ~RADEON_LVDS_PLL_RESET;
WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl);
- lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL);
- lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN |
RADEON_LVDS_DIGON | RADEON_LVDS_BLON);
+ lvds_gen_cntl = ~(RADEON_LVDS_DISPLAY_DIS |
+ RADEON_LVDS_BL_MOD_LEVEL_MASK);
+ lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN |
+ RADEON_LVDS_DIGON | RADEON_LVDS_BLON |
+ (backlight_level
RADEON_LVDS_BL_MOD_LEVEL_SHIFT));
if (is_mac)
lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN;
- lvds_gen_cntl =