This makes the mach64 a platform device on atari m68 devices. Please test
and it if is okay I will send it to Andrew Morton.
diff -urN -X /home/jsimmons/dontdiff linus-2.6/drivers/video/aty/atyfb_base.c
fbdev-2.6/drivers/video/aty/atyfb_base.c
--- linus-2.6/drivers/video/aty/atyfb_base.c 2005-07-11 10:07:21.000000000
-0700
+++ fbdev-2.6/drivers/video/aty/atyfb_base.c 2005-07-27 08:41:24.000000000
-0700
@@ -244,9 +244,6 @@
*/
static int aty_init(struct fb_info *info, const char *name);
-#ifdef CONFIG_ATARI
-static int store_video_par(char *videopar, unsigned char m64_num);
-#endif
static struct crtc saved_crtc;
static union aty_pll saved_pll;
@@ -321,10 +318,8 @@
#endif
#ifdef CONFIG_ATARI
-static unsigned int mach64_count __initdata = 0;
-static unsigned long phys_vmembase[FB_MAX] __initdata = { 0, };
-static unsigned long phys_size[FB_MAX] __initdata = { 0, };
-static unsigned long phys_guiregbase[FB_MAX] __initdata = { 0, };
+static struct mach64_device* __init store_video_par(char *video_str, unsigned
char m64_num)
+static LIST_HEAD(mach64_list);
#endif
/* top -> down is an evolution of mach64 chipset, any corrections? */
@@ -2170,8 +2165,6 @@
* Initialisation
*/
-static struct fb_info *fb_list = NULL;
-
static int __init aty_init(struct fb_info *info, const char *name)
{
struct atyfb_par *par = (struct atyfb_par *) info->par;
@@ -2562,8 +2555,6 @@
if (register_framebuffer(info) < 0)
goto aty_init_exit;
- fb_list = info;
-
PRINTKI("fb%d: %s frame buffer device on %s\n",
info->node, info->fix.id, name);
return 0;
@@ -2587,10 +2578,13 @@
}
#ifdef CONFIG_ATARI
-static int __init store_video_par(char *video_str, unsigned char m64_num)
+static struct mach64_device* __init store_video_par(char *video_str, unsigned
char m64_num)
{
- char *p;
unsigned long vmembase, size, guiregbase;
+ struct platform_device *atyfb_device;
+ struct mach64_device *device;
+ struct resource io[2];
+ char *p;
PRINTKI("store_video_par() '%s' \n", video_str);
@@ -2604,16 +2598,18 @@
goto mach64_invalid;
guiregbase = simple_strtoul(p, NULL, 0);
- phys_vmembase[m64_num] = vmembase;
- phys_size[m64_num] = size;
- phys_guiregbase[m64_num] = guiregbase;
- PRINTKI("stored them all: $%08lX $%08lX $%08lX \n", vmembase, size,
- guiregbase);
- return 0;
+ io[0] = request_mem_region(vmembase, size, "atyfb");
+ io[1] = request_mem_region(guiregbase, 0x10000, "atyfb");
- mach64_invalid:
- phys_vmembase[m64_num] = 0;
- return -1;
+ atyfb_device = platform_device_register_simple("atyfb", m64_num, io, 2);
+ if (IS_ERR(atyfb_device))
+ return PTR_ERR(atyfb_device);
+
+ device = kmalloc(sizeof(struct mach64_device), GFP_KERNEL);
+ PRINTKI("stored them all: $%08lX $%08lX $%08lX \n", vmembase, size,
guiregbase);
+ return device;
+mach64_invalid:
+ return NULL;
}
#endif /* CONFIG_ATARI */
@@ -2679,17 +2675,10 @@
static void aty_st_pal(u_int regno, u_int red, u_int green, u_int blue,
const struct atyfb_par *par)
{
-#ifdef CONFIG_ATARI
- out_8(&par->aty_cmap_regs->windex, regno);
- out_8(&par->aty_cmap_regs->lut, red);
- out_8(&par->aty_cmap_regs->lut, green);
- out_8(&par->aty_cmap_regs->lut, blue);
-#else
writeb(regno, &par->aty_cmap_regs->windex);
writeb(red, &par->aty_cmap_regs->lut);
writeb(green, &par->aty_cmap_regs->lut);
writeb(blue, &par->aty_cmap_regs->lut);
-#endif
}
/*
@@ -3456,47 +3445,43 @@
#ifdef CONFIG_ATARI
-static int __devinit atyfb_atari_probe(void)
+static int __devinit atyfb_atari_probe(struct device *device)
{
- struct aty_par *par;
+ struct platform_device *dev = to_platform_device(device);
struct fb_info *info;
- int m64_num;
+ struct aty_par *par;
+ int size = 0;
u32 clock_r;
- for (m64_num = 0; m64_num < mach64_count; m64_num++) {
- if (!phys_vmembase[m64_num] || !phys_size[m64_num] ||
- !phys_guiregbase[m64_num]) {
- PRINTKI("phys_*[%d] parameters not set => returning early.
\n", m64_num);
- continue;
- }
-
- info = framebuffer_alloc(sizeof(struct atyfb_par), NULL);
- if (!info) {
- PRINTKE("atyfb_atari_probe() can't alloc fb_info\n");
- return -ENOMEM;
- }
- par = info->par;
+ info = framebuffer_alloc(sizeof(struct atyfb_par), &dev->dev);
+ if (!info) {
+ PRINTKE("atyfb_atari_probe() can't alloc fb_info\n");
+ return -ENOMEM;
+ }
+ par = info->par;
- info->fix = atyfb_fix;
+ info->fix = atyfb_fix;
- par->irq = (unsigned int) -1; /* something invalid */
+ par->irq = (unsigned int) -1; /* something invalid */
- /*
- * Map the video memory (physical address given) to somewhere
in the
- * kernel address space.
- */
- info->screen_base = ioremap(phys_vmembase[m64_num],
phys_size[m64_num]);
- info->fix.smem_start = (unsigned long)info->screen_base; /*
Fake! */
- par->ati_regbase = ioremap(phys_guiregbase[m64_num], 0x10000) +
- 0xFC00ul;
- info->fix.mmio_start = (unsigned long)par->ati_regbase; /*
Fake! */
-
- aty_st_le32(CLOCK_CNTL, 0x12345678, par);
- clock_r = aty_ld_le32(CLOCK_CNTL, par);
-
- switch (clock_r & 0x003F) {
- case 0x12:
- par->clk_wr_offset = 3; /* */
+ /*
+ * Map the video memory (physical address given) to somewhere in the
+ * kernel address space.
+ */
+ size = dev->resource[0].start - dev->resource[0].end;
+ info->fix.smem_start = dev->resource[0].start;
+ info->screen_base = ioremap(dev->resource[0], size);
+
+ size = 0x10000;
+ info->fix.mmio_start = dev->resource[1].start + 0xFC00ul;
+ par->ati_regbase = ioremap(dev->resource[1], size) + 0xFC00ul;
+
+ aty_st_le32(CLOCK_CNTL, 0x12345678, par);
+ clock_r = aty_ld_le32(CLOCK_CNTL, par);
+
+ switch (clock_r & 0x003F) {
+ case 0x12:
+ par->clk_wr_offset = 3; /* */
break;
case 0x34:
par->clk_wr_offset = 2; /* Medusa ST-IO ISA Adapter
etc. */
@@ -3595,6 +3580,23 @@
#endif /* CONFIG_PCI */
+#ifdef CONFIG_ATARI
+
+static struct device_driver atyfb_driver = {
+ .name = "atyfb",
+ .probe = atyfb_atari_probe,
+ .remove = __devexit_p(atyfb_atari_remove),
+}
+
+static void __devexit atyfb_atari_remove(struct device *dev)
+{
+ struct fb_info *info = dev_get_drvdata(dev);
+
+ atyfb_remove(info);
+}
+
+#endif /* CONFIG_ATARI */
+
#ifndef MODULE
static int __init atyfb_setup(char *options)
{
@@ -3650,15 +3652,15 @@
* Why do we need this silly Mach64 argument?
* We are already here because of mach64= so its redundant.
*/
- else if (MACH_IS_ATARI
- && (!strncmp(this_opt, "Mach64:", 7))) {
- static unsigned char m64_num;
- static char mach64_str[80];
+ else if (MACH_IS_ATARI && (!strncmp(this_opt, "Mach64:", 7))) {
+ struct mach64_device *dev;
+ unsigned char m64_num = 0;
+ char mach64_str[80];
+
strlcpy(mach64_str, this_opt + 7, sizeof(mach64_str));
- if (!store_video_par(mach64_str, m64_num)) {
- m64_num++;
- mach64_count = m64_num;
- }
+ dev = store_video_par(mach64_str, m64_num++);
+ if (dev != null)
+ list_add_tail(dev->node, &mach64_list);
}
#endif
else
@@ -3670,6 +3672,8 @@
static int __init atyfb_init(void)
{
+ int retval = 0;
+
#ifndef MODULE
char *option = NULL;
@@ -3679,16 +3683,34 @@
#endif
#ifdef CONFIG_PCI
- pci_register_driver(&atyfb_driver);
+ retval = pci_register_driver(&atyfb_driver);
#endif
#ifdef CONFIG_ATARI
- atyfb_atari_probe();
+ retval = driver_register(&atyfb_driver);
+ if (retval < 0) {
+ struct platform_device *device;
+
+ list_for_each_safe(device, &mach64_list, node) {
+ platform_device_unregister(&device->dev);
+ kfree(device);
+ }
+ }
#endif
- return 0;
+ return retval;
}
static void __exit atyfb_exit(void)
{
+#ifdef CONFIG_ATARI
+ struct platform_device *device;
+
+ list_for_each_safe(device, &mach64_list, node) {
+ platform_device_unregister(&device->dev);
+ kfree(device);
+ }
+ driver_unregister(&atyfb_driver);
+#endif
+
#ifdef CONFIG_PCI
pci_unregister_driver(&atyfb_driver);
#endif
diff -urN -X /home/jsimmons/dontdiff linus-2.6/drivers/video/aty/atyfb.h
fbdev-2.6/drivers/video/aty/atyfb.h
--- linus-2.6/drivers/video/aty/atyfb.h 2005-07-11 10:07:21.000000000 -0700
+++ fbdev-2.6/drivers/video/aty/atyfb.h 2005-07-22 15:36:41.000000000 -0700
@@ -187,6 +187,13 @@
#endif
};
+#ifdef CONFIG_ATARI
+struct mach64_device {
+ struct list_head node;
+ struct platform_device *dev;
+};
+#endif
+
/*
* ATI Mach64 features
*/
-
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html