Commit fa6688e1 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven

m68k: amiga - Frame buffer platform device conversion

Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 0d305464
...@@ -56,3 +56,18 @@ static int __init amiga_init_bus(void) ...@@ -56,3 +56,18 @@ static int __init amiga_init_bus(void)
subsys_initcall(amiga_init_bus); subsys_initcall(amiga_init_bus);
#endif /* CONFIG_ZORRO */ #endif /* CONFIG_ZORRO */
static int __init amiga_init_devices(void)
{
if (!MACH_IS_AMIGA)
return -ENODEV;
/* video hardware */
if (AMIGAHW_PRESENT(AMI_VIDEO))
platform_device_register_simple("amiga-video", -1, NULL, 0);
return 0;
}
device_initcall(amiga_init_devices);
...@@ -50,8 +50,9 @@ ...@@ -50,8 +50,9 @@
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/platform_device.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/amigahw.h> #include <asm/amigahw.h>
...@@ -1135,7 +1136,7 @@ static int amifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg ...@@ -1135,7 +1136,7 @@ static int amifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg
* Interface to the low level console driver * Interface to the low level console driver
*/ */
static void amifb_deinit(void); static void amifb_deinit(struct platform_device *pdev);
/* /*
* Internal routines * Internal routines
...@@ -2246,7 +2247,7 @@ static inline void chipfree(void) ...@@ -2246,7 +2247,7 @@ static inline void chipfree(void)
* Initialisation * Initialisation
*/ */
static int __init amifb_init(void) static int __init amifb_probe(struct platform_device *pdev)
{ {
int tag, i, err = 0; int tag, i, err = 0;
u_long chipptr; u_long chipptr;
...@@ -2261,16 +2262,6 @@ static int __init amifb_init(void) ...@@ -2261,16 +2262,6 @@ static int __init amifb_init(void)
} }
amifb_setup(option); amifb_setup(option);
#endif #endif
if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_VIDEO))
return -ENODEV;
/*
* We request all registers starting from bplpt[0]
*/
if (!request_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120,
"amifb [Denise/Lisa]"))
return -EBUSY;
custom.dmacon = DMAF_ALL | DMAF_MASTER; custom.dmacon = DMAF_ALL | DMAF_MASTER;
switch (amiga_chipset) { switch (amiga_chipset) {
...@@ -2377,6 +2368,7 @@ static int __init amifb_init(void) ...@@ -2377,6 +2368,7 @@ static int __init amifb_init(void)
fb_info.fbops = &amifb_ops; fb_info.fbops = &amifb_ops;
fb_info.par = &currentpar; fb_info.par = &currentpar;
fb_info.flags = FBINFO_DEFAULT; fb_info.flags = FBINFO_DEFAULT;
fb_info.device = &pdev->dev;
if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb, if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb,
NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) { NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) {
...@@ -2451,18 +2443,18 @@ static int __init amifb_init(void) ...@@ -2451,18 +2443,18 @@ static int __init amifb_init(void)
return 0; return 0;
amifb_error: amifb_error:
amifb_deinit(); amifb_deinit(pdev);
return err; return err;
} }
static void amifb_deinit(void) static void amifb_deinit(struct platform_device *pdev)
{ {
if (fb_info.cmap.len) if (fb_info.cmap.len)
fb_dealloc_cmap(&fb_info.cmap); fb_dealloc_cmap(&fb_info.cmap);
fb_dealloc_cmap(&fb_info.cmap);
chipfree(); chipfree();
if (videomemory) if (videomemory)
iounmap((void*)videomemory); iounmap((void*)videomemory);
release_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120);
custom.dmacon = DMAF_ALL | DMAF_MASTER; custom.dmacon = DMAF_ALL | DMAF_MASTER;
} }
...@@ -3794,14 +3786,35 @@ static void ami_rebuild_copper(void) ...@@ -3794,14 +3786,35 @@ static void ami_rebuild_copper(void)
} }
} }
static void __exit amifb_exit(void) static int __exit amifb_remove(struct platform_device *pdev)
{ {
unregister_framebuffer(&fb_info); unregister_framebuffer(&fb_info);
amifb_deinit(); amifb_deinit(pdev);
amifb_video_off(); amifb_video_off();
return 0;
}
static struct platform_driver amifb_driver = {
.remove = __exit_p(amifb_remove),
.driver = {
.name = "amiga-video",
.owner = THIS_MODULE,
},
};
static int __init amifb_init(void)
{
return platform_driver_probe(&amifb_driver, amifb_probe);
} }
module_init(amifb_init); module_init(amifb_init);
static void __exit amifb_exit(void)
{
platform_driver_unregister(&amifb_driver);
}
module_exit(amifb_exit); module_exit(amifb_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:amiga-video");
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