mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-03 05:16:48 +07:00
Merge branch 'pan-fixes' of git://linuxtv.org/pinchartl/fbdev into fbdev-next
This commit is contained in:
commit
3c470f33e6
@ -1364,26 +1364,16 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
|
||||
}
|
||||
|
||||
#ifdef XGIFB_PAN
|
||||
static int XGIfb_pan_var(struct fb_var_screeninfo *var)
|
||||
static int XGIfb_pan_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
{
|
||||
unsigned int base;
|
||||
|
||||
/* printk("Inside pan_var"); */
|
||||
|
||||
if (var->xoffset > (var->xres_virtual - var->xres)) {
|
||||
/* printk("Pan: xo: %d xv %d xr %d\n",
|
||||
var->xoffset, var->xres_virtual, var->xres); */
|
||||
return -EINVAL;
|
||||
}
|
||||
if (var->yoffset > (var->yres_virtual - var->yres)) {
|
||||
/* printk("Pan: yo: %d yv %d yr %d\n",
|
||||
var->yoffset, var->yres_virtual, var->yres); */
|
||||
return -EINVAL;
|
||||
}
|
||||
base = var->yoffset * var->xres_virtual + var->xoffset;
|
||||
base = var->yoffset * info->var.xres_virtual + var->xoffset;
|
||||
|
||||
/* calculate base bpp dep. */
|
||||
switch (var->bits_per_pixel) {
|
||||
switch (info->var.bits_per_pixel) {
|
||||
case 16:
|
||||
base >>= 1;
|
||||
break;
|
||||
@ -1681,9 +1671,9 @@ static int XGIfb_pan_display(struct fb_var_screeninfo *var,
|
||||
|
||||
/* printk("\nInside pan_display:\n"); */
|
||||
|
||||
if (var->xoffset > (var->xres_virtual - var->xres))
|
||||
if (var->xoffset > (info->var.xres_virtual - info->var.xres))
|
||||
return -EINVAL;
|
||||
if (var->yoffset > (var->yres_virtual - var->yres))
|
||||
if (var->yoffset > (info->var.yres_virtual - info->var.yres))
|
||||
return -EINVAL;
|
||||
|
||||
if (var->vmode & FB_VMODE_YWRAP) {
|
||||
@ -1696,7 +1686,7 @@ static int XGIfb_pan_display(struct fb_var_screeninfo *var,
|
||||
> info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
}
|
||||
err = XGIfb_pan_var(var);
|
||||
err = XGIfb_pan_var(var, info);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
@ -378,8 +378,8 @@ static int mc68x328fb_pan_display(struct fb_var_screeninfo *var,
|
||||
|| var->xoffset)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
if (var->xoffset + var->xres > info->var.xres_virtual ||
|
||||
var->yoffset + var->yres > info->var.yres_virtual)
|
||||
if (var->xoffset + info->var.xres > info->var.xres_virtual ||
|
||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
}
|
||||
info->var.xoffset = var->xoffset;
|
||||
|
@ -850,9 +850,10 @@ acornfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
u_int y_bottom = var->yoffset;
|
||||
|
||||
if (!(var->vmode & FB_VMODE_YWRAP))
|
||||
y_bottom += var->yres;
|
||||
y_bottom += info->var.yres;
|
||||
|
||||
BUG_ON(y_bottom > var->yres_virtual);
|
||||
if (y_bottom > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
|
||||
acornfb_update_dma(info, var);
|
||||
|
||||
|
@ -908,13 +908,14 @@ static int arkfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info
|
||||
unsigned int offset;
|
||||
|
||||
/* Calculate the offset */
|
||||
if (var->bits_per_pixel == 0) {
|
||||
offset = (var->yoffset / 16) * (var->xres_virtual / 2) + (var->xoffset / 2);
|
||||
if (info->var.bits_per_pixel == 0) {
|
||||
offset = (var->yoffset / 16) * (info->var.xres_virtual / 2)
|
||||
+ (var->xoffset / 2);
|
||||
offset = offset >> 2;
|
||||
} else {
|
||||
offset = (var->yoffset * info->fix.line_length) +
|
||||
(var->xoffset * var->bits_per_pixel / 8);
|
||||
offset = offset >> ((var->bits_per_pixel == 4) ? 2 : 3);
|
||||
(var->xoffset * info->var.bits_per_pixel / 8);
|
||||
offset = offset >> ((info->var.bits_per_pixel == 4) ? 2 : 3);
|
||||
}
|
||||
|
||||
/* Set the offset */
|
||||
|
@ -39,7 +39,8 @@
|
||||
| FBINFO_HWACCEL_YPAN)
|
||||
|
||||
static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo,
|
||||
struct fb_var_screeninfo *var)
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_info *info)
|
||||
{
|
||||
|
||||
}
|
||||
@ -50,14 +51,16 @@ static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo,
|
||||
| FBINFO_HWACCEL_YPAN)
|
||||
|
||||
static void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo,
|
||||
struct fb_var_screeninfo *var)
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_info *info)
|
||||
{
|
||||
u32 dma2dcfg;
|
||||
u32 pixeloff;
|
||||
|
||||
pixeloff = (var->xoffset * var->bits_per_pixel) & 0x1f;
|
||||
pixeloff = (var->xoffset * info->var.bits_per_pixel) & 0x1f;
|
||||
|
||||
dma2dcfg = ((var->xres_virtual - var->xres) * var->bits_per_pixel) / 8;
|
||||
dma2dcfg = (info->var.xres_virtual - info->var.xres)
|
||||
* info->var.bits_per_pixel / 8;
|
||||
dma2dcfg |= pixeloff << ATMEL_LCDC_PIXELOFF_OFFSET;
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_DMA2DCFG, dma2dcfg);
|
||||
|
||||
@ -249,14 +252,14 @@ static void atmel_lcdfb_update_dma(struct fb_info *info,
|
||||
unsigned long dma_addr;
|
||||
|
||||
dma_addr = (fix->smem_start + var->yoffset * fix->line_length
|
||||
+ var->xoffset * var->bits_per_pixel / 8);
|
||||
+ var->xoffset * info->var.bits_per_pixel / 8);
|
||||
|
||||
dma_addr &= ~3UL;
|
||||
|
||||
/* Set framebuffer DMA base address and pixel offset */
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_DMABADDR1, dma_addr);
|
||||
|
||||
atmel_lcdfb_update_dma2d(sinfo, var);
|
||||
atmel_lcdfb_update_dma2d(sinfo, var, info);
|
||||
}
|
||||
|
||||
static inline void atmel_lcdfb_free_video_memory(struct atmel_lcdfb_info *sinfo)
|
||||
|
@ -845,16 +845,16 @@ static int radeonfb_pan_display (struct fb_var_screeninfo *var,
|
||||
{
|
||||
struct radeonfb_info *rinfo = info->par;
|
||||
|
||||
if ((var->xoffset + var->xres > var->xres_virtual)
|
||||
|| (var->yoffset + var->yres > var->yres_virtual))
|
||||
return -EINVAL;
|
||||
if ((var->xoffset + info->var.xres > info->var.xres_virtual)
|
||||
|| (var->yoffset + info->var.yres > info->var.yres_virtual))
|
||||
return -EINVAL;
|
||||
|
||||
if (rinfo->asleep)
|
||||
return 0;
|
||||
|
||||
radeon_fifo_wait(2);
|
||||
OUTREG(CRTC_OFFSET, ((var->yoffset * var->xres_virtual + var->xoffset)
|
||||
* var->bits_per_pixel / 8) & ~7);
|
||||
OUTREG(CRTC_OFFSET, (var->yoffset * info->fix.line_length +
|
||||
var->xoffset * info->var.bits_per_pixel / 8) & ~7);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -877,8 +877,8 @@ static int da8xx_pan_display(struct fb_var_screeninfo *var,
|
||||
|
||||
start = fix->smem_start +
|
||||
new_var.yoffset * fix->line_length +
|
||||
new_var.xoffset * var->bits_per_pixel / 8;
|
||||
end = start + var->yres * fix->line_length - 1;
|
||||
new_var.xoffset * fbi->var.bits_per_pixel / 8;
|
||||
end = start + fbi->var.yres * fix->line_length - 1;
|
||||
par->dma_start = start;
|
||||
par->dma_end = end;
|
||||
}
|
||||
|
@ -624,8 +624,8 @@ static int unifb_pan_display(struct fb_var_screeninfo *var,
|
||||
|| var->xoffset)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
if (var->xoffset + var->xres > info->var.xres_virtual ||
|
||||
var->yoffset + var->yres > info->var.yres_virtual)
|
||||
if (var->xoffset + info->var.xres > info->var.xres_virtual ||
|
||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
}
|
||||
info->var.xoffset = var->xoffset;
|
||||
|
@ -149,10 +149,11 @@ int g364fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
|
||||
static int g364fb_pan_display(struct fb_var_screeninfo *var,
|
||||
struct fb_info *info)
|
||||
{
|
||||
if (var->xoffset || var->yoffset + var->yres > var->yres_virtual)
|
||||
if (var->xoffset ||
|
||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
|
||||
*(unsigned int *) TOP_REG = var->yoffset * var->xres;
|
||||
*(unsigned int *) TOP_REG = var->yoffset * info->var.xres;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -543,8 +543,8 @@ static int gxt4500_pan_display(struct fb_var_screeninfo *var,
|
||||
|
||||
if (var->xoffset & 7)
|
||||
return -EINVAL;
|
||||
if (var->xoffset + var->xres > var->xres_virtual ||
|
||||
var->yoffset + var->yres > var->yres_virtual)
|
||||
if (var->xoffset + info->var.xres > info->var.xres_virtual ||
|
||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
|
||||
writereg(par, REFRESH_START, (var->xoffset << 16) | var->yoffset);
|
||||
|
@ -422,8 +422,8 @@ static int hgafb_pan_display(struct fb_var_screeninfo *var,
|
||||
var->xoffset)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
if (var->xoffset + var->xres > info->var.xres_virtual
|
||||
|| var->yoffset + var->yres > info->var.yres_virtual
|
||||
if (var->xoffset + info->var.xres > info->var.xres_virtual
|
||||
|| var->yoffset + info->var.yres > info->var.yres_virtual
|
||||
|| var->yoffset % 8)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -749,7 +749,7 @@ set_offset (struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
{
|
||||
struct imstt_par *par = info->par;
|
||||
__u32 off = var->yoffset * (info->fix.line_length >> 3)
|
||||
+ ((var->xoffset * (var->bits_per_pixel >> 3)) >> 3);
|
||||
+ ((var->xoffset * (info->var.bits_per_pixel >> 3)) >> 3);
|
||||
write_reg_le32(par->dc_regs, SSR, off);
|
||||
}
|
||||
|
||||
|
@ -390,12 +390,12 @@ int intelfbhw_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
xoffset = ROUND_DOWN_TO(var->xoffset, 8);
|
||||
yoffset = var->yoffset;
|
||||
|
||||
if ((xoffset + var->xres > var->xres_virtual) ||
|
||||
(yoffset + var->yres > var->yres_virtual))
|
||||
if ((xoffset + info->var.xres > info->var.xres_virtual) ||
|
||||
(yoffset + info->var.yres > info->var.yres_virtual))
|
||||
return -EINVAL;
|
||||
|
||||
offset = (yoffset * dinfo->pitch) +
|
||||
(xoffset * var->bits_per_pixel) / 8;
|
||||
(xoffset * info->var.bits_per_pixel) / 8;
|
||||
|
||||
offset += dinfo->fb.offset << 12;
|
||||
|
||||
|
@ -278,7 +278,7 @@ static int mb862xxfb_pan(struct fb_var_screeninfo *var,
|
||||
reg = pack(var->yoffset, var->xoffset);
|
||||
outreg(disp, GC_L0WY_L0WX, reg);
|
||||
|
||||
reg = pack(var->yres_virtual, var->xres_virtual);
|
||||
reg = pack(info->var.yres_virtual, info->var.xres_virtual);
|
||||
outreg(disp, GC_L0WH_L0WW, reg);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1062,15 +1062,15 @@ static int mx3fb_pan_display(struct fb_var_screeninfo *var,
|
||||
y_bottom = var->yoffset;
|
||||
|
||||
if (!(var->vmode & FB_VMODE_YWRAP))
|
||||
y_bottom += var->yres;
|
||||
y_bottom += fbi->var.yres;
|
||||
|
||||
if (y_bottom > fbi->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&mx3_fbi->mutex);
|
||||
|
||||
offset = (var->yoffset * var->xres_virtual + var->xoffset) *
|
||||
(var->bits_per_pixel / 8);
|
||||
offset = var->yoffset * fbi->fix.line_length
|
||||
+ var->xoffset * (fbi->var.bits_per_pixel / 8);
|
||||
base = fbi->fix.smem_start + offset;
|
||||
|
||||
dev_dbg(fbi->device, "Updating SDC BG buf %d address=0x%08lX\n",
|
||||
|
@ -1185,8 +1185,8 @@ static int neofb_pan_display(struct fb_var_screeninfo *var,
|
||||
|
||||
DBG("neofb_update_start");
|
||||
|
||||
Base = (var->yoffset * var->xres_virtual + var->xoffset) >> 2;
|
||||
Base *= (var->bits_per_pixel + 7) / 8;
|
||||
Base = (var->yoffset * info->var.xres_virtual + var->xoffset) >> 2;
|
||||
Base *= (info->var.bits_per_pixel + 7) / 8;
|
||||
|
||||
neoUnlock();
|
||||
|
||||
|
@ -973,8 +973,8 @@ static int pm2fb_pan_display(struct fb_var_screeninfo *var,
|
||||
{
|
||||
struct pm2fb_par *p = info->par;
|
||||
u32 base;
|
||||
u32 depth = (var->bits_per_pixel + 7) & ~7;
|
||||
u32 xres = (var->xres + 31) & ~31;
|
||||
u32 depth = (info->var.bits_per_pixel + 7) & ~7;
|
||||
u32 xres = (info->var.xres + 31) & ~31;
|
||||
|
||||
depth = (depth > 32) ? 32 : depth;
|
||||
base = to3264(var->yoffset * xres + var->xoffset, depth, 1);
|
||||
|
@ -1147,9 +1147,9 @@ static int pm3fb_pan_display(struct fb_var_screeninfo *var,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct pm3_par *par = info->par;
|
||||
const u32 xres = (var->xres + 31) & ~31;
|
||||
const u32 xres = (info->var.xres + 31) & ~31;
|
||||
|
||||
par->base = pm3fb_shift_bpp(var->bits_per_pixel,
|
||||
par->base = pm3fb_shift_bpp(info->var.bits_per_pixel,
|
||||
(var->yoffset * xres)
|
||||
+ var->xoffset);
|
||||
PM3_WAIT(par, 1);
|
||||
|
@ -883,7 +883,7 @@ static int s3c_fb_pan_display(struct fb_var_screeninfo *var,
|
||||
}
|
||||
}
|
||||
/* Offset in bytes to the end of the displayed area */
|
||||
end_boff = start_boff + var->yres * info->fix.line_length;
|
||||
end_boff = start_boff + info->var.yres * info->fix.line_length;
|
||||
|
||||
/* Temporarily turn off per-vsync update from shadow registers until
|
||||
* both start and end addresses are updated to prevent corruption */
|
||||
|
@ -1019,12 +1019,13 @@ static int s3fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
unsigned int offset;
|
||||
|
||||
/* Calculate the offset */
|
||||
if (var->bits_per_pixel == 0) {
|
||||
offset = (var->yoffset / 16) * (var->xres_virtual / 2) + (var->xoffset / 2);
|
||||
if (info->var.bits_per_pixel == 0) {
|
||||
offset = (var->yoffset / 16) * (info->var.xres_virtual / 2)
|
||||
+ (var->xoffset / 2);
|
||||
offset = offset >> 2;
|
||||
} else {
|
||||
offset = (var->yoffset * info->fix.line_length) +
|
||||
(var->xoffset * var->bits_per_pixel / 8);
|
||||
(var->xoffset * info->var.bits_per_pixel / 8);
|
||||
offset = offset >> 2;
|
||||
}
|
||||
|
||||
|
@ -1477,15 +1477,9 @@ static void savagefb_set_par_int(struct savagefb_par *par, struct savage_reg *r
|
||||
vgaHWProtect(par, 0);
|
||||
}
|
||||
|
||||
static void savagefb_update_start(struct savagefb_par *par,
|
||||
struct fb_var_screeninfo *var)
|
||||
static void savagefb_update_start(struct savagefb_par *par, int base)
|
||||
{
|
||||
int base;
|
||||
|
||||
base = ((var->yoffset * var->xres_virtual + (var->xoffset & ~1))
|
||||
* ((var->bits_per_pixel+7) / 8)) >> 2;
|
||||
|
||||
/* now program the start address registers */
|
||||
/* program the start address registers */
|
||||
vga_out16(0x3d4, (base & 0x00ff00) | 0x0c, par);
|
||||
vga_out16(0x3d4, ((base & 0x00ff) << 8) | 0x0d, par);
|
||||
vga_out8(0x3d4, 0x69, par);
|
||||
@ -1550,8 +1544,12 @@ static int savagefb_pan_display(struct fb_var_screeninfo *var,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct savagefb_par *par = info->par;
|
||||
int base;
|
||||
|
||||
savagefb_update_start(par, var);
|
||||
base = (var->yoffset * info->fix.line_length
|
||||
+ (var->xoffset & ~1) * ((info->var.bits_per_pixel+7) / 8)) >> 2;
|
||||
|
||||
savagefb_update_start(par, base);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1333,19 +1333,14 @@ sisfb_set_base_CRT2(struct sis_video_info *ivideo, unsigned int base)
|
||||
}
|
||||
|
||||
static int
|
||||
sisfb_pan_var(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
|
||||
sisfb_pan_var(struct sis_video_info *ivideo, struct fb_info *info,
|
||||
struct fb_var_screeninfo *var)
|
||||
{
|
||||
if(var->xoffset > (var->xres_virtual - var->xres)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
if(var->yoffset > (var->yres_virtual - var->yres)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ivideo->current_base = (var->yoffset * var->xres_virtual) + var->xoffset;
|
||||
ivideo->current_base = var->yoffset * info->var.xres_virtual
|
||||
+ var->xoffset;
|
||||
|
||||
/* calculate base bpp dep. */
|
||||
switch(var->bits_per_pixel) {
|
||||
switch (info->var.bits_per_pixel) {
|
||||
case 32:
|
||||
break;
|
||||
case 16:
|
||||
@ -1635,20 +1630,15 @@ sisfb_pan_display(struct fb_var_screeninfo *var, struct fb_info* info)
|
||||
struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
|
||||
int err;
|
||||
|
||||
if(var->xoffset > (var->xres_virtual - var->xres))
|
||||
if (var->vmode & FB_VMODE_YWRAP)
|
||||
return -EINVAL;
|
||||
|
||||
if(var->yoffset > (var->yres_virtual - var->yres))
|
||||
if (var->xoffset + info->var.xres > info->var.xres_virtual ||
|
||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
|
||||
if(var->vmode & FB_VMODE_YWRAP)
|
||||
return -EINVAL;
|
||||
|
||||
if(var->xoffset + info->var.xres > info->var.xres_virtual ||
|
||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
|
||||
if((err = sisfb_pan_var(ivideo, var)) < 0)
|
||||
err = sisfb_pan_var(ivideo, info, var);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
info->var.xoffset = var->xoffset;
|
||||
|
@ -582,7 +582,7 @@ static int sm501fb_pan_crt(struct fb_var_screeninfo *var,
|
||||
{
|
||||
struct sm501fb_par *par = info->par;
|
||||
struct sm501fb_info *fbi = par->info;
|
||||
unsigned int bytes_pixel = var->bits_per_pixel / 8;
|
||||
unsigned int bytes_pixel = info->var.bits_per_pixel / 8;
|
||||
unsigned long reg;
|
||||
unsigned long xoffs;
|
||||
|
||||
@ -614,10 +614,10 @@ static int sm501fb_pan_pnl(struct fb_var_screeninfo *var,
|
||||
struct sm501fb_info *fbi = par->info;
|
||||
unsigned long reg;
|
||||
|
||||
reg = var->xoffset | (var->xres_virtual << 16);
|
||||
reg = var->xoffset | (info->var.xres_virtual << 16);
|
||||
smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_WIDTH);
|
||||
|
||||
reg = var->yoffset | (var->yres_virtual << 16);
|
||||
reg = var->yoffset | (info->var.yres_virtual << 16);
|
||||
smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_HEIGHT);
|
||||
|
||||
sm501fb_sync_regs(fbi);
|
||||
|
@ -987,8 +987,8 @@ static int tridentfb_pan_display(struct fb_var_screeninfo *var,
|
||||
unsigned int offset;
|
||||
|
||||
debug("enter\n");
|
||||
offset = (var->xoffset + (var->yoffset * var->xres_virtual))
|
||||
* var->bits_per_pixel / 32;
|
||||
offset = (var->xoffset + (var->yoffset * info->var.xres_virtual))
|
||||
* info->var.bits_per_pixel / 32;
|
||||
set_screen_start(par, offset);
|
||||
debug("exit\n");
|
||||
return 0;
|
||||
|
@ -395,8 +395,8 @@ static int vfb_pan_display(struct fb_var_screeninfo *var,
|
||||
|| var->xoffset)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
if (var->xoffset + var->xres > info->var.xres_virtual ||
|
||||
var->yoffset + var->yres > info->var.yres_virtual)
|
||||
if (var->xoffset + info->var.xres > info->var.xres_virtual ||
|
||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
||||
return -EINVAL;
|
||||
}
|
||||
info->var.xoffset = var->xoffset;
|
||||
|
@ -207,7 +207,7 @@ static void vga16fb_pan_var(struct fb_info *info,
|
||||
* granularity if someone supports xoffset in bit resolution */
|
||||
vga_io_r(VGA_IS1_RC); /* reset flip-flop */
|
||||
vga_io_w(VGA_ATT_IW, VGA_ATC_PEL);
|
||||
if (var->bits_per_pixel == 8)
|
||||
if (info->var.bits_per_pixel == 8)
|
||||
vga_io_w(VGA_ATT_IW, (xoffset & 3) << 1);
|
||||
else
|
||||
vga_io_w(VGA_ATT_IW, xoffset & 7);
|
||||
|
@ -210,8 +210,8 @@ static int vt8500lcd_pan_display(struct fb_var_screeninfo *var,
|
||||
struct vt8500lcd_info *fbi = to_vt8500lcd_info(info);
|
||||
|
||||
writel((1 << 31)
|
||||
| (((var->xres_virtual - var->xres) * pixlen / 4) << 20)
|
||||
| (off >> 2), fbi->regbase + 0x20);
|
||||
| (((info->var.xres_virtual - info->var.xres) * pixlen / 4) << 20)
|
||||
| (off >> 2), fbi->regbase + 0x20);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -620,13 +620,14 @@ static int vt8623fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *i
|
||||
unsigned int offset;
|
||||
|
||||
/* Calculate the offset */
|
||||
if (var->bits_per_pixel == 0) {
|
||||
offset = (var->yoffset / 16) * var->xres_virtual + var->xoffset;
|
||||
if (info->var.bits_per_pixel == 0) {
|
||||
offset = (var->yoffset / 16) * info->var.xres_virtual
|
||||
+ var->xoffset;
|
||||
offset = offset >> 3;
|
||||
} else {
|
||||
offset = (var->yoffset * info->fix.line_length) +
|
||||
(var->xoffset * var->bits_per_pixel / 8);
|
||||
offset = offset >> ((var->bits_per_pixel == 4) ? 2 : 1);
|
||||
(var->xoffset * info->var.bits_per_pixel / 8);
|
||||
offset = offset >> ((info->var.bits_per_pixel == 4) ? 2 : 1);
|
||||
}
|
||||
|
||||
/* Set the offset */
|
||||
|
Loading…
Reference in New Issue
Block a user