From: <aot...@us...> - 2004-02-26 21:28:22
|
Update of /cvsroot/gc-linux/linux/arch/ppc/platforms In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31212/arch/ppc/platforms Modified Files: Makefile gamecube.c Added Files: gamecube_pic.c Log Message: Moved interrupt code into arch/ppc/platforms/gamecube_pic.c --- NEW FILE: gamecube_pic.c --- /* * arch/ppc/platforms/gamecube_pic.c */ #undef DEBUG #include <linux/irq.h> #include <linux/init.h> #include <linux/kernel.h> #include <asm/io.h> static void gamecube_mask_and_ack_irq(unsigned int irq) { pr_debug("mask_and_ack(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); if (irq < GAMECUBE_IRQS) { GAMECUBE_OUT(GAMECUBE_PIIM, GAMECUBE_IN(GAMECUBE_PIIM) & ~(1 << irq)); /* mask */ GAMECUBE_OUT(GAMECUBE_PIIC, 1 << irq); /* ack */ } pr_debug("after mask_and_ack(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); } static void gamecube_mask_irq(unsigned int irq) { pr_debug("mask(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); if (irq < GAMECUBE_IRQS) GAMECUBE_OUT(GAMECUBE_PIIM, GAMECUBE_IN(GAMECUBE_PIIM) & ~(1 << irq)); /* mask */ } static void gamecube_unmask_irq(unsigned int irq) { pr_debug(" before unmask(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); if (irq < GAMECUBE_IRQS) GAMECUBE_OUT(GAMECUBE_PIIM, GAMECUBE_IN(GAMECUBE_PIIM) | (1 << irq)); pr_debug("after unmask(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); } static struct hw_interrupt_type gamecube_pic = { .typename = " GC-PIC ", .enable = gamecube_unmask_irq, .disable = gamecube_mask_irq, .ack = gamecube_mask_and_ack_irq, }; void __init gamecube_init_IRQ(void) { int i; GAMECUBE_OUT(GAMECUBE_PIIM, 0); /* disable all irqs */ GAMECUBE_OUT(GAMECUBE_PIIC, 0xffffffff); /* ack all irqs */ for (i = 0; i < GAMECUBE_IRQS; i++) irq_desc[i].handler = &gamecube_pic; } /* * Find the highest IRQ that's generating an interrupt, if any. */ int gamecube_get_irq(struct pt_regs *regs) { int irq = 0; u_int irq_status, irq_test = 1; pr_debug("get_irq(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); irq_status = GAMECUBE_IN(GAMECUBE_PIIC) & GAMECUBE_IN(GAMECUBE_PIIM); if (irq_status == 0) { pr_debug("GC-PIC: Received a spurious IRQ\n"); return -1; /* while(1);*/ } do { if (irq_status & irq_test) break; irq++; irq_test <<= 1; } while (irq < GAMECUBE_IRQS); return irq; } Index: Makefile =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/ppc/platforms/Makefile,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Makefile 18 Feb 2004 20:01:58 -0000 1.5 +++ Makefile 26 Feb 2004 21:20:09 -0000 1.6 @@ -46,7 +46,7 @@ obj-$(CONFIG_PRPMC800) += prpmc800_setup.o prpmc800_pci.o obj-$(CONFIG_SANDPOINT) += sandpoint.o obj-$(CONFIG_SPRUCE) += spruce_setup.o spruce_pci.o -obj-$(CONFIG_GAMECUBE) += gamecube.o +obj-$(CONFIG_GAMECUBE) += gamecube.o gamecube_pic.o obj-$(CONFIG_GAMECUBE_CONSOLE) += console.o obj-$(CONFIG_GAMECUBE_RESET_SWITCH) += gc-rsw.o obj-$(CONFIG_GAMECUBE_DVD_COVER) += gc-dvdcover.o Index: gamecube.c =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/ppc/platforms/gamecube.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gamecube.c 5 Feb 2004 12:33:11 -0000 1.10 +++ gamecube.c 26 Feb 2004 21:20:09 -0000 1.11 @@ -1,14 +1,23 @@ -#include <linux/config.h> +/* + * arch/ppc/platforms/gamecube.c + */ + #include <linux/init.h> -#include <linux/pagemap.h> -#include <linux/irq.h> +#include <linux/config.h> #include <linux/console.h> #include <linux/initrd.h> + +#include <asm/machdep.h> #include <asm/time.h> #include <asm/io.h> -#include <asm/machdep.h> + #include "console.h" + +extern void gamecube_init_IRQ(void); +extern int gamecube_get_irq(struct pt_regs *regs); + + void __init gamecube_setup_arch(void) { @@ -27,88 +36,6 @@ } static void -gamecube_unmask_irq(unsigned int irq) -{ - //printk("unmask(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); - if (irq < GAMECUBE_IRQS) { - GAMECUBE_OUT(GAMECUBE_PIIM, GAMECUBE_IN(GAMECUBE_PIIM) | (1 << irq)); - } - //printk("after unmask(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); -} - -static void -gamecube_mask_irq(unsigned int irq) -{ - //printk("mask(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); - if (irq < GAMECUBE_IRQS) { - GAMECUBE_OUT(GAMECUBE_PIIM, GAMECUBE_IN(GAMECUBE_PIIM) & ~(1 << irq)); /* mask */ - } -} - -static void -gamecube_mask_and_ack_irq(unsigned int irq) -{ - //printk("mask_and_ack(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); - if (irq < GAMECUBE_IRQS) { - GAMECUBE_OUT(GAMECUBE_PIIM, GAMECUBE_IN(GAMECUBE_PIIM) & ~(1 << irq)); /* mask */ - GAMECUBE_OUT(GAMECUBE_PIIC, 1 << irq); /* ack */ - } - //printk("after mask_and_ack(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); -} - -static struct hw_interrupt_type gamecube_pic = { - "GameCube PIC", - NULL, /* startup */ - NULL, /* shutdown */ - gamecube_unmask_irq, - gamecube_mask_irq, - gamecube_mask_and_ack_irq, - NULL, /* end */ - NULL /* set_affinity */ -}; - -static void __init -gamecube_init_IRQ(void) -{ - int i; - - GAMECUBE_OUT(GAMECUBE_PIIM,0); /* disable all irqs */ - GAMECUBE_OUT(GAMECUBE_PIIC,0xffffffff); /* ack all irqs */ - - for (i = 0; i < GAMECUBE_IRQS; i++) { - irq_desc[i].handler = &gamecube_pic; - } -} - -/* - * Find the highest IRQ that generating an interrupt, if any. - */ -int -gamecube_get_irq(struct pt_regs *regs) -{ - int irq = 0; - u_int irq_status, irq_test = 1; - - //printk("get_irq(): %x, %x\n", GAMECUBE_IN(GAMECUBE_PIIM), GAMECUBE_IN(GAMECUBE_PIIC)); - irq_status = GAMECUBE_IN(GAMECUBE_PIIC) & GAMECUBE_IN(GAMECUBE_PIIM); - - if(irq_status==0) { - return -1; - //printk("\nPanic: IRQ for no reason!\n\n\n\n\n\n"); - //while(1); - } - do - { - if (irq_status & irq_test) - break; - irq++; - irq_test <<= 1; - } while (irq < GAMECUBE_IRQS); - - return irq; -} - -static void gamecube_restart(char *cmd) { printk("gamecube_restart()\n"); |