From: Pete P. <pp...@us...> - 2001-10-03 22:49:37
|
Update of /cvsroot/linux-mips/linux/arch/mips/au1000/common In directory usw-pr-cvs1:/tmp/cvs-serv25362/arch/mips/au1000/common Modified Files: irq.c prom.c Log Message: * Added pcmcia ide support. * fixed interrupt handler to work with new pb1000 pcmcia cpld * modified pcmcia driver to reflect cpld changes * hardcoded pcmcia driver to apply 3.3V if XV is detected, which seems to be a socket/hardware problem. Index: irq.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/au1000/common/irq.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- irq.c 2001/09/25 03:36:35 1.7 +++ irq.c 2001/10/03 22:49:23 1.8 @@ -99,44 +99,44 @@ if (irq_nr > AU1000_LAST_INTC0_INT) { switch (type) { case INTC_INT_RISE_EDGE: /* 0:0:1 */ - outl(1<<irq_nr,INTC1_CONFIG2_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG1_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG0_SET); + outl(1<<(irq_nr-32),INTC1_CONFIG2_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG1_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG0_SET); break; case INTC_INT_FALL_EDGE: /* 0:1:0 */ - outl(1<<irq_nr, INTC1_CONFIG2_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG1_SET); - outl(1<<irq_nr, INTC1_CONFIG0_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG2_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG1_SET); + outl(1<<(irq_nr-32), INTC1_CONFIG0_CLEAR); break; case INTC_INT_HIGH_LEVEL: /* 1:0:1 */ - outl(1<<irq_nr, INTC1_CONFIG2_SET); - outl(1<<irq_nr, INTC1_CONFIG1_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG0_SET); + outl(1<<(irq_nr-32), INTC1_CONFIG2_SET); + outl(1<<(irq_nr-32), INTC1_CONFIG1_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG0_SET); break; case INTC_INT_LOW_LEVEL: /* 1:1:0 */ - outl(1<<irq_nr, INTC1_CONFIG2_SET); - outl(1<<irq_nr, INTC1_CONFIG1_SET); - outl(1<<irq_nr, INTC1_CONFIG0_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG2_SET); + outl(1<<(irq_nr-32), INTC1_CONFIG1_SET); + outl(1<<(irq_nr-32), INTC1_CONFIG0_CLEAR); break; case INTC_INT_DISABLED: /* 0:0:0 */ - outl(1<<irq_nr, INTC1_CONFIG0_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG1_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG2_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG0_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG1_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG2_CLEAR); break; default: /* disable the interrupt */ printk("unexpected int type %d (irq %d)\n", type, irq_nr); - outl(1<<irq_nr, INTC1_CONFIG0_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG1_CLEAR); - outl(1<<irq_nr, INTC1_CONFIG2_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG0_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG1_CLEAR); + outl(1<<(irq_nr-32), INTC1_CONFIG2_CLEAR); return; } if (int_req) /* assign to interrupt request 1 */ - outl(1<<irq_nr, INTC1_ASSIGN_REQ_CLEAR); + outl(1<<(irq_nr-32), INTC1_ASSIGN_REQ_CLEAR); else /* assign to interrupt request 0 */ - outl(1<<irq_nr, INTC1_ASSIGN_REQ_SET); - outl(1<<irq_nr, INTC1_SOURCE_SET); - outl(1<<irq_nr, INTC1_MASK_CLEAR); - outl(1<<irq_nr, INTC1_WAKEUP_CLEAR); + outl(1<<(irq_nr-32), INTC1_ASSIGN_REQ_SET); + outl(1<<(irq_nr-32), INTC1_SOURCE_SET); + outl(1<<(irq_nr-32), INTC1_MASK_CLEAR); + outl(1<<(irq_nr-32), INTC1_WAKEUP_CLEAR); } else { switch (type) { @@ -194,14 +194,15 @@ static void shutdown_irq(unsigned int irq_nr) { local_disable_irq(irq_nr); + return; } inline void local_enable_irq(unsigned int irq_nr) { if (irq_nr > AU1000_LAST_INTC0_INT) { - outl(1<<irq_nr, INTC1_MASK_SET); - outl(1<<irq_nr, INTC1_WAKEUP_SET); + outl(1<<(irq_nr-32), INTC1_MASK_SET); + outl(1<<(irq_nr-32), INTC1_WAKEUP_SET); } else { outl(1<<irq_nr, INTC0_MASK_SET); @@ -214,8 +215,8 @@ inline void local_disable_irq(unsigned int irq_nr) { if (irq_nr > AU1000_LAST_INTC0_INT) { - outl(1<<irq_nr, INTC1_MASK_CLEAR); - outl(1<<irq_nr, INTC1_WAKEUP_CLEAR); + outl(1<<(irq_nr-32), INTC1_MASK_CLEAR); + outl(1<<(irq_nr-32), INTC1_WAKEUP_CLEAR); } else { outl(1<<irq_nr, INTC0_MASK_CLEAR); @@ -228,8 +229,8 @@ static inline void mask_and_ack_rise_edge_irq(unsigned int irq_nr) { if (irq_nr > AU1000_LAST_INTC0_INT) { - outl(1<<irq_nr, INTC1_R_EDGE_DETECT_CLEAR); - outl(1<<irq_nr, INTC1_MASK_CLEAR); + outl(1<<(irq_nr-32), INTC1_R_EDGE_DETECT_CLEAR); + outl(1<<(irq_nr-32), INTC1_MASK_CLEAR); } else { outl(1<<irq_nr, INTC0_R_EDGE_DETECT_CLEAR); @@ -242,8 +243,8 @@ static inline void mask_and_ack_fall_edge_irq(unsigned int irq_nr) { if (irq_nr > AU1000_LAST_INTC0_INT) { - outl(1<<irq_nr, INTC1_F_EDGE_DETECT_CLEAR); - outl(1<<irq_nr, INTC1_MASK_CLEAR); + outl(1<<(irq_nr-32), INTC1_F_EDGE_DETECT_CLEAR); + outl(1<<(irq_nr-32), INTC1_MASK_CLEAR); } else { outl(1<<irq_nr, INTC0_F_EDGE_DETECT_CLEAR); @@ -255,38 +256,30 @@ static inline void mask_and_ack_level_irq(unsigned int irq_nr) { -#ifdef CONFIG_MIPS_PB1000 - if (irq_nr == AU1000_GPIO_15) { /* shared pin */ - writel(0x8000, AU1000_MDR); /* clear pcmcia interrupt */ - au_sync(); - udelay(1); - writel(0x4000, AU1000_MDR); /* re-enable pcmcia interrupt */ - au_sync(); - udelay(1); - } -#endif + local_disable_irq(irq_nr); au_sync(); + if (irq_nr == AU1000_GPIO_15) { + writew(0x8000, AU1000_MDR); /* ack int */ + au_sync(); + } + return; } static void end_irq(unsigned int irq_nr) { -#ifdef CONFIG_MIPS_PB1000 - if (irq_nr == AU1000_GPIO_15) { /* shared pin */ - writel(0x8000, AU1000_MDR); /* clear pcmcia interrupt */ - au_sync(); - udelay(1); - writel(0x4000, AU1000_MDR); /* re-enable pcmcia interrupt */ - au_sync(); - udelay(1); - } -#endif - if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRESS))) + if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRESS))) { local_enable_irq(irq_nr); - else + } + else { printk("warning: end_irq %d did not enable (%x)\n", irq_nr, irq_desc[irq_nr].status); + } + if (irq_nr == AU1000_GPIO_15) { + writew(0x4000, AU1000_MDR); /* enable int */ + au_sync(); + } } unsigned long save_local_and_disable(int controller) @@ -297,13 +290,13 @@ if (controller) { mask = readl(INTC1_MASK_SET); - for (i=0; i<32; i++) { + for (i=32; i<64; i++) { local_disable_irq(i); } } else { mask = readl(INTC0_MASK_SET); - for (i=32; i<64; i++) { + for (i=0; i<32; i++) { local_disable_irq(i); } } @@ -470,7 +463,7 @@ if ((intc0_req0 & (1<<i))) { intc0_req0 &= ~(1<<i); do_IRQ(irq, regs); - return; + break; } irq++; } @@ -500,7 +493,7 @@ { do_IRQ(irq, regs); } - return; + break; } irq++; } @@ -515,19 +508,25 @@ { int irq = 0, i; static unsigned long intc1_req0 = 0; + volatile unsigned short levels, mdr; + unsigned char ide_status; intc1_req0 |= inl(INTC1_REQ0_INT); if (!intc1_req0) return; + writew(1, CPLD_AUX0); /* debug led 0 */ for (i=0; i<32; i++) { if ((intc1_req0 & (1<<i))) { intc1_req0 &= ~(1<<i); + writew(2, CPLD_AUX0); /* turn on debug led 1 */ do_IRQ(irq+32, regs); - return; + writew(0, CPLD_AUX0); /* turn off debug led 1 */ + break; } irq++; } + writew(0, CPLD_AUX0); } @@ -544,7 +543,7 @@ if ((intc1_req1 & (1<<i))) { intc1_req1 &= ~(1<<i); do_IRQ(irq+32, regs); - return; + break; } irq++; } Index: prom.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/au1000/common/prom.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- prom.c 2001/08/28 07:23:54 1.4 +++ prom.c 2001/10/03 22:49:23 1.5 @@ -4,7 +4,7 @@ * PROM library initialisation code, assuming a version of * pmon is the boot code. * - * Copyright 2000 MontaVista Software Inc. + * Copyright 2000,2001 MontaVista Software Inc. * Author: MontaVista Software, Inc. * pp...@mv... or so...@mv... * @@ -35,7 +35,7 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <linux/config.h> +#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/string.h> @@ -55,12 +55,12 @@ }t_env_var; -char * __init prom_getcmdline(void) +char * prom_getcmdline(void) { return &(arcs_cmdline[0]); } -void __init prom_init_cmdline(void) +void prom_init_cmdline(void) { char *cp; int actr; @@ -149,3 +149,5 @@ } void prom_free_prom_memory (void) {} +EXPORT_SYMBOL(prom_getcmdline); +EXPORT_SYMBOL(get_ethernet_addr); |