[Nouveau] [PATCH] drm/nv50: Fix backlight not working when PWM_DIV is uninitialised
Roy Spliet
r.spliet at student.tudelft.nl
Sun Sep 1 08:20:21 PDT 2013
Known issues before merge:
- Currently requires acpi_backlight=vendor kernel param
- 0x5e always valid?
Signed-off-by: Roy Spliet <r.spliet at student.tudelft.nl>
Tested-by: Rick Hendricksen
---
drivers/gpu/drm/nouveau/nouveau_backlight.c | 20 +++++++++++++++++---
drivers/gpu/drm/nouveau/nouveau_display.c | 4 ++++
drivers/gpu/drm/nouveau/nouveau_display.h | 7 +++++++
3 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c
index 2ffad21..63f3f26 100644
--- a/drivers/gpu/drm/nouveau/nouveau_backlight.c
+++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c
@@ -174,6 +174,23 @@ static const struct backlight_ops nva3_bl_ops = {
.update_status = nva3_set_intensity,
};
+int
+nouveau_backlight_config(struct nouveau_drm *drm)
+{
+ struct backlight_device *bd = drm->backlight;
+ struct nouveau_encoder *nv_encoder = bl_get_data(bd);
+ struct nouveau_device *device = nv_device(drm->device);
+ int or = nv_encoder->or;
+
+ if (device->card_type == NV_50 &&
+ (device->chipset <= 0xa0 ||
+ device->chipset == 0xaa ||
+ device->chipset == 0xac))
+ nv_wr32(device, NV50_PDISP_SOR_PWM_DIV(or), 0x5e);
+
+ return 0;
+}
+
static int
nv50_backlight_init(struct drm_connector *connector)
{
@@ -191,9 +208,6 @@ nv50_backlight_init(struct drm_connector *connector)
return -ENODEV;
}
- if (!nv_rd32(device, NV50_PDISP_SOR_PWM_CTL(nv_encoder->or)))
- return 0;
-
if (device->chipset <= 0xa0 ||
device->chipset == 0xaa ||
device->chipset == 0xac)
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index e616124..08d5ff4 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -249,6 +249,10 @@ nouveau_display_init(struct drm_device *dev)
}
}
+ /* configure backlight params */
+ if(drm->backlight)
+ nouveau_backlight_config(drm);
+
return ret;
}
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h
index 1ea3e47..d4113be 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.h
+++ b/drivers/gpu/drm/nouveau/nouveau_display.h
@@ -75,6 +75,7 @@ void nouveau_hdmi_mode_set(struct drm_encoder *, struct drm_display_mode *);
#ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
extern int nouveau_backlight_init(struct drm_device *);
+extern int nouveau_backlight_config(struct nouveau_drm *);
extern void nouveau_backlight_exit(struct drm_device *);
#else
static inline int
@@ -83,6 +84,12 @@ nouveau_backlight_init(struct drm_device *dev)
return 0;
}
+static inline int
+nouveau_backlight_config(struct nouveau_drm *drm)
+{
+ return 0;
+}
+
static inline void
nouveau_backlight_exit(struct drm_device *dev) {
}
--
1.8.3.1
More information about the Nouveau
mailing list