forked from mirrors/linux
		
	drm/fb-helper: factor out pseudo-palette
The pseudo-palette has nothing to do with the crtc, so move it out of the crtc loop and update the palette once, then break out early. Signed-off-by: Peter Rosin <peda@axenita.se> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1499164632-5582-2-git-send-email-peda@axentia.se
This commit is contained in:
		
							parent
							
								
									6b7dc6e9f8
								
							
						
					
					
						commit
						b8e2b0199c
					
				
					 1 changed files with 37 additions and 23 deletions
				
			
		| 
						 | 
					@ -1218,29 +1218,6 @@ static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
 | 
				
			||||||
	struct drm_fb_helper *fb_helper = info->par;
 | 
						struct drm_fb_helper *fb_helper = info->par;
 | 
				
			||||||
	struct drm_framebuffer *fb = fb_helper->fb;
 | 
						struct drm_framebuffer *fb = fb_helper->fb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
 | 
					 | 
				
			||||||
		u32 *palette;
 | 
					 | 
				
			||||||
		u32 value;
 | 
					 | 
				
			||||||
		/* place color in psuedopalette */
 | 
					 | 
				
			||||||
		if (regno > 16)
 | 
					 | 
				
			||||||
			return -EINVAL;
 | 
					 | 
				
			||||||
		palette = (u32 *)info->pseudo_palette;
 | 
					 | 
				
			||||||
		red >>= (16 - info->var.red.length);
 | 
					 | 
				
			||||||
		green >>= (16 - info->var.green.length);
 | 
					 | 
				
			||||||
		blue >>= (16 - info->var.blue.length);
 | 
					 | 
				
			||||||
		value = (red << info->var.red.offset) |
 | 
					 | 
				
			||||||
			(green << info->var.green.offset) |
 | 
					 | 
				
			||||||
			(blue << info->var.blue.offset);
 | 
					 | 
				
			||||||
		if (info->var.transp.length > 0) {
 | 
					 | 
				
			||||||
			u32 mask = (1 << info->var.transp.length) - 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			mask <<= info->var.transp.offset;
 | 
					 | 
				
			||||||
			value |= mask;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		palette[regno] = value;
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * The driver really shouldn't advertise pseudo/directcolor
 | 
						 * The driver really shouldn't advertise pseudo/directcolor
 | 
				
			||||||
	 * visuals if it can't deal with the palette.
 | 
						 * visuals if it can't deal with the palette.
 | 
				
			||||||
| 
						 | 
					@ -1256,6 +1233,38 @@ static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int setcmap_pseudo_palette(struct fb_cmap *cmap, struct fb_info *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 *palette = (u32 *)info->pseudo_palette;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (cmap->start + cmap->len > 16)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < cmap->len; ++i) {
 | 
				
			||||||
 | 
							u16 red = cmap->red[i];
 | 
				
			||||||
 | 
							u16 green = cmap->green[i];
 | 
				
			||||||
 | 
							u16 blue = cmap->blue[i];
 | 
				
			||||||
 | 
							u32 value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							red >>= 16 - info->var.red.length;
 | 
				
			||||||
 | 
							green >>= 16 - info->var.green.length;
 | 
				
			||||||
 | 
							blue >>= 16 - info->var.blue.length;
 | 
				
			||||||
 | 
							value = (red << info->var.red.offset) |
 | 
				
			||||||
 | 
								(green << info->var.green.offset) |
 | 
				
			||||||
 | 
								(blue << info->var.blue.offset);
 | 
				
			||||||
 | 
							if (info->var.transp.length > 0) {
 | 
				
			||||||
 | 
								u32 mask = (1 << info->var.transp.length) - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mask <<= info->var.transp.offset;
 | 
				
			||||||
 | 
								value |= mask;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							palette[cmap->start + i] = value;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * drm_fb_helper_setcmap - implementation for &fb_ops.fb_setcmap
 | 
					 * drm_fb_helper_setcmap - implementation for &fb_ops.fb_setcmap
 | 
				
			||||||
 * @cmap: cmap to set
 | 
					 * @cmap: cmap to set
 | 
				
			||||||
| 
						 | 
					@ -1281,6 +1290,11 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drm_modeset_lock_all(dev);
 | 
						drm_modeset_lock_all(dev);
 | 
				
			||||||
 | 
						if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
 | 
				
			||||||
 | 
							rc = setcmap_pseudo_palette(cmap, info);
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < fb_helper->crtc_count; i++) {
 | 
						for (i = 0; i < fb_helper->crtc_count; i++) {
 | 
				
			||||||
		crtc = fb_helper->crtc_info[i].mode_set.crtc;
 | 
							crtc = fb_helper->crtc_info[i].mode_set.crtc;
 | 
				
			||||||
		crtc_funcs = crtc->helper_private;
 | 
							crtc_funcs = crtc->helper_private;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue