Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/udl: Inline DPMS code into CRTC enable and disable functions

DPMS functionality is only used by the CRTC's enable and disable
functions. Inline the code. The patch also adds symbolic constants
for the blank register and constants; according to udlfb, which is
a bit more detailed than DRM's udl.

v3:
* use symbolic constants for blank, according to udlfb driver

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191210084905.5570-5-tzimmermann@suse.de

+38 -59
+9
drivers/gpu/drm/udl/udl_drv.h
··· 110 110 #define CMD_WRITE_COPY16 "\xAF\x6A" /**< 16 bit copy command. */ 111 111 #define CMD_WRITE_RLX16 "\xAF\x6B" /**< 16 bit extended run length command. */ 112 112 113 + /* On/Off for driving the DisplayLink framebuffer to the display */ 114 + #define UDL_REG_BLANK_MODE 0x1f 115 + 116 + #define UDL_BLANK_MODE_ON 0x00 /* hsync and vsync on, visible */ 117 + #define UDL_BLANK_MODE_BLANKED 0x01 /* hsync and vsync on, blanked */ 118 + #define UDL_BLANK_MODE_VSYNC_OFF 0x03 /* vsync off, blanked */ 119 + #define UDL_BLANK_MODE_HSYNC_OFF 0x05 /* hsync off, blanked */ 120 + #define UDL_BLANK_MODE_POWERDOWN 0x07 /* powered off; requires modeset */ 121 + 113 122 #endif
+29 -59
drivers/gpu/drm/udl/udl_modeset.c
··· 42 42 return udl_set_register(buf, 0xFF, 0xFF); 43 43 } 44 44 45 - /* 46 - * On/Off for driving the DisplayLink framebuffer to the display 47 - * 0x00 H and V sync on 48 - * 0x01 H and V sync off (screen blank but powered) 49 - * 0x07 DPMS powerdown (requires modeset to come back) 50 - */ 51 - static char *udl_set_blank(char *buf, int dpms_mode) 45 + static char *udl_set_blank_mode(char *buf, u8 mode) 52 46 { 53 - u8 reg; 54 - switch (dpms_mode) { 55 - case DRM_MODE_DPMS_OFF: 56 - reg = 0x07; 57 - break; 58 - case DRM_MODE_DPMS_STANDBY: 59 - reg = 0x05; 60 - break; 61 - case DRM_MODE_DPMS_SUSPEND: 62 - reg = 0x01; 63 - break; 64 - case DRM_MODE_DPMS_ON: 65 - reg = 0x00; 66 - break; 67 - } 68 - 69 - return udl_set_register(buf, 0x1f, reg); 47 + return udl_set_register(buf, UDL_REG_BLANK_MODE, mode); 70 48 } 71 49 72 50 static char *udl_set_color_depth(char *buf, u8 selection) ··· 215 237 char *buf; 216 238 int retval; 217 239 240 + if (udl->mode_buf_len == 0) { 241 + DRM_ERROR("No mode set\n"); 242 + return -EINVAL; 243 + } 244 + 218 245 urb = udl_get_urb(dev); 219 246 if (!urb) 220 247 return -ENOMEM; ··· 230 247 retval = udl_submit_urb(dev, urb, udl->mode_buf_len); 231 248 DRM_DEBUG("write mode info %d\n", udl->mode_buf_len); 232 249 return retval; 233 - } 234 - 235 - 236 - static void udl_crtc_dpms(struct drm_crtc *crtc, int mode) 237 - { 238 - struct drm_device *dev = crtc->dev; 239 - struct udl_device *udl = dev->dev_private; 240 - int retval; 241 - 242 - if (mode == DRM_MODE_DPMS_OFF) { 243 - char *buf; 244 - struct urb *urb; 245 - urb = udl_get_urb(dev); 246 - if (!urb) 247 - return; 248 - 249 - buf = (char *)urb->transfer_buffer; 250 - buf = udl_vidreg_lock(buf); 251 - buf = udl_set_blank(buf, mode); 252 - buf = udl_vidreg_unlock(buf); 253 - 254 - buf = udl_dummy_render(buf); 255 - retval = udl_submit_urb(dev, urb, buf - (char *) 256 - urb->transfer_buffer); 257 - } else { 258 - if (udl->mode_buf_len == 0) { 259 - DRM_ERROR("Trying to enable DPMS with no mode\n"); 260 - return; 261 - } 262 - udl_crtc_write_mode_to_hw(crtc); 263 - } 264 - 265 250 } 266 251 267 252 /* ··· 278 327 wrptr = udl_set_base8bpp(wrptr, 2 * mode->vdisplay * mode->hdisplay); 279 328 280 329 wrptr = udl_set_vid_cmds(wrptr, mode); 281 - wrptr = udl_set_blank(wrptr, DRM_MODE_DPMS_ON); 330 + wrptr = udl_set_blank_mode(wrptr, UDL_BLANK_MODE_ON); 282 331 wrptr = udl_vidreg_unlock(wrptr); 283 332 284 333 wrptr = udl_dummy_render(wrptr); ··· 290 339 291 340 udl_handle_damage(fb, 0, 0, fb->width, fb->height); 292 341 293 - udl_crtc_dpms(&pipe->crtc, DRM_MODE_DPMS_ON); 342 + if (!crtc_state->mode_changed) 343 + return; 344 + 345 + /* enable display */ 346 + udl_crtc_write_mode_to_hw(crtc); 294 347 } 295 348 296 349 static void 297 350 udl_simple_display_pipe_disable(struct drm_simple_display_pipe *pipe) 298 351 { 299 - udl_crtc_dpms(&pipe->crtc, DRM_MODE_DPMS_OFF); 352 + struct drm_crtc *crtc = &pipe->crtc; 353 + struct drm_device *dev = crtc->dev; 354 + struct urb *urb; 355 + char *buf; 356 + 357 + urb = udl_get_urb(dev); 358 + if (!urb) 359 + return; 360 + 361 + buf = (char *)urb->transfer_buffer; 362 + buf = udl_vidreg_lock(buf); 363 + buf = udl_set_blank_mode(buf, UDL_BLANK_MODE_POWERDOWN); 364 + buf = udl_vidreg_unlock(buf); 365 + buf = udl_dummy_render(buf); 366 + 367 + udl_submit_urb(dev, urb, buf - (char *)urb->transfer_buffer); 300 368 } 301 369 302 370 static int