diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c index 5e2c5685b4dd..c47000001f31 100644 --- a/drivers/gpu/drm/nouveau/nouveau_backlight.c +++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c @@ -173,6 +173,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 nvif_object *device = &drm->client.device.object; + struct nouveau_encoder *nv_encoder = bl_get_data(bd); + int or = ffs(nv_encoder->dcb->or) - 1; + + if (drm->client.device.info.chipset <= 0xa0 || + drm->client.device.info.chipset == 0xaa || + drm->client.device.info.chipset == 0xac) + nvif_wr32(device, NV50_PDISP_SOR_PWM_DIV(or), 0x5e); + + return 0; + +} + static int nv50_backlight_init(struct drm_connector *connector) { diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 9e16deffba86..1c397d1c32dc 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c @@ -740,6 +740,10 @@ nouveau_display_resume(struct drm_device *dev, bool runtime) if (dev->mode_config.funcs->atomic_commit) { nouveau_display_init(dev); + /* configure backlight params */ + if (drm->backlight) { + nouveau_backlight_config(drm); + } if (disp->suspend) { drm_atomic_helper_resume(dev, disp->suspend); disp->suspend = NULL; @@ -774,6 +778,12 @@ nouveau_display_resume(struct drm_device *dev, bool runtime) nouveau_display_init(dev); + /* configure backlight params */ + if (drm->backlight) { + nouveau_backlight_config(drm); + } + + /* Force CLUT to get re-loaded during modeset */ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h index ecdc0a3a8d32..44e5bd90f06b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.h +++ b/drivers/gpu/drm/nouveau/nouveau_display.h @@ -93,6 +93,7 @@ void nouveau_hdmi_mode_set(struct drm_encoder *, struct drm_display_mode *); int nouveau_crtc_set_config(struct drm_mode_set *set); #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 @@ -101,6 +102,12 @@ nouveau_backlight_init(struct drm_device *dev) return 0; } +static inline int +nouveau_backlight_config(struct nouveau_drm *connector) +{ + return 0; +} + static inline void nouveau_backlight_exit(struct drm_device *dev) { }