Commit 2a8cbf2a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'fbdev-v5.0-rc3' of git://github.com/bzolnier/linux

Pull fbdev fixes from Bartlomiej Zolnierkiewicz:

 - fix stack memory leak in omap2fb driver (Vlad Tsyrklevich)

 - fix OF node name handling v4.20 regression in offb driver (Rob
   Herring)

 - convert CONFIG_FB_LOGO_CENTER config option added in v5.0-rc1 into a
   kernel parameter (Peter Rosin)

* tag 'fbdev-v5.0-rc3' of git://github.com/bzolnier/linux:
  fbdev: fbmem: convert CONFIG_FB_LOGO_CENTER into a cmd line option
  fbdev: offb: Fix OF node name handling
  omap2fb: Fix stack memory disclosure
parents c3653ebd 890d14d2
...@@ -163,6 +163,14 @@ C. Boot options ...@@ -163,6 +163,14 @@ C. Boot options
be preserved until there actually is some text is output to the console. be preserved until there actually is some text is output to the console.
This option causes fbcon to bind immediately to the fbdev device. This option causes fbcon to bind immediately to the fbdev device.
7. fbcon=logo-pos:<location>
The only possible 'location' is 'center' (without quotes), and when
given, the bootup logo is moved from the default top-left corner
location to the center of the framebuffer. If more than one logo is
displayed due to multiple CPUs, the collected line of logos is moved
as a whole.
C. Attaching, Detaching and Unloading C. Attaching, Detaching and Unloading
Before going on to how to attach, detach and unload the framebuffer console, an Before going on to how to attach, detach and unload the framebuffer console, an
......
...@@ -510,6 +510,13 @@ static int __init fb_console_setup(char *this_opt) ...@@ -510,6 +510,13 @@ static int __init fb_console_setup(char *this_opt)
continue; continue;
} }
#endif #endif
if (!strncmp(options, "logo-pos:", 9)) {
options += 9;
if (!strcmp(options, "center"))
fb_center_logo = true;
continue;
}
} }
return 1; return 1;
} }
......
...@@ -53,6 +53,9 @@ EXPORT_SYMBOL(registered_fb); ...@@ -53,6 +53,9 @@ EXPORT_SYMBOL(registered_fb);
int num_registered_fb __read_mostly; int num_registered_fb __read_mostly;
EXPORT_SYMBOL(num_registered_fb); EXPORT_SYMBOL(num_registered_fb);
bool fb_center_logo __read_mostly;
EXPORT_SYMBOL(fb_center_logo);
static struct fb_info *get_fb_info(unsigned int idx) static struct fb_info *get_fb_info(unsigned int idx)
{ {
struct fb_info *fb_info; struct fb_info *fb_info;
...@@ -506,8 +509,7 @@ static int fb_show_logo_line(struct fb_info *info, int rotate, ...@@ -506,8 +509,7 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
fb_set_logo(info, logo, logo_new, fb_logo.depth); fb_set_logo(info, logo, logo_new, fb_logo.depth);
} }
#ifdef CONFIG_FB_LOGO_CENTER if (fb_center_logo) {
{
int xres = info->var.xres; int xres = info->var.xres;
int yres = info->var.yres; int yres = info->var.yres;
...@@ -520,11 +522,11 @@ static int fb_show_logo_line(struct fb_info *info, int rotate, ...@@ -520,11 +522,11 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
--n; --n;
image.dx = (xres - n * (logo->width + 8) - 8) / 2; image.dx = (xres - n * (logo->width + 8) - 8) / 2;
image.dy = y ?: (yres - logo->height) / 2; image.dy = y ?: (yres - logo->height) / 2;
} else {
image.dx = 0;
image.dy = y;
} }
#else
image.dx = 0;
image.dy = y;
#endif
image.width = logo->width; image.width = logo->width;
image.height = logo->height; image.height = logo->height;
...@@ -684,9 +686,8 @@ int fb_prepare_logo(struct fb_info *info, int rotate) ...@@ -684,9 +686,8 @@ int fb_prepare_logo(struct fb_info *info, int rotate)
} }
height = fb_logo.logo->height; height = fb_logo.logo->height;
#ifdef CONFIG_FB_LOGO_CENTER if (fb_center_logo)
height += (yres - fb_logo.logo->height) / 2; height += (yres - fb_logo.logo->height) / 2;
#endif
return fb_prepare_extra_logos(info, height, yres); return fb_prepare_extra_logos(info, height, yres);
} }
......
...@@ -318,28 +318,28 @@ static void __iomem *offb_map_reg(struct device_node *np, int index, ...@@ -318,28 +318,28 @@ static void __iomem *offb_map_reg(struct device_node *np, int index,
} }
static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp, static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp,
const char *name, unsigned long address) unsigned long address)
{ {
struct offb_par *par = (struct offb_par *) info->par; struct offb_par *par = (struct offb_par *) info->par;
if (dp && !strncmp(name, "ATY,Rage128", 11)) { if (of_node_name_prefix(dp, "ATY,Rage128")) {
par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
if (par->cmap_adr) if (par->cmap_adr)
par->cmap_type = cmap_r128; par->cmap_type = cmap_r128;
} else if (dp && (!strncmp(name, "ATY,RageM3pA", 12) } else if (of_node_name_prefix(dp, "ATY,RageM3pA") ||
|| !strncmp(name, "ATY,RageM3p12A", 14))) { of_node_name_prefix(dp, "ATY,RageM3p12A")) {
par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
if (par->cmap_adr) if (par->cmap_adr)
par->cmap_type = cmap_M3A; par->cmap_type = cmap_M3A;
} else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) { } else if (of_node_name_prefix(dp, "ATY,RageM3pB")) {
par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
if (par->cmap_adr) if (par->cmap_adr)
par->cmap_type = cmap_M3B; par->cmap_type = cmap_M3B;
} else if (dp && !strncmp(name, "ATY,Rage6", 9)) { } else if (of_node_name_prefix(dp, "ATY,Rage6")) {
par->cmap_adr = offb_map_reg(dp, 1, 0, 0x1fff); par->cmap_adr = offb_map_reg(dp, 1, 0, 0x1fff);
if (par->cmap_adr) if (par->cmap_adr)
par->cmap_type = cmap_radeon; par->cmap_type = cmap_radeon;
} else if (!strncmp(name, "ATY,", 4)) { } else if (of_node_name_prefix(dp, "ATY,")) {
unsigned long base = address & 0xff000000UL; unsigned long base = address & 0xff000000UL;
par->cmap_adr = par->cmap_adr =
ioremap(base + 0x7ff000, 0x1000) + 0xcc0; ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
...@@ -350,7 +350,7 @@ static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp ...@@ -350,7 +350,7 @@ static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp
par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000); par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000);
if (par->cmap_adr) if (par->cmap_adr)
par->cmap_type = cmap_gxt2000; par->cmap_type = cmap_gxt2000;
} else if (dp && !strncmp(name, "vga,Display-", 12)) { } else if (of_node_name_prefix(dp, "vga,Display-")) {
/* Look for AVIVO initialized by SLOF */ /* Look for AVIVO initialized by SLOF */
struct device_node *pciparent = of_get_parent(dp); struct device_node *pciparent = of_get_parent(dp);
const u32 *vid, *did; const u32 *vid, *did;
...@@ -438,7 +438,7 @@ static void __init offb_init_fb(const char *name, ...@@ -438,7 +438,7 @@ static void __init offb_init_fb(const char *name,
par->cmap_type = cmap_unknown; par->cmap_type = cmap_unknown;
if (depth == 8) if (depth == 8)
offb_init_palette_hacks(info, dp, name, address); offb_init_palette_hacks(info, dp, address);
else else
fix->visual = FB_VISUAL_TRUECOLOR; fix->visual = FB_VISUAL_TRUECOLOR;
......
...@@ -609,6 +609,8 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) ...@@ -609,6 +609,8 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
int r = 0; int r = 0;
memset(&p, 0, sizeof(p));
switch (cmd) { switch (cmd) {
case OMAPFB_SYNC_GFX: case OMAPFB_SYNC_GFX:
DBG("ioctl SYNC_GFX\n"); DBG("ioctl SYNC_GFX\n");
......
...@@ -10,15 +10,6 @@ menuconfig LOGO ...@@ -10,15 +10,6 @@ menuconfig LOGO
if LOGO if LOGO
config FB_LOGO_CENTER
bool "Center the logo"
depends on FB=y
help
When this option is selected, the bootup logo is centered both
horizontally and vertically. If more than one logo is displayed
due to multiple CPUs, the collected line of logos is centered
as a whole.
config FB_LOGO_EXTRA config FB_LOGO_EXTRA
bool bool
depends on FB=y depends on FB=y
......
...@@ -653,6 +653,7 @@ extern int fb_new_modelist(struct fb_info *info); ...@@ -653,6 +653,7 @@ extern int fb_new_modelist(struct fb_info *info);
extern struct fb_info *registered_fb[FB_MAX]; extern struct fb_info *registered_fb[FB_MAX];
extern int num_registered_fb; extern int num_registered_fb;
extern bool fb_center_logo;
extern struct class *fb_class; extern struct class *fb_class;
#define for_each_registered_fb(i) \ #define for_each_registered_fb(i) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment