Merge branch 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6
* 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6: fbdev: sh_mobile_lcdc: increase maximum framebuffer size to support 1080p video: imxfb: Fix the maximum value for yres fb: fix overlapping test off-by-one. fbdev: sh-mobile: retrieve and propagate display sizes from EDID fbdev: sh-mobile: restore display size configuration
This commit is contained in:
commit
b094a870ae
|
@ -1458,7 +1458,7 @@ static bool apertures_overlap(struct aperture *gen, struct aperture *hw)
|
|||
if (gen->base == hw->base)
|
||||
return true;
|
||||
/* is the generic aperture base inside the hw base->hw base+size */
|
||||
if (gen->base > hw->base && gen->base <= hw->base + hw->size)
|
||||
if (gen->base > hw->base && gen->base < hw->base + hw->size)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -53,11 +53,8 @@
|
|||
#define LCDC_SIZE 0x04
|
||||
#define SIZE_XMAX(x) ((((x) >> 4) & 0x3f) << 20)
|
||||
|
||||
#ifdef CONFIG_ARCH_MX1
|
||||
#define SIZE_YMAX(y) ((y) & 0x1ff)
|
||||
#else
|
||||
#define SIZE_YMAX(y) ((y) & 0x3ff)
|
||||
#endif
|
||||
#define YMAX_MASK (cpu_is_mx1() ? 0x1ff : 0x3ff)
|
||||
#define SIZE_YMAX(y) ((y) & YMAX_MASK)
|
||||
|
||||
#define LCDC_VPW 0x08
|
||||
#define VPW_VPW(x) ((x) & 0x3ff)
|
||||
|
@ -623,7 +620,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
|
|||
if (var->right_margin > 255)
|
||||
printk(KERN_ERR "%s: invalid right_margin %d\n",
|
||||
info->fix.id, var->right_margin);
|
||||
if (var->yres < 1 || var->yres > 511)
|
||||
if (var->yres < 1 || var->yres > YMAX_MASK)
|
||||
printk(KERN_ERR "%s: invalid yres %d\n",
|
||||
info->fix.id, var->yres);
|
||||
if (var->vsync_len > 100)
|
||||
|
|
|
@ -787,6 +787,9 @@ static int sh_hdmi_read_edid(struct sh_hdmi *hdmi)
|
|||
found_rate_error = rate_error;
|
||||
}
|
||||
|
||||
hdmi->var.width = hdmi->monspec.max_x * 10;
|
||||
hdmi->var.height = hdmi->monspec.max_y * 10;
|
||||
|
||||
/*
|
||||
* TODO 1: if no ->info is present, postpone running the config until
|
||||
* after ->info first gets registered.
|
||||
|
@ -960,8 +963,12 @@ static bool sh_hdmi_must_reconfigure(struct sh_hdmi *hdmi)
|
|||
dev_dbg(info->dev, "Old %ux%u, new %ux%u\n",
|
||||
mode1.xres, mode1.yres, mode2.xres, mode2.yres);
|
||||
|
||||
if (fb_mode_is_equal(&mode1, &mode2))
|
||||
if (fb_mode_is_equal(&mode1, &mode2)) {
|
||||
/* It can be a different monitor with an equal video-mode */
|
||||
old_var->width = new_var->width;
|
||||
old_var->height = new_var->height;
|
||||
return false;
|
||||
}
|
||||
|
||||
dev_dbg(info->dev, "Switching %u -> %u lines\n",
|
||||
mode1.yres, mode2.yres);
|
||||
|
@ -1057,8 +1064,11 @@ static void sh_hdmi_edid_work_fn(struct work_struct *work)
|
|||
* on, if we run a resume here, the logo disappears
|
||||
*/
|
||||
if (lock_fb_info(hdmi->info)) {
|
||||
sh_hdmi_display_on(hdmi, hdmi->info);
|
||||
unlock_fb_info(hdmi->info);
|
||||
struct fb_info *info = hdmi->info;
|
||||
info->var.width = hdmi->var.width;
|
||||
info->var.height = hdmi->var.height;
|
||||
sh_hdmi_display_on(hdmi, info);
|
||||
unlock_fb_info(info);
|
||||
}
|
||||
} else {
|
||||
/* New monitor or have to wake up */
|
||||
|
|
|
@ -54,8 +54,8 @@ static int lcdc_shared_regs[] = {
|
|||
};
|
||||
#define NR_SHARED_REGS ARRAY_SIZE(lcdc_shared_regs)
|
||||
|
||||
#define DEFAULT_XRES 1280
|
||||
#define DEFAULT_YRES 1024
|
||||
#define MAX_XRES 1920
|
||||
#define MAX_YRES 1080
|
||||
|
||||
static unsigned long lcdc_offs_mainlcd[NR_CH_REGS] = {
|
||||
[LDDCKPAT1R] = 0x400,
|
||||
|
@ -914,22 +914,12 @@ static int sh_mobile_check_var(struct fb_var_screeninfo *var, struct fb_info *in
|
|||
{
|
||||
struct sh_mobile_lcdc_chan *ch = info->par;
|
||||
|
||||
if (var->xres < 160 || var->xres > 1920 ||
|
||||
var->yres < 120 || var->yres > 1080 ||
|
||||
var->left_margin < 32 || var->left_margin > 320 ||
|
||||
var->right_margin < 12 || var->right_margin > 240 ||
|
||||
var->upper_margin < 12 || var->upper_margin > 120 ||
|
||||
var->lower_margin < 1 || var->lower_margin > 64 ||
|
||||
var->hsync_len < 32 || var->hsync_len > 240 ||
|
||||
var->vsync_len < 2 || var->vsync_len > 64 ||
|
||||
var->pixclock < 6000 || var->pixclock > 40000 ||
|
||||
if (var->xres > MAX_XRES || var->yres > MAX_YRES ||
|
||||
var->xres * var->yres * (ch->cfg.bpp / 8) * 2 > info->fix.smem_len) {
|
||||
dev_warn(info->dev, "Invalid info: %u %u %u %u %u %u %u %u %u!\n",
|
||||
var->xres, var->yres,
|
||||
var->left_margin, var->right_margin,
|
||||
var->upper_margin, var->lower_margin,
|
||||
var->hsync_len, var->vsync_len,
|
||||
var->pixclock);
|
||||
dev_warn(info->dev, "Invalid info: %u-%u-%u-%u x %u-%u-%u-%u @ %ukHz!\n",
|
||||
var->left_margin, var->xres, var->right_margin, var->hsync_len,
|
||||
var->upper_margin, var->yres, var->lower_margin, var->vsync_len,
|
||||
PICOS2KHZ(var->pixclock));
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
|
@ -1226,7 +1216,7 @@ static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
if (!mode)
|
||||
max_size = DEFAULT_XRES * DEFAULT_YRES;
|
||||
max_size = MAX_XRES * MAX_YRES;
|
||||
else if (max_cfg)
|
||||
dev_dbg(&pdev->dev, "Found largest videomode %ux%u\n",
|
||||
max_cfg->xres, max_cfg->yres);
|
||||
|
@ -1238,12 +1228,14 @@ static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev)
|
|||
mode = &default_720p;
|
||||
num_cfg = 1;
|
||||
} else {
|
||||
num_cfg = ch->cfg.num_cfg;
|
||||
num_cfg = cfg->num_cfg;
|
||||
}
|
||||
|
||||
fb_videomode_to_modelist(mode, num_cfg, &info->modelist);
|
||||
|
||||
fb_videomode_to_var(var, mode);
|
||||
var->width = cfg->lcd_size_cfg.width;
|
||||
var->height = cfg->lcd_size_cfg.height;
|
||||
/* Default Y virtual resolution is 2x panel size */
|
||||
var->yres_virtual = var->yres * 2;
|
||||
var->activate = FB_ACTIVATE_NOW;
|
||||
|
|
Loading…
Reference in a new issue