Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 271219
b: refs/heads/master
c: 58e7c3b
h: refs/heads/master
i:
  271217: 13b5ecd
  271215: 884a491
v: v3
  • Loading branch information
Bernie Thompson authored and Florian Tobias Schandinat committed Aug 24, 2011
1 parent 6595679 commit da45302
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3c470f33e6a1df1398143c1f3dd619f675602472
refs/heads/master: 58e7c3b00114c48e0879e9fbafd37e0e0c2402cb
97 changes: 73 additions & 24 deletions trunk/drivers/video/udlfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,39 @@ static char *dlfb_vidreg_unlock(char *buf)
}

/*
* On/Off for driving the DisplayLink framebuffer to the display
* 0x00 H and V sync on
* 0x01 H and V sync off (screen blank but powered)
* 0x07 DPMS powerdown (requires modeset to come back)
* Map FB_BLANK_* to DisplayLink register
* DLReg FB_BLANK_*
* ----- -----------------------------
* 0x00 FB_BLANK_UNBLANK (0)
* 0x01 FB_BLANK (1)
* 0x03 FB_BLANK_VSYNC_SUSPEND (2)
* 0x05 FB_BLANK_HSYNC_SUSPEND (3)
* 0x07 FB_BLANK_POWERDOWN (4) Note: requires modeset to come back
*/
static char *dlfb_enable_hvsync(char *buf, bool enable)
static char *dlfb_blanking(char *buf, int fb_blank)
{
if (enable)
return dlfb_set_register(buf, 0x1F, 0x00);
else
return dlfb_set_register(buf, 0x1F, 0x07);
u8 reg;

switch (fb_blank) {
case FB_BLANK_POWERDOWN:
reg = 0x07;
break;
case FB_BLANK_HSYNC_SUSPEND:
reg = 0x05;
break;
case FB_BLANK_VSYNC_SUSPEND:
reg = 0x03;
break;
case FB_BLANK_NORMAL:
reg = 0x01;
break;
default:
reg = 0x00;
}

buf = dlfb_set_register(buf, 0x1F, reg);

return buf;
}

static char *dlfb_set_color_depth(char *buf, u8 selection)
Expand Down Expand Up @@ -272,13 +294,15 @@ static int dlfb_set_video_mode(struct dlfb_data *dev,
wrptr = dlfb_set_base8bpp(wrptr, dev->info->fix.smem_len);

wrptr = dlfb_set_vid_cmds(wrptr, var);
wrptr = dlfb_enable_hvsync(wrptr, true);
wrptr = dlfb_blanking(wrptr, FB_BLANK_UNBLANK);
wrptr = dlfb_vidreg_unlock(wrptr);

writesize = wrptr - buf;

retval = dlfb_submit_urb(dev, urb, writesize);

dev->blank_mode = FB_BLANK_UNBLANK;

return retval;
}

Expand Down Expand Up @@ -1039,32 +1063,57 @@ static int dlfb_ops_set_par(struct fb_info *info)
return result;
}

/* To fonzi the jukebox (e.g. make blanking changes take effect) */
static char *dlfb_dummy_render(char *buf)
{
*buf++ = 0xAF;
*buf++ = 0x6A; /* copy */
*buf++ = 0x00; /* from address*/
*buf++ = 0x00;
*buf++ = 0x00;
*buf++ = 0x01; /* one pixel */
*buf++ = 0x00; /* to address */
*buf++ = 0x00;
*buf++ = 0x00;
return buf;
}

/*
* In order to come back from full DPMS off, we need to set the mode again
*/
static int dlfb_ops_blank(int blank_mode, struct fb_info *info)
{
struct dlfb_data *dev = info->par;
char *bufptr;
struct urb *urb;

if (blank_mode != FB_BLANK_UNBLANK) {
char *bufptr;
struct urb *urb;

urb = dlfb_get_urb(dev);
if (!urb)
return 0;
pr_info("/dev/fb%d FB_BLANK mode %d --> %d\n",
info->node, dev->blank_mode, blank_mode);

bufptr = (char *) urb->transfer_buffer;
bufptr = dlfb_vidreg_lock(bufptr);
bufptr = dlfb_enable_hvsync(bufptr, false);
bufptr = dlfb_vidreg_unlock(bufptr);
if ((dev->blank_mode == FB_BLANK_POWERDOWN) &&
(blank_mode != FB_BLANK_POWERDOWN)) {

dlfb_submit_urb(dev, urb, bufptr -
(char *) urb->transfer_buffer);
} else {
/* returning from powerdown requires a fresh modeset */
dlfb_set_video_mode(dev, &info->var);
}

urb = dlfb_get_urb(dev);
if (!urb)
return 0;

bufptr = (char *) urb->transfer_buffer;
bufptr = dlfb_vidreg_lock(bufptr);
bufptr = dlfb_blanking(bufptr, blank_mode);
bufptr = dlfb_vidreg_unlock(bufptr);

/* seems like a render op is needed to have blank change take effect */
bufptr = dlfb_dummy_render(bufptr);

dlfb_submit_urb(dev, urb, bufptr -
(char *) urb->transfer_buffer);

dev->blank_mode = blank_mode;

return 0;
}

Expand Down
1 change: 1 addition & 0 deletions trunk/include/video/udlfb.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ struct dlfb_data {
int base16;
int base8;
u32 pseudo_palette[256];
int blank_mode; /*one of FB_BLANK_ */
/* blit-only rendering path metrics, exposed through sysfs */
atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */
atomic_t bytes_identical; /* saved effort with backbuffer comparison */
Expand Down

0 comments on commit da45302

Please sign in to comment.