aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-05-27 13:19:57 -0400
committerDave Airlie <airlied@gmail.com>2013-06-17 05:42:47 -0400
commit04c0c569d4358d0e2f9c78ca9fc0ddeb68ae4872 (patch)
tree812f493c7a60c6eca19e529c2804ce584419287b /drivers/gpu
parent8391a3d5bc6269cb0622c136ec7f125a2d5fb5f9 (diff)
drm/fb-helper: Make load_lut and gamma_set/gamma_get hooks optional
Check whether the crtc provides the load_lut callback before calling it. This allows the driver to provide the hook only for those CRTCs that actually have the hardware support for it. Also check whether the driver provided the fb_helper gamma_set/gamma_get hooks. It's a driver bug if it allows non-truecolor fbdev visuals w/o these hooks, but auditing all the drivers is too tedious. So just slap a big WARN_ON() there and bail out before things start to explode. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@gmail.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index dff205849b34..3d13ca6e257f 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -168,6 +168,9 @@ static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_h
168 uint16_t *r_base, *g_base, *b_base; 168 uint16_t *r_base, *g_base, *b_base;
169 int i; 169 int i;
170 170
171 if (helper->funcs->gamma_get == NULL)
172 return;
173
171 r_base = crtc->gamma_store; 174 r_base = crtc->gamma_store;
172 g_base = r_base + crtc->gamma_size; 175 g_base = r_base + crtc->gamma_size;
173 b_base = g_base + crtc->gamma_size; 176 b_base = g_base + crtc->gamma_size;
@@ -597,6 +600,14 @@ static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
597 return 0; 600 return 0;
598 } 601 }
599 602
603 /*
604 * The driver really shouldn't advertise pseudo/directcolor
605 * visuals if it can't deal with the palette.
606 */
607 if (WARN_ON(!fb_helper->funcs->gamma_set ||
608 !fb_helper->funcs->gamma_get))
609 return -EINVAL;
610
600 pindex = regno; 611 pindex = regno;
601 612
602 if (fb->bits_per_pixel == 16) { 613 if (fb->bits_per_pixel == 16) {
@@ -677,7 +688,8 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
677 if (rc) 688 if (rc)
678 goto out; 689 goto out;
679 } 690 }
680 crtc_funcs->load_lut(crtc); 691 if (crtc_funcs->load_lut)
692 crtc_funcs->load_lut(crtc);
681 } 693 }
682 out: 694 out:
683 drm_modeset_unlock_all(dev); 695 drm_modeset_unlock_all(dev);