Commit 80cf9635 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Bartlomiej Zolnierkiewicz

fbdev: atafb: Fix broken frame buffer after kexec

On Falcon, Atari frame buffer initialization relies on preprogrammed
register values.  These register values are changed to blank the
console.

Hence when using kexec to boot into a new kernel while the console is
blanked, the new kernel cannot determine the current video
configuration, and the Atari frame buffer driver fails to initialize:

    atafb: phys_screen_base 6ce000 screen_len 4096

Fix this by doing a straight-forward conversion of the driver to a
platform device driver, and adding a shutdown handler that unblanks the
display.
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Cc: Michael Schmitz <schmitzmic@gmail.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
parent 577eabb2
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
...@@ -3072,7 +3073,7 @@ int __init atafb_setup(char *options) ...@@ -3072,7 +3073,7 @@ int __init atafb_setup(char *options)
return 0; return 0;
} }
int __init atafb_init(void) static int __init atafb_probe(struct platform_device *pdev)
{ {
int pad, detected_mode, error; int pad, detected_mode, error;
unsigned int defmode = 0; unsigned int defmode = 0;
...@@ -3084,9 +3085,6 @@ int __init atafb_init(void) ...@@ -3084,9 +3085,6 @@ int __init atafb_init(void)
atafb_setup(option); atafb_setup(option);
printk("atafb_init: start\n"); printk("atafb_init: start\n");
if (!MACH_IS_ATARI)
return -ENODEV;
do { do {
#ifdef ATAFB_EXT #ifdef ATAFB_EXT
if (external_addr) { if (external_addr) {
...@@ -3247,4 +3245,32 @@ int __init atafb_init(void) ...@@ -3247,4 +3245,32 @@ int __init atafb_init(void)
return 0; return 0;
} }
static void atafb_shutdown(struct platform_device *pdev)
{
/* Unblank before kexec */
if (fbhw->blank)
fbhw->blank(0);
}
static struct platform_driver atafb_driver = {
.shutdown = atafb_shutdown,
.driver = {
.name = "atafb",
},
};
static int __init atafb_init(void)
{
struct platform_device *pdev;
if (!MACH_IS_ATARI)
return -ENODEV;
pdev = platform_device_register_simple("atafb", -1, NULL, 0);
if (IS_ERR(pdev))
return PTR_ERR(pdev);
return platform_driver_probe(&atafb_driver, atafb_probe);
}
device_initcall(atafb_init); device_initcall(atafb_init);
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