? drivers/net/wireless/bin_to_h ? lib/gen_crc32table Index: arch/arm/kernel/entry-armv.S =================================================================== RCS file: /cvs/linux/kernel/arch/arm/kernel/entry-armv.S,v retrieving revision 1.32 diff -u -r1.32 entry-armv.S --- arch/arm/kernel/entry-armv.S 7 Oct 2003 15:33:18 -0000 1.32 +++ arch/arm/kernel/entry-armv.S 20 May 2005 23:33:40 -0000 @@ -629,7 +629,7 @@ rsb \irqnr, \irqstat, #0 and \irqstat, \irqstat, \irqnr clz \irqnr, \irqstat - rsb \irqnr, \irqnr, #23 + rsb \irqnr, \irqnr, #(31 - PXA_IRQ_SKIP) 1001: .endm @@ -894,8 +894,9 @@ * This is the return code to user mode for abort handlers */ ENTRY(ret_from_exception) - get_current_task tsk + disable_irq r1 mov why, #0 + get_current_task tsk b ret_to_user .data Index: arch/arm/kernel/entry-common.S =================================================================== RCS file: /cvs/linux/kernel/arch/arm/kernel/entry-common.S,v retrieving revision 1.17 diff -u -r1.17 entry-common.S --- arch/arm/kernel/entry-common.S 7 Oct 2003 15:33:18 -0000 1.17 +++ arch/arm/kernel/entry-common.S 20 May 2005 23:33:40 -0000 @@ -34,6 +34,7 @@ * stack. */ ret_fast_syscall: + disable_irq r1 @ ensure IRQs are disabled ldr r1, [tsk, #TSK_NEED_RESCHED] ldr r2, [tsk, #TSK_SIGPENDING] teq r1, #0 @ need_resched || sigpending @@ -45,28 +46,35 @@ * Ok, we need to do extra processing, enter the slow path. */ slow: str r0, [sp, #S_R0+S_OFF]! @ returned r0 - b 1f + teq r1, #0 + beq 1f /* * "slow" syscall return path. "why" tells us if this was a real syscall. */ reschedule: bl SYMBOL_NAME(schedule) +ret_disable_irq: + disable_irq r1 @ ensure IRQs are disabled ENTRY(ret_to_user) ret_slow_syscall: ldr r1, [tsk, #TSK_NEED_RESCHED] ldr r2, [tsk, #TSK_SIGPENDING] -1: teq r1, #0 @ need_resched => schedule() + teq r1, #0 @ need_resched => schedule() bne reschedule - teq r2, #0 @ sigpending => do_signal() - blne __do_signal +1: teq r2, #0 @ sigpending => do_signal() + bne __do_signal +restore: restore_user_regs __do_signal: + enable_irq r1 mov r0, #0 @ NULL 'oldset' mov r1, sp @ 'regs' mov r2, why @ 'syscall' - b SYMBOL_NAME(do_signal) @ note the bl above sets lr + bl SYMBOL_NAME(do_signal) @ note the bl above sets lr + disable_irq r1 @ ensure IRQs are disabled + b restore /* * This is how we return from a fork. __switch_to will be calling us @@ -79,11 +87,11 @@ ldr ip, [tsk, #TSK_PTRACE] @ check for syscall tracing mov why, #1 tst ip, #PT_TRACESYS @ are we tracing syscalls? - beq ret_slow_syscall + beq ret_disable_irq mov r1, sp mov r0, #1 @ trace exit [IP = 1] bl SYMBOL_NAME(syscall_trace) - b ret_slow_syscall + b ret_disable_irq #include "calls.S" @@ -130,7 +138,7 @@ ldr ip, [ip] mcr p15, 0, ip, c1, c0 @ update control register #endif - enable_irqs ip + enable_irq ip str r4, [sp, #-S_OFF]! @ push fifth arg @@ -174,7 +182,7 @@ mov r1, sp mov r0, #1 @ trace exit [IP = 1] bl SYMBOL_NAME(syscall_trace) - b ret_slow_syscall + b ret_disable_irq .align 5 #ifdef CONFIG_ALIGNMENT_TRAP Index: arch/arm/kernel/entry-header.S =================================================================== RCS file: /cvs/linux/kernel/arch/arm/kernel/entry-header.S,v retrieving revision 1.4 diff -u -r1.4 entry-header.S --- arch/arm/kernel/entry-header.S 23 Aug 2002 22:18:41 -0000 1.4 +++ arch/arm/kernel/entry-header.S 20 May 2005 23:33:40 -0000 @@ -41,14 +41,14 @@ @ @ Stack format (ensured by USER_* and SVC_*) @ -#define S_FRAME_SIZE 72 #ifdef CONFIG_CPU_32 +#define S_FRAME_SIZE 72 #define S_OLD_R0 68 #define S_PSR 64 #else +#define S_FRAME_SIZE 68 #define S_OLD_R0 64 #define S_PSR 60 -#define S_PC 60 #endif #define S_PC 60 @@ -70,6 +70,24 @@ #define S_OFF 8 #ifdef CONFIG_CPU_32 + .macro set_cpsr_c, reg, mode +#if 1 + /* broken binutils */ + mov \reg, \mode + msr cpsr_c, \reg +#else + msr cpsr_c, \mode +#endif + .endm + + .macro disable_irq, temp + set_cpsr_c \temp, #I_BIT | MODE_SVC + .endm + + .macro enable_irq, temp + set_cpsr_c \temp, #MODE_SVC + .endm + .macro save_user_regs sub sp, sp, #S_FRAME_SIZE stmia sp, {r0 - r12} @ Calling r0 - r12 @@ -81,21 +99,23 @@ str r0, [sp, #S_OLD_R0] @ Save OLD_R0 .endm +/* + * Must be called with IRQs already disabled. + */ .macro restore_user_regs - ldr r0, [sp, #S_PSR] @ Get calling cpsr - mov ip, #I_BIT | MODE_SVC - msr cpsr_c, ip @ disable IRQs - msr spsr, r0 @ save in spsr_svc - ldr lr, [sp, #S_PC] @ Get PC - ldmia sp, {r0 - lr}^ @ Get calling r0 - lr + ldr r1, [sp, #S_PSR] @ Get calling cpsr + ldr lr, [sp, #S_PC]! @ Get PC + msr spsr, r1 @ save in spsr_svc + ldmdb sp, {r0 - lr}^ @ Get calling r0 - lr mov r0, r0 - add sp, sp, #S_FRAME_SIZE + add sp, sp, #S_FRAME_SIZE - S_PC movs pc, lr @ return & move spsr_svc into cpsr .endm +/* + * Must be called with IRQs already disabled. + */ .macro fast_restore_user_regs - mov ip, #I_BIT | MODE_SVC - msr cpsr_c, ip @ disable IRQs ldr r1, [sp, #S_OFF + S_PSR] @ get calling cpsr ldr lr, [sp, #S_OFF + S_PC]! @ get pc msr spsr, r1 @ save in spsr_svc @@ -108,11 +128,6 @@ .macro mask_pc, rd, rm .endm - .macro enable_irqs, temp - mov \temp, #MODE_SVC - msr cpsr_c, \temp - .endm - .macro get_current_task, rd mov \rd, sp, lsr #13 mov \rd, \rd, lsl #13 @@ -136,9 +151,9 @@ #else .macro save_user_regs - str r0, [sp, #-4]! - str lr, [sp, #-4]! - sub sp, sp, #15*4 + sub sp, sp, #S_FRAME_SIZE + str r0, [sp, #S_OLD_R0] + str lr, [sp, #S_PC] stmia sp, {r0 - lr}^ mov r0, r0 .endm @@ -146,17 +161,16 @@ .macro restore_user_regs ldmia sp, {r0 - lr}^ mov r0, r0 - ldr lr, [sp, #15*4] - add sp, sp, #15*4+8 + ldr lr, [sp, #S_PC] + add sp, sp, #S_FRAME_SIZE movs pc, lr .endm .macro fast_restore_user_regs - add sp, sp, #S_OFF - ldmib sp, {r1 - lr}^ + add sp, sp, #S_OFF + S_PC + ldmdb sp, {r1 - lr}^ mov r0, r0 - ldr lr, [sp, #15*4] - add sp, sp, #15*4+8 + ldr lr, [sp], #S_FRAME_SIZE - S_PC movs pc, lr .endm @@ -164,7 +178,11 @@ bic \rd, \rm, #PCMASK .endm - .macro enable_irqs, temp + .macro disable_irq, temp + teqp pc, #0x08000003 + .endm + + .macro enable_irq, temp teqp pc, #0x00000003 .endm Index: arch/arm/kernel/irq-arch.c =================================================================== RCS file: /cvs/linux/kernel/arch/arm/kernel/irq-arch.c,v retrieving revision 1.2 diff -u -r1.2 irq-arch.c --- arch/arm/kernel/irq-arch.c 14 Aug 2001 08:56:32 -0000 1.2 +++ arch/arm/kernel/irq-arch.c 20 May 2005 23:33:40 -0000 @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include Index: arch/arm/kernel/irq.c =================================================================== RCS file: /cvs/linux/kernel/arch/arm/kernel/irq.c,v retrieving revision 1.22 diff -u -r1.22 irq.c --- arch/arm/kernel/irq.c 25 Oct 2003 17:45:57 -0000 1.22 +++ arch/arm/kernel/irq.c 20 May 2005 23:33:40 -0000 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -74,9 +75,9 @@ spin_lock_irqsave(&irq_controller_lock, flags); if (!desc->disable_depth++) { -//#ifndef CONFIG_CPU_SA1100 + //#ifndef CONFIG_CPU_SA1100 desc->mask(irq); -//#endif + //#endif } spin_unlock_irqrestore(&irq_controller_lock, flags); } @@ -219,7 +220,7 @@ * we shouldn't process the IRQ. Instead, turn on the * hardware masks. */ - if ((desc->running && !desc->reentrant) || desc->disable_depth) + if (desc->running || desc->disable_depth) goto running; /* @@ -249,10 +250,8 @@ /* * If we are disabled or freed, shut down the handler. */ - if (desc->action && desc->disable_depth == 0 && !desc->no_unmask && !check_irq_lock(desc, irq, regs) ) { + if (desc->action && !check_irq_lock(desc, irq, regs)) desc->unmask(irq); - } - return; running: @@ -260,7 +259,6 @@ * We got another IRQ while this one was masked or * currently running. Delay it. */ - desc->mask(irq); desc->pending = 1; } @@ -364,7 +362,7 @@ int cpu; #ifdef CONFIG_ARCH_S3C2410 -eint_again: + eint_again: if( irq == IRQ_EINT4_7 || EINT4_7flag) { EINT4_7flag = 1; @@ -373,7 +371,7 @@ EINT4_7flag = 0; } } - + if( irq == IRQ_EINT8_23 || EINT8_23flag) { EINT8_23flag = 1; irq = Split_EINT8_23(irq); @@ -383,6 +381,7 @@ } #endif + desc = irq_desc + irq; cpu = smp_processor_id(); Index: arch/arm/kernel/time.c =================================================================== RCS file: /cvs/linux/kernel/arch/arm/kernel/time.c,v retrieving revision 1.13 diff -u -r1.13 time.c --- arch/arm/kernel/time.c 27 Sep 2002 13:50:23 -0000 1.13 +++ arch/arm/kernel/time.c 20 May 2005 23:33:40 -0000 @@ -203,6 +203,7 @@ static struct irqaction timer_irq = { .name = "timer", + .flags = SA_INTERRUPT, }; /* Index: arch/arm/mach-pxa/h5400.c =================================================================== RCS file: /cvs/linux/kernel/arch/arm/mach-pxa/h5400.c,v retrieving revision 1.76 diff -u -r1.76 h5400.c --- arch/arm/mach-pxa/h5400.c 3 Sep 2004 13:25:47 -0000 1.76 +++ arch/arm/mach-pxa/h5400.c 20 May 2005 23:33:40 -0000 @@ -485,7 +485,6 @@ GPIO43_BTTXD_MD, GPIO44_BTCTS_MD, GPIO45_BTRTS_MD, - GPIO_NR_H5400_IRDA_SD | GPIO_OUT, /* GPIO58 */ 59 | GPIO_OUT, /* GPIO59 XXX docs say "usb charge on" input */ GPIO_NR_H5400_POWER_SD_N | GPIO_OUT, /* GPIO60 XXX not really active low? */ @@ -515,6 +514,7 @@ fix_msc (void) { int i; + int cpuid; /* fix CS0 for h5400 flash. */ /* fix CS1 for MediaQ chip. select 16-bit bus and vlio. */ @@ -529,7 +529,24 @@ // make sure clock to samcop is not turned off by mistake MDREFR |= 0x02080000; + cpuid = (read_cpuid(CPUID_ID) >> 4) & 0xfff; for (i = 0; i < ARRAY_SIZE(h5400_gpio_modes); i++) { + if (cpuid == 0x2d0 || cpuid == 0x290) { + switch (h5400_gpio_modes[i]) { + case GPIO42_BTRXD_MD: + h5400_gpio_modes[i] = GPIO42_HWRXD_MD; + break; + case GPIO43_BTTXD_MD: + h5400_gpio_modes[i] = GPIO43_HWTXD_MD; + break; + case GPIO44_BTCTS_MD: + h5400_gpio_modes[i] = GPIO44_HWCTS_MD; + break; + case GPIO45_BTRTS_MD: + h5400_gpio_modes[i] = GPIO45_HWRTS_MD; + break; + } + } int mode = h5400_gpio_modes[i]; set_GPIO_mode(mode); } Index: arch/arm/mach-pxa/ipaq.c =================================================================== RCS file: /cvs/linux/kernel/arch/arm/mach-pxa/ipaq.c,v retrieving revision 1.48 diff -u -r1.48 ipaq.c --- arch/arm/mach-pxa/ipaq.c 11 Mar 2004 19:20:46 -0000 1.48 +++ arch/arm/mach-pxa/ipaq.c 20 May 2005 23:33:40 -0000 @@ -67,7 +67,7 @@ { static int power_state[NR_SERIAL]; - if (line >= NR_SERIAL) + if (line > NR_SERIAL) return; if (state) { @@ -78,6 +78,7 @@ set_h3600_egpio(IPAQ_EGPIO_RS232_ON); break; case 1: + case 3: ipaq_led_blink(BLUE_LED,1,7); set_h3600_egpio(IPAQ_EGPIO_BLUETOOTH_ON); break; @@ -90,6 +91,7 @@ clr_h3600_egpio(IPAQ_EGPIO_RS232_ON); break; case 1: + case 3: ipaq_led_off(BLUE_LED); clr_h3600_egpio(IPAQ_EGPIO_BLUETOOTH_ON); break; Index: arch/arm/mach-pxa/irq.c =================================================================== RCS file: /cvs/linux/kernel/arch/arm/mach-pxa/irq.c,v retrieving revision 1.1 diff -u -r1.1 irq.c --- arch/arm/mach-pxa/irq.c 19 Jun 2002 18:45:28 -0000 1.1 +++ arch/arm/mach-pxa/irq.c 20 May 2005 23:33:40 -0000 @@ -250,6 +250,14 @@ /* only unmasked interrupts kick us out of idle */ ICCR = 1; + for (irq = PXA_IRQ(PXA_IRQ_SKIP); irq <= PXA_IRQ(31); irq++) { + irq_desc[irq].valid = 1; + irq_desc[irq].probe_ok = 0; + irq_desc[irq].mask_ack = pxa_mask_irq; + irq_desc[irq].mask = pxa_mask_irq; + irq_desc[irq].unmask = pxa_unmask_irq; + } + /* * Note: GPIO IRQs are initially invalid until set_GPIO_IRQ_edge() * is called at least once. @@ -263,17 +271,6 @@ irq_desc[irq].unmask = pxa_unmask_GPIO_0_1_irq; } - for (irq = IRQ_GPIO_2_80; irq <= IRQ_RTCAlrm; irq++) { - irq_desc[irq].valid = 1; - irq_desc[irq].probe_ok = 0; - irq_desc[irq].mask_ack = pxa_mask_irq; - irq_desc[irq].mask = pxa_mask_irq; - irq_desc[irq].unmask = pxa_unmask_irq; - } - /* Those are reserved */ - irq_desc[PXA_IRQ(15)].valid = 0; - irq_desc[PXA_IRQ(16)].valid = 0; - for (irq = IRQ_GPIO(2); irq <= IRQ_GPIO(80); irq++) { irq_desc[irq].valid = 0; irq_desc[irq].probe_ok = 1; Index: drivers/char/serial.c =================================================================== RCS file: /cvs/linux/kernel/drivers/char/serial.c,v retrieving revision 1.39 diff -u -r1.39 serial.c --- drivers/char/serial.c 22 Nov 2003 13:34:20 -0000 1.39 +++ drivers/char/serial.c 20 May 2005 23:33:41 -0000 @@ -300,6 +300,32 @@ #define SERIAL_DEV_OFFSET 0 #endif +#ifdef CONFIG_ARCH_PXA +static struct serial_state hwuart_serial_port = { + type: PORT_PXA, + xmit_fifo_size: 32, + baud_base: BAUD_BASE, + iomem_base: (void *)&HWUART, + iomem_reg_shift: 2, + io_type: SERIAL_IO_MEM32, + irq: IRQ_HWUART, + flags: STD_COM_FLAGS, + power_func: pxa_serial_power_hook, +}; + +static struct serial_state btuart_serial_port = { + type: PORT_PXA, + xmit_fifo_size: 32, + baud_base: BAUD_BASE, + iomem_base: (void *)&BTUART, + iomem_reg_shift: 2, + io_type: SERIAL_IO_MEM32, + irq: IRQ_BTUART, + flags: STD_COM_FLAGS, + power_func: pxa_serial_power_hook, +}; +#endif + #ifdef SERIAL_INLINE #define _INLINE_ inline #else @@ -1047,7 +1073,7 @@ ((iir & UART_IIR_ID) == UART_IIR_THRI)) transmit_chars(info, 0); if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if SERIAL_DEBUG_INTR +#ifdef SERIAL_DEBUG_INTR printk("rs_single loop break.\n"); #endif break; @@ -1342,6 +1368,9 @@ #ifdef CONFIG_SERIAL_MANY_PORTS unsigned short ICP; #endif +#ifdef CONFIG_ARCH_PXA + int cpuid; +#endif page = get_zeroed_page(GFP_KERNEL); if (!page) @@ -1439,10 +1468,18 @@ #endif #ifdef CONFIG_ARCH_PXA + cpuid = ((read_cpuid(CPUID_ID)) >> 4) & 0xfff; if (state->type == PORT_PXA) { switch ((long)state->iomem_base) { case (long)&FFUART: CKEN |= CKEN6_FFUART; break; - case (long)&BTUART: CKEN |= CKEN7_BTUART; break; + case (long)&BTUART: + case (long)&HWUART: + if (cpuid == 0x2d0 || cpuid == 0x290) { + CKEN |= CKEN4_HWUART; + } else { + CKEN |= CKEN7_BTUART; + } + break; case (long)&STUART: CKEN |= CKEN5_STUART; break; } } @@ -1492,7 +1529,7 @@ printk(" state->irq = %d\n", state->irq); printk(" IRQ_ports[state->irq] = %p\n", IRQ_ports[state->irq]); #endif - + if (state->irq && (!IRQ_ports[state->irq] || !IRQ_ports[state->irq]->next_port)) { if (IRQ_ports[state->irq]) { @@ -1555,7 +1592,14 @@ info->MCR ^= UART_MCR_OUT2; } info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */ - serial_outp(info, UART_MCR, info->MCR); + /* Enable autoflow control for HWUART if used */ + if (state->type == PORT_PXA && + (long)state->iomem_base == (long)&HWUART && + (cpuid == 0x2d0 || cpuid == 0x290)) { + info->MCR |= UART_MCR_AFE; + info->MCR |= UART_MCR_RTS; + } + serial_outp(info, UART_MCR, info->MCR); /* Switch to receive mode for half-duplex ports */ HALFDUPLEX_RX; @@ -1633,6 +1677,9 @@ unsigned long flags; struct serial_state *state; int retval; +#ifdef CONFIG_ARCH_PXA + int cpuid; +#endif if (!(info->flags & ASYNC_INITIALIZED)) return; @@ -1725,10 +1772,18 @@ #endif #ifdef CONFIG_ARCH_PXA + cpuid = ((read_cpuid(CPUID_ID)) >> 4) & 0xfff; if (state->type == PORT_PXA) { switch ((long)state->iomem_base) { case (long)&FFUART: CKEN &= ~CKEN6_FFUART; break; - case (long)&BTUART: CKEN &= ~CKEN7_BTUART; break; + case (long)&BTUART: + case (long)&HWUART: + if (cpuid == 0x2d0 || cpuid == 0x290) { + CKEN &= ~CKEN4_HWUART; + } else { + CKEN &= ~CKEN7_BTUART; + } + break; case (long)&STUART: CKEN &= ~CKEN5_STUART; break; } } @@ -5746,6 +5801,9 @@ static int __init rs_init(void) { int i; +#ifdef CONFIG_ARCH_PXA + int cpuid; +#endif struct serial_state * state; init_bh(SERIAL_BH, do_serial_bh); @@ -5753,6 +5811,15 @@ serial_timer.function = rs_timer; mod_timer(&serial_timer, jiffies + RS_STROBE_TIME); +#ifdef CONFIG_ARCH_PXA + cpuid = ((read_cpuid(CPUID_ID)) >> 4) & 0xfff; + if (cpuid == 0x2d0 || cpuid == 0x290) { + rs_table[NUM_STD_SERIAL_PORT_DEFNS] = hwuart_serial_port; + } else { + rs_table[NUM_STD_SERIAL_PORT_DEFNS] = btuart_serial_port; + } +#endif + for (i = 0; i < NR_IRQS; i++) { IRQ_ports[i] = 0; IRQ_timeout[i] = 0; @@ -6193,6 +6260,7 @@ unsigned i; #ifdef CONFIG_ARCH_PXA int wasdisabled = 0; + int cpuid; #endif /* @@ -6205,6 +6273,7 @@ HALFDUPLEX_TX; #ifdef CONFIG_ARCH_PXA + cpuid = ((read_cpuid(CPUID_ID)) >> 4) & 0xfff; if (pxa_port(info->state->type)) { /* * If the port was shut down its clock will have been @@ -6214,7 +6283,14 @@ wasdisabled = 1; switch ((long)info->state->iomem_base) { case (long)&FFUART: CKEN |= CKEN6_FFUART; break; - case (long)&BTUART: CKEN |= CKEN7_BTUART; break; + case (long)&BTUART: + case (long)&HWUART: + if (cpuid == 0x2d0 || cpuid == 0x290) { + CKEN |= CKEN4_HWUART; + } else { + CKEN |= CKEN7_BTUART; + } + break; case (long)&STUART: CKEN |= CKEN5_STUART; break; } } @@ -6250,7 +6326,14 @@ if (0 && wasdisabled) { switch ((long)info->state->iomem_base) { case (long)&FFUART: CKEN &= ~CKEN6_FFUART; break; - case (long)&BTUART: CKEN &= ~CKEN7_BTUART; break; + case (long)&BTUART: + case (long)&HWUART: + if (cpuid == 0x2d0 || cpuid == 0x290) { + CKEN &= ~CKEN4_HWUART; + } else { + CKEN &= ~CKEN7_BTUART; + } + break; case (long)&STUART: CKEN &= ~CKEN5_STUART; break; } } Index: include/asm-arm/arch-pxa/irqs.h =================================================================== RCS file: /cvs/linux/kernel/include/asm-arm/arch-pxa/irqs.h,v retrieving revision 1.12 diff -u -r1.12 irqs.h --- include/asm-arm/arch-pxa/irqs.h 8 Dec 2003 22:15:40 -0000 1.12 +++ include/asm-arm/arch-pxa/irqs.h 20 May 2005 23:33:42 -0000 @@ -12,9 +12,13 @@ 28/05/03 Martin Demin Added MQ1132 */ -#define PXA_IRQ_SKIP 8 /* The first 8 IRQs are reserved */ +#define PXA_IRQ_SKIP 6 /* The first 7 IRQs are reserved, but drivers/char/serial.c uses irq 0 to denoteirq-less serial devices. */ + /* Since we want to use IRQ 0 for a serial device (pxa HWUART on pxa-255 and pxa-26x processors) we make */ + /* the skip 6 so the HWUART will show up as IRQ 1 instead of re-writing a junky driver */ + #define PXA_IRQ(x) ((x) - PXA_IRQ_SKIP) +#define IRQ_HWUART PXA_IRQ(7) #define IRQ_GPIO0 PXA_IRQ(8) /* GPIO0 Edge Detect */ #define IRQ_GPIO1 PXA_IRQ(9) /* GPIO1 Edge Detect */ #define IRQ_GPIO_2_80 PXA_IRQ(10) /* GPIO[2-80] Edge Detect */ Index: include/asm-arm/arch-pxa/pxa-regs.h =================================================================== RCS file: /cvs/linux/kernel/include/asm-arm/arch-pxa/pxa-regs.h,v retrieving revision 1.20 diff -u -r1.20 pxa-regs.h --- include/asm-arm/arch-pxa/pxa-regs.h 8 May 2003 20:28:36 -0000 1.20 +++ include/asm-arm/arch-pxa/pxa-regs.h 20 May 2005 23:33:42 -0000 @@ -323,6 +323,25 @@ #define STDLL __REG(0x40700000) /* Divisor Latch Low Register (DLAB = 1) (read/write) */ #define STDLH __REG(0x40700004) /* Divisor Latch High Register (DLAB = 1) (read/write) */ +/* Hardware UART (HWUART) */ +#define HWUART HWRBR +#define HWRBR __REG(0x41600000) /* Receive Buffer Register (read only) */ +#define HWTHR __REG(0x41600000) /* Transmit Holding Register (write only) */ +#define HWIER __REG(0x41600004) /* Interrupt Enable Register (read/write) */ +#define HWIIR __REG(0x41600008) /* Interrupt ID Register (read only) */ +#define HWFCR __REG(0x41600008) /* FIFO Control Register (write only) */ +#define HWLCR __REG(0x4160000C) /* Line Control Register (read/write) */ +#define HWMCR __REG(0x41600010) /* Modem Control Register (read/write) */ +#define HWLSR __REG(0x41600014) /* Line Status Register (read only) */ +#define HWMSR __REG(0x41600018) /* Modem Status Register (read only) */ +#define HWSPR __REG(0x4160001C) /* Scratch Pad Register (read/write) */ +#define HWISR __REG(0x41600020) /* Infrared Selection Register (read/write) */ +#define HWDLL __REG(0x41600000) /* Divisor Latch Low Register (DLAB = 1) (read/write) */ +#define HWDLH __REG(0x41600004) /* Divisor Latch High Register (DLAB = 1) (read/write) */ +#define HWFOR __REG(0x41600024) /* Receive FIFO Occupancy Register (FOR) (read only) */ +#define HWABR __REG(0x41600028) /* Auto-Baud Control Register (ABR) (read/write) */ +#define HWACR __REG(0x4160002C) /* Auto-Baud Count Register (ACR) (read/write) */ + #define IER_DMAE (1 << 7) /* DMA Requests Enable */ #define IER_UUE (1 << 6) /* UART Unit Enable */ #define IER_NRZE (1 << 5) /* NRZ coding Enable */ @@ -1007,6 +1026,10 @@ #define GPIO43_BTTXD_MD (43 | GPIO_ALT_FN_2_OUT) #define GPIO44_BTCTS_MD (44 | GPIO_ALT_FN_1_IN) #define GPIO45_BTRTS_MD (45 | GPIO_ALT_FN_2_OUT) +#define GPIO42_HWRXD_MD (42 | GPIO_ALT_FN_3_IN) +#define GPIO43_HWTXD_MD (43 | GPIO_ALT_FN_3_OUT) +#define GPIO44_HWCTS_MD (44 | GPIO_ALT_FN_3_IN) +#define GPIO45_HWRTS_MD (45 | GPIO_ALT_FN_3_OUT) #define GPIO46_ICPRXD_MD (46 | GPIO_ALT_FN_1_IN) #define GPIO46_STRXD_MD (46 | GPIO_ALT_FN_2_IN) #define GPIO47_ICPTXD_MD (47 | GPIO_ALT_FN_2_OUT) @@ -1200,6 +1223,7 @@ #define CKEN7_BTUART (1 << 7) /* BTUART Unit Clock Enable */ #define CKEN6_FFUART (1 << 6) /* FFUART Unit Clock Enable */ #define CKEN5_STUART (1 << 5) /* STUART Unit Clock Enable */ +#define CKEN4_HWUART (1 << 4) /* HWUART Unit Clock Enable */ #define CKEN3_SSP (1 << 3) /* SSP Unit Clock Enable */ #define CKEN2_AC97 (1 << 2) /* AC97 Unit Clock Enable */ #define CKEN1_PWM1 (1 << 1) /* PWM1 Clock Enable */ Index: include/asm-arm/arch-pxa/serial.h =================================================================== RCS file: /cvs/linux/kernel/include/asm-arm/arch-pxa/serial.h,v retrieving revision 1.3 diff -u -r1.3 serial.h --- include/asm-arm/arch-pxa/serial.h 13 Nov 2002 18:25:39 -0000 1.3 +++ include/asm-arm/arch-pxa/serial.h 20 May 2005 23:33:42 -0000 @@ -12,6 +12,8 @@ #define BAUD_BASE 921600 +#define UART_MCR_AFE 0x20 + /* Standard COM flags */ #define STD_COM_FLAGS (ASYNC_SKIP_TEST) @@ -32,23 +34,15 @@ type: PORT_PXA, \ xmit_fifo_size: 32, \ baud_base: BAUD_BASE, \ - iomem_base: (void *)&BTUART,\ - iomem_reg_shift: 2, \ - io_type: SERIAL_IO_MEM32,\ - irq: IRQ_BTUART, \ - flags: STD_COM_FLAGS, \ - power_func: pxa_serial_power_hook, \ - }, { \ - type: PORT_PXA, \ - xmit_fifo_size: 32, \ - baud_base: BAUD_BASE, \ iomem_base: (void *)&STUART,\ iomem_reg_shift: 2, \ io_type: SERIAL_IO_MEM32,\ irq: IRQ_STUART, \ flags: STD_COM_FLAGS, \ power_func: pxa_serial_power_hook, \ - } + } + +#define NUM_STD_SERIAL_PORT_DEFNS 2 #define RS_TABLE_SIZE 8 Index: include/asm-arm/arch-pxa/uncompress.h =================================================================== RCS file: /cvs/linux/kernel/include/asm-arm/arch-pxa/uncompress.h,v retrieving revision 1.1 diff -u -r1.1 uncompress.h --- include/asm-arm/arch-pxa/uncompress.h 19 Jun 2002 18:48:16 -0000 1.1 +++ include/asm-arm/arch-pxa/uncompress.h 20 May 2005 23:33:42 -0000 @@ -12,6 +12,7 @@ #define FFUART ((volatile unsigned long *)0x40100000) #define BTUART ((volatile unsigned long *)0x40200000) #define STUART ((volatile unsigned long *)0x40700000) +#define HWUART ((volatile unsigned long *)0x41600000) #define UART FFUART Index: include/asm-arm/proc-armv/system.h =================================================================== RCS file: /cvs/linux/kernel/include/asm-arm/proc-armv/system.h,v retrieving revision 1.11 diff -u -r1.11 system.h --- include/asm-arm/proc-armv/system.h 27 Sep 2002 13:54:51 -0000 1.11 +++ include/asm-arm/proc-armv/system.h 20 May 2005 23:33:42 -0000 @@ -33,6 +33,18 @@ #define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */ #define CR_RR (1 << 14) /* Round Robin cache replacement */ +#define CPUID_ID 0 + +#define read_cpuid(reg) \ + ({ \ + unsigned int __val; \ + asm("mrc p15, 0, %0, c0, c0, " __stringify(reg) \ + : "=r" (__val) \ + : \ + : "cc"); \ + __val; \ + }) + extern unsigned long cr_no_alignment; /* defined in entry-armv.S */ extern unsigned long cr_alignment; /* defined in entry-armv.S */