diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-07 09:53:58 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-07 09:53:58 -0700 |
commit | b5a8466d37d30cfcc8015789f4a3f0c44b6c7bc6 (patch) | |
tree | 26680b8ecd520af38149d67736372316052a540b /drivers/video | |
parent | 1612c382ffbdf1f673caec76502b1c00e6d35363 (diff) | |
parent | 6ba592fa014f21f35a8ee8da4ca7b95a018f13e8 (diff) | |
download | lwn-b5a8466d37d30cfcc8015789f4a3f0c44b6c7bc6.tar.gz lwn-b5a8466d37d30cfcc8015789f4a3f0c44b6c7bc6.zip |
Merge tag 'for-5.20/fbdev-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev
Pull fbdev updates from Helge Deller:
"The two major changes in this patchset corrects VGA modes, color
handling and various other smaller fixes in the Atari framebuffer (by
Geert Uytterhoeven), and devm_* conversion, platform data fixes and
header cleanups in the imxfb driver (by Uwe Kleine-König).
Other small patches clean up code in sa1100fb, cirrusfb and omapfb,
fix a refcount leak in amba-clcd (by Liang He), and adds parameter
checks to arkfb, i740fb, vt8623fb and s3fb (by Zheyu Ma)"
* tag 'for-5.20/fbdev-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev: (27 commits)
video: fbdev: s3fb: Check the size of screen before memset_io()
video: fbdev: arkfb: Check the size of screen before memset_io()
video: fbdev: vt8623fb: Check the size of screen before memset_io()
video: fbdev: i740fb: Check the argument of i740_calc_vclk()
video: fbdev: arkfb: Fix a divide-by-zero bug in ark_set_pixclock()
video: fbdev: imxfb: fix return value check in imxfb_probe()
video: fbdev: sis: fix typos in SiS_GetModeID()
video: fbdev: imxfb: Convert request_mem_region + ioremap to devm_ioremap_resource
video: fbdev: imxfb: Fold <linux/platform_data/video-imxfb.h> into only user
video: fbdev: imxfb: Drop unused symbols from header
video: fbdev: imxfb: Drop platform data support
video: fbdev: amba-clcd: Fix refcount leak bugs
video: fbdev: omapfb: Unexport omap*_update_window_async()
video: fbdev: atari: Remove backward bug-compatibility
video: fbdev: atari: Remove unused definitions and variables
video: fbdev: atari: Fix VGA modes
video: fbdev: atari: Fix TT High video mode vertical refresh
video: fbdev: atari: Remove unneeded casts to void *
video: fbdev: atari: Remove unneeded casts from void *
video: fbdev: atari: Fix ext_setcolreg()
...
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/fbdev/68328fb.c | 7 | ||||
-rw-r--r-- | drivers/video/fbdev/amba-clcd.c | 24 | ||||
-rw-r--r-- | drivers/video/fbdev/amifb.c | 15 | ||||
-rw-r--r-- | drivers/video/fbdev/arkfb.c | 9 | ||||
-rw-r--r-- | drivers/video/fbdev/atafb.c | 103 | ||||
-rw-r--r-- | drivers/video/fbdev/cirrusfb.c | 2 | ||||
-rw-r--r-- | drivers/video/fbdev/dnfb.c | 2 | ||||
-rw-r--r-- | drivers/video/fbdev/fm2fb.c | 4 | ||||
-rw-r--r-- | drivers/video/fbdev/hpfb.c | 4 | ||||
-rw-r--r-- | drivers/video/fbdev/i740fb.c | 9 | ||||
-rw-r--r-- | drivers/video/fbdev/imxfb.c | 134 | ||||
-rw-r--r-- | drivers/video/fbdev/omap/hwa742.c | 3 | ||||
-rw-r--r-- | drivers/video/fbdev/omap/omapfb.h | 9 | ||||
-rw-r--r-- | drivers/video/fbdev/omap/omapfb_main.c | 3 | ||||
-rw-r--r-- | drivers/video/fbdev/q40fb.c | 2 | ||||
-rw-r--r-- | drivers/video/fbdev/s3fb.c | 2 | ||||
-rw-r--r-- | drivers/video/fbdev/sa1100fb.c | 41 | ||||
-rw-r--r-- | drivers/video/fbdev/sis/init.c | 4 | ||||
-rw-r--r-- | drivers/video/fbdev/skeletonfb.c | 6 | ||||
-rw-r--r-- | drivers/video/fbdev/valkyriefb.c | 10 | ||||
-rw-r--r-- | drivers/video/fbdev/vt8623fb.c | 2 |
21 files changed, 134 insertions, 261 deletions
diff --git a/drivers/video/fbdev/68328fb.c b/drivers/video/fbdev/68328fb.c index 9811f1bad8d4..7db03ed77c76 100644 --- a/drivers/video/fbdev/68328fb.c +++ b/drivers/video/fbdev/68328fb.c @@ -84,9 +84,6 @@ static const struct fb_fix_screeninfo mc68x328fb_fix __initconst = { /* * Interface used by the world */ -int mc68x328fb_init(void); -int mc68x328fb_setup(char *); - static int mc68x328fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info); static int mc68x328fb_set_par(struct fb_info *info); @@ -403,7 +400,7 @@ static int mc68x328fb_mmap(struct fb_info *info, struct vm_area_struct *vma) #endif } -int __init mc68x328fb_setup(char *options) +static int __init mc68x328fb_setup(char *options) { if (!options || !*options) return 1; @@ -414,7 +411,7 @@ int __init mc68x328fb_setup(char *options) * Initialisation */ -int __init mc68x328fb_init(void) +static int __init mc68x328fb_init(void) { #ifndef MODULE char *option = NULL; diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c index 8080116aea84..f65c96d1394d 100644 --- a/drivers/video/fbdev/amba-clcd.c +++ b/drivers/video/fbdev/amba-clcd.c @@ -698,16 +698,18 @@ static int clcdfb_of_init_display(struct clcd_fb *fb) return -ENODEV; panel = of_graph_get_remote_port_parent(endpoint); - if (!panel) - return -ENODEV; + if (!panel) { + err = -ENODEV; + goto out_endpoint_put; + } err = clcdfb_of_get_backlight(&fb->dev->dev, fb->panel); if (err) - return err; + goto out_panel_put; err = clcdfb_of_get_mode(&fb->dev->dev, panel, fb->panel); if (err) - return err; + goto out_panel_put; err = of_property_read_u32(fb->dev->dev.of_node, "max-memory-bandwidth", &max_bandwidth); @@ -736,11 +738,21 @@ static int clcdfb_of_init_display(struct clcd_fb *fb) if (of_property_read_u32_array(endpoint, "arm,pl11x,tft-r0g0b0-pads", - tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0) - return -ENOENT; + tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0) { + err = -ENOENT; + goto out_panel_put; + } + + of_node_put(panel); + of_node_put(endpoint); return clcdfb_of_init_tft_panel(fb, tft_r0b0g0[0], tft_r0b0g0[1], tft_r0b0g0[2]); +out_panel_put: + of_node_put(panel); +out_endpoint_put: + of_node_put(endpoint); + return err; } static int clcdfb_of_vram_setup(struct clcd_fb *fb) diff --git a/drivers/video/fbdev/amifb.c b/drivers/video/fbdev/amifb.c index 6e07a97bbd31..d88265dbebf4 100644 --- a/drivers/video/fbdev/amifb.c +++ b/drivers/video/fbdev/amifb.c @@ -2540,27 +2540,16 @@ static int amifb_blank(int blank, struct fb_info *info) static int amifb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { - if (var->vmode & FB_VMODE_YWRAP) { - if (var->yoffset < 0 || - var->yoffset >= info->var.yres_virtual || var->xoffset) - return -EINVAL; - } else { + if (!(var->vmode & FB_VMODE_YWRAP)) { /* * TODO: There will be problems when xpan!=1, so some columns * on the right side will never be seen */ if (var->xoffset + info->var.xres > - upx(16 << maxfmode, info->var.xres_virtual) || - var->yoffset + info->var.yres > info->var.yres_virtual) + upx(16 << maxfmode, info->var.xres_virtual)) return -EINVAL; } ami_pan_var(var, info); - info->var.xoffset = var->xoffset; - info->var.yoffset = var->yoffset; - if (var->vmode & FB_VMODE_YWRAP) - info->var.vmode |= FB_VMODE_YWRAP; - else - info->var.vmode &= ~FB_VMODE_YWRAP; return 0; } diff --git a/drivers/video/fbdev/arkfb.c b/drivers/video/fbdev/arkfb.c index eb3e47c58c5f..a2a381631628 100644 --- a/drivers/video/fbdev/arkfb.c +++ b/drivers/video/fbdev/arkfb.c @@ -781,7 +781,12 @@ static int arkfb_set_par(struct fb_info *info) return -EINVAL; } - ark_set_pixclock(info, (hdiv * info->var.pixclock) / hmul); + value = (hdiv * info->var.pixclock) / hmul; + if (!value) { + fb_dbg(info, "invalid pixclock\n"); + value = 1; + } + ark_set_pixclock(info, value); svga_set_timings(par->state.vgabase, &ark_timing_regs, &(info->var), hmul, hdiv, (info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, (info->var.vmode & FB_VMODE_INTERLACED) ? 2 : 1, @@ -792,6 +797,8 @@ static int arkfb_set_par(struct fb_info *info) value = ((value * hmul / hdiv) / 8) - 5; vga_wcrt(par->state.vgabase, 0x42, (value + 1) / 2); + if (screen_size > info->screen_size) + screen_size = info->screen_size; memset_io(info->screen_base, 0x00, screen_size); /* Device and screen back on */ svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); diff --git a/drivers/video/fbdev/atafb.c b/drivers/video/fbdev/atafb.c index 52a35b661643..2bc4089865e6 100644 --- a/drivers/video/fbdev/atafb.c +++ b/drivers/video/fbdev/atafb.c @@ -236,8 +236,6 @@ static int *MV300_reg = MV300_reg_8bit; #endif /* ATAFB_EXT */ -static int inverse; - /* * struct fb_ops { * * open/release and usage marking @@ -467,27 +465,27 @@ static struct fb_videomode atafb_modedb[] __initdata = { { /* 320x200, 15 kHz, 60 Hz (ST low) */ "st-low", 60, 320, 200, 32000, 32, 16, 31, 14, 96, 4, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + 0, FB_VMODE_NONINTERLACED }, { /* 640x200, 15 kHz, 60 Hz (ST medium) */ "st-mid", 60, 640, 200, 32000, 32, 16, 31, 14, 96, 4, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + 0, FB_VMODE_NONINTERLACED }, { /* 640x400, 30.25 kHz, 63.5 Hz (ST high) */ "st-high", 63, 640, 400, 32000, 128, 0, 40, 14, 128, 4, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + 0, FB_VMODE_NONINTERLACED }, { /* 320x480, 15 kHz, 60 Hz (TT low) */ "tt-low", 60, 320, 480, 31041, 120, 100, 8, 16, 140, 30, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + 0, FB_VMODE_NONINTERLACED }, { /* 640x480, 29 kHz, 57 Hz (TT medium) */ "tt-mid", 60, 640, 480, 31041, 120, 100, 8, 16, 140, 30, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + 0, FB_VMODE_NONINTERLACED }, { /* 1280x960, 72 kHz, 72 Hz (TT high) */ - "tt-high", 57, 1280, 960, 7760, 260, 60, 36, 4, 192, 4, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + "tt-high", 72, 1280, 960, 7760, 260, 60, 36, 4, 192, 4, + 0, FB_VMODE_NONINTERLACED }, /* @@ -496,12 +494,12 @@ static struct fb_videomode atafb_modedb[] __initdata = { { /* 640x480, 31 kHz, 60 Hz (VGA) */ - "vga", 63.5, 640, 480, 32000, 18, 42, 31, 11, 96, 3, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + "vga", 60, 640, 480, 39721, 42, 18, 31, 11, 100, 3, + 0, FB_VMODE_NONINTERLACED }, { /* 640x400, 31 kHz, 70 Hz (VGA) */ - "vga70", 70, 640, 400, 32000, 18, 42, 31, 11, 96, 3, - FB_SYNC_VERT_HIGH_ACT | FB_SYNC_COMP_HIGH_ACT, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + "vga70", 70, 640, 400, 39721, 42, 18, 31, 11, 100, 3, + FB_SYNC_VERT_HIGH_ACT | FB_SYNC_COMP_HIGH_ACT, FB_VMODE_NONINTERLACED }, /* @@ -511,7 +509,7 @@ static struct fb_videomode atafb_modedb[] __initdata = { { /* 896x608, 31 kHz, 60 Hz (Falcon High) */ "falh", 60, 896, 608, 32000, 18, 42, 31, 1, 96,3, - 0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP + 0, FB_VMODE_NONINTERLACED }, }; @@ -1010,10 +1008,6 @@ static int falcon_decode_var(struct fb_var_screeninfo *var, else if (yres_virtual < yres) yres_virtual = yres; - /* backward bug-compatibility */ - if (var->pixclock > 1) - var->pixclock -= 1; - par->hw.falcon.line_width = bpp * xres / 16; par->hw.falcon.line_offset = bpp * (xres_virtual - xres) / 16; @@ -1072,8 +1066,6 @@ static int falcon_decode_var(struct fb_var_screeninfo *var, xstretch = 2; /* Double pixel width only for hicolor */ /* Default values are used for vert./hor. timing if no pixelclock given. */ if (var->pixclock == 0) { - int linesize; - /* Choose master pixelclock depending on hor. timing */ plen = 1 * xstretch; if ((plen * xres + f25.right + f25.hsync + f25.left) * @@ -1092,7 +1084,6 @@ static int falcon_decode_var(struct fb_var_screeninfo *var, left_margin = pclock->left / plen; right_margin = pclock->right / plen; hsync_len = pclock->hsync / plen; - linesize = left_margin + xres + right_margin + hsync_len; upper_margin = 31; lower_margin = 11; vsync_len = 3; @@ -1641,7 +1632,7 @@ static irqreturn_t falcon_vbl_switcher(int irq, void *dummy) static int falcon_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { - struct atafb_par *par = (struct atafb_par *)info->par; + struct atafb_par *par = info->par; int xoffset; int bpp = info->var.bits_per_pixel; @@ -2208,6 +2199,10 @@ static int ext_setcolreg(unsigned int regno, unsigned int red, if (regno > 255) return 1; + red >>= 8; + green >>= 8; + blue >>= 8; + switch (external_card_type) { case IS_VGA: OUTB(0x3c8, regno); @@ -2261,7 +2256,7 @@ static void set_screen_base(void *s_base) static int pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { - struct atafb_par *par = (struct atafb_par *)info->par; + struct atafb_par *par = info->par; if (!fbhw->set_screen_base || (!ATARIHW_PRESENT(EXTD_SHIFTER) && var->xoffset)) @@ -2407,55 +2402,19 @@ static void atafb_set_disp(struct fb_info *info) static int atafb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { - int xoffset = var->xoffset; - int yoffset = var->yoffset; - int err; - - if (var->vmode & FB_VMODE_YWRAP) { - if (yoffset < 0 || yoffset >= info->var.yres_virtual || xoffset) - return -EINVAL; - } else { - if (xoffset + info->var.xres > info->var.xres_virtual || - yoffset + info->var.yres > info->var.yres_virtual) - return -EINVAL; - } - - if (fbhw->pan_display) { - err = fbhw->pan_display(var, info); - if (err) - return err; - } else + if (!fbhw->pan_display) return -EINVAL; - info->var.xoffset = xoffset; - info->var.yoffset = yoffset; - - if (var->vmode & FB_VMODE_YWRAP) - info->var.vmode |= FB_VMODE_YWRAP; - else - info->var.vmode &= ~FB_VMODE_YWRAP; - - return 0; + return fbhw->pan_display(var, info); } /* * generic drawing routines; imageblit needs updating for image depth > 1 */ -#if BITS_PER_LONG == 32 -#define BYTES_PER_LONG 4 -#define SHIFT_PER_LONG 5 -#elif BITS_PER_LONG == 64 -#define BYTES_PER_LONG 8 -#define SHIFT_PER_LONG 6 -#else -#define Please update me -#endif - - static void atafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) { - struct atafb_par *par = (struct atafb_par *)info->par; + struct atafb_par *par = info->par; int x2, y2; u32 width, height; @@ -2498,7 +2457,7 @@ static void atafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area) { - struct atafb_par *par = (struct atafb_par *)info->par; + struct atafb_par *par = info->par; int x2, y2; u32 dx, dy, sx, sy, width, height; int rev_copy = 0; @@ -2552,10 +2511,8 @@ static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area) static void atafb_imageblit(struct fb_info *info, const struct fb_image *image) { - struct atafb_par *par = (struct atafb_par *)info->par; + struct atafb_par *par = info->par; int x2, y2; - unsigned long *dst; - int dst_idx; const char *src; u32 dx, dy, width, height, pitch; @@ -2582,10 +2539,6 @@ static void atafb_imageblit(struct fb_info *info, const struct fb_image *image) if (image->depth == 1) { // used for font data - dst = (unsigned long *) - ((unsigned long)info->screen_base & ~(BYTES_PER_LONG - 1)); - dst_idx = ((unsigned long)info->screen_base & (BYTES_PER_LONG - 1)) * 8; - dst_idx += dy * par->next_line * 8 + dx; src = image->data; pitch = (image->width + 7) / 8; while (height--) { @@ -2622,14 +2575,14 @@ atafb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) switch (cmd) { #ifdef FBCMD_GET_CURRENTPAR case FBCMD_GET_CURRENTPAR: - if (copy_to_user((void *)arg, (void *)¤t_par, + if (copy_to_user((void *)arg, ¤t_par, sizeof(struct atafb_par))) return -EFAULT; return 0; #endif #ifdef FBCMD_SET_CURRENTPAR case FBCMD_SET_CURRENTPAR: - if (copy_from_user((void *)¤t_par, (void *)arg, + if (copy_from_user(¤t_par, (void *)arg, sizeof(struct atafb_par))) return -EFAULT; ata_set_par(¤t_par); @@ -2695,7 +2648,7 @@ static int atafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) * hw par just decoded */ static int atafb_set_par(struct fb_info *info) { - struct atafb_par *par = (struct atafb_par *)info->par; + struct atafb_par *par = info->par; /* Decode wanted screen parameters */ fbhw->decode_var(&info->var, par); @@ -2981,7 +2934,7 @@ static void __init atafb_setup_user(char *spec) } } -int __init atafb_setup(char *options) +static int __init atafb_setup(char *options) { char *this_opt; int temp; @@ -2996,7 +2949,7 @@ int __init atafb_setup(char *options) default_par = temp; mode_option = this_opt; } else if (!strcmp(this_opt, "inverse")) - inverse = 1; + fb_invert_cmaps(); else if (!strncmp(this_opt, "hwscroll_", 9)) { hwscroll = simple_strtoul(this_opt + 9, NULL, 10); if (hwscroll < 0) diff --git a/drivers/video/fbdev/cirrusfb.c b/drivers/video/fbdev/cirrusfb.c index 51e072c03e1c..a41a75841e10 100644 --- a/drivers/video/fbdev/cirrusfb.c +++ b/drivers/video/fbdev/cirrusfb.c @@ -2301,7 +2301,7 @@ err_release_fb: return error; } -void cirrusfb_zorro_unregister(struct zorro_dev *z) +static void cirrusfb_zorro_unregister(struct zorro_dev *z) { struct fb_info *info = zorro_get_drvdata(z); diff --git a/drivers/video/fbdev/dnfb.c b/drivers/video/fbdev/dnfb.c index 3688f9165848..18405c402ec1 100644 --- a/drivers/video/fbdev/dnfb.c +++ b/drivers/video/fbdev/dnfb.c @@ -280,7 +280,7 @@ static struct platform_device dnfb_device = { .name = "dnfb", }; -int __init dnfb_init(void) +static int __init dnfb_init(void) { int ret; diff --git a/drivers/video/fbdev/fm2fb.c b/drivers/video/fbdev/fm2fb.c index 3b727d528fde..942e382cf1cf 100644 --- a/drivers/video/fbdev/fm2fb.c +++ b/drivers/video/fbdev/fm2fb.c @@ -293,7 +293,7 @@ static int fm2fb_probe(struct zorro_dev *z, const struct zorro_device_id *id) return 0; } -int __init fm2fb_setup(char *options) +static int __init fm2fb_setup(char *options) { char *this_opt; @@ -309,7 +309,7 @@ int __init fm2fb_setup(char *options) return 0; } -int __init fm2fb_init(void) +static int __init fm2fb_init(void) { char *option = NULL; diff --git a/drivers/video/fbdev/hpfb.c b/drivers/video/fbdev/hpfb.c index 8d418abdd767..cdd44e5deafe 100644 --- a/drivers/video/fbdev/hpfb.c +++ b/drivers/video/fbdev/hpfb.c @@ -375,7 +375,7 @@ static struct dio_driver hpfb_driver = { .remove = hpfb_remove_one, }; -int __init hpfb_init(void) +static int __init hpfb_init(void) { unsigned int sid; unsigned char i; @@ -415,7 +415,7 @@ int __init hpfb_init(void) return 0; } -void __exit hpfb_cleanup_module(void) +static void __exit hpfb_cleanup_module(void) { dio_unregister_driver(&hpfb_driver); } diff --git a/drivers/video/fbdev/i740fb.c b/drivers/video/fbdev/i740fb.c index 09dd85553d4f..7f09a0daaaa2 100644 --- a/drivers/video/fbdev/i740fb.c +++ b/drivers/video/fbdev/i740fb.c @@ -400,7 +400,7 @@ static int i740fb_decode_var(const struct fb_var_screeninfo *var, u32 xres, right, hslen, left, xtotal; u32 yres, lower, vslen, upper, ytotal; u32 vxres, xoffset, vyres, yoffset; - u32 bpp, base, dacspeed24, mem; + u32 bpp, base, dacspeed24, mem, freq; u8 r7; int i; @@ -643,7 +643,12 @@ static int i740fb_decode_var(const struct fb_var_screeninfo *var, par->atc[VGA_ATC_OVERSCAN] = 0; /* Calculate VCLK that most closely matches the requested dot clock */ - i740_calc_vclk((((u32)1e9) / var->pixclock) * (u32)(1e3), par); + freq = (((u32)1e9) / var->pixclock) * (u32)(1e3); + if (freq < I740_RFREQ_FIX) { + fb_dbg(info, "invalid pixclock\n"); + freq = I740_RFREQ_FIX; + } + i740_calc_vclk(freq, par); /* Since we program the clocks ourselves, always use VCLK2. */ par->misc |= 0x0C; diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c index a2f644c97f28..d97d7456d15a 100644 --- a/drivers/video/fbdev/imxfb.c +++ b/drivers/video/fbdev/imxfb.c @@ -41,7 +41,18 @@ #include <video/of_videomode.h> #include <video/videomode.h> -#include <linux/platform_data/video-imxfb.h> +#define PCR_TFT (1 << 31) +#define PCR_BPIX_8 (3 << 25) +#define PCR_BPIX_12 (4 << 25) +#define PCR_BPIX_16 (5 << 25) +#define PCR_BPIX_18 (6 << 25) + +struct imx_fb_videomode { + struct fb_videomode mode; + u32 pcr; + bool aus_mode; + unsigned char bpp; +}; /* * Complain if VAR is out of range. @@ -656,7 +667,6 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf static int imxfb_init_fbinfo(struct platform_device *pdev) { - struct imx_fb_platform_data *pdata = dev_get_platdata(&pdev->dev); struct fb_info *info = platform_get_drvdata(pdev); struct imxfb_info *fbi = info->par; struct device_node *np; @@ -690,25 +700,20 @@ static int imxfb_init_fbinfo(struct platform_device *pdev) info->fbops = &imxfb_ops; info->flags = FBINFO_FLAG_DEFAULT | FBINFO_READS_FAST; - if (pdata) { - fbi->lscr1 = pdata->lscr1; - fbi->dmacr = pdata->dmacr; - fbi->pwmr = pdata->pwmr; - } else { - np = pdev->dev.of_node; - info->var.grayscale = of_property_read_bool(np, - "cmap-greyscale"); - fbi->cmap_inverse = of_property_read_bool(np, "cmap-inverse"); - fbi->cmap_static = of_property_read_bool(np, "cmap-static"); - fbi->lscr1 = IMXFB_LSCR1_DEFAULT; + np = pdev->dev.of_node; + info->var.grayscale = of_property_read_bool(np, + "cmap-greyscale"); + fbi->cmap_inverse = of_property_read_bool(np, "cmap-inverse"); + fbi->cmap_static = of_property_read_bool(np, "cmap-static"); - of_property_read_u32(np, "fsl,lpccr", &fbi->pwmr); + fbi->lscr1 = IMXFB_LSCR1_DEFAULT; - of_property_read_u32(np, "fsl,lscr1", &fbi->lscr1); + of_property_read_u32(np, "fsl,lpccr", &fbi->pwmr); - of_property_read_u32(np, "fsl,dmacr", &fbi->dmacr); - } + of_property_read_u32(np, "fsl,lscr1", &fbi->lscr1); + + of_property_read_u32(np, "fsl,dmacr", &fbi->dmacr); return 0; } @@ -863,10 +868,10 @@ static int imxfb_probe(struct platform_device *pdev) struct imxfb_info *fbi; struct lcd_device *lcd; struct fb_info *info; - struct imx_fb_platform_data *pdata; struct resource *res; struct imx_fb_videomode *m; const struct of_device_id *of_id; + struct device_node *display_np; int ret, i; int bytes_per_pixel; @@ -884,8 +889,6 @@ static int imxfb_probe(struct platform_device *pdev) if (!res) return -ENODEV; - pdata = dev_get_platdata(&pdev->dev); - info = framebuffer_alloc(sizeof(struct imxfb_info), &pdev->dev); if (!info) return -ENOMEM; @@ -898,43 +901,34 @@ static int imxfb_probe(struct platform_device *pdev) if (ret < 0) goto failed_init; - if (pdata) { - if (!fb_mode) - fb_mode = pdata->mode[0].mode.name; - - fbi->mode = pdata->mode; - fbi->num_modes = pdata->num_modes; - } else { - struct device_node *display_np; - fb_mode = NULL; - - display_np = of_parse_phandle(pdev->dev.of_node, "display", 0); - if (!display_np) { - dev_err(&pdev->dev, "No display defined in devicetree\n"); - ret = -EINVAL; - goto failed_of_parse; - } + fb_mode = NULL; - /* - * imxfb does not support more modes, we choose only the native - * mode. - */ - fbi->num_modes = 1; - - fbi->mode = devm_kzalloc(&pdev->dev, - sizeof(struct imx_fb_videomode), GFP_KERNEL); - if (!fbi->mode) { - ret = -ENOMEM; - of_node_put(display_np); - goto failed_of_parse; - } + display_np = of_parse_phandle(pdev->dev.of_node, "display", 0); + if (!display_np) { + dev_err(&pdev->dev, "No display defined in devicetree\n"); + ret = -EINVAL; + goto failed_of_parse; + } - ret = imxfb_of_read_mode(&pdev->dev, display_np, fbi->mode); + /* + * imxfb does not support more modes, we choose only the native + * mode. + */ + fbi->num_modes = 1; + + fbi->mode = devm_kzalloc(&pdev->dev, + sizeof(struct imx_fb_videomode), GFP_KERNEL); + if (!fbi->mode) { + ret = -ENOMEM; of_node_put(display_np); - if (ret) - goto failed_of_parse; + goto failed_of_parse; } + ret = imxfb_of_read_mode(&pdev->dev, display_np, fbi->mode); + of_node_put(display_np); + if (ret) + goto failed_of_parse; + /* Calculate maximum bytes used per pixel. In most cases this should * be the same as m->bpp/8 */ m = &fbi->mode[0]; @@ -943,13 +937,6 @@ static int imxfb_probe(struct platform_device *pdev) info->fix.smem_len = max_t(size_t, info->fix.smem_len, m->mode.xres * m->mode.yres * bytes_per_pixel); - res = request_mem_region(res->start, resource_size(res), - DRIVER_NAME); - if (!res) { - ret = -EBUSY; - goto failed_req; - } - fbi->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); if (IS_ERR(fbi->clk_ipg)) { ret = PTR_ERR(fbi->clk_ipg); @@ -983,10 +970,10 @@ static int imxfb_probe(struct platform_device *pdev) goto failed_getclock; } - fbi->regs = ioremap(res->start, resource_size(res)); - if (fbi->regs == NULL) { + fbi->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(fbi->regs)) { dev_err(&pdev->dev, "Cannot map frame buffer registers\n"); - ret = -ENOMEM; + ret = PTR_ERR(fbi->regs); goto failed_ioremap; } @@ -1001,13 +988,6 @@ static int imxfb_probe(struct platform_device *pdev) info->fix.smem_start = fbi->map_dma; - if (pdata && pdata->init) { - ret = pdata->init(fbi->pdev); - if (ret) - goto failed_platform_init; - } - - INIT_LIST_HEAD(&info->modelist); for (i = 0; i < fbi->num_modes; i++) fb_add_videomode(&fbi->mode[i].mode, &info->modelist); @@ -1059,17 +1039,12 @@ failed_lcd: failed_register: fb_dealloc_cmap(&info->cmap); failed_cmap: - if (pdata && pdata->exit) - pdata->exit(fbi->pdev); -failed_platform_init: dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer, fbi->map_dma); failed_map: - iounmap(fbi->regs); failed_ioremap: failed_getclock: release_mem_region(res->start, resource_size(res)); -failed_req: failed_of_parse: kfree(info->pseudo_palette); failed_init: @@ -1079,26 +1054,15 @@ failed_init: static int imxfb_remove(struct platform_device *pdev) { - struct imx_fb_platform_data *pdata; struct fb_info *info = platform_get_drvdata(pdev); struct imxfb_info *fbi = info->par; - struct resource *res; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -EINVAL; imxfb_disable_controller(fbi); unregister_framebuffer(info); fb_dealloc_cmap(&info->cmap); - pdata = dev_get_platdata(&pdev->dev); - if (pdata && pdata->exit) - pdata->exit(fbi->pdev); dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer, fbi->map_dma); - iounmap(fbi->regs); - release_mem_region(res->start, resource_size(res)); kfree(info->pseudo_palette); framebuffer_release(info); diff --git a/drivers/video/fbdev/omap/hwa742.c b/drivers/video/fbdev/omap/hwa742.c index 9d9fe5c3a7a1..161fc65d6b57 100644 --- a/drivers/video/fbdev/omap/hwa742.c +++ b/drivers/video/fbdev/omap/hwa742.c @@ -489,7 +489,7 @@ static void hwa742_update_window_auto(struct timer_list *unused) __hwa742_update_window_auto(false); } -int hwa742_update_window_async(struct fb_info *fbi, +static int hwa742_update_window_async(struct fb_info *fbi, struct omapfb_update_window *win, void (*complete_callback)(void *arg), void *complete_callback_data) @@ -522,7 +522,6 @@ int hwa742_update_window_async(struct fb_info *fbi, out: return r; } -EXPORT_SYMBOL(hwa742_update_window_async); static int hwa742_setup_plane(int plane, int channel_out, unsigned long offset, int screen_width, diff --git a/drivers/video/fbdev/omap/omapfb.h b/drivers/video/fbdev/omap/omapfb.h index beb841ccb99c..ab1cb6e7f5f8 100644 --- a/drivers/video/fbdev/omap/omapfb.h +++ b/drivers/video/fbdev/omap/omapfb.h @@ -227,13 +227,4 @@ extern int omapfb_register_client(struct omapfb_notifier_block *nb, omapfb_notifier_callback_t callback, void *callback_data); extern int omapfb_unregister_client(struct omapfb_notifier_block *nb); -extern int omapfb_update_window_async(struct fb_info *fbi, - struct omapfb_update_window *win, - void (*callback)(void *), - void *callback_data); -extern int hwa742_update_window_async(struct fb_info *fbi, - struct omapfb_update_window *win, - void (*callback)(void *), - void *callback_data); - #endif /* __OMAPFB_H */ diff --git a/drivers/video/fbdev/omap/omapfb_main.c b/drivers/video/fbdev/omap/omapfb_main.c index 292fcb0a24fc..dfb4ddc45701 100644 --- a/drivers/video/fbdev/omap/omapfb_main.c +++ b/drivers/video/fbdev/omap/omapfb_main.c @@ -668,7 +668,7 @@ static int omapfb_set_par(struct fb_info *fbi) return r; } -int omapfb_update_window_async(struct fb_info *fbi, +static int omapfb_update_window_async(struct fb_info *fbi, struct omapfb_update_window *win, void (*callback)(void *), void *callback_data) @@ -714,7 +714,6 @@ int omapfb_update_window_async(struct fb_info *fbi, return fbdev->ctrl->update_window(fbi, win, callback, callback_data); } -EXPORT_SYMBOL(omapfb_update_window_async); static int omapfb_update_win(struct fb_info *fbi, struct omapfb_update_window *win) diff --git a/drivers/video/fbdev/q40fb.c b/drivers/video/fbdev/q40fb.c index 079a2a7fb2c5..964bc88bb89c 100644 --- a/drivers/video/fbdev/q40fb.c +++ b/drivers/video/fbdev/q40fb.c @@ -133,7 +133,7 @@ static struct platform_device q40fb_device = { .name = "q40fb", }; -int __init q40fb_init(void) +static int __init q40fb_init(void) { int ret = 0; diff --git a/drivers/video/fbdev/s3fb.c b/drivers/video/fbdev/s3fb.c index b93c8eb02336..5069f6f67923 100644 --- a/drivers/video/fbdev/s3fb.c +++ b/drivers/video/fbdev/s3fb.c @@ -905,6 +905,8 @@ static int s3fb_set_par(struct fb_info *info) value = clamp((htotal + hsstart + 1) / 2 + 2, hsstart + 4, htotal + 1); svga_wcrt_multi(par->state.vgabase, s3_dtpc_regs, value); + if (screen_size > info->screen_size) + screen_size = info->screen_size; memset_io(info->screen_base, 0x00, screen_size); /* Device and screen back on */ svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); diff --git a/drivers/video/fbdev/sa1100fb.c b/drivers/video/fbdev/sa1100fb.c index e31cf63b0a62..017c8efe8267 100644 --- a/drivers/video/fbdev/sa1100fb.c +++ b/drivers/video/fbdev/sa1100fb.c @@ -1224,47 +1224,6 @@ int __init sa1100fb_init(void) return platform_driver_register(&sa1100fb_driver); } -int __init sa1100fb_setup(char *options) -{ -#if 0 - char *this_opt; - - if (!options || !*options) - return 0; - - while ((this_opt = strsep(&options, ",")) != NULL) { - - if (!strncmp(this_opt, "bpp:", 4)) - current_par.max_bpp = - simple_strtoul(this_opt + 4, NULL, 0); - - if (!strncmp(this_opt, "lccr0:", 6)) - lcd_shadow.lccr0 = - simple_strtoul(this_opt + 6, NULL, 0); - if (!strncmp(this_opt, "lccr1:", 6)) { - lcd_shadow.lccr1 = - simple_strtoul(this_opt + 6, NULL, 0); - current_par.max_xres = - (lcd_shadow.lccr1 & 0x3ff) + 16; - } - if (!strncmp(this_opt, "lccr2:", 6)) { - lcd_shadow.lccr2 = - simple_strtoul(this_opt + 6, NULL, 0); - current_par.max_yres = - (lcd_shadow. - lccr0 & LCCR0_SDS) ? ((lcd_shadow. - lccr2 & 0x3ff) + - 1) * - 2 : ((lcd_shadow.lccr2 & 0x3ff) + 1); - } - if (!strncmp(this_opt, "lccr3:", 6)) - lcd_shadow.lccr3 = - simple_strtoul(this_opt + 6, NULL, 0); - } -#endif - return 0; -} - module_init(sa1100fb_init); MODULE_DESCRIPTION("StrongARM-1100/1110 framebuffer driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/video/fbdev/sis/init.c b/drivers/video/fbdev/sis/init.c index b568c646a76c..2ba91d62af92 100644 --- a/drivers/video/fbdev/sis/init.c +++ b/drivers/video/fbdev/sis/init.c @@ -355,12 +355,12 @@ SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay, } break; case 400: - if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 800) && (LCDwidth >= 600))) { + if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 800) && (LCDheight >= 600))) { if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth]; } break; case 512: - if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 1024) && (LCDwidth >= 768))) { + if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 1024) && (LCDheight >= 768))) { if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth]; } break; diff --git a/drivers/video/fbdev/skeletonfb.c b/drivers/video/fbdev/skeletonfb.c index d119b1d08007..8ab9a3fbd281 100644 --- a/drivers/video/fbdev/skeletonfb.c +++ b/drivers/video/fbdev/skeletonfb.c @@ -131,8 +131,6 @@ static struct fb_info info; */ static struct xxx_par __initdata current_par; -int xxxfb_init(void); - /** * xxxfb_open - Optional function. Called when the framebuffer is * first accessed. @@ -886,7 +884,7 @@ static struct pci_driver xxxfb_driver = { MODULE_DEVICE_TABLE(pci, xxxfb_id_table); -int __init xxxfb_init(void) +static int __init xxxfb_init(void) { /* * For kernel boot options (in 'video=xxxfb:<options>' format) @@ -967,7 +965,7 @@ static struct platform_device *xxxfb_device; * Only necessary if your driver takes special options, * otherwise we fall back on the generic fb_setup(). */ -int __init xxxfb_setup(char *options) +static int __init xxxfb_setup(char *options) { /* Parse user specified options (`video=xxxfb:') */ } diff --git a/drivers/video/fbdev/valkyriefb.c b/drivers/video/fbdev/valkyriefb.c index a6c9d4f26669..1007023a5e88 100644 --- a/drivers/video/fbdev/valkyriefb.c +++ b/drivers/video/fbdev/valkyriefb.c @@ -90,11 +90,7 @@ struct fb_info_valkyrie { u32 pseudo_palette[16]; }; -/* - * Exported functions - */ -int valkyriefb_init(void); -int valkyriefb_setup(char*); +static int valkyriefb_setup(char*); static int valkyriefb_check_var(struct fb_var_screeninfo *var, struct fb_info *info); @@ -302,7 +298,7 @@ static void __init valkyrie_choose_mode(struct fb_info_valkyrie *p) default_vmode, default_cmode); } -int __init valkyriefb_init(void) +static int __init valkyriefb_init(void) { struct fb_info_valkyrie *p; unsigned long frame_buffer_phys, cmap_regs_phys; @@ -549,7 +545,7 @@ static int __init valkyrie_init_info(struct fb_info *info, /* * Parse user specified options (`video=valkyriefb:') */ -int __init valkyriefb_setup(char *options) +static int __init valkyriefb_setup(char *options) { char *this_opt; diff --git a/drivers/video/fbdev/vt8623fb.c b/drivers/video/fbdev/vt8623fb.c index a92a8c670cf0..4274c6efb249 100644 --- a/drivers/video/fbdev/vt8623fb.c +++ b/drivers/video/fbdev/vt8623fb.c @@ -507,6 +507,8 @@ static int vt8623fb_set_par(struct fb_info *info) (info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, 1, 1, info->node); + if (screen_size > info->screen_size) + screen_size = info->screen_size; memset_io(info->screen_base, 0x00, screen_size); /* Device and screen back on */ |