From: <aot...@us...> - 2004-03-08 23:35:50
|
Update of /cvsroot/gc-linux/linux/arch/ppc/platforms In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16424/arch/ppc/platforms Modified Files: gamecube.h gc-dvdcover.c Log Message: Patch from Albert Herranz (isobel) after he spotted a bug in gc_dvdcover_handler() where it was handling only one (cover closed) of all interrupts it was claiming. Should fix the hang people were seeing pre-fbcon init. Index: gamecube.h =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/ppc/platforms/gamecube.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gamecube.h 30 Jan 2004 14:59:16 -0000 1.3 +++ gamecube.h 8 Mar 2004 23:19:06 -0000 1.4 @@ -7,6 +7,10 @@ * * Author: Armin Kuster <ak...@mv...> * + * Albert Herranz + * GAMECUBE + * - Added some defines for DI interrupt handling. + * * 2001 (c) MontaVista, Software, Inc. This file is licensed under * the terms of the GNU General Public License version 2. This program * is licensed "as is" without any warranty of any kind, whether express @@ -39,8 +43,17 @@ #define GAMECUBE_RESET 0xcc003024 /* RESET */ #define GAMECUBE_DICVR 0xcc006004 /* DI Cover Register */ -#define GAMECUBE_IN(a) (*(u_int *)a) -#define GAMECUBE_OUT(a,d) (*(u_int *)a = d) +#define GC_DI_DISR 0xcc006000 /* DI Status Register */ +#define GC_DI_DISR_BRKINT (1<<6) +#define GC_DI_DISR_BRKINTMASK (1<<5) +#define GC_DI_DISR_TCINT (1<<4) +#define GC_DI_DISR_TCINTMASK (1<<3) +#define GC_DI_DISR_DEINT (1<<2) +#define GC_DI_DISR_DEINTMASK (1<<1) +#define GC_DI_DISR_BRK (1<<0) + +#define GAMECUBE_IN(a) (*(volatile unsigned long *)a) +#define GAMECUBE_OUT(a,d) (*(volatile unsigned long *)a = d) #define GAMECUBE_IRQS 14 Index: gc-dvdcover.c =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/ppc/platforms/gc-dvdcover.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gc-dvdcover.c 30 Jan 2004 14:59:16 -0000 1.1 +++ gc-dvdcover.c 8 Mar 2004 23:19:06 -0000 1.2 @@ -17,6 +17,12 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ +/* + * Albert Herranz + * GAMECUBE + * - Fixed bug that caused kernel to "loop" in gc_dvdcover_handler + * sometimes during kernel init. + */ #include <linux/kernel.h> #include <linux/ioport.h> @@ -40,19 +46,30 @@ if (reason & 4) { GAMECUBE_OUT(GAMECUBE_DICVR, reason | 4); printk(KERN_ERR "gc_dvdcover: DVD cover was closed\n"); + return IRQ_HANDLED; } - return IRQ_HANDLED; + return IRQ_NONE; } static int gc_dvdcover_init(void) { + unsigned long outval; + + /* clear pending DI interrupts and mask new ones */ + /* this prevents an annoying bug while we lack a complete DVD driver */ + outval = GC_DI_DISR_BRKINT | GC_DI_DISR_TCINT | + GC_DI_DISR_DEINT; + outval &= ~(GC_DI_DISR_BRKINTMASK | GC_DI_DISR_TCINTMASK | + GC_DI_DISR_DEINTMASK); + GAMECUBE_OUT(GC_DI_DISR, outval); + if (request_irq(DVD_IRQ, gc_dvdcover_handler, 0, "GameCube DVD Cover", 0) < 0) { printk(KERN_ERR "gc_dvdcover: Request irq%d failed\n", DVD_IRQ); } else { enable_irq(DVD_IRQ); + GAMECUBE_OUT(GAMECUBE_DICVR, GAMECUBE_IN(GAMECUBE_DICVR) | 2); } - GAMECUBE_OUT(GAMECUBE_DICVR, GAMECUBE_IN(GAMECUBE_DICVR) | 2); return 0; } |