From: Richard B. <rb...@us...> - 2002-05-29 03:02:54
|
Update of /cvsroot/linux-vax/kernel-2.4/drivers/vsbus In directory usw-pr-cvs1:/tmp/cvs-serv22990/drivers/vsbus Modified Files: vsbus.c Log Message: Fixed vsbus autodetect for KA55 cpu. It uses a different CPU register arrangement. Now correctly detects Dz console device. Index: vsbus.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/vsbus/vsbus.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- vsbus.c 4 Feb 2002 22:56:50 -0000 1.8 +++ vsbus.c 29 May 2002 03:02:50 -0000 1.9 @@ -14,6 +14,7 @@ #include <asm/mv.h> #include <asm/ka43.h> +#include <asm/ka55.h> extern struct vax_mv mv_ka46; extern struct vax_mv mv_ka55; @@ -23,45 +24,72 @@ unsigned char vs_enabled; } sys_vs; +struct ka55_cpu_regs *ka55_cpu; + +int is_ka46(void) { return (mv==&mv_ka46); } + +int is_ka55(void) { return (mv==&mv_ka55); } + int vsbus_setup(void) { unsigned long irqs; - if (!is_ka55()) + if (!is_ka55()){ sys_vs.vs_cpu_ptr=(void *)ioremap(VSA_BASE_REGS, 128); - else + sys_vs.vs_mask=sys_vs.vs_cpu_ptr->vc_intreq; + } + else { sys_vs.vs_cpu_ptr=(void *)ioremap(VSA_KA55_BASE_REGS,128); - sys_vs.vs_mask=sys_vs.vs_cpu_ptr->vc_intreq; + ka55_cpu = (struct ka55_cpu_regs *)sys_vs.vs_cpu_ptr; + sys_vs.vs_mask=ka55_cpu->intreq; + } irqs=probe_irq_on(); - sys_vs.vs_cpu_ptr->vc_intmsk=0; - sys_vs.vs_cpu_ptr->vc_intclr=0xFF; - mdelay(1000); - sys_vs.vs_mask=sys_vs.vs_cpu_ptr->vc_intreq; + if (!is_ka55()) { + sys_vs.vs_cpu_ptr->vc_intmsk=0; + sys_vs.vs_cpu_ptr->vc_intclr=0xFF; + mdelay(1000); + sys_vs.vs_mask=sys_vs.vs_cpu_ptr->vc_intreq; - /* switch off all interrupts for now */ - sys_vs.vs_cpu_ptr->vc_intmsk=0; /*~sys_vs.vs_mask;*/ + /* switch off all interrupts for now */ + sys_vs.vs_cpu_ptr->vc_intmsk=0; /*~sys_vs.vs_mask;*/ + } + else { + ka55_cpu->intmsk = 0; + ka55_cpu->intclr = 0xff; + mdelay(1000); + sys_vs.vs_mask=ka55_cpu->intreq; + } probe_irq_off(irqs); return 0; } int vsbus_enable_int(int bit_nr) { - sys_vs.vs_cpu_ptr->vc_intmsk|=1<<bit_nr; + if (!is_ka55()) + sys_vs.vs_cpu_ptr->vc_intmsk|=1<<bit_nr; + else + ka55_cpu->intmsk|=1<<bit_nr; sys_vs.vs_enabled |= 1<< bit_nr; return 0; } int vsbus_clear_int(int bit_nr) { - sys_vs.vs_cpu_ptr->vc_intclr=1<<bit_nr; + if(!is_ka55()) + sys_vs.vs_cpu_ptr->vc_intclr=1<<bit_nr; + else + ka55_cpu->intclr=1<<bit_nr; return 0; } int vsbus_disable_int(int bit_nr) { - sys_vs.vs_cpu_ptr->vc_intmsk&=~(1<<bit_nr); + if (!is_ka55()) + sys_vs.vs_cpu_ptr->vc_intmsk&=~(1<<bit_nr); + else + ka55_cpu->intmsk&=~(1<<bit_nr); sys_vs.vs_enabled &= ~(1<<bit_nr); return 0; } @@ -69,8 +97,13 @@ int vsbus_probe_irq_on(void) { printk("vsbus: probing set mask ~%2X\n", sys_vs.vs_mask); - sys_vs.vs_cpu_ptr->vc_intmsk = 0; //~sys_vs.vs_mask; - sys_vs.vs_cpu_ptr->vc_intclr=0xff; + if (!is_ka55()){ + sys_vs.vs_cpu_ptr->vc_intmsk = 0; //~sys_vs.vs_mask; + sys_vs.vs_cpu_ptr->vc_intclr=0xff; + } else { + ka55_cpu->intmsk=0; + ka55_cpu->intclr=0xff; + } return 0; } @@ -78,14 +111,15 @@ { unsigned char x, y; - x=sys_vs.vs_cpu_ptr->vc_intreq; + if (!is_ka55()) + x=sys_vs.vs_cpu_ptr->vc_intreq; + else + x=ka55_cpu->intreq; y = x & ~sys_vs.vs_mask; printk("vsbus: probe returning %2X, %2X\n", x, ffs(y)); - sys_vs.vs_cpu_ptr->vc_intmsk = sys_vs.vs_enabled; + if(!is_ka55()) + sys_vs.vs_cpu_ptr->vc_intmsk = sys_vs.vs_enabled; + else + ka55_cpu->intmsk=sys_vs.vs_enabled; return ffs(y)-1; } - -int is_ka46(void) { return (mv==&mv_ka46); } - -int is_ka55(void) { return (mv==&mv_ka55); } - |