diff options
Diffstat (limited to 'arch/parisc/kernel')
-rw-r--r-- | arch/parisc/kernel/firmware.c | 88 | ||||
-rw-r--r-- | arch/parisc/kernel/irq.c | 2 | ||||
-rw-r--r-- | arch/parisc/kernel/parisc_ksyms.c | 22 | ||||
-rw-r--r-- | arch/parisc/kernel/pdc_cons.c | 11 |
4 files changed, 59 insertions, 64 deletions
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index fd6552c4c08..4ab83d56974 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -1082,76 +1082,56 @@ void pdc_io_reset_devices(void) /** - * pdc_iodc_putc - Console character print using IODC. - * @c: the character to output. + * pdc_iodc_print - Console print using IODC. + * @str: the string to output. + * @count: length of str * * Note that only these special chars are architected for console IODC io: * BEL, BS, CR, and LF. Others are passed through. * Since the HP console requires CR+LF to perform a 'newline', we translate * "\n" to "\r\n". */ -void pdc_iodc_putc(unsigned char c) +int pdc_iodc_print(unsigned char *str, unsigned count) { - /* XXX Should we spinlock posx usage */ - static int posx; /* for simple TAB-Simulation... */ - static int __attribute__((aligned(8))) iodc_retbuf[32]; - static char __attribute__((aligned(64))) iodc_dbuf[4096]; - unsigned int n; + /* XXX Should we spinlock posx usage */ + static int posx; /* for simple TAB-Simulation... */ + int __attribute__((aligned(8))) iodc_retbuf[32]; + char __attribute__((aligned(64))) iodc_dbuf[4096]; + unsigned int i; unsigned long flags; - switch (c) { - case '\n': - iodc_dbuf[0] = '\r'; - iodc_dbuf[1] = '\n'; - n = 2; - posx = 0; - break; - case '\t': - pdc_iodc_putc(' '); - while (posx & 7) /* expand TAB */ - pdc_iodc_putc(' '); - return; /* return since IODC can't handle this */ - case '\b': - posx-=2; /* BS */ - default: - iodc_dbuf[0] = c; - n = 1; - posx++; - break; - } + memset(iodc_dbuf, 0, 4096); + for (i = 0; i < count && i < 2048;) { + switch(str[i]) { + case '\n': + iodc_dbuf[i+0] = '\r'; + iodc_dbuf[i+1] = '\n'; + i += 2; + posx = 0; + break; + case '\t': + while (posx & 7) { + iodc_dbuf[i] = ' '; + i++, posx++; + } + break; + case '\b': /* BS */ + posx -= 2; + default: + iodc_dbuf[i] = str[i]; + i++, posx++; + break; + } + } spin_lock_irqsave(&pdc_lock, flags); real32_call(PAGE0->mem_cons.iodc_io, (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT, PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers), - __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0); + __pa(iodc_retbuf), 0, __pa(iodc_dbuf), i, 0); spin_unlock_irqrestore(&pdc_lock, flags); -} -/** - * pdc_iodc_outc - Console character print using IODC (without conversions). - * @c: the character to output. - * - * Write the character directly to the IODC console. - */ -void pdc_iodc_outc(unsigned char c) -{ - unsigned int n; - unsigned long flags; - - /* fill buffer with one caracter and print it */ - static int __attribute__((aligned(8))) iodc_retbuf[32]; - static char __attribute__((aligned(64))) iodc_dbuf[4096]; - - n = 1; - iodc_dbuf[0] = c; - - spin_lock_irqsave(&pdc_lock, flags); - real32_call(PAGE0->mem_cons.iodc_io, - (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT, - PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers), - __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0); - spin_unlock_irqrestore(&pdc_lock, flags); + return i; } /** diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 76ce5e3b005..23ef950df00 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c @@ -397,7 +397,7 @@ static void claim_cpu_irqs(void) } irq_desc[TIMER_IRQ].action = &timer_action; - irq_desc[TIMER_IRQ].status |= IRQ_PER_CPU; + irq_desc[TIMER_IRQ].status = IRQ_PER_CPU; #ifdef CONFIG_SMP irq_desc[IPI_IRQ].action = &ipi_action; irq_desc[IPI_IRQ].status = IRQ_PER_CPU; diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c index 671ee5b9950..7aca704e96f 100644 --- a/arch/parisc/kernel/parisc_ksyms.c +++ b/arch/parisc/kernel/parisc_ksyms.c @@ -122,9 +122,31 @@ EXPORT_SYMBOL($$divI_12); EXPORT_SYMBOL($$divI_14); EXPORT_SYMBOL($$divI_15); +extern void __ashrdi3(void); +extern void __ashldi3(void); +extern void __lshrdi3(void); +extern void __muldi3(void); + +EXPORT_SYMBOL(__ashrdi3); +EXPORT_SYMBOL(__ashldi3); +EXPORT_SYMBOL(__lshrdi3); +EXPORT_SYMBOL(__muldi3); + asmlinkage void * __canonicalize_funcptr_for_compare(void *); EXPORT_SYMBOL(__canonicalize_funcptr_for_compare); +#ifdef CONFIG_64BIT +extern void __divdi3(void); +extern void __udivdi3(void); +extern void __umoddi3(void); +extern void __moddi3(void); + +EXPORT_SYMBOL(__divdi3); +EXPORT_SYMBOL(__udivdi3); +EXPORT_SYMBOL(__umoddi3); +EXPORT_SYMBOL(__moddi3); +#endif + #ifndef CONFIG_64BIT extern void $$dyncall(void); EXPORT_SYMBOL($$dyncall); diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c index aab05767427..33b1f84441b 100644 --- a/arch/parisc/kernel/pdc_cons.c +++ b/arch/parisc/kernel/pdc_cons.c @@ -55,13 +55,7 @@ static void pdc_console_write(struct console *co, const char *s, unsigned count) { - while(count--) - pdc_iodc_putc(*s++); -} - -void pdc_outc(unsigned char c) -{ - pdc_iodc_outc(c); + pdc_iodc_print(s, count); } void pdc_printf(const char *fmt, ...) @@ -74,8 +68,7 @@ void pdc_printf(const char *fmt, ...) len = vscnprintf(buf, sizeof(buf), fmt, args); va_end(args); - for (i = 0; i < len; i++) - pdc_iodc_outc(buf[i]); + pdc_iodc_print(buf, len); } int pdc_console_poll_key(struct console *co) |