From: Geert U. <ge...@li...> - 2000-08-24 17:13:23
|
Hi, This patch adds resource handling to the - Amiga mouse driver - Amiga keyboard driver - A3000 builtin SCSI driver - Amiga parallel port driver - Amiga timer driver - Amiga system RAM (I'm still interested in your /proc/iomem) It also makes the list of Amiga models __initdata, so it no longer consumes precious kernel memory (and to compensate a bit for the extra memory used by the resource management system :-) As usual these days, this patch isn't tested. But I have to store the patches I cook _somewhere_ until I can test them myself, haven't I? ;-) --- linux-2.4.0-test7-pre7/drivers/char/amigamouse.c Tue Jul 18 14:04:42 2000 +++ geert-amiga-resource-2.4.0-test7-pre7/drivers/char/amigamouse.c Thu Aug 24 17:11:32 2000 @@ -185,6 +185,8 @@ { if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE)) return -ENODEV; + if (!request_mem_region(CUSTOM_PHYSADDR+10, 2, "amigamouse [Denise]")) + return -EBUSY; custom.joytest = 0; /* reset counters */ #if AMIGA_OLD_INT @@ -201,6 +203,7 @@ static void __exit amiga_mouse_exit(void) { unregister_busmouse(msedev); + release_mem_region(CUSTOM_PHYSADDR+10, 2); } module_init(amiga_mouse_init); --- linux-2.4.0-test7-pre7/drivers/char/amikeyb.c Fri Jul 28 21:19:04 2000 +++ geert-amiga-resource-2.4.0-test7-pre7/drivers/char/amikeyb.c Thu Aug 24 17:11:32 2000 @@ -300,6 +300,8 @@ { if (!AMIGAHW_PRESENT(AMI_KEYBOARD)) return -EIO; + if (!request_mem_region(CIAA_PHYSADDR-1+0xb00, 0x100, "amikeyb")) + return -EBUSY; /* setup key map */ memcpy(key_maps[0], amiplain_map, sizeof(plain_map)); --- linux-2.4.0-test7-pre7/drivers/scsi/a3000.c Mon Jul 17 15:13:39 2000 +++ geert-amiga-resource-2.4.0-test7-pre7/drivers/scsi/a3000.c Thu Aug 24 17:11:32 2000 @@ -170,6 +170,8 @@ if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(A3000_SCSI)) return 0; + if (!request_mem_region(0xDD0000, 256, "wd33c93")) + return -EBUSY; tpnt->proc_name = "A3000"; tpnt->proc_info = &wd33c93_proc_info; @@ -205,6 +207,7 @@ #ifdef MODULE wd33c93_release(); DMA(instance)->CNTR = 0; + release_mem_region(0xDD0000, 256); free_irq(IRQ_AMIGA_PORTS, a3000_intr); #endif return 1; --- linux-2.4.0-test7-pre7/drivers/parport/parport_amiga.c Tue Jul 18 14:04:59 2000 +++ geert-amiga-resource-2.4.0-test7-pre7/drivers/parport/parport_amiga.c Thu Aug 24 17:11:32 2000 @@ -240,19 +240,20 @@ struct parport *p; if (MACH_IS_AMIGA && AMIGAHW_PRESENT(AMI_PARALLEL)) { - if (!request_mem_region(CIAA_PHYSADDR+0x100, 1, "parallel")) + if (!request_mem_region(CIAA_PHYSADDR-1+0x100, 0x100, + "parallel")) return 0; ciaa.ddrb = 0xff; ciab.ddra &= 0xf8; if (!(p = parport_register_port((unsigned long)&ciaa.prb, IRQ_AMIGA_CIAA_FLG, PARPORT_DMA_NONE, &pp_amiga_ops))) { - release_mem_region(CIAA_PHYSADDR+0x100, 1); + release_mem_region(CIAA_PHYSADDR-1+0x100, 0x100); return 0; } if (!request_irq(IRQ_AMIGA_CIAA_FLG, amiga_interrupt, 0, p->name, p)) { parport_unregister_port (p); - release_mem_region(CIAA_PHYSADDR+0x100, 1); + release_mem_region(CIAA_PHYSADDR-1+0x100, 0x100); return 0; } @@ -286,7 +287,7 @@ free_irq(IRQ_AMIGA_CIAA_FLG, this_port); parport_proc_unregister(this_port); parport_unregister_port(this_port); - release_mem_region(CIAA_PHYSADDR+0x100, 1); + release_mem_region(CIAA_PHYSADDR-1+0x100, 0x100); } #endif --- linux-2.4.0-test7-pre7/arch/ppc/amiga/config.c Mon Jul 17 14:57:32 2000 +++ geert-amiga-resource-2.4.0-test7-pre7/arch/ppc/amiga/config.c Thu Aug 24 17:15:10 2000 @@ -49,11 +49,28 @@ unsigned char amiga_psfreq; struct amiga_hw_present amiga_hw_present; -static const char *amiga_models[] = { - "A500", "A500+", "A600", "A1000", "A1200", "A2000", "A2500", "A3000", - "A3000T", "A3000+", "A4000", "A4000T", "CDTV", "CD32", "Draco" +static const char s_a500[] __initdata = "A500"; +static const char s_a500p[] __initdata = "A500+"; +static const char s_a600[] __initdata = "A600"; +static const char s_a1000[] __initdata = "A1000"; +static const char s_a1200[] __initdata = "A1200"; +static const char s_a2000[] __initdata = "A2000"; +static const char s_a2500[] __initdata = "A2500"; +static const char s_a3000[] __initdata = "A3000"; +static const char s_a3000t[] __initdata = "A3000T"; +static const char s_a3000p[] __initdata = "A3000+"; +static const char s_a4000[] __initdata = "A4000"; +static const char s_a4000t[] __initdata = "A4000T"; +static const char s_cdtv[] __initdata = "CDTV"; +static const char s_cd32[] __initdata = "CD32"; +static const char s_draco[] __initdata = "Draco"; +static const char *amiga_models[] __initdata = { + s_a500, s_a500p, s_a600, s_a1000, s_a1200, s_a2000, s_a2500, s_a3000, + s_a3000t, s_a3000p, s_a4000, s_a4000t, s_cdtv, s_cd32, s_draco, }; +static char amiga_model_name[13] = "Amiga "; + extern char m68k_debug_device[]; static void amiga_sched_init(void (*handler)(int, void *, struct pt_regs *)); @@ -195,8 +212,10 @@ memset(&amiga_hw_present, 0, sizeof(amiga_hw_present)); printk("Amiga hardware found: "); - if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) + if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) { printk("[%s] ", amiga_models[amiga_model-AMI_500]); + strcat(amiga_model_name, amiga_models[amiga_model-AMI_500]); + } switch(amiga_model) { case AMI_UNKNOWN: @@ -411,6 +430,17 @@ /* ensure that the DMA master bit is set */ custom.dmacon = DMAF_SETCLR | DMAF_MASTER; + /* request all RAM */ + for (i = 0; i < m68k_num_memory; i++) { + ram_resource[i].name = + (m68k_memory[i].addr >= 0x01000000) ? "32-bit Fast RAM" : + (m68k_memory[i].addr < 0x00c00000) ? "16-bit Fast RAM" : + "16-bit Slow RAM"; + ram_resource[i].start = m68k_memory[i].addr; + ram_resource[i].end = m68k_memory[i].addr+m68k_memory[i].size-1; + request_resource(&iomem_resource, &ram_resource[i]); + } + /* initialize chipram allocator */ amiga_chip_init (); @@ -444,6 +474,8 @@ { jiffy_ticks = (amiga_eclock+HZ/2)/HZ; + if (!request_mem_region(CIAB_PHYSADDR+0x400, 0x200, "timer")) + printk("Cannot allocate ciab.ta{lo,hi}\n"); ciab.cra &= 0xC0; /* turn off timer A, continuous mode, from Eclk */ ciab.talo = jiffy_ticks % 256; ciab.tahi = jiffy_ticks / 256; @@ -703,6 +735,8 @@ for (;;); } +static struct resource ram_resource[NUM_MEMINFO]; + /* * Debugging @@ -847,9 +881,7 @@ static void amiga_get_model(char *model) { - strcpy(model, "Amiga "); - if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) - strcat(model, amiga_models[amiga_model-AMI_500]); + strcpy(model, amiga_model_name); } --- linux-2.4.0-test7-pre7/arch/m68k/amiga/config.c Mon Jul 17 15:13:27 2000 +++ geert-amiga-resource-2.4.0-test7-pre7/arch/m68k/amiga/config.c Thu Aug 24 17:11:32 2000 @@ -41,11 +41,28 @@ unsigned char amiga_psfreq; struct amiga_hw_present amiga_hw_present; -static const char *amiga_models[] = { - "A500", "A500+", "A600", "A1000", "A1200", "A2000", "A2500", "A3000", - "A3000T", "A3000+", "A4000", "A4000T", "CDTV", "CD32", "Draco" +static const char s_a500[] __initdata = "A500"; +static const char s_a500p[] __initdata = "A500+"; +static const char s_a600[] __initdata = "A600"; +static const char s_a1000[] __initdata = "A1000"; +static const char s_a1200[] __initdata = "A1200"; +static const char s_a2000[] __initdata = "A2000"; +static const char s_a2500[] __initdata = "A2500"; +static const char s_a3000[] __initdata = "A3000"; +static const char s_a3000t[] __initdata = "A3000T"; +static const char s_a3000p[] __initdata = "A3000+"; +static const char s_a4000[] __initdata = "A4000"; +static const char s_a4000t[] __initdata = "A4000T"; +static const char s_cdtv[] __initdata = "CDTV"; +static const char s_cd32[] __initdata = "CD32"; +static const char s_draco[] __initdata = "Draco"; +static const char *amiga_models[] __initdata = { + s_a500, s_a500p, s_a600, s_a1000, s_a1200, s_a2000, s_a2500, s_a3000, + s_a3000t, s_a3000p, s_a4000, s_a4000t, s_cdtv, s_cd32, s_draco, }; +static char amiga_model_name[13] = "Amiga "; + extern char m68k_debug_device[]; static void amiga_sched_init(void (*handler)(int, void *, struct pt_regs *)); @@ -132,6 +149,8 @@ NULL, 0x00dc0000, 0x00dcffff }; +static struct resource ram_resource[NUM_MEMINFO]; + /* * Parse an Amiga-specific record in the bootinfo @@ -203,8 +222,10 @@ memset(&amiga_hw_present, 0, sizeof(amiga_hw_present)); printk("Amiga hardware found: "); - if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) + if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) { printk("[%s] ", amiga_models[amiga_model-AMI_500]); + strcat(amiga_model_name, amiga_models[amiga_model-AMI_500]); + } switch(amiga_model) { case AMI_UNKNOWN: @@ -450,6 +471,17 @@ disabled_z2mem>>10); } + /* request all RAM */ + for (i = 0; i < m68k_num_memory; i++) { + ram_resource[i].name = + (m68k_memory[i].addr >= 0x01000000) ? "32-bit Fast RAM" : + (m68k_memory[i].addr < 0x00c00000) ? "16-bit Fast RAM" : + "16-bit Slow RAM"; + ram_resource[i].start = m68k_memory[i].addr; + ram_resource[i].end = m68k_memory[i].addr+m68k_memory[i].size-1; + request_resource(&iomem_resource, &ram_resource[i]); + } + /* initialize chipram allocator */ amiga_chip_init (); @@ -483,6 +515,8 @@ { jiffy_ticks = (amiga_eclock+HZ/2)/HZ; + if (!request_mem_region(CIAB_PHYSADDR+0x400, 0x200, "timer")) + printk("Cannot allocate ciab.ta{lo,hi}\n"); ciab.cra &= 0xC0; /* turn off timer A, continuous mode, from Eclk */ ciab.talo = jiffy_ticks % 256; ciab.tahi = jiffy_ticks / 256; @@ -936,9 +970,7 @@ static void amiga_get_model(char *model) { - strcpy(model, "Amiga "); - if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) - strcat(model, amiga_models[amiga_model-AMI_500]); + strcpy(model, amiga_model_name); } Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@li... In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds |