summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.transmeta.com>2002-05-24 01:17:12 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-05-24 01:17:12 -0700
commit4bce4b2a5e8dd4cd653f57117f291ea06be42b57 (patch)
treea28c3d95532837141f3fd6e6bff7c8a4645ef709
parenta800d54e18bcf588c54f896f4a3b155ad05bbaed (diff)
parent752e2bd202c15fd5160f67c7e21b5deef171e9f0 (diff)
Merge bk://bk.arm.linux.org.uk
into home.transmeta.com:/home/torvalds/v2.5/linux
-rw-r--r--arch/arm/Makefile11
-rw-r--r--arch/arm/boot/compressed/head-l7200.S3
-rw-r--r--arch/arm/boot/compressed/head.S75
-rw-r--r--arch/arm/kernel/bios32.c67
-rw-r--r--arch/arm/kernel/dma.c12
-rw-r--r--arch/arm/kernel/ecard.c16
-rw-r--r--arch/arm/kernel/head.S537
-rw-r--r--arch/arm/kernel/process.c20
-rw-r--r--arch/arm/kernel/semaphore.c132
-rw-r--r--arch/arm/kernel/setup.c6
-rw-r--r--arch/arm/kernel/signal.c2
-rw-r--r--arch/arm/lib/csumpartial.S4
-rw-r--r--arch/arm/lib/longlong.h28
-rw-r--r--arch/arm/lib/muldi3.c24
-rw-r--r--arch/arm/mach-footbridge/cats-pci.c12
-rw-r--r--arch/arm/mach-footbridge/dc21285.c82
-rw-r--r--arch/arm/mach-footbridge/ebsa285-pci.c12
-rw-r--r--arch/arm/mach-footbridge/netwinder-pci.c12
-rw-r--r--arch/arm/mach-footbridge/personal-pci.c12
-rw-r--r--arch/arm/mach-ftvpci/pci.c11
-rw-r--r--arch/arm/mach-integrator/pci.c12
-rw-r--r--arch/arm/mach-iop310/iop310-pci.c4
-rw-r--r--arch/arm/mach-iop310/iq80310-pci.c12
-rw-r--r--arch/arm/mach-rpc/dma.c99
-rw-r--r--arch/arm/mach-sa1100/badge4.c1
-rw-r--r--arch/arm/mach-shark/pci.c12
-rw-r--r--arch/arm/mm/abort-lv4t.S4
-rw-r--r--arch/arm/mm/fault-common.c11
-rw-r--r--arch/arm/mm/init.c1
-rw-r--r--arch/arm/nwfpe/softfloat.c6
-rw-r--r--arch/arm/tools/mach-types16
-rw-r--r--drivers/acorn/char/mouse_rpc.c1
-rw-r--r--drivers/acorn/net/etherh.c14
-rw-r--r--drivers/acorn/scsi/acornscsi.c30
-rw-r--r--drivers/acorn/scsi/cumana_2.c13
-rw-r--r--drivers/acorn/scsi/eesox.c13
-rw-r--r--drivers/acorn/scsi/fas216.c112
-rw-r--r--drivers/acorn/scsi/powertec.c13
-rw-r--r--drivers/acorn/scsi/scsi.h122
-rw-r--r--drivers/pcmcia/sa1100_assabet.c1
-rw-r--r--drivers/pcmcia/sa1100_badge4.c6
-rw-r--r--drivers/pcmcia/sa1100_generic.c31
-rw-r--r--drivers/pcmcia/sa1100_generic.h4
-rw-r--r--drivers/pcmcia/sa1100_neponset.c4
-rw-r--r--drivers/pcmcia/sa1111_generic.c1
-rw-r--r--drivers/video/acornfb.c83
-rw-r--r--drivers/video/clps711xfb.c100
-rw-r--r--drivers/video/sa1100fb.c126
-rw-r--r--include/asm-arm/arch-clps711x/memory.h8
-rw-r--r--include/asm-arm/dma.h4
-rw-r--r--include/asm-arm/hardware/sa1111.h6
-rw-r--r--include/asm-arm/mach/arch.h4
-rw-r--r--include/asm-arm/mach/pci.h25
-rw-r--r--include/asm-arm/memory.h2
-rw-r--r--include/asm-arm/proc-armv/system.h4
-rw-r--r--include/asm-arm/ptrace.h15
-rw-r--r--include/asm-arm/thread_info.h2
-rw-r--r--include/asm-arm/unistd.h2
58 files changed, 1022 insertions, 980 deletions
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 218deb1cdd16..5490f0f6403a 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -26,11 +26,14 @@ apcs-$(CONFIG_CPU_32) :=-mapcs-32
apcs-$(CONFIG_CPU_26) :=-mapcs-26 -mcpu=arm3 -Os
# This selects which instruction set is used.
+# Note that GCC is lame - it doesn't numerically define an
+# architecture version macro, but instead defines a whole
+# series of macros.
arch-y :=
-arch-$(CONFIG_CPU_32v3) :=-march=armv3
-arch-$(CONFIG_CPU_32v4) :=-march=armv4
-arch-$(CONFIG_CPU_32v5) :=-march=armv5
-arch-$(CONFIG_CPU_XSCALE) :=-march=armv4 -Wa,-mxscale #-march=armv5te
+arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3
+arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4
+arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 -march=armv5
+arch-$(CONFIG_CPU_XSCALE) :=-D__LINUX_ARM_ARCH__=5 -march=armv4 -Wa,-mxscale #-march=armv5te
# This selects how we optimise for the processor.
tune-y :=
diff --git a/arch/arm/boot/compressed/head-l7200.S b/arch/arm/boot/compressed/head-l7200.S
index 1eb2246c3077..b08bd23f8d16 100644
--- a/arch/arm/boot/compressed/head-l7200.S
+++ b/arch/arm/boot/compressed/head-l7200.S
@@ -8,6 +8,7 @@
*/
#include <linux/config.h>
+#include <asm/mach-types.h>
#ifndef CONFIG_ARCH_L7200
#error What am I doing here...
@@ -26,4 +27,4 @@ __L7200_start:
ble 1b
mov r8, #0 @ Zero it out
- mov r7, #19 @ Set architecture ID
+ mov r7, #MACH_TYPE_L7200 @ Set architecture ID
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index 74abc8b88930..64be8e930a54 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -1,7 +1,7 @@
/*
* linux/arch/arm/boot/compressed/head.S
*
- * Copyright (C) 1996-1999 Russell King
+ * Copyright (C) 1996-2002 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -161,7 +161,6 @@ not_relocated: mov r0, #0
cmp r2, r3
blo 1b
- mrc p15, 0, r6, c0, c0 @ get processor ID
bl cache_on
mov r1, sp @ malloc space above stack
@@ -200,7 +199,8 @@ not_relocated: mov r0, #0
*/
add r1, r5, r0 @ end of decompressed kernel
adr r2, reloc_start
- adr r3, reloc_end
+ ldr r3, LC1
+ add r3, r2, r3
1: ldmia r2!, {r8 - r13} @ copy relocation code
stmia r1!, {r8 - r13}
ldmia r2!, {r8 - r13}
@@ -229,8 +229,9 @@ LC0: .word LC0 @ r1
.word _load_addr @ r4
.word _start @ r5
.word _got_start @ r6
- .word _got_end @ r7
- .word user_stack+4096 @ r8
+ .word _got_end @ ip
+ .word user_stack+4096 @ sp
+LC1: .word reloc_end - reloc_start
.size LC0, . - LC0
/*
@@ -255,7 +256,7 @@ LC0: .word LC0 @ r1
cache_on: mov r3, #8 @ cache_on function
b call_cache_fn
-__cache_on: sub r3, r4, #16384 @ Page directory size
+__setup_mmu: sub r3, r4, #16384 @ Page directory size
bic r3, r3, #0xff @ Align the pointer
bic r3, r3, #0x3f00
/*
@@ -291,20 +292,35 @@ __cache_on: sub r3, r4, #16384 @ Page directory size
str r1, [r0], #4
add r1, r1, #1048576
str r1, [r0]
+ mov pc, lr
+__armv4_cache_on:
+ mov r12, lr
+ bl __setup_mmu
mov r0, #0
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
- mcr p15, 0, r0, c8, c7 @ flush I,D TLBs
- mcr p15, 0, r3, c2, c0 @ load page table pointer
- mov r0, #-1
- mcr p15, 0, r0, c3, c0 @ load domain access register
- mrc p15, 0, r0, c1, c0
+ mcr p15, 0, r0, c8, c7, 0 @ flush I,D TLBs
+ mrc p15, 0, r0, c1, c0, 0 @ read control reg
orr r0, r0, #0x1000 @ I-cache enable
+ orr r0, r0, #0x0030
+ b __common_cache_on
+
+__arm6_cache_on:
+ mov r12, lr
+ bl __setup_mmu
+ mov r0, #0
+ mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3
+ mcr p15, 0, r0, c5, c0, 0 @ invalidate whole TLB v3
+ mov r0, #0x30
+__common_cache_on:
#ifndef DEBUG
- orr r0, r0, #0x003d @ Write buffer, mmu
+ orr r0, r0, #0x000d @ Write buffer, mmu
#endif
- mcr p15, 0, r0, c1, c0
- mov pc, lr
+ mov r1, #-1
+ mcr p15, 0, r3, c2, c0, 0 @ load page table pointer
+ mcr p15, 0, r1, c3, c0, 0 @ load domain access control
+ mcr p15, 0, r0, c1, c0, 0 @ load control register
+ mov pc, r12
/*
* All code following this line is relocatable. It is relocated by
@@ -349,11 +365,12 @@ call_kernel: bl cache_clean_flush
* r1 = corrupted
* r2 = corrupted
* r3 = block offset
- * r6 = CPU ID
+ * r6 = corrupted
* r12 = corrupted
*/
call_cache_fn: adr r12, proc_types
+ mrc p15, 0, r6, c0, c0 @ get processor ID
1: ldr r1, [r12, #0] @ get value
ldr r2, [r12, #4] @ get mask
eor r1, r1, r6 @ (real ^ match)
@@ -380,9 +397,12 @@ call_cache_fn: adr r12, proc_types
proc_types:
.word 0x41560600 @ ARM6/610
.word 0xffffffe0
- b __arm6_cache_off
+ b __arm6_cache_off @ works, but slow
b __arm6_cache_off
mov pc, lr
+@ b __arm6_cache_on @ untested
+@ b __arm6_cache_off
+@ b __armv3_cache_flush
.word 0x41007000 @ ARM7/710
.word 0xfff8fe00
@@ -392,31 +412,31 @@ proc_types:
.word 0x41807200 @ ARM720T (writethrough)
.word 0xffffff00
- b __cache_on
+ b __armv4_cache_on
b __armv4_cache_off
mov pc, lr
.word 0x41129200 @ ARM920T
.word 0xff00fff0
- b __cache_on
+ b __armv4_cache_on
b __armv4_cache_off
b __armv4_cache_flush
.word 0x4401a100 @ sa110 / sa1100
.word 0xffffffe0
- b __cache_on
+ b __armv4_cache_on
b __armv4_cache_off
b __armv4_cache_flush
.word 0x6901b110 @ sa1110
.word 0xfffffff0
- b __cache_on
+ b __armv4_cache_on
b __armv4_cache_off
b __armv4_cache_flush
.word 0x69050000 @ xscale
.word 0xffff0000
- b __cache_on
+ b __armv4_cache_on
b __armv4_cache_off
b __armv4_cache_flush
@@ -450,7 +470,7 @@ __armv4_cache_off:
mov pc, lr
__arm6_cache_off:
- mov r0, #0x00000060 @ ARM6 control reg.
+ mov r0, #0x00000030 @ ARM6 control reg.
b __armv3_cache_off
__arm7_cache_off:
@@ -458,10 +478,10 @@ __arm7_cache_off:
b __armv3_cache_off
__armv3_cache_off:
- mcr p15, 0, r0, c1, c0 @ turn MMU and cache off
+ mcr p15, 0, r0, c1, c0, 0 @ turn MMU and cache off
mov r0, #0
- mcr p15, 0, r0, c7, c0 @ invalidate whole cache v3
- mcr p15, 0, r0, c5, c0 @ invalidate whole TLB v3
+ mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3
+ mcr p15, 0, r0, c5, c0, 0 @ invalidate whole TLB v3
mov pc, lr
/*
@@ -490,6 +510,11 @@ __armv4_cache_flush:
mcr p15, 0, r1, c7, c10, 4 @ drain WB
mov pc, lr
+__armv3_cache_flush:
+ mov r1, #0
+ mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3
+ mov pc, lr
+
/*
* Various debugging routines for printing hex characters and
* memory, which again must be relocatable.
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index bddbcef51c1b..201f14368eb2 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -545,73 +545,8 @@ static void __init pcibios_init_hw(struct hw_pci *hw)
}
}
-extern struct hw_pci ebsa285_pci;
-extern struct hw_pci cats_pci;
-extern struct hw_pci netwinder_pci;
-extern struct hw_pci personal_server_pci;
-extern struct hw_pci ftv_pci;
-extern struct hw_pci shark_pci;
-extern struct hw_pci integrator_pci;
-extern struct hw_pci iq80310_pci;
-
-void __init pcibios_init(void)
+void __init pci_common_init(struct hw_pci *hw)
{
- struct hw_pci *hw = NULL;
-
- do {
-#ifdef CONFIG_ARCH_EBSA285
- if (machine_is_ebsa285()) {
- hw = &ebsa285_pci;
- break;
- }
-#endif
-#ifdef CONFIG_ARCH_SHARK
- if (machine_is_shark()) {
- hw = &shark_pci;
- break;
- }
-#endif
-#ifdef CONFIG_ARCH_CATS
- if (machine_is_cats()) {
- hw = &cats_pci;
- break;
- }
-#endif
-#ifdef CONFIG_ARCH_NETWINDER
- if (machine_is_netwinder()) {
- hw = &netwinder_pci;
- break;
- }
-#endif
-#ifdef CONFIG_ARCH_PERSONAL_SERVER
- if (machine_is_personal_server()) {
- hw = &personal_server_pci;
- break;
- }
-#endif
-#ifdef CONFIG_ARCH_FTVPCI
- if (machine_is_ftvpci()) {
- hw = &ftv_pci;
- break;
- }
-#endif
-#ifdef CONFIG_ARCH_INTEGRATOR
- if (machine_is_integrator()) {
- hw = &integrator_pci;
- break;
- }
-#endif
-#ifdef CONFIG_ARCH_IQ80310
- if (machine_is_iq80310()) {
- hw = &iq80310_pci;
- break;
- }
-#endif
- } while (0);
-
- if (hw == NULL)
- return;
-
if (hw->preinit)
hw->preinit();
pcibios_init_hw(hw);
diff --git a/arch/arm/kernel/dma.c b/arch/arm/kernel/dma.c
index c5a4c6a09dab..6717f735136a 100644
--- a/arch/arm/kernel/dma.c
+++ b/arch/arm/kernel/dma.c
@@ -120,6 +120,10 @@ void set_dma_sg (dmach_t channel, struct scatterlist *sg, int nr_sg)
{
dma_t *dma = dma_chan + channel;
+ if (dma->active)
+ printk(KERN_ERR "dma%d: altering DMA SG while "
+ "DMA active\n", channel);
+
dma->sg = sg;
dma->sgcount = nr_sg;
dma->using_sg = 1;
@@ -218,6 +222,14 @@ free_dma:
BUG();
}
+/*
+ * Is the specified DMA channel active?
+ */
+int dma_channel_active(dmach_t channel)
+{
+ return dma_chan[channel].active;
+}
+
void set_dma_page(dmach_t channel, char pagenr)
{
printk(KERN_ERR "dma%d: trying to set_dma_page\n", channel);
diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c
index 31a31471388e..2213863f199e 100644
--- a/arch/arm/kernel/ecard.c
+++ b/arch/arm/kernel/ecard.c
@@ -541,7 +541,7 @@ static expansioncard_ops_t ecard_default_ops = {
*
* They are not meant to be called directly, but via enable/disable_irq.
*/
-static void ecard_irq_mask(unsigned int irqnr)
+static void ecard_irq_unmask(unsigned int irqnr)
{
ecard_t *ec = slot_to_ecard(irqnr - 32);
@@ -557,7 +557,7 @@ static void ecard_irq_mask(unsigned int irqnr)
}
}
-static void ecard_irq_unmask(unsigned int irqnr)
+static void ecard_irq_mask(unsigned int irqnr)
{
ecard_t *ec = slot_to_ecard(irqnr - 32);
@@ -945,20 +945,20 @@ ecard_probe(int slot, card_type_t type)
break;
}
- ec->irq = 32 + slot;
-#ifdef IO_EC_MEMC8_BASE
- if (slot == 8)
- ec->irq = 11;
-#endif
/*
* hook the interrupt handlers
*/
- if (ec->irq != 0 && ec->irq >= 32) {
+ if (slot < 8) {
+ ec->irq = 32 + slot;
set_irq_chip(ec->irq, &ecard_chip);
set_irq_handler(ec->irq, do_level_IRQ);
set_irq_flags(ec->irq, IRQF_VALID);
}
+#ifdef IO_EC_MEMC8_BASE
+ if (slot == 8)
+ ec->irq = 11;
+#endif
#ifdef CONFIG_ARCH_RPC
/* On RiscPC, only first two slots have DMA capability */
if (slot < 2)
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index 012b99c262c1..005c888a318b 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -1,13 +1,13 @@
/*
* linux/arch/arm/kernel/head-armv.S
*
- * Copyright (C) 1994-1999 Russell King
+ * Copyright (C) 1994-2002 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
- * 32-bit kernel startup code for all architectures
+ * Kernel startup code for all 32-bit CPUs
*/
#include <linux/config.h>
#include <linux/linkage.h>
@@ -17,12 +17,10 @@
#include <asm/procinfo.h>
#include <asm/mach/arch.h>
-#define K(a,b,c) ((a) << 24 | (b) << 12 | (c))
-
/*
* We place the page tables 16K below TEXTADDR. Therefore, we must make sure
* that TEXTADDR is correctly set. Currently, we expect the least significant
- * "short" to be 0x8000, but we could probably relax this restriction to
+ * 16 bits to be 0x8000, but we could probably relax this restriction to
* TEXTADDR > PAGE_OFFSET + 0x4000
*
* Note that swapper_pg_dir is the virtual address of the page tables, and
@@ -35,159 +33,119 @@
#error TEXTADDR must start at 0xXXXX8000
#endif
- .globl swapper_pg_dir
- .equ swapper_pg_dir, TEXTADDR - 0x4000
+ .globl swapper_pg_dir
+ .equ swapper_pg_dir, TEXTADDR - 0x4000
- .macro pgtbl, reg, rambase
- adr \reg, stext
- sub \reg, \reg, #0x4000
- .endm
+ .macro pgtbl, reg, rambase
+ adr \reg, stext
+ sub \reg, \reg, #0x4000
+ .endm
/*
* Since the page table is closely related to the kernel start address, we
* can convert the page table base address to the base address of the section
* containing both.
*/
- .macro krnladr, rd, pgtable, rambase
- bic \rd, \pgtable, #0x000ff000
- .endm
+ .macro krnladr, rd, pgtable, rambase
+ bic \rd, \pgtable, #0x000ff000
+ .endm
/*
- * Kernel startup entry point.
+ * Kernel startup entry point.
+ * ---------------------------
*
- * The rules are:
- * r0 - should be 0
- * r1 - unique architecture number
- * MMU - off
- * I-cache - on or off
- * D-cache - off
+ * This is normally called from the decompressor code. The requirements
+ * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
+ * r1 = machine nr.
*
- * See linux/arch/arm/tools/mach-types for the complete list of numbers
- * for r1.
- */
- .section ".text.init",#alloc,#execinstr
- .type stext, #function
-ENTRY(stext)
- mov r12, r0
-/*
- * NOTE! Any code which is placed here should be done for one of
- * the following reasons:
+ * This code is mostly position independent, so if you link the kernel at
+ * 0xc0008000, you call this at __pa(0xc0008000).
*
- * 1. Compatability with old production boot firmware (ie, users
- * actually have and are booting the kernel with the old firmware)
- * and therefore will be eventually removed.
- * 2. Cover the case when there is no boot firmware. This is not
- * ideal, but in this case, it should ONLY set r0 and r1 to the
- * appropriate value.
- */
-#if defined(CONFIG_ARCH_NETWINDER)
-/*
- * Compatability cruft for old NetWinder NeTTroms. This
- * code is currently scheduled for destruction in 2.5.xx
+ * See linux/arch/arm/tools/mach-types for the complete list of machine
+ * numbers for r1.
+ *
+ * We're trying to keep crap to a minimum; DO NOT add any machine specific
+ * crap here - that's what the boot loader (or in extreme, well justified
+ * circumstances, zImage) is for.
*/
- .rept 8
- mov r0, r0
- .endr
-
- adr r2, 1f
- ldmdb r2, {r7, r8}
- and r3, r2, #0xc000
- teq r3, #0x8000
- beq __entry
- bic r3, r2, #0xc000
- orr r3, r3, #0x8000
- mov r0, r3
- mov r4, #64
- sub r5, r8, r7
- b 1f
-
- .word _stext
- .word __bss_start
-
-1:
- .rept 4
- ldmia r2!, {r6, r7, r8, r9}
- stmia r3!, {r6, r7, r8, r9}
- .endr
- subs r4, r4, #64
- bcs 1b
- movs r4, r5
- mov r5, #0
- movne pc, r0
+ .section ".text.init",#alloc,#execinstr
+ .type stext, #function
+ENTRY(stext)
+ mov r12, r0
+ mov r0, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ make sure svc mode
+ msr cpsr_c, r0 @ and all irqs disabled
+ bl __lookup_processor_type
+ teq r10, #0 @ invalid processor?
+ moveq r0, #'p' @ yes, error 'p'
+ beq __error
+ bl __lookup_architecture_type
+ teq r7, #0 @ invalid architecture?
+ moveq r0, #'a' @ yes, error 'a'
+ beq __error
+ bl __create_page_tables
+
+ /*
+ * The following calls CPU specific code in a position independent
+ * manner. See arch/arm/mm/proc-*.S for details. r10 = base of
+ * xxx_proc_info structure selected by __lookup_architecture_type
+ * above. On return, the CPU will be ready for the MMU to be
+ * turned on, and r0 will hold the CPU control register value.
+ */
+ adr lr, __turn_mmu_on @ return (PIC) address
+ add pc, r10, #12
+
+ .type __switch_data, %object
+__switch_data:
+ .long __mmap_switched
+ .long __bss_start @ r4
+ .long _end @ r5
+ .long processor_id @ r6
+ .long __machine_arch_type @ r7
+ .long cr_alignment @ r8
+ .long init_thread_union+8192 @ sp
- mov r1, #MACH_TYPE_NETWINDER @ (will go in 2.5)
- mov r12, #2 << 24 @ scheduled for removal in 2.5.xx
- orr r12, r12, #5 << 12
-__entry:
-#endif
-#if defined(CONFIG_ARCH_L7200)
/*
- * FIXME - No bootloader, so manually set 'r1' with our architecture number.
+ * Enable the MMU. This completely changes the structure of the visible
+ * memory space. You will not be able to trace execution through this.
+ * If you have an enquiry about this, *please* check the linux-arm-kernel
+ * mailing list archives BEFORE sending another post to the list.
*/
- mov r1, #MACH_TYPE_L7200
+ .align 5
+ .type __turn_mmu_on, %function
+__turn_mmu_on:
+ ldr lr, __switch_data
+#ifdef CONFIG_ALIGNMENT_TRAP
+ orr r0, r0, #2 @ ...........A.
#endif
+ mcr p15, 0, r0, c1, c0
+ mov r0, r0
+ mov r0, r0
+ mov r0, r0
+ mov pc, lr
- mov r0, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ make sure svc mode
- msr cpsr_c, r0 @ and all irqs disabled
- bl __lookup_processor_type
- teq r10, #0 @ invalid processor?
- moveq r0, #'p' @ yes, error 'p'
- beq __error
- bl __lookup_architecture_type
- teq r7, #0 @ invalid architecture?
- moveq r0, #'a' @ yes, error 'a'
- beq __error
- bl __create_page_tables
- adr lr, __ret @ return address
- add pc, r10, #12 @ initialise processor
- @ (return control reg)
-
- .type __switch_data, %object
-__switch_data: .long __mmap_switched
- .long compat
- .long __bss_start
- .long _end
- .long processor_id
- .long __machine_arch_type
- .long cr_alignment
- .long init_thread_union+8192
-
- .type __ret, %function
-__ret: ldr lr, __switch_data
- mcr p15, 0, r0, c1, c0
- mov r0, r0
- mov r0, r0
- mov r0, r0
- mov pc, lr
-
- /*
- * This code follows on after the page
- * table switch and jump above.
- *
- * r0 = processor control register
- * r1 = machine ID
- * r9 = processor ID
- */
- .align 5
+/*
+ * The following fragment of code is executed with the MMU on, and uses
+ * absolute addresses; this is not position independent.
+ *
+ * r0 = processor control register
+ * r1 = machine ID
+ * r9 = processor ID
+ * r12 = value of r0 when kernel was called (currently always zero)
+ */
+ .align 5
__mmap_switched:
- adr r3, __switch_data + 4
- ldmia r3, {r2, r4, r5, r6, r7, r8, sp}@ r2 = compat
- @ sp = stack pointer
- str r12, [r2]
-
- mov fp, #0 @ Clear BSS (and zero fp)
-1: cmp r4, r5
- strcc fp, [r4],#4
- bcc 1b
+ adr r3, __switch_data + 4
+ ldmia r3, {r4, r5, r6, r7, r8, sp}
+ mov fp, #0 @ Clear BSS (and zero fp)
+1: cmp r4, r5
+ strcc fp, [r4],#4
+ bcc 1b
+ str r9, [r6] @ Save processor ID
+ str r1, [r7] @ Save machine type
+ bic r2, r0, #2 @ Clear 'A' bit
+ stmia r8, {r0, r2} @ Save control register values
+ b start_kernel
- str r9, [r6] @ Save processor ID
- str r1, [r7] @ Save machine type
-#ifdef CONFIG_ALIGNMENT_TRAP
- orr r0, r0, #2 @ ...........A.
-#endif
- bic r2, r0, #2 @ Clear 'A' bit
- stmia r8, {r0, r2} @ Save control register values
- b start_kernel
@@ -205,116 +163,116 @@ __mmap_switched:
* r8 = page table flags
*/
__create_page_tables:
- pgtbl r4, r5 @ page table address
-
- /*
- * Clear the 16K level 1 swapper page table
- */
- mov r0, r4
- mov r3, #0
- add r2, r0, #0x4000
-1: str r3, [r0], #4
- str r3, [r0], #4
- str r3, [r0], #4
- str r3, [r0], #4
- teq r0, r2
- bne 1b
-
- /*
- * Create identity mapping for first MB of kernel to
- * cater for the MMU enable. This identity mapping
- * will be removed by paging_init()
- */
- krnladr r2, r4, r5 @ start of kernel
- add r3, r8, r2 @ flags + kernel base
- str r3, [r4, r2, lsr #18] @ identity mapping
-
- /*
- * Now setup the pagetables for our kernel direct
- * mapped region. We round TEXTADDR down to the
- * nearest megabyte boundary.
- */
- add r0, r4, #(TEXTADDR & 0xff000000) >> 18 @ start of kernel
- bic r2, r3, #0x00f00000
- str r2, [r0] @ PAGE_OFFSET + 0MB
- add r0, r0, #(TEXTADDR & 0x00f00000) >> 18
- str r3, [r0], #4 @ KERNEL + 0MB
- add r3, r3, #1 << 20
- str r3, [r0], #4 @ KERNEL + 1MB
- add r3, r3, #1 << 20
- str r3, [r0], #4 @ KERNEL + 2MB
- add r3, r3, #1 << 20
- str r3, [r0], #4 @ KERNEL + 3MB
-
- /*
- * Ensure that the first section of RAM is present.
- * we assume that:
- * 1. the RAM is aligned to a 32MB boundary
- * 2. the kernel is executing in the same 32MB chunk
- * as the start of RAM.
- */
- bic r0, r0, #0x01f00000 >> 18 @ round down
- and r2, r5, #0xfe000000 @ round down
- add r3, r8, r2 @ flags + rambase
- str r3, [r0]
-
- bic r8, r8, #0x0c @ turn off cacheable
- @ and bufferable bits
+ pgtbl r4, r5 @ page table address
+
+ /*
+ * Clear the 16K level 1 swapper page table
+ */
+ mov r0, r4
+ mov r3, #0
+ add r2, r0, #0x4000
+1: str r3, [r0], #4
+ str r3, [r0], #4
+ str r3, [r0], #4
+ str r3, [r0], #4
+ teq r0, r2
+ bne 1b
+
+ /*
+ * Create identity mapping for first MB of kernel to
+ * cater for the MMU enable. This identity mapping
+ * will be removed by paging_init()
+ */
+ krnladr r2, r4, r5 @ start of kernel
+ add r3, r8, r2 @ flags + kernel base
+ str r3, [r4, r2, lsr #18] @ identity mapping
+
+ /*
+ * Now setup the pagetables for our kernel direct
+ * mapped region. We round TEXTADDR down to the
+ * nearest megabyte boundary.
+ */
+ add r0, r4, #(TEXTADDR & 0xff000000) >> 18 @ start of kernel
+ bic r2, r3, #0x00f00000
+ str r2, [r0] @ PAGE_OFFSET + 0MB
+ add r0, r0, #(TEXTADDR & 0x00f00000) >> 18
+ str r3, [r0], #4 @ KERNEL + 0MB
+ add r3, r3, #1 << 20
+ str r3, [r0], #4 @ KERNEL + 1MB
+ add r3, r3, #1 << 20
+ str r3, [r0], #4 @ KERNEL + 2MB
+ add r3, r3, #1 << 20
+ str r3, [r0], #4 @ KERNEL + 3MB
+
+ /*
+ * Ensure that the first section of RAM is present.
+ * we assume that:
+ * 1. the RAM is aligned to a 32MB boundary
+ * 2. the kernel is executing in the same 32MB chunk
+ * as the start of RAM.
+ */
+ bic r0, r0, #0x01f00000 >> 18 @ round down
+ and r2, r5, #0xfe000000 @ round down
+ add r3, r8, r2 @ flags + rambase
+ str r3, [r0]
+
+ bic r8, r8, #0x0c @ turn off cacheable
+ @ and bufferable bits
#ifdef CONFIG_DEBUG_LL
- /*
- * Map in IO space for serial debugging.
- * This allows debug messages to be output
- * via a serial console before paging_init.
- */
- add r0, r4, r7
- rsb r3, r7, #0x4000 @ PTRS_PER_PGD*sizeof(long)
- cmp r3, #0x0800
- addge r2, r0, #0x0800
- addlt r2, r0, r3
- orr r3, r6, r8
-1: str r3, [r0], #4
- add r3, r3, #1 << 20
- teq r0, r2
- bne 1b
+ /*
+ * Map in IO space for serial debugging.
+ * This allows debug messages to be output
+ * via a serial console before paging_init.
+ */
+ add r0, r4, r7
+ rsb r3, r7, #0x4000 @ PTRS_PER_PGD*sizeof(long)
+ cmp r3, #0x0800
+ addge r2, r0, #0x0800
+ addlt r2, r0, r3
+ orr r3, r6, r8
+1: str r3, [r0], #4
+ add r3, r3, #1 << 20
+ teq r0, r2
+ bne 1b
#if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS)
- /*
- * If we're using the NetWinder, we need to map in
- * the 16550-type serial port for the debug messages
- */
- teq r1, #MACH_TYPE_NETWINDER
- teqne r1, #MACH_TYPE_CATS
- bne 1f
- add r0, r4, #0x3fc0
- mov r3, #0x7c000000
- orr r3, r3, r8
- str r3, [r0], #4
- add r3, r3, #1 << 20
- str r3, [r0], #4
+ /*
+ * If we're using the NetWinder, we need to map in
+ * the 16550-type serial port for the debug messages
+ */
+ teq r1, #MACH_TYPE_NETWINDER
+ teqne r1, #MACH_TYPE_CATS
+ bne 1f
+ add r0, r4, #0x3fc0 @ ff000000
+ mov r3, #0x7c000000
+ orr r3, r3, r8
+ str r3, [r0], #4
+ add r3, r3, #1 << 20
+ str r3, [r0], #4
1:
#endif
#endif
#ifdef CONFIG_ARCH_RPC
- /*
- * Map in screen at 0x02000000 & SCREEN2_BASE
- * Similar reasons here - for debug. This is
- * only for Acorn RiscPC architectures.
- */
- add r0, r4, #0x80 @ 02000000
- mov r3, #0x02000000
- orr r3, r3, r8
- str r3, [r0]
- add r0, r4, #0x3600 @ d8000000
- str r3, [r0]
+ /*
+ * Map in screen at 0x02000000 & SCREEN2_BASE
+ * Similar reasons here - for debug. This is
+ * only for Acorn RiscPC architectures.
+ */
+ add r0, r4, #0x80 @ 02000000
+ mov r3, #0x02000000
+ orr r3, r3, r8
+ str r3, [r0]
+ add r0, r4, #0x3600 @ d8000000
+ str r3, [r0]
#endif
- mov pc, lr
+ mov pc, lr
/*
- * Exception handling. Something went wrong and we can't
- * proceed. We ought to tell the user, but since we
- * don't have any guarantee that we're even running on
- * the right architecture, we do virtually nothing.
+ * Exception handling. Something went wrong and we can't proceed. We
+ * ought to tell the user, but since we don't have any guarantee that
+ * we're even running on the right architecture, we do virtually nothing.
+ *
* r0 = ascii error character:
* a = invalid architecture
* p = invalid processor
@@ -324,31 +282,32 @@ __create_page_tables:
*/
__error:
#ifdef CONFIG_DEBUG_LL
- mov r8, r0 @ preserve r0
- adr r0, err_str
- bl printascii
- mov r0, r8
- bl printch
+ mov r8, r0 @ preserve r0
+ adr r0, err_str
+ bl printascii
+ mov r0, r8
+ bl printch
#endif
#ifdef CONFIG_ARCH_RPC
/*
* Turn the screen red on a error - RiscPC only.
*/
- mov r0, #0x02000000
- mov r3, #0x11
- orr r3, r3, r3, lsl #8
- orr r3, r3, r3, lsl #16
- str r3, [r0], #4
- str r3, [r0], #4
- str r3, [r0], #4
- str r3, [r0], #4
+ mov r0, #0x02000000
+ mov r3, #0x11
+ orr r3, r3, r3, lsl #8
+ orr r3, r3, r3, lsl #16
+ str r3, [r0], #4
+ str r3, [r0], #4
+ str r3, [r0], #4
+ str r3, [r0], #4
#endif
-1: mov r0, r0
- b 1b
+1: mov r0, r0
+ b 1b
#ifdef CONFIG_DEBUG_LL
-err_str: .asciz "\nError: "
- .align
+err_str:
+ .asciz "\nError: "
+ .align
#endif
/*
@@ -365,31 +324,31 @@ err_str: .asciz "\nError: "
* r10 = pointer to processor structure
*/
__lookup_processor_type:
- adr r5, 2f
- ldmia r5, {r7, r9, r10}
- sub r5, r5, r10 @ convert addresses
- add r7, r7, r5 @ to our address space
- add r10, r9, r5
- mrc p15, 0, r9, c0, c0 @ get processor id
-1: ldmia r10, {r5, r6, r8} @ value, mask, mmuflags
- and r6, r6, r9 @ mask wanted bits
- teq r5, r6
- moveq pc, lr
- add r10, r10, #PROC_INFO_SZ @ sizeof(proc_info_list)
- cmp r10, r7
- blt 1b
- mov r10, #0 @ unknown processor
- mov pc, lr
+ adr r5, 2f
+ ldmia r5, {r7, r9, r10}
+ sub r5, r5, r10 @ convert addresses
+ add r7, r7, r5 @ to our address space
+ add r10, r9, r5
+ mrc p15, 0, r9, c0, c0 @ get processor id
+1: ldmia r10, {r5, r6, r8} @ value, mask, mmuflags
+ and r6, r6, r9 @ mask wanted bits
+ teq r5, r6
+ moveq pc, lr
+ add r10, r10, #PROC_INFO_SZ @ sizeof(proc_info_list)
+ cmp r10, r7
+ blt 1b
+ mov r10, #0 @ unknown processor
+ mov pc, lr
/*
* Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for
* more information about the __proc_info and __arch_info structures.
*/
-2: .long __proc_info_end
- .long __proc_info_begin
- .long 2b
- .long __arch_info_begin
- .long __arch_info_end
+2: .long __proc_info_end
+ .long __proc_info_begin
+ .long 2b
+ .long __arch_info_begin
+ .long __arch_info_end
/*
* Lookup machine architecture in the linker-build list of architectures.
@@ -405,18 +364,18 @@ __lookup_processor_type:
* r7 = byte offset into page tables for IO
*/
__lookup_architecture_type:
- adr r4, 2b
- ldmia r4, {r2, r3, r5, r6, r7} @ throw away r2, r3
- sub r5, r4, r5 @ convert addresses
- add r4, r6, r5 @ to our address space
- add r7, r7, r5
-1: ldr r5, [r4] @ get machine type
- teq r5, r1
- beq 2f
- add r4, r4, #SIZEOF_MACHINE_DESC
- cmp r4, r7
- blt 1b
- mov r7, #0 @ unknown architecture
- mov pc, lr
-2: ldmib r4, {r5, r6, r7} @ found, get results
- mov pc, lr
+ adr r4, 2b
+ ldmia r4, {r2, r3, r5, r6, r7} @ throw away r2, r3
+ sub r5, r4, r5 @ convert addresses
+ add r4, r6, r5 @ to our address space
+ add r7, r7, r5
+1: ldr r5, [r4] @ get machine type
+ teq r5, r1 @ matches loader number?
+ beq 2f @ found
+ add r4, r4, #SIZEOF_MACHINE_DESC @ next machine_desc
+ cmp r4, r7
+ blt 1b
+ mov r7, #0 @ unknown architecture
+ mov pc, lr
+2: ldmib r4, {r5, r6, r7} @ found, get results
+ mov pc, lr
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index d073d21127fc..9d192b98d6d6 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -386,16 +386,16 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
pid_t __ret;
__asm__ __volatile__(
- "orr r0, %1, %2 @ kernel_thread sys_clone
- mov r1, #0
- "__syscall(clone)"
- movs %0, r0 @ if we are the child
- bne 1f
- mov fp, #0 @ ensure that fp is zero
- mov r0, %4
- mov lr, pc
- mov pc, %3
- b sys_exit
+ "orr r0, %1, %2 @ kernel_thread sys_clone \n\
+ mov r1, #0 \n\
+ "__syscall(clone)" \n\
+ movs %0, r0 @ if we are the child \n\
+ bne 1f \n\
+ mov fp, #0 @ ensure that fp is zero \n\
+ mov r0, %4 \n\
+ mov lr, pc \n\
+ mov pc, %3 \n\
+ b sys_exit \n\
1: "
: "=r" (__ret)
: "Ir" (flags), "I" (CLONE_VM), "r" (fn), "r" (arg)
diff --git a/arch/arm/kernel/semaphore.c b/arch/arm/kernel/semaphore.c
index 2ac3faa7b364..31efb0d53c64 100644
--- a/arch/arm/kernel/semaphore.c
+++ b/arch/arm/kernel/semaphore.c
@@ -178,76 +178,76 @@ int __down_trylock(struct semaphore * sem)
* value in some cases..
*/
#ifdef CONFIG_CPU_26
-asm(" .align 5
- .globl __down_failed
-__down_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __down
- ldmfd sp!, {r0 - r3, pc}^
-
- .align 5
- .globl __down_interruptible_failed
-__down_interruptible_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __down_interruptible
- mov ip, r0
- ldmfd sp!, {r0 - r3, pc}^
-
- .align 5
- .globl __down_trylock_failed
-__down_trylock_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __down_trylock
- mov ip, r0
- ldmfd sp!, {r0 - r3, pc}^
-
- .align 5
- .globl __up_wakeup
-__up_wakeup:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __up
- ldmfd sp!, {r0 - r3, pc}^
+asm(" .align 5 \n\
+ .globl __down_failed \n\
+__down_failed: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __down \n\
+ ldmfd sp!, {r0 - r3, pc}^ \n\
+ \n\
+ .align 5 \n\
+ .globl __down_interruptible_failed \n\
+__down_interruptible_failed: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __down_interruptible \n\
+ mov ip, r0 \n\
+ ldmfd sp!, {r0 - r3, pc}^ \n\
+ \n\
+ .align 5 \n\
+ .globl __down_trylock_failed \n\
+__down_trylock_failed: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __down_trylock \n\
+ mov ip, r0 \n\
+ ldmfd sp!, {r0 - r3, pc}^ \n\
+ \n\
+ .align 5 \n\
+ .globl __up_wakeup \n\
+__up_wakeup: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __up \n\
+ ldmfd sp!, {r0 - r3, pc}^ \n\
");
#else
/* 32 bit version */
-asm(" .align 5
- .globl __down_failed
-__down_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __down
- ldmfd sp!, {r0 - r3, pc}
-
- .align 5
- .globl __down_interruptible_failed
-__down_interruptible_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __down_interruptible
- mov ip, r0
- ldmfd sp!, {r0 - r3, pc}
-
- .align 5
- .globl __down_trylock_failed
-__down_trylock_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __down_trylock
- mov ip, r0
- ldmfd sp!, {r0 - r3, pc}
-
- .align 5
- .globl __up_wakeup
-__up_wakeup:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bl __up
- ldmfd sp!, {r0 - r3, pc}
+asm(" .align 5 \n\
+ .globl __down_failed \n\
+__down_failed: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __down \n\
+ ldmfd sp!, {r0 - r3, pc} \n\
+ \n\
+ .align 5 \n\
+ .globl __down_interruptible_failed \n\
+__down_interruptible_failed: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __down_interruptible \n\
+ mov ip, r0 \n\
+ ldmfd sp!, {r0 - r3, pc} \n\
+ \n\
+ .align 5 \n\
+ .globl __down_trylock_failed \n\
+__down_trylock_failed: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __down_trylock \n\
+ mov ip, r0 \n\
+ ldmfd sp!, {r0 - r3, pc} \n\
+ \n\
+ .align 5 \n\
+ .globl __up_wakeup \n\
+__up_wakeup: \n\
+ stmfd sp!, {r0 - r3, lr} \n\
+ mov r0, ip \n\
+ bl __up \n\
+ ldmfd sp!, {r0 - r3, pc} \n\
");
#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 03d1b746f104..810c732c88a5 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -61,7 +61,6 @@ extern int root_mountflags;
extern int _stext, _text, _etext, _edata, _end;
unsigned int processor_id;
-unsigned int compat;
unsigned int __machine_arch_type;
unsigned int system_rev;
unsigned int system_serial_low;
@@ -289,11 +288,6 @@ static struct machine_desc * __init setup_machine(unsigned int nr)
}
printk("Machine: %s\n", list->name);
- if (compat)
- printk(KERN_WARNING "Using compatibility code "
- "scheduled for removal in v%d.%d.%d\n",
- compat >> 24, (compat >> 12) & 0x3ff,
- compat & 0x3ff);
return list;
}
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index b90df71485d0..fa5df23bf4c0 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -618,7 +618,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
continue;
switch (signr) {
- case SIGCONT: case SIGCHLD: case SIGWINCH:
+ case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
continue;
case SIGTSTP: case SIGTTIN: case SIGTTOU:
diff --git a/arch/arm/lib/csumpartial.S b/arch/arm/lib/csumpartial.S
index 1e7f4a60fedb..25c05f35fd8d 100644
--- a/arch/arm/lib/csumpartial.S
+++ b/arch/arm/lib/csumpartial.S
@@ -49,7 +49,7 @@ td3 .req lr
/* we are now half-word aligned */
.less8_wordlp:
-#ifdef __ARM_ARCH_4__
+#if __LINUX_ARM_ARCH__ >= 4
ldrh td0, [buf], #2
sub len, len, #2
#else
@@ -83,7 +83,7 @@ td3 .req lr
adcnes sum, sum, td0, lsl #byte(1) @ update checksum
tst buf, #2 @ 32-bit aligned?
-#ifdef __ARM_ARCH_4__
+#if __LINUX_ARM_ARCH__ >= 4
ldrneh td0, [buf], #2 @ make 32-bit aligned
subne len, len, #2
#else
diff --git a/arch/arm/lib/longlong.h b/arch/arm/lib/longlong.h
index d0f9b11190e0..05ec1abd6a2c 100644
--- a/arch/arm/lib/longlong.h
+++ b/arch/arm/lib/longlong.h
@@ -75,7 +75,7 @@
#if defined (__arm__)
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- __asm__ ("adds %1, %4, %5
+ __asm__ ("adds %1, %4, %5 \n\
adc %0, %2, %3" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
@@ -84,7 +84,7 @@
"%r" ((USItype) (al)), \
"rI" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- __asm__ ("subs %1, %4, %5
+ __asm__ ("subs %1, %4, %5 \n\
sbc %0, %2, %3" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
@@ -94,18 +94,18 @@
"rI" ((USItype) (bl)))
#define umul_ppmm(xh, xl, a, b) \
{register USItype __t0, __t1, __t2; \
- __asm__ ("%@ Inlined umul_ppmm
- mov %2, %5, lsr #16
- mov %0, %6, lsr #16
- bic %3, %5, %2, lsl #16
- bic %4, %6, %0, lsl #16
- mul %1, %3, %4
- mul %4, %2, %4
- mul %3, %0, %3
- mul %0, %2, %0
- adds %3, %4, %3
- addcs %0, %0, #65536
- adds %1, %1, %3, lsl #16
+ __asm__ ("%@ Inlined umul_ppmm \n\
+ mov %2, %5, lsr #16 \n\
+ mov %0, %6, lsr #16 \n\
+ bic %3, %5, %2, lsl #16 \n\
+ bic %4, %6, %0, lsl #16 \n\
+ mul %1, %3, %4 \n\
+ mul %4, %2, %4 \n\
+ mul %3, %0, %3 \n\
+ mul %0, %2, %0 \n\
+ adds %3, %4, %3 \n\
+ addcs %0, %0, #65536 \n\
+ adds %1, %1, %3, lsl #16 \n\
adc %0, %0, %3, lsr #16" \
: "=&r" ((USItype) (xh)), \
"=r" ((USItype) (xl)), \
diff --git a/arch/arm/lib/muldi3.c b/arch/arm/lib/muldi3.c
index 3b5aa51790b1..44d611b1cfdb 100644
--- a/arch/arm/lib/muldi3.c
+++ b/arch/arm/lib/muldi3.c
@@ -33,18 +33,18 @@ Boston, MA 02111-1307, USA. */
#define umul_ppmm(xh, xl, a, b) \
{register USItype __t0, __t1, __t2; \
- __asm__ ("%@ Inlined umul_ppmm
- mov %2, %5, lsr #16
- mov %0, %6, lsr #16
- bic %3, %5, %2, lsl #16
- bic %4, %6, %0, lsl #16
- mul %1, %3, %4
- mul %4, %2, %4
- mul %3, %0, %3
- mul %0, %2, %0
- adds %3, %4, %3
- addcs %0, %0, #65536
- adds %1, %1, %3, lsl #16
+ __asm__ ("%@ Inlined umul_ppmm \n\
+ mov %2, %5, lsr #16 \n\
+ mov %0, %6, lsr #16 \n\
+ bic %3, %5, %2, lsl #16 \n\
+ bic %4, %6, %0, lsl #16 \n\
+ mul %1, %3, %4 \n\
+ mul %4, %2, %4 \n\
+ mul %3, %0, %3 \n\
+ mul %0, %2, %0 \n\
+ adds %3, %4, %3 \n\
+ addcs %0, %0, #65536 \n\
+ adds %1, %1, %3, lsl #16 \n\
adc %0, %0, %3, lsr #16" \
: "=&r" ((USItype) (xh)), \
"=r" ((USItype) (xl)), \
diff --git a/arch/arm/mach-footbridge/cats-pci.c b/arch/arm/mach-footbridge/cats-pci.c
index 0e09d315016a..386d400f5c1f 100644
--- a/arch/arm/mach-footbridge/cats-pci.c
+++ b/arch/arm/mach-footbridge/cats-pci.c
@@ -11,6 +11,7 @@
#include <asm/irq.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
/* cats host-specific stuff */
static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 };
@@ -34,7 +35,7 @@ static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
* why not the standard PCI swizzle? does this prevent 4-port tulip
* cards being used (ie, pci-pci bridge based cards)?
*/
-struct hw_pci cats_pci __initdata = {
+static struct hw_pci cats_pci __initdata = {
swizzle: NULL,
map_irq: cats_map_irq,
nr_controllers: 1,
@@ -43,3 +44,12 @@ struct hw_pci cats_pci __initdata = {
preinit: dc21285_preinit,
postinit: dc21285_postinit,
};
+
+static int cats_pci_init(void)
+{
+ if (machine_is_cats())
+ pci_common_init(&cats_pci);
+ return 0;
+}
+
+subsys_initcall(cats_pci_init);
diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c
index 3d08c2e7fee8..8cfa3a437a4b 100644
--- a/arch/arm/mach-footbridge/dc21285.c
+++ b/arch/arm/mach-footbridge/dc21285.c
@@ -1,7 +1,8 @@
/*
* linux/arch/arm/kernel/dec21285.c: PCI functions for DC21285
*
- * Copyright (C) 1998-2000 Russell King, Phil Blundell
+ * Copyright (C) 1998-2001 Russell King
+ * Copyright (C) 1998-2000 Phil Blundell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -261,31 +262,45 @@ static void dc21285_parity_irq(int irq, void *dev_id, struct pt_regs *regs)
add_timer(timer);
}
-void __init dc21285_setup_resources(struct resource **resource)
+int __init dc21285_setup(int nr, struct pci_sys_data *sys)
{
- struct resource *busmem, *busmempf;
+ struct resource *res;
- busmem = kmalloc(sizeof(*busmem), GFP_KERNEL);
- busmempf = kmalloc(sizeof(*busmempf), GFP_KERNEL);
- memset(busmem, 0, sizeof(*busmem));
- memset(busmempf, 0, sizeof(*busmempf));
+ if (nr || !footbridge_cfn_mode())
+ return 0;
- busmem->flags = IORESOURCE_MEM;
- busmem->name = "Footbridge non-prefetch";
- busmempf->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
- busmempf->name = "Footbridge prefetch";
+ res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL);
+ if (!res) {
+ printk("out of memory for root bus resources");
+ return 0;
+ }
+
+ memset(res, 0, sizeof(struct resource) * 2);
- allocate_resource(&iomem_resource, busmempf, 0x20000000,
- 0x80000000, 0xffffffff, 0x20000000, NULL, NULL);
- allocate_resource(&iomem_resource, busmem, 0x40000000,
+ res[0].flags = IORESOURCE_MEM;
+ res[0].name = "Footbridge non-prefetch";
+ res[1].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
+ res[1].name = "Footbridge prefetch";
+
+ allocate_resource(&iomem_resource, &res[1], 0x20000000,
+ 0xa0000000, 0xffffffff, 0x20000000, NULL, NULL);
+ allocate_resource(&iomem_resource, &res[0], 0x40000000,
0x80000000, 0xffffffff, 0x40000000, NULL, NULL);
- resource[0] = &ioport_resource;
- resource[1] = busmem;
- resource[2] = busmempf;
+ sys->resource[0] = &ioport_resource;
+ sys->resource[1] = &res[0];
+ sys->resource[2] = &res[1];
+ sys->mem_offset = DC21285_PCI_MEM;
+
+ return 1;
+}
+
+struct pci_bus * __init dc21285_scan_bus(int nr, struct pci_sys_data *sys)
+{
+ return pci_scan_bus(0, &dc21285_ops, sys);
}
-void __init dc21285_init(void *sysdata)
+void __init dc21285_preinit(void)
{
unsigned int mem_size, mem_mask;
int cfn_mode;
@@ -313,17 +328,13 @@ void __init dc21285_init(void *sysdata)
"central function" : "addin");
if (cfn_mode) {
- static struct resource csrmem, csrio;
+ static struct resource csrio;
csrio.flags = IORESOURCE_IO;
csrio.name = "Footbridge";
- csrmem.flags = IORESOURCE_MEM;
- csrmem.name = "Footbridge";
allocate_resource(&ioport_resource, &csrio, 128,
0xff00, 0xffff, 128, NULL, NULL);
- allocate_resource(&iomem_resource, &csrmem, 128,
- 0xf4000000, 0xf8000000, 128, NULL, NULL);
/*
* Map our SDRAM at a known address in PCI space, just in case
@@ -331,22 +342,12 @@ void __init dc21285_init(void *sysdata)
* necessary, since some VGA cards forcefully use PCI addresses
* in the range 0x000a0000 to 0x000c0000. (eg, S3 cards).
*/
- *CSR_PCICSRBASE = csrmem.start;
+ *CSR_PCICSRBASE = 0xf4000000;
*CSR_PCICSRIOBASE = csrio.start;
*CSR_PCISDRAMBASE = __virt_to_bus(PAGE_OFFSET);
*CSR_PCIROMBASE = 0;
*CSR_PCICMD = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
PCI_COMMAND_INVALIDATE | PCICMD_ERROR_BITS;
-
- pci_scan_bus(0, &dc21285_ops, sysdata);
-
- /*
- * Clear any existing errors - we aren't
- * interested in historical data...
- */
- *CSR_SA110_CNTL = (*CSR_SA110_CNTL & 0xffffde07) |
- SA110_CNTL_RXSERR;
- *CSR_PCICMD = (*CSR_PCICMD & 0xffff) | PCICMD_ERROR_BITS;
} else if (footbridge_cfn_mode() != 0) {
/*
* If we are not compiled to accept "add-in" mode, then
@@ -357,6 +358,19 @@ void __init dc21285_init(void *sysdata)
panic("PCI: this kernel is compiled for central "
"function mode only");
}
+}
+
+void __init dc21285_postinit(void)
+{
+ if (footbridge_cfn_mode()) {
+ /*
+ * Clear any existing errors - we aren't
+ * interested in historical data...
+ */
+ *CSR_SA110_CNTL = (*CSR_SA110_CNTL & 0xffffde07) |
+ SA110_CNTL_RXSERR;
+ *CSR_PCICMD = (*CSR_PCICMD & 0xffff) | PCICMD_ERROR_BITS;
+ }
/*
* Initialise PCI error IRQ after we've finished probing
diff --git a/arch/arm/mach-footbridge/ebsa285-pci.c b/arch/arm/mach-footbridge/ebsa285-pci.c
index 8f1603d787fb..f8f956905264 100644
--- a/arch/arm/mach-footbridge/ebsa285-pci.c
+++ b/arch/arm/mach-footbridge/ebsa285-pci.c
@@ -11,6 +11,7 @@
#include <asm/irq.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
static int irqmap_ebsa285[] __initdata = { IRQ_IN3, IRQ_IN1, IRQ_IN0, IRQ_PCI };
@@ -27,7 +28,7 @@ static int __init ebsa285_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
return irqmap_ebsa285[(slot + pin) & 3];
}
-struct hw_pci ebsa285_pci __initdata = {
+static struct hw_pci ebsa285_pci __initdata = {
swizzle: pci_std_swizzle,
map_irq: ebsa285_map_irq,
nr_controllers: 1,
@@ -36,3 +37,12 @@ struct hw_pci ebsa285_pci __initdata = {
preinit: dc21285_preinit,
postinit: dc21285_postinit,
};
+
+static int __init ebsa285_init_pci(void)
+{
+ if (machine_is_ebsa285())
+ pci_common_init(&ebsa285_pci);
+ return 0;
+}
+
+subsys_initcall(ebsa285_init_pci);
diff --git a/arch/arm/mach-footbridge/netwinder-pci.c b/arch/arm/mach-footbridge/netwinder-pci.c
index d8bae268d70c..8c426a802ab9 100644
--- a/arch/arm/mach-footbridge/netwinder-pci.c
+++ b/arch/arm/mach-footbridge/netwinder-pci.c
@@ -11,6 +11,7 @@
#include <asm/irq.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
/*
* We now use the slot ID instead of the device identifiers to select
@@ -41,7 +42,7 @@ static int __init netwinder_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
}
}
-struct hw_pci netwinder_pci __initdata = {
+static struct hw_pci netwinder_pci __initdata = {
swizzle: pci_std_swizzle,
map_irq: netwinder_map_irq,
nr_controllers: 1,
@@ -50,3 +51,12 @@ struct hw_pci netwinder_pci __initdata = {
preinit: dc21285_preinit,
postinit: dc21285_postinit,
};
+
+static int __init netwinder_pci_init(void)
+{
+ if (machine_is_netwinder())
+ pci_common_init(&netwinder_pci);
+ return 0;
+}
+
+subsys_initcall(netwinder_pci_init);
diff --git a/arch/arm/mach-footbridge/personal-pci.c b/arch/arm/mach-footbridge/personal-pci.c
index 9df2853b313e..148a0fa55d27 100644
--- a/arch/arm/mach-footbridge/personal-pci.c
+++ b/arch/arm/mach-footbridge/personal-pci.c
@@ -11,6 +11,7 @@
#include <asm/irq.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
static int irqmap_personal_server[] __initdata = {
IRQ_IN0, IRQ_IN1, IRQ_IN2, IRQ_IN3, 0, 0, 0,
@@ -36,7 +37,7 @@ static int __init personal_server_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
return irqmap_personal_server[(line - 1) & 3];
}
-struct hw_pci personal_server_pci __initdata = {
+static struct hw_pci personal_server_pci __initdata = {
map_irq: personal_server_map_irq,
nr_controllers: 1,
setup: dc21285_setup,
@@ -44,3 +45,12 @@ struct hw_pci personal_server_pci __initdata = {
preinit: dc21285_preinit,
postinit: dc21285_postinit,
};
+
+static int __init personal_pci_init(void)
+{
+ if (machine_is_personal_server())
+ pci_common_init(&personal_server_pci);
+ return 0;
+}
+
+subsys_initcall(&personal_pci_init);
diff --git a/arch/arm/mach-ftvpci/pci.c b/arch/arm/mach-ftvpci/pci.c
index 11369bc58c0f..43bedeb5c90f 100644
--- a/arch/arm/mach-ftvpci/pci.c
+++ b/arch/arm/mach-ftvpci/pci.c
@@ -11,6 +11,7 @@
#include <asm/irq.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
/*
* Owing to a PCB cockup, issue A backplanes are wired thus:
@@ -43,9 +44,17 @@ static u8 __init ftv_swizzle(struct pci_dev *dev, u8 *pin)
}
/* ftv host-specific stuff */
-struct hw_pci ftv_pci __initdata = {
+static struct hw_pci ftv_pci __initdata = {
init: plx90x0_init,
swizzle: ftv_swizzle,
map_irq: ftv_map_irq,
};
+static int __init ftv_pci_init(void)
+{
+ if (machine_is_ftvpci())
+ pci_common_init(&ftv_pci);
+ return 0;
+}
+
+subsys_initcall(ftv_pci_init);
diff --git a/arch/arm/mach-integrator/pci.c b/arch/arm/mach-integrator/pci.c
index 62d961835311..5489e8437bb2 100644
--- a/arch/arm/mach-integrator/pci.c
+++ b/arch/arm/mach-integrator/pci.c
@@ -31,6 +31,7 @@
#include <asm/irq.h>
#include <asm/system.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
/*
* A small note about bridges and interrupts. The DECchip 21050 (and
@@ -112,7 +113,7 @@ static int __init integrator_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
extern void pci_v3_init(void *);
-struct hw_pci integrator_pci __initdata = {
+static struct hw_pci integrator_pci __initdata = {
swizzle: integrator_swizzle,
map_irq: integrator_map_irq,
setup: pci_v3_setup,
@@ -121,3 +122,12 @@ struct hw_pci integrator_pci __initdata = {
preinit: pci_v3_preinit,
postinit: pci_v3_postinit,
};
+
+static int __init integrator_pci_init(void)
+{
+ if (machine_is_integrator())
+ pci_common_init(&integrator_pci);
+ return 0;
+}
+
+subsys_initcall(integrator_pci_init);
diff --git a/arch/arm/mach-iop310/iop310-pci.c b/arch/arm/mach-iop310/iop310-pci.c
index 1dca952f109b..3e1a5f6b4480 100644
--- a/arch/arm/mach-iop310/iop310-pci.c
+++ b/arch/arm/mach-iop310/iop310-pci.c
@@ -452,20 +452,24 @@ int iop310_setup(int nr, struct pci_sys_data *sys)
res[0].start = IOP310_PCIPRI_LOWER_IO + 0x6e000000;
res[0].end = IOP310_PCIPRI_LOWER_IO + 0x6e00ffff;
res[0].name = "PCI IO Primary";
+ res[0].flags = IORESOURCE_IO;
res[1].start = IOP310_PCIPRI_LOWER_MEM;
res[1].end = IOP310_PCIPRI_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
res[1].name = "PCI Memory Primary";
+ res[1].flags = IORESOURCE_MEM;
break;
case 1:
res[0].start = IOP310_PCISEC_LOWER_IO + 0x6e000000;
res[0].end = IOP310_PCISEC_LOWER_IO + 0x6e00ffff;
res[0].name = "PCI IO Secondary";
+ res[0].flags = IORESOURCE_IO;
res[1].start = IOP310_PCISEC_LOWER_MEM;
res[1].end = IOP310_PCISEC_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
res[1].name = "PCI Memory Secondary";
+ res[1].flags = IORESOURCE_MEM;
break;
}
diff --git a/arch/arm/mach-iop310/iq80310-pci.c b/arch/arm/mach-iop310/iq80310-pci.c
index a26a8e1e5e2e..b6f6b2308a69 100644
--- a/arch/arm/mach-iop310/iq80310-pci.c
+++ b/arch/arm/mach-iop310/iq80310-pci.c
@@ -18,6 +18,7 @@
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
/*
* The following macro is used to lookup irqs in a standard table
@@ -140,10 +141,19 @@ static void iq80310_preinit(void)
iop310_init();
}
-struct hw_pci iq80310_pci __initdata = {
+static struct hw_pci iq80310_pci __initdata = {
swizzle: pci_std_swizzle,
nr_controllers: 2,
setup: iq80310_setup,
scan: iop310_scan_bus,
preinit: iq80310_preinit,
};
+
+static int __init iq80310_pci_init(void)
+{
+ if (machine_is_iq80310())
+ pci_common_init(&iq80310_pci);
+ return 0;
+}
+
+subsys_initcall(iq80310_pci_init);
diff --git a/arch/arm/mach-rpc/dma.c b/arch/arm/mach-rpc/dma.c
index cc0dc96ae2ee..6bd602e712e6 100644
--- a/arch/arm/mach-rpc/dma.c
+++ b/arch/arm/mach-rpc/dma.c
@@ -33,10 +33,6 @@ typedef enum {
dma_size_32 = 4,
dma_size_128 = 16
} dma_size_t;
-
-typedef struct {
- dma_size_t transfersize;
-} dma_t;
#endif
#define TRANSFER_SIZE 2
@@ -48,10 +44,6 @@ typedef struct {
#define CR (IOMD_IO0CR - IOMD_IO0CURA)
#define ST (IOMD_IO0ST - IOMD_IO0CURA)
-#define state_prog_a 0
-#define state_wait_a 1
-#define state_wait_b 2
-
static void iomd_get_next_sg(struct scatterlist *sg, dma_t *dma)
{
unsigned long end, offset, flags = 0;
@@ -91,76 +83,40 @@ static void iomd_get_next_sg(struct scatterlist *sg, dma_t *dma)
sg->length |= flags;
}
-static inline void iomd_setup_dma_a(struct scatterlist *sg, dma_t *dma)
-{
- iomd_writel(sg->dma_address, dma->dma_base + CURA);
- iomd_writel(sg->length, dma->dma_base + ENDA);
-}
-
-static inline void iomd_setup_dma_b(struct scatterlist *sg, dma_t *dma)
-{
- iomd_writel(sg->dma_address, dma->dma_base + CURB);
- iomd_writel(sg->length, dma->dma_base + ENDB);
-}
-
static void iomd_dma_handle(int irq, void *dev_id, struct pt_regs *regs)
{
dma_t *dma = (dma_t *)dev_id;
- unsigned int status = 0, no_buffer = dma->sg == NULL;
+ unsigned long base = dma->dma_base;
do {
- switch (dma->state) {
- case state_prog_a:
- iomd_get_next_sg(&dma->cur_sg, dma);
- iomd_setup_dma_a(&dma->cur_sg, dma);
- dma->state = state_wait_a;
-
- case state_wait_a:
- status = iomd_readb(dma->dma_base + ST);
- switch (status & (DMA_ST_OFL|DMA_ST_INT|DMA_ST_AB)) {
- case DMA_ST_OFL|DMA_ST_INT:
- iomd_get_next_sg(&dma->cur_sg, dma);
- iomd_setup_dma_a(&dma->cur_sg, dma);
- break;
-
- case DMA_ST_INT:
- iomd_get_next_sg(&dma->cur_sg, dma);
- iomd_setup_dma_b(&dma->cur_sg, dma);
- dma->state = state_wait_b;
- break;
-
- case DMA_ST_OFL|DMA_ST_INT|DMA_ST_AB:
- iomd_setup_dma_b(&dma->cur_sg, dma);
- dma->state = state_wait_b;
- break;
- }
+ unsigned int status;
+
+ status = iomd_readb(base + ST);
+ if (!(status & DMA_ST_INT))
+ return;
+
+ if (status & DMA_ST_OFL && !dma->sg)
break;
- case state_wait_b:
- status = iomd_readb(dma->dma_base + ST);
- switch (status & (DMA_ST_OFL|DMA_ST_INT|DMA_ST_AB)) {
- case DMA_ST_OFL|DMA_ST_INT|DMA_ST_AB:
- iomd_get_next_sg(&dma->cur_sg, dma);
- iomd_setup_dma_b(&dma->cur_sg, dma);
- break;
-
- case DMA_ST_INT|DMA_ST_AB:
- iomd_get_next_sg(&dma->cur_sg, dma);
- iomd_setup_dma_a(&dma->cur_sg, dma);
- dma->state = state_wait_a;
- break;
-
- case DMA_ST_OFL|DMA_ST_INT:
- iomd_setup_dma_a(&dma->cur_sg, dma);
- dma->state = state_wait_a;
- break;
- }
+ iomd_get_next_sg(&dma->cur_sg, dma);
+
+ switch (status & (DMA_ST_OFL | DMA_ST_AB)) {
+ case DMA_ST_OFL: /* OIA */
+ case DMA_ST_AB: /* .IB */
+ iomd_writel(dma->cur_sg.dma_address, base + CURA);
+ iomd_writel(dma->cur_sg.length, base + ENDA);
+ break;
+
+ case DMA_ST_OFL | DMA_ST_AB: /* OIB */
+ case 0: /* .IA */
+ iomd_writel(dma->cur_sg.dma_address, base + CURB);
+ iomd_writel(dma->cur_sg.length, base + ENDB);
break;
}
- } while (dma->sg && (status & DMA_ST_INT));
+ } while (1);
- if (no_buffer)
- disable_irq(irq);
+ iomd_writeb(0, dma->dma_base + CR);
+ disable_irq(irq);
}
static int iomd_request_dma(dmach_t channel, dma_t *dma)
@@ -194,7 +150,6 @@ static void iomd_enable_dma(dmach_t channel, dma_t *dma)
}
iomd_writeb(DMA_CR_C, dma_base + CR);
- dma->state = state_prog_a;
}
if (dma->dma_mode == DMA_MODE_READ)
@@ -207,11 +162,15 @@ static void iomd_enable_dma(dmach_t channel, dma_t *dma)
static void iomd_disable_dma(dmach_t channel, dma_t *dma)
{
unsigned long dma_base = dma->dma_base;
+ unsigned long flags;
unsigned int ctrl;
- disable_irq(dma->dma_irq);
+ local_irq_save(flags);
ctrl = iomd_readb(dma_base + CR);
+ if (ctrl & DMA_CR_E)
+ disable_irq(dma->dma_irq);
iomd_writeb(ctrl & ~DMA_CR_E, dma_base + CR);
+ local_irq_restore(flags);
}
static int iomd_set_dma_speed(dmach_t channel, dma_t *dma, int cycle)
diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c
index a04fceb9a707..230b16e4aa9c 100644
--- a/arch/arm/mach-sa1100/badge4.c
+++ b/arch/arm/mach-sa1100/badge4.c
@@ -16,6 +16,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
+#include <linux/device.h>
#include <linux/delay.h>
#include <linux/tty.h>
#include <linux/errno.h>
diff --git a/arch/arm/mach-shark/pci.c b/arch/arm/mach-shark/pci.c
index 46c083f3a502..809dfc1643e6 100644
--- a/arch/arm/mach-shark/pci.c
+++ b/arch/arm/mach-shark/pci.c
@@ -11,6 +11,7 @@
#include <asm/irq.h>
#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
static int __init shark_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
@@ -22,7 +23,7 @@ static int __init shark_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
extern void __init via82c505_preinit(void *sysdata);
-struct hw_pci shark_pci __initdata = {
+static struct hw_pci shark_pci __initdata = {
setup: via82c505_setup,
swizzle: pci_std_swizzle,
map_irq: shark_map_irq,
@@ -30,3 +31,12 @@ struct hw_pci shark_pci __initdata = {
scan: via82c505_scan_bus,
preinit: via82c505_preinit
};
+
+static int __init shark_pci_init(void)
+{
+ if (machine_is_shark())
+ pci_common_init(&shark_pci);
+ return 0;
+}
+
+subsys_initcall(shark_pci_init);
diff --git a/arch/arm/mm/abort-lv4t.S b/arch/arm/mm/abort-lv4t.S
index 6b768df8fab2..1742f586de85 100644
--- a/arch/arm/mm/abort-lv4t.S
+++ b/arch/arm/mm/abort-lv4t.S
@@ -66,8 +66,8 @@ ENTRY(v4t_late_abort)
add r6, r6, r2, lsr #3
add r6, r6, r6, lsr #8
add r6, r6, r6, lsr #4
- and r6, r6, #15 @ r7 = no. of registers to transfer.
- and r5, r8, #15 << 16 @ Extract 'n' form instruction
+ and r6, r6, #15 @ r6 = no. of registers to transfer.
+ and r5, r8, #15 << 16 @ Extract 'n' from instruction
ldr r7, [sp, r5, lsr #14] @ Get register 'Rn'
tst r8, #1 << 23 @ Check U bit
subne r7, r7, r6, lsl #2 @ Undo increment
diff --git a/arch/arm/mm/fault-common.c b/arch/arm/mm/fault-common.c
index b39fd67963f7..37770f82b356 100644
--- a/arch/arm/mm/fault-common.c
+++ b/arch/arm/mm/fault-common.c
@@ -339,8 +339,7 @@ no_context:
int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *regs)
{
struct task_struct *tsk;
- struct mm_struct *mm;
- int offset;
+ unsigned int offset;
pgd_t *pgd, *pgd_k;
pmd_t *pmd, *pmd_k;
@@ -349,16 +348,17 @@ int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *reg
offset = __pgd_offset(addr);
+ /*
+ * FIXME: CP15 C1 is write only on ARMv3 architectures.
+ */
pgd = cpu_get_pgd() + offset;
pgd_k = init_mm.pgd + offset;
if (pgd_none(*pgd_k))
goto bad_area;
-#if 0 /* note that we are two-level */
if (!pgd_present(*pgd))
set_pgd(pgd, *pgd_k);
-#endif
pmd_k = pmd_offset(pgd_k, addr);
pmd = pmd_offset(pgd, addr);
@@ -371,8 +371,7 @@ int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *reg
bad_area:
tsk = current;
- mm = tsk->active_mm;
- do_bad_area(tsk, mm, addr, error_code, regs);
+ do_bad_area(tsk, tsk->active_mm, addr, error_code, regs);
return 0;
}
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 07033a36b175..c408174af5e0 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -243,6 +243,7 @@ find_memend_and_nodes(struct meminfo *mi, struct node_info *np)
* also get rid of some of the stuff above as well.
*/
max_low_pfn = memend_pfn - O_PFN_DOWN(PHYS_OFFSET);
+ max_pfn = memend_pfn - O_PFN_DOWN(PHYS_OFFSET);
mi->end = memend_pfn << PAGE_SHIFT;
return bootmem_pages;
diff --git a/arch/arm/nwfpe/softfloat.c b/arch/arm/nwfpe/softfloat.c
index 86f3cf9b51e8..26c1b916e527 100644
--- a/arch/arm/nwfpe/softfloat.c
+++ b/arch/arm/nwfpe/softfloat.c
@@ -184,9 +184,9 @@ INLINE float32 packFloat32( flag zSign, int16 zExp, bits32 zSig )
{
#if 0
float32 f;
- __asm__("@ packFloat32;
- mov %0, %1, asl #31;
- orr %0, %2, asl #23;
+ __asm__("@ packFloat32; \n\
+ mov %0, %1, asl #31; \n\
+ orr %0, %2, asl #23; \n\
orr %0, %3"
: /* no outputs */
: "g" (f), "g" (zSign), "g" (zExp), "g" (zSig)
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types
index 76ca193d0112..82dd2c7cf55f 100644
--- a/arch/arm/tools/mach-types
+++ b/arch/arm/tools/mach-types
@@ -6,7 +6,7 @@
# To add an entry into this database, please see Documentation/arm/README,
# or contact rmk@arm.linux.org.uk
#
-# Last update: Fri Mar 29 15:51:20 2002
+# Last update: Tue May 21 14:19:05 2002
#
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
#
@@ -149,7 +149,7 @@ h3800 SA1100_H3800 H3800 137
blue_v1 ARCH_BLUE_V1 BLUE_V1 138
pxa_cerf ARCH_PXA_CERF PXA_CERF 139
arm7tevb ARCH_ARM7TEVB ARM7TEVB 140
-d7400 ARCH_D7400 D7400 141
+d7400 SA1100_D7400 D7400 141
piranha ARCH_PIRANHA PIRANHA 142
sbcamelot SA1100_SBCAMELOT SBCAMELOT 143
kings SA1100_KINGS KINGS 144
@@ -180,3 +180,15 @@ active SA1100_ACTIVE ACTIVE 168
iq80321 ARCH_IQ80321 IQ80321 169
wid SA1100_WID WID 170
sabinal ARCH_SABINAL SABINAL 171
+ixp425_matacumbe ARCH_IXP425_MATACUMBE IXP425_MATACUMBE 172
+miniprint SA1100_MINIPRINT MINIPRINT 173
+adm510x ARCH_ADM510X ADM510X 174
+svs200 SA1100_SVS200 SVS200 175
+atg_tcu ARCH_ATG_TCU ATG_TCU 176
+jornada820 SA1100_JORNADA820 JORNADA820 177
+s3c44b0 ARCH_S3C44B0 S3C44B0 178
+margis2 ARCH_MARGIS2 MARGIS2 179
+ks8695 ARCH_KS8695 KS8695 180
+brh ARCH_BRH BRH 181
+s3c2410 ARCH_S3C2410 S3C2410 182
+possio_px30 ARCH_POSSIO_PX30 POSSIO_PX30 183
diff --git a/drivers/acorn/char/mouse_rpc.c b/drivers/acorn/char/mouse_rpc.c
index 22ea6d9bcb51..bf6d2fd25923 100644
--- a/drivers/acorn/char/mouse_rpc.c
+++ b/drivers/acorn/char/mouse_rpc.c
@@ -17,6 +17,7 @@
#include <linux/ptrace.h>
#include <linux/interrupt.h>
#include <linux/init.h>
+#include <linux/errno.h>
#include <asm/hardware.h>
#include <asm/irq.h>
diff --git a/drivers/acorn/net/etherh.c b/drivers/acorn/net/etherh.c
index 2e65de939889..68e3d62fd326 100644
--- a/drivers/acorn/net/etherh.c
+++ b/drivers/acorn/net/etherh.c
@@ -66,6 +66,7 @@ static const card_ids __init etherh_cids[] = {
};
struct etherh_priv {
+ struct ei_device eidev;
unsigned int id;
unsigned int ctrl_port;
unsigned int ctrl;
@@ -150,8 +151,8 @@ static expansioncard_ops_t etherh_ops = {
static void
etherh_setif(struct net_device *dev)
{
- struct ei_device *ei_local = (struct ei_device *) dev->priv;
- struct etherh_priv *eh = (struct etherh_priv *)dev->rmem_start;
+ struct etherh_priv *eh = (struct etherh_priv *)dev->priv;
+ struct ei_device *ei_local = &eh->eidev;
unsigned long addr, flags;
local_irq_save(flags);
@@ -194,8 +195,8 @@ etherh_setif(struct net_device *dev)
static int
etherh_getifstat(struct net_device *dev)
{
- struct ei_device *ei_local = (struct ei_device *) dev->priv;
- struct etherh_priv *eh = (struct etherh_priv *)dev->rmem_start;
+ struct etherh_priv *eh = (struct etherh_priv *)dev->priv;
+ struct ei_device *ei_local = &eh->eidev;
int stat = 0;
switch (eh->id) {
@@ -560,6 +561,9 @@ static struct net_device * __init etherh_init_one(struct expansion_card *ec)
if (!eh)
goto out_nopriv;
+ memset(eh, 0, sizeof(struct etherh_priv));
+ spin_lock_init(&eh->eidev.page_lock);
+
SET_MODULE_OWNER(dev);
dev->open = etherh_open;
@@ -567,7 +571,7 @@ static struct net_device * __init etherh_init_one(struct expansion_card *ec)
dev->set_config = etherh_set_config;
dev->irq = ec->irq;
dev->base_addr = ecard_address(ec, ECARD_MEMC, 0);
- dev->rmem_start = (unsigned long)eh;
+ dev->priv = eh;
/*
* IRQ and control port handling
diff --git a/drivers/acorn/scsi/acornscsi.c b/drivers/acorn/scsi/acornscsi.c
index 0cc075818e39..cfba41407c2d 100644
--- a/drivers/acorn/scsi/acornscsi.c
+++ b/drivers/acorn/scsi/acornscsi.c
@@ -157,6 +157,7 @@
#include "../../scsi/constants.h"
#include "acornscsi.h"
#include "msgqueue.h"
+#include "scsi.h"
#include <scsi/scsicam.h>
@@ -902,17 +903,8 @@ void acornscsi_data_updateptr(AS_Host *host, Scsi_Pointer *SCp, unsigned int len
SCp->ptr += length;
SCp->this_residual -= length;
- if (!SCp->this_residual) {
- if (SCp->buffers_residual) {
- SCp->buffer++;
- SCp->buffers_residual--;
- SCp->ptr = (char *)SCp->buffer->address;
- SCp->this_residual = SCp->buffer->length;
- } else {
- SCp->ptr = NULL;
- host->dma.xfer_done = 1;
- }
- }
+ if (SCp->this_residual == 0 && next_SCp(SCp) == 0)
+ host->dma.xfer_done = 1;
}
/*
@@ -2558,20 +2550,8 @@ int acornscsi_queuecmd(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
SCpnt->SCp.phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]);
SCpnt->SCp.sent_command = 0;
SCpnt->SCp.scsi_xferred = 0;
- SCpnt->SCp.Status = 0;
- SCpnt->SCp.Message = 0;
-
- if (SCpnt->use_sg) {
- SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->buffer;
- SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
- SCpnt->SCp.ptr = (char *) SCpnt->SCp.buffer->address;
- SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
- } else {
- SCpnt->SCp.buffer = NULL;
- SCpnt->SCp.buffers_residual = 0;
- SCpnt->SCp.ptr = (char *) SCpnt->request_buffer;
- SCpnt->SCp.this_residual = SCpnt->request_bufflen;
- }
+
+ init_SCp(SCpnt);
host->stats.queues += 1;
diff --git a/drivers/acorn/scsi/cumana_2.c b/drivers/acorn/scsi/cumana_2.c
index 05a309e55e30..9404ee0e2009 100644
--- a/drivers/acorn/scsi/cumana_2.c
+++ b/drivers/acorn/scsi/cumana_2.c
@@ -38,6 +38,7 @@
#include "../../scsi/sd.h"
#include "../../scsi/hosts.h"
#include "fas216.h"
+#include "scsi.h"
#include <scsi/scsicam.h>
@@ -188,15 +189,9 @@ cumanascsi_2_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
if (dmach != NO_DMA &&
(min_type == fasdma_real_all || SCp->this_residual >= 512)) {
- int bufs = SCp->buffers_residual;
- int pci_dir, dma_dir, alatch_dir;
-
- if (bufs)
- memcpy(info->sg + 1, SCp->buffer + 1,
- sizeof(struct scatterlist) * bufs);
- info->sg[0].address = SCp->ptr;
- info->sg[0].page = NULL;
- info->sg[0].length = SCp->this_residual;
+ int bufs, pci_dir, dma_dir, alatch_dir;
+
+ bufs = copy_SCp_to_sg(&info->sg[0], SCp, NR_SG);
if (direction == DMA_OUT)
pci_dir = PCI_DMA_TODEVICE,
diff --git a/drivers/acorn/scsi/eesox.c b/drivers/acorn/scsi/eesox.c
index 8fb70ec8a876..899d639b7837 100644
--- a/drivers/acorn/scsi/eesox.c
+++ b/drivers/acorn/scsi/eesox.c
@@ -44,6 +44,7 @@
#include "../../scsi/sd.h"
#include "../../scsi/hosts.h"
#include "fas216.h"
+#include "scsi.h"
#include <scsi/scsicam.h>
@@ -192,15 +193,9 @@ eesoxscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
if (dmach != NO_DMA &&
(min_type == fasdma_real_all || SCp->this_residual >= 512)) {
- int bufs = SCp->buffers_residual;
- int pci_dir, dma_dir;
-
- if (bufs)
- memcpy(info->sg + 1, SCp->buffer + 1,
- sizeof(struct scatterlist) * bufs);
- info->sg[0].address = SCp->ptr;
- info->sg[0].page = NULL;
- info->sg[0].length = SCp->this_residual;
+ int bufs, pci_dir, dma_dir;
+
+ bufs = copy_SCp_to_sg(&info->sg[0], SCp, NR_SG);
if (direction == DMA_OUT)
pci_dir = PCI_DMA_TODEVICE,
diff --git a/drivers/acorn/scsi/fas216.c b/drivers/acorn/scsi/fas216.c
index 31e92aae0aa7..445c1574453d 100644
--- a/drivers/acorn/scsi/fas216.c
+++ b/drivers/acorn/scsi/fas216.c
@@ -59,6 +59,7 @@
#include "../../scsi/scsi.h"
#include "../../scsi/hosts.h"
#include "fas216.h"
+#include "scsi.h"
#define VER_MAJOR 0
#define VER_MINOR 0
@@ -588,38 +589,32 @@ fas216_handlewide(FAS216_Info *info, char *msg)
static void
fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
{
- unsigned char *ptr;
- unsigned int residual;
+ Scsi_Pointer *SCp = &info->scsi.SCp;
fas216_checkmagic(info);
- ptr = info->scsi.SCp.ptr;
- residual = info->scsi.SCp.this_residual;
-
info->SCpnt->request_bufflen -= bytes_transferred;
- while (residual <= bytes_transferred && bytes_transferred) {
- /* We have used up this buffer */
- bytes_transferred -= residual;
- if (info->scsi.SCp.buffers_residual) {
- info->scsi.SCp.buffer++;
- info->scsi.SCp.buffers_residual--;
- ptr = (unsigned char *)info->scsi.SCp.buffer->address;
- residual = info->scsi.SCp.buffer->length;
- } else {
- ptr = NULL;
- residual = 0;
+ while (bytes_transferred != 0) {
+ if (SCp->this_residual > bytes_transferred)
+ break;
+ /*
+ * We have used up this buffer. Move on to the
+ * next buffer.
+ */
+ bytes_transferred -= SCp->this_residual;
+ if (!next_SCp(&info->scsi.SCp)) {
+ printk(KERN_WARNING "scsi%d.%c: out of buffers\n",
+ info->host->host_no, '0' + info->SCpnt->target);
+ return;
}
}
- residual -= bytes_transferred;
- ptr += bytes_transferred;
-
- if (residual == 0)
- ptr = NULL;
-
- info->scsi.SCp.ptr = ptr;
- info->scsi.SCp.this_residual = residual;
+ SCp->this_residual -= bytes_transferred;
+ if (SCp->this_residual)
+ SCp->ptr += bytes_transferred;
+ else
+ SCp->ptr = NULL;
}
/* Function: void fas216_pio(FAS216_Info *info, fasdmadir_t direction)
@@ -631,35 +626,12 @@ fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
static void
fas216_pio(FAS216_Info *info, fasdmadir_t direction)
{
- unsigned int residual;
- char *ptr;
-
fas216_checkmagic(info);
- residual = info->scsi.SCp.this_residual;
- ptr = info->scsi.SCp.ptr;
-
if (direction == DMA_OUT)
- outb(*ptr++, REG_FF(info));
+ outb(get_next_SCp_byte(&info->scsi.SCp), REG_FF(info));
else
- *ptr++ = inb(REG_FF(info));
-
- residual -= 1;
-
- if (residual == 0) {
- if (info->scsi.SCp.buffers_residual) {
- info->scsi.SCp.buffer++;
- info->scsi.SCp.buffers_residual--;
- ptr = (unsigned char *)info->scsi.SCp.buffer->address;
- residual = info->scsi.SCp.buffer->length;
- } else {
- ptr = NULL;
- residual = 0;
- }
- }
-
- info->scsi.SCp.ptr = ptr;
- info->scsi.SCp.this_residual = residual;
+ put_next_SCp_byte(&info->scsi.SCp, inb(REG_FF(info)));
}
/* Function: void fas216_starttransfer(FAS216_Info *info,
@@ -2034,48 +2006,8 @@ int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
SCpnt->scsi_done = done;
SCpnt->host_scribble = (void *)fas216_std_done;
SCpnt->result = 0;
- SCpnt->SCp.Message = 0;
- SCpnt->SCp.Status = 0;
-
- if (SCpnt->use_sg) {
- unsigned long len = 0;
- int buf;
- SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->buffer;
- SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
- SCpnt->SCp.ptr = (char *) SCpnt->SCp.buffer->address;
- SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
- /*
- * Calculate correct buffer length. Some commands
- * come in with the wrong request_bufflen.
- */
- for (buf = 0; buf <= SCpnt->SCp.buffers_residual; buf++)
- len += SCpnt->SCp.buffer[buf].length;
-
- if (SCpnt->request_bufflen != len)
- printk(KERN_WARNING "scsi%d.%c: bad request buffer "
- "length %d, should be %ld\n", info->host->host_no,
- '0' + SCpnt->target, SCpnt->request_bufflen, len);
- SCpnt->request_bufflen = len;
- } else {
- SCpnt->SCp.buffer = NULL;
- SCpnt->SCp.buffers_residual = 0;
- SCpnt->SCp.ptr = (unsigned char *)SCpnt->request_buffer;
- SCpnt->SCp.this_residual = SCpnt->request_bufflen;
- }
-
- /*
- * If the upper SCSI layers pass a buffer, but zero length,
- * we aren't interested in the buffer pointer.
- */
- if (SCpnt->SCp.this_residual == 0 && SCpnt->SCp.ptr) {
-#if 0
- printk(KERN_WARNING "scsi%d.%c: zero length buffer passed for "
- "command ", info->host->host_no, '0' + SCpnt->target);
- print_command(SCpnt->cmnd);
-#endif
- SCpnt->SCp.ptr = NULL;
- }
+ init_SCp(SCpnt);
info->stats.queues += 1;
SCpnt->tag = 0;
diff --git a/drivers/acorn/scsi/powertec.c b/drivers/acorn/scsi/powertec.c
index fe44b79f3754..75f989b53e01 100644
--- a/drivers/acorn/scsi/powertec.c
+++ b/drivers/acorn/scsi/powertec.c
@@ -41,6 +41,7 @@
#include "../../scsi/sd.h"
#include "../../scsi/hosts.h"
#include "fas216.h"
+#include "scsi.h"
#include <scsi/scsicam.h>
@@ -180,15 +181,9 @@ powertecscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
if (dmach != NO_DMA &&
(min_type == fasdma_real_all || SCp->this_residual >= 512)) {
- int bufs = SCp->buffers_residual;
- int pci_dir, dma_dir;
-
- if (bufs)
- memcpy(info->sg + 1, SCp->buffer + 1,
- sizeof(struct scatterlist) * bufs);
- info->sg[0].address = SCp->ptr;
- info->sg[0].page = NULL;
- info->sg[0].length = SCp->this_residual;
+ int bufs, pci_dir, dma_dir;
+
+ bufs = copy_SCp_to_sg(&info->sg[0], SCp, NR_SG);
if (direction == DMA_OUT)
pci_dir = PCI_DMA_TODEVICE,
diff --git a/drivers/acorn/scsi/scsi.h b/drivers/acorn/scsi/scsi.h
new file mode 100644
index 000000000000..fe4e8c80a04a
--- /dev/null
+++ b/drivers/acorn/scsi/scsi.h
@@ -0,0 +1,122 @@
+/*
+ * linux/drivers/acorn/scsi/scsi.h
+ *
+ * Copyright (C) 2002 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Commonly used scsi driver functions.
+ */
+
+#define BELT_AND_BRACES
+
+/*
+ * The scatter-gather list handling. This contains all
+ * the yucky stuff that needs to be fixed properly.
+ */
+static inline int copy_SCp_to_sg(struct scatterlist *sg, Scsi_Pointer *SCp, int max)
+{
+ int bufs = SCp->buffers_residual;
+
+ BUG_ON(bufs + 1 > max);
+
+ sg->page = virt_to_page(SCp->ptr);
+ sg->offset = ((unsigned int)SCp->ptr) & ~PAGE_MASK;
+ sg->length = SCp->this_residual;
+
+ if (bufs)
+ memcpy(sg + 1, SCp->buffer + 1,
+ sizeof(struct scatterlist) * bufs);
+ return bufs + 1;
+}
+
+static inline int next_SCp(Scsi_Pointer *SCp)
+{
+ int ret = SCp->buffers_residual;
+ if (ret) {
+ SCp->buffer++;
+ SCp->buffers_residual--;
+ SCp->ptr = (char *)
+ (page_address(SCp->buffer->page) +
+ SCp->buffer->offset);
+ SCp->this_residual = SCp->buffer->length;
+ } else {
+ SCp->ptr = NULL;
+ SCp->this_residual = 0;
+ }
+ return ret;
+}
+
+static inline unsigned char get_next_SCp_byte(Scsi_Pointer *SCp)
+{
+ char c = SCp->ptr;
+
+ SCp->ptr += 1;
+ SCp->this_residual -= 1;
+ if (SCp->this_residual == 0)
+ next_SCp(SCp);
+
+ return c;
+}
+
+static inline void put_next_SCp_byte(Scsi_Pointer *SCp, unsigned char c)
+{
+ SCp->ptr = c;
+ SCp->ptr += 1;
+ SCp->this_residual -= 1;
+ if (SCp->this_residual == 0)
+ next_SCp(SCp);
+}
+
+static inline void init_SCp(Scsi_Cmnd *SCpnt)
+{
+ SCpnt->SCp.Message = 0;
+ SCpnt->SCp.Status = 0;
+
+ if (SCpnt->use_sg) {
+ unsigned long len = 0;
+ int buf;
+
+ SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->buffer;
+ SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
+ SCpnt->SCp.ptr = (char *)
+ (page_address(SCpnt->SCp.buffer->page) +
+ SCpnt->SCp.buffer->offset);
+ SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
+
+#ifdef BELT_AND_BRACES
+ /*
+ * Calculate correct buffer length. Some commands
+ * come in with the wrong request_bufflen.
+ */
+ for (buf = 0; buf <= SCpnt->SCp.buffers_residual; buf++)
+ len += SCpnt->SCp.buffer[buf].length;
+
+ if (SCpnt->request_bufflen != len)
+ printk(KERN_WARNING "scsi%d.%c: bad request buffer "
+ "length %d, should be %ld\n", SCpnt->host->host_no,
+ '0' + SCpnt->target, SCpnt->request_bufflen, len);
+ SCpnt->request_bufflen = len;
+#endif
+ } else {
+ SCpnt->SCp.buffer = NULL;
+ SCpnt->SCp.buffers_residual = 0;
+ SCpnt->SCp.ptr = (unsigned char *)SCpnt->request_buffer;
+ SCpnt->SCp.this_residual = SCpnt->request_bufflen;
+ }
+
+ /*
+ * If the upper SCSI layers pass a buffer, but zero length,
+ * we aren't interested in the buffer pointer.
+ */
+ if (SCpnt->SCp.this_residual == 0 && SCpnt->SCp.ptr) {
+#ifdef BELT_AND_BRACES
+ printk(KERN_WARNING "scsi%d.%c: zero length buffer passed for "
+ "command ", SCpnt->host->host_no, '0' + SCpnt->target);
+ print_command(SCpnt->cmnd);
+#endif
+ SCpnt->SCp.ptr = NULL;
+ }
+}
diff --git a/drivers/pcmcia/sa1100_assabet.c b/drivers/pcmcia/sa1100_assabet.c
index 1a7cc433cf85..eb883f64e239 100644
--- a/drivers/pcmcia/sa1100_assabet.c
+++ b/drivers/pcmcia/sa1100_assabet.c
@@ -7,6 +7,7 @@
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/errno.h>
#include <linux/init.h>
#include <asm/hardware.h>
diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c
index 41cba02b9944..546ec5d95102 100644
--- a/drivers/pcmcia/sa1100_badge4.c
+++ b/drivers/pcmcia/sa1100_badge4.c
@@ -14,6 +14,8 @@
*/
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
+#include <linux/errno.h>
#include <linux/init.h>
#include <asm/hardware.h>
@@ -56,7 +58,7 @@
static int badge4_pcmvcc = 50;
static int badge4_pcmvpp = 50;
-static int badge4_cfvcc = 0;
+static int badge4_cfvcc = 33;
static int badge4_pcmcia_init(struct pcmcia_init *init)
{
@@ -91,8 +93,6 @@ static void complain_about_jumpering(const char *whom,
given / 10, given % 10);
}
-static unsigned badge4_need_5V_bitmap = 0;
-
static int
badge4_pcmcia_configure_socket(const struct pcmcia_configure *conf)
{
diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c
index 62a607d605a2..38697b2ee19d 100644
--- a/drivers/pcmcia/sa1100_generic.c
+++ b/drivers/pcmcia/sa1100_generic.c
@@ -95,10 +95,11 @@ static struct tq_struct sa1100_pcmcia_task;
* "Expansion Memory (PCMCIA) Configuration Register (MECR)"
* that's section 10.2.5 in _my_ version of the manuial ;)
*/
-static int sa1100_pcmcia_default_mecr_timing(unsigned int sock, unsigned int cpu_speed,
- unsigned int cmd_time )
+static unsigned int
+sa1100_pcmcia_default_mecr_timing(unsigned int sock, unsigned int cpu_speed,
+ unsigned int cmd_time)
{
- return sa1100_pcmcia_mecr_bs( cmd_time, cpu_speed );
+ return sa1100_pcmcia_mecr_bs(cmd_time, cpu_speed);
}
/* sa1100_pcmcia_set_mecr()
@@ -109,7 +110,7 @@ static int sa1100_pcmcia_default_mecr_timing(unsigned int sock, unsigned int cpu
* Call board specific BS value calculation to allow boards
* to tweak the BS values.
*/
-static int sa1100_pcmcia_set_mecr( int sock )
+static int sa1100_pcmcia_set_mecr(int sock)
{
struct sa1100_pcmcia_socket *skt;
u32 mecr;
@@ -117,15 +118,15 @@ static int sa1100_pcmcia_set_mecr( int sock )
long flags;
unsigned int bs;
- if ( sock<0 || sock>SA1100_PCMCIA_MAX_SOCK )
+ if (sock < 0 || sock > SA1100_PCMCIA_MAX_SOCK)
return -1;
- skt = PCMCIA_SOCKET( sock );
+ skt = PCMCIA_SOCKET(sock);
local_irq_save(flags);
clock = cpufreq_get(0);
- bs = pcmcia_low_level->socket_get_timing( sock, clock, skt->speed_io);
+ bs = pcmcia_low_level->socket_get_timing(sock, clock, skt->speed_io);
mecr = MECR;
MECR_FAST_SET(mecr, sock, 0);
@@ -136,10 +137,10 @@ static int sa1100_pcmcia_set_mecr( int sock )
local_irq_restore(flags);
- DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n",
- __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock,
- MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock),
- sock, MECR_BSIO_GET(mecr, sock));
+ DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n",
+ __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock,
+ MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock),
+ sock, MECR_BSIO_GET(mecr, sock));
return 0;
}
@@ -882,11 +883,11 @@ static struct pccard_operations sa1100_pcmcia_operations = {
*/
static void sa1100_pcmcia_update_mecr(unsigned int clock)
{
- unsigned int sock;
+ unsigned int sock;
- for (sock = 0; sock < SA1100_PCMCIA_MAX_SOCK; ++sock) {
- sa1100_pcmcia_set_mecr( sock );
- }
+ for (sock = 0; sock < SA1100_PCMCIA_MAX_SOCK; ++sock) {
+ sa1100_pcmcia_set_mecr(sock);
+ }
}
/* sa1100_pcmcia_notifier()
diff --git a/drivers/pcmcia/sa1100_generic.h b/drivers/pcmcia/sa1100_generic.h
index 3b77e715af9d..daa043b1b523 100644
--- a/drivers/pcmcia/sa1100_generic.h
+++ b/drivers/pcmcia/sa1100_generic.h
@@ -73,8 +73,8 @@ struct pcmcia_low_level {
/*
* Calculate MECR timing clock wait states
*/
- int (*socket_get_timing)(unsigned int sock, unsigned int cpu_speed,
- unsigned int cmd_time );
+ unsigned int (*socket_get_timing)(unsigned int sock,
+ unsigned int cpu_speed, unsigned int cmd_time);
};
extern int sa1100_register_pcmcia(struct pcmcia_low_level *);
diff --git a/drivers/pcmcia/sa1100_neponset.c b/drivers/pcmcia/sa1100_neponset.c
index 12408343d653..d8e09192bacc 100644
--- a/drivers/pcmcia/sa1100_neponset.c
+++ b/drivers/pcmcia/sa1100_neponset.c
@@ -5,6 +5,8 @@
*/
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
+#include <linux/errno.h>
#include <linux/init.h>
#include <asm/hardware.h>
@@ -133,7 +135,7 @@ int __init pcmcia_neponset_init(void)
{
int ret = -ENODEV;
- if (machine_is_assabet() && machine_has_neponset())
+ if (machine_is_assabet() && sa1111)
ret = sa1100_register_pcmcia(&neponset_pcmcia_ops);
return ret;
diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c
index bd2b7fb28afd..ef5a8b0bf153 100644
--- a/drivers/pcmcia/sa1111_generic.c
+++ b/drivers/pcmcia/sa1111_generic.c
@@ -8,6 +8,7 @@
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/ioport.h>
+#include <linux/device.h>
#include <asm/hardware.h>
#include <asm/hardware/sa1111.h>
diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c
index 6ef333ae235e..4947a37b5334 100644
--- a/drivers/video/acornfb.c
+++ b/drivers/video/acornfb.c
@@ -601,13 +601,13 @@ acornfb_adjust_timing(struct fb_var_screeninfo *var, int con)
/* Find int 'y', such that y * fll == s * sam < maxsize
* y = s * sam / fll; s = maxsize / sam
*/
- for (size = current_par.screen_size; min_size <= size;
+ for (size = current_par.screen_size;
+ nr_y = size / font_line_len, min_size <= size;
size -= sam_size) {
- nr_y = size / font_line_len;
-
if (nr_y * font_line_len == size)
break;
}
+ nr_y *= fontht;
if (var->accel_flags & FB_ACCELF_TEXT) {
if (min_size > size) {
@@ -617,8 +617,9 @@ acornfb_adjust_timing(struct fb_var_screeninfo *var, int con)
size = current_par.screen_size;
var->yres_virtual = size / (font_line_len / fontht);
} else
- var->yres_virtual = nr_y * fontht;
- }
+ var->yres_virtual = nr_y;
+ } else if (var->yres_virtual > nr_y)
+ var->yres_virtual = nr_y;
current_par.screen_end = current_par.screen_base_p + size;
@@ -1100,6 +1101,41 @@ acornfb_pan_display(struct fb_var_screeninfo *var, int con,
return 0;
}
+static int
+acornfb_blank(int blank, struct fb_info *info)
+{
+ union palette p;
+ int i, bpp = fb_display[info->currcon].var.bits_per_pixel;
+
+#ifdef FBCON_HAS_CFB16
+ if (bpp == 16) {
+ p.p = 0;
+
+ for (i = 0; i < 256; i++) {
+ if (blank)
+ p = acornfb_palette_encode(i, 0, 0, 0, 0);
+ else {
+ p.vidc20.red = current_par.palette[ i & 31].vidc20.red;
+ p.vidc20.green = current_par.palette[(i >> 1) & 31].vidc20.green;
+ p.vidc20.blue = current_par.palette[(i >> 2) & 31].vidc20.blue;
+ }
+ acornfb_palette_write(i, current_par.palette[i]);
+ }
+ } else
+#endif
+ {
+ for (i = 0; i < current_par.palette_size; i++) {
+ if (blank)
+ p = acornfb_palette_encode(i, 0, 0, 0, 0);
+ else
+ p = current_par.palette[i];
+
+ acornfb_palette_write(i, p);
+ }
+ }
+ return 0;
+}
+
/*
* Note that we are entered with the kernel locked.
*/
@@ -1146,7 +1182,7 @@ static struct fb_ops acornfb_ops = {
fb_set_var: acornfb_set_var,
fb_get_cmap: acornfb_get_cmap,
fb_set_cmap: gen_set_cmap,
- fb_set_colreg: acornfb_setcolreg,
+ fb_setcolreg: acornfb_setcolreg,
fb_pan_display: acornfb_pan_display,
fb_blank: acornfb_blank,
fb_mmap: acornfb_mmap,
@@ -1182,41 +1218,6 @@ acornfb_switch(int con, struct fb_info *info)
return 0;
}
-static int
-acornfb_blank(int blank, struct fb_info *info)
-{
- union palette p;
- int i, bpp = fb_display[info->currcon].var.bits_per_pixel;
-
-#ifdef FBCON_HAS_CFB16
- if (bpp == 16) {
- p.p = 0;
-
- for (i = 0; i < 256; i++) {
- if (blank)
- p = acornfb_palette_encode(i, 0, 0, 0, 0);
- else {
- p.vidc20.red = current_par.palette[ i & 31].vidc20.red;
- p.vidc20.green = current_par.palette[(i >> 1) & 31].vidc20.green;
- p.vidc20.blue = current_par.palette[(i >> 2) & 31].vidc20.blue;
- }
- acornfb_palette_write(i, current_par.palette[i]);
- }
- } else
-#endif
- {
- for (i = 0; i < current_par.palette_size; i++) {
- if (blank)
- p = acornfb_palette_encode(i, 0, 0, 0, 0);
- else
- p = current_par.palette[i];
-
- acornfb_palette_write(i, p);
- }
- }
- return 0;
-}
-
/*
* Everything after here is initialisation!!!
*/
diff --git a/drivers/video/clps711xfb.c b/drivers/video/clps711xfb.c
index a864beddfc76..44c58097ad22 100644
--- a/drivers/video/clps711xfb.c
+++ b/drivers/video/clps711xfb.c
@@ -211,6 +211,53 @@ clps7111fb_set_var(struct fb_var_screeninfo *var, int con,
return 0;
}
+static int clps7111fb_blank(int blank, struct fb_info *info)
+{
+ if (blank) {
+ if (machine_is_edb7211()) {
+ int i;
+
+ /* Turn off the LCD backlight. */
+ clps_writeb(clps_readb(PDDR) & ~EDB_PD3_LCDBL, PDDR);
+
+ /* Power off the LCD DC-DC converter. */
+ clps_writeb(clps_readb(PDDR) & ~EDB_PD1_LCD_DC_DC_EN, PDDR);
+
+ /* Delay for a little while (half a second). */
+ for (i=0; i<65536*4; i++);
+
+ /* Power off the LCD panel. */
+ clps_writeb(clps_readb(PDDR) & ~EDB_PD2_LCDEN, PDDR);
+
+ /* Power off the LCD controller. */
+ clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN,
+ SYSCON1);
+ }
+ } else {
+ if (machine_is_edb7211()) {
+ int i;
+
+ /* Power up the LCD controller. */
+ clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN,
+ SYSCON1);
+
+ /* Power up the LCD panel. */
+ clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
+
+ /* Delay for a little while. */
+ for (i=0; i<65536*4; i++);
+
+ /* Power up the LCD DC-DC converter. */
+ clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN,
+ PDDR);
+
+ /* Turn on the LCD backlight. */
+ clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
+ }
+ }
+ return 0;
+}
+
static struct fb_ops clps7111fb_ops = {
owner: THIS_MODULE,
fb_set_var: clps7111fb_set_var,
@@ -266,53 +313,6 @@ static int clps7111fb_updatevar(int con, struct fb_info *info)
return -EINVAL;
}
-static int clps7111fb_blank(int blank, struct fb_info *info)
-{
- if (blank) {
- if (machine_is_edb7211()) {
- int i;
-
- /* Turn off the LCD backlight. */
- clps_writeb(clps_readb(PDDR) & ~EDB_PD3_LCDBL, PDDR);
-
- /* Power off the LCD DC-DC converter. */
- clps_writeb(clps_readb(PDDR) & ~EDB_PD1_LCD_DC_DC_EN, PDDR);
-
- /* Delay for a little while (half a second). */
- for (i=0; i<65536*4; i++);
-
- /* Power off the LCD panel. */
- clps_writeb(clps_readb(PDDR) & ~EDB_PD2_LCDEN, PDDR);
-
- /* Power off the LCD controller. */
- clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN,
- SYSCON1);
- }
- } else {
- if (machine_is_edb7211()) {
- int i;
-
- /* Power up the LCD controller. */
- clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN,
- SYSCON1);
-
- /* Power up the LCD panel. */
- clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
-
- /* Delay for a little while. */
- for (i=0; i<65536*4; i++);
-
- /* Power up the LCD DC-DC converter. */
- clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN,
- PDDR);
-
- /* Turn on the LCD backlight. */
- clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
- }
- }
- return 0;
-}
-
static int
clps7111fb_proc_backlight_read(char *page, char **start, off_t off,
int count, int *eof, void *data)
@@ -430,7 +430,7 @@ int __init clps711xfb_init(void)
clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
/* Delay for a little while. */
- for (i=0; i<65536*4; i++);
+ udelay(100);
/* Power up the LCD DC-DC converter. */
clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, PDDR);
@@ -463,3 +463,7 @@ static void __exit clps711xfb_exit(void)
module_init(clps711xfb_init);
#endif
module_exit(clps711xfb_exit);
+
+MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
+MODULE_DESCRIPTION("CLPS711x framebuffer driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/video/sa1100fb.c b/drivers/video/sa1100fb.c
index fcaf8c8cc390..29f2386eceb6 100644
--- a/drivers/video/sa1100fb.c
+++ b/drivers/video/sa1100fb.c
@@ -1258,69 +1258,6 @@ sa1100fb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info)
return 0;
}
-static struct fb_ops sa1100fb_ops = {
- owner: THIS_MODULE,
- fb_get_fix: sa1100fb_get_fix,
- fb_get_var: sa1100fb_get_var,
- fb_set_var: sa1100fb_set_var,
- fb_get_cmap: sa1100fb_get_cmap,
- fb_set_cmap: sa1100fb_set_cmap,
- fb_setcolreg: sa1100fb_setcolreg,
- fb_blank: sa1100fb_blank,
-};
-
-/*
- * sa1100fb_switch():
- * Change to the specified console. Palette and video mode
- * are changed to the console's stored parameters.
- *
- * Uh oh, this can be called from a tasklet (IRQ)
- */
-static int sa1100fb_switch(int con, struct fb_info *info)
-{
- struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
- struct display *disp;
- struct fb_cmap *cmap;
-
- DPRINTK("con=%d info->modename=%s\n", con, fbi->fb.modename);
-
- if (con == info->currcon)
- return 0;
-
- if (info->currcon >= 0) {
- disp = fb_display + info->currcon;
-
- /*
- * Save the old colormap and video mode.
- */
- disp->var = fbi->fb.var;
-
- if (disp->cmap.len)
- fb_copy_cmap(&fbi->fb.cmap, &disp->cmap, 0);
- }
-
- info->currcon = con;
- disp = fb_display + con;
-
- /*
- * Make sure that our colourmap contains 256 entries.
- */
- fb_alloc_cmap(&fbi->fb.cmap, 256, 0);
-
- if (disp->cmap.len)
- cmap = &disp->cmap;
- else
- cmap = fb_default_cmap(1 << disp->var.bits_per_pixel);
-
- fb_copy_cmap(cmap, &fbi->fb.cmap, 0);
-
- fbi->fb.var = disp->var;
- fbi->fb.var.activate = FB_ACTIVATE_NOW;
-
- sa1100fb_set_var(&fbi->fb.var, con, info);
- return 0;
-}
-
/*
* Formal definition of the VESA spec:
* On
@@ -1388,6 +1325,69 @@ static int sa1100fb_blank(int blank, struct fb_info *info)
return 0;
}
+static struct fb_ops sa1100fb_ops = {
+ owner: THIS_MODULE,
+ fb_get_fix: sa1100fb_get_fix,
+ fb_get_var: sa1100fb_get_var,
+ fb_set_var: sa1100fb_set_var,
+ fb_get_cmap: sa1100fb_get_cmap,
+ fb_set_cmap: sa1100fb_set_cmap,
+ fb_setcolreg: sa1100fb_setcolreg,
+ fb_blank: sa1100fb_blank,
+};
+
+/*
+ * sa1100fb_switch():
+ * Change to the specified console. Palette and video mode
+ * are changed to the console's stored parameters.
+ *
+ * Uh oh, this can be called from a tasklet (IRQ)
+ */
+static int sa1100fb_switch(int con, struct fb_info *info)
+{
+ struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+ struct display *disp;
+ struct fb_cmap *cmap;
+
+ DPRINTK("con=%d info->modename=%s\n", con, fbi->fb.modename);
+
+ if (con == info->currcon)
+ return 0;
+
+ if (info->currcon >= 0) {
+ disp = fb_display + info->currcon;
+
+ /*
+ * Save the old colormap and video mode.
+ */
+ disp->var = fbi->fb.var;
+
+ if (disp->cmap.len)
+ fb_copy_cmap(&fbi->fb.cmap, &disp->cmap, 0);
+ }
+
+ info->currcon = con;
+ disp = fb_display + con;
+
+ /*
+ * Make sure that our colourmap contains 256 entries.
+ */
+ fb_alloc_cmap(&fbi->fb.cmap, 256, 0);
+
+ if (disp->cmap.len)
+ cmap = &disp->cmap;
+ else
+ cmap = fb_default_cmap(1 << disp->var.bits_per_pixel);
+
+ fb_copy_cmap(cmap, &fbi->fb.cmap, 0);
+
+ fbi->fb.var = disp->var;
+ fbi->fb.var.activate = FB_ACTIVATE_NOW;
+
+ sa1100fb_set_var(&fbi->fb.var, con, info);
+ return 0;
+}
+
static int sa1100fb_updatevar(int con, struct fb_info *info)
{
DPRINTK("entered\n");
diff --git a/include/asm-arm/arch-clps711x/memory.h b/include/asm-arm/arch-clps711x/memory.h
index dd1ae0acb55e..e40d08e180f6 100644
--- a/include/asm-arm/arch-clps711x/memory.h
+++ b/include/asm-arm/arch-clps711x/memory.h
@@ -153,13 +153,13 @@
#define NODE_MAX_MEM_SHIFT 24
#define NODE_MAX_MEM_SIZE (1<<NODE_MAX_MEM_SHIFT)
-#else
-
-#define PFN_TO_NID(pfn) (0)
-
#endif /* CONFIG_DISCONTIGMEM */
#endif /* CONFIG_ARCH_EDB7211 */
+#ifndef PFN_TO_NID
+#define PFN_TO_NID(pfn) (0)
+#endif
+
#endif
diff --git a/include/asm-arm/dma.h b/include/asm-arm/dma.h
index f42a8cf158ca..0dee33c1aad8 100644
--- a/include/asm-arm/dma.h
+++ b/include/asm-arm/dma.h
@@ -74,6 +74,10 @@ extern void enable_dma(dmach_t channel);
*/
extern void disable_dma(dmach_t channel);
+/* Test whether the specified channel has an active DMA transfer
+ */
+extern int dma_channel_active(dmach_t channel);
+
/* Set the DMA scatter gather list for this channel
*
* This should not be called if a DMA channel is enabled,
diff --git a/include/asm-arm/hardware/sa1111.h b/include/asm-arm/hardware/sa1111.h
index bc0933178340..60bcc0869ab8 100644
--- a/include/asm-arm/hardware/sa1111.h
+++ b/include/asm-arm/hardware/sa1111.h
@@ -198,6 +198,12 @@
#define USB_RESET_PWRSENSELOW (1 << 6)
#define USB_RESET_PWRCTRLLOW (1 << 7)
+#define USB_STATUS_IRQHCIRMTWKUP (1 << 7)
+#define USB_STATUS_IRQHCIBUFFACC (1 << 8)
+#define USB_STATUS_NIRQHCIM (1 << 9)
+#define USB_STATUS_NHCIMFCLR (1 << 10)
+#define USB_STATUS_USBPWRSENSE (1 << 11)
+
/*
* Serial Audio Controller
*
diff --git a/include/asm-arm/mach/arch.h b/include/asm-arm/mach/arch.h
index 9e15e251e5de..6831e446a50a 100644
--- a/include/asm-arm/mach/arch.h
+++ b/include/asm-arm/mach/arch.h
@@ -19,6 +19,8 @@
extern void setup_initrd(unsigned int start, unsigned int size);
extern void setup_ramdisk(int doload, int prompt, int start, unsigned int rd_sz);
+struct tag;
+
struct machine_desc {
/*
* Note! The first four elements are used
@@ -41,7 +43,7 @@ struct machine_desc {
unsigned int reserve_lp2 :1; /* never has lp2 */
unsigned int soft_reboot :1; /* soft reboot */
void (*fixup)(struct machine_desc *,
- struct param_struct *, char **,
+ struct tag *, char **,
struct meminfo *);
void (*map_io)(void);/* IO mapping function */
void (*init_irq)(void);
diff --git a/include/asm-arm/mach/pci.h b/include/asm-arm/mach/pci.h
index 08c459b25aa5..10f0158e6372 100644
--- a/include/asm-arm/mach/pci.h
+++ b/include/asm-arm/mach/pci.h
@@ -12,27 +12,13 @@ struct pci_sys_data;
struct pci_bus;
struct hw_pci {
- /* START OF OLD STUFF */
- /* Initialise the hardware */
- void (*init)(void *);
-
- /* Setup bus resources */
- void (*setup_resources)(struct resource **);
-
- /* IRQ swizzle */
- u8 (*swizzle)(struct pci_dev *dev, u8 *pin);
-
- /* IRQ mapping */
- int (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin);
-
- /* END OF OLD STUFF */
-
- /* NEW STUFF */
int nr_controllers;
int (*setup)(int nr, struct pci_sys_data *);
struct pci_bus *(*scan)(int nr, struct pci_sys_data *);
void (*preinit)(void);
void (*postinit)(void);
+ u8 (*swizzle)(struct pci_dev *dev, u8 *pin);
+ int (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin);
};
/*
@@ -57,6 +43,11 @@ struct pci_sys_data {
u8 pci_std_swizzle(struct pci_dev *dev, u8 *pinp);
/*
+ * Call this with your hw_pci struct to initialise the PCI system.
+ */
+void pci_common_init(struct hw_pci *);
+
+/*
* PCI controllers
*/
extern int iop310_setup(int nr, struct pci_sys_data *);
@@ -70,7 +61,7 @@ extern void dc21285_postinit(void);
extern int via82c505_setup(int nr, struct pci_sys_data *);
extern struct pci_bus *via82c505_scan_bus(int nr, struct pci_sys_data *);
-extern void __init via82c505_init(void *sysdata);
+extern void via82c505_init(void *sysdata);
extern int pci_v3_setup(int nr, struct pci_sys_data *);
extern struct pci_bus *pci_v3_scan_bus(int nr, struct pci_sys_data *);
diff --git a/include/asm-arm/memory.h b/include/asm-arm/memory.h
index 865f1d686a30..57f6b758164a 100644
--- a/include/asm-arm/memory.h
+++ b/include/asm-arm/memory.h
@@ -69,7 +69,7 @@ static inline void *phys_to_virt(unsigned long x)
#define page_to_pfn(page) (((page) - mem_map) + PHYS_PFN_OFFSET)
#define pfn_to_page(pfn) ((mem_map + (pfn)) - PHYS_PFN_OFFSET)
-#define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < max_mapnr)
+#define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr))
#define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT))
#define virt_addr_valid(kaddr) ((kaddr) >= PAGE_OFFSET && (kaddr) < (unsigned long)high_memory)
diff --git a/include/asm-arm/proc-armv/system.h b/include/asm-arm/proc-armv/system.h
index bc61642284fa..64ccb9c06c6c 100644
--- a/include/asm-arm/proc-armv/system.h
+++ b/include/asm-arm/proc-armv/system.h
@@ -36,7 +36,7 @@
extern unsigned long cr_no_alignment; /* defined in entry-armv.S */
extern unsigned long cr_alignment; /* defined in entry-armv.S */
-#ifdef __ARM_ARCH_4__
+#if __LINUX_ARM_ARCH__ >= 4
#define vectors_base() ((cr_alignment & CR_V) ? 0xffff0000 : 0)
#else
#define vectors_base() (0)
@@ -192,7 +192,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size
: "memory");
break;
#endif
- default: __bad_xchg(ptr, size);
+ default: __bad_xchg(ptr, size), ret = 0;
}
return ret;
diff --git a/include/asm-arm/ptrace.h b/include/asm-arm/ptrace.h
index ae4927937309..0e4482b8c7ab 100644
--- a/include/asm-arm/ptrace.h
+++ b/include/asm-arm/ptrace.h
@@ -1,6 +1,16 @@
#ifndef __ASM_ARM_PTRACE_H
#define __ASM_ARM_PTRACE_H
+#define PTRACE_GETREGS 12
+#define PTRACE_SETREGS 13
+#define PTRACE_GETFPREGS 14
+#define PTRACE_SETFPREGS 15
+
+#define PTRACE_SETOPTIONS 21
+
+/* options set using PTRACE_SETOPTIONS */
+#define PTRACE_O_TRACESYSGOOD 0x00000001
+
#include <asm/proc/ptrace.h>
#ifndef __ASSEMBLY__
@@ -11,11 +21,6 @@
(pc_pointer((regs)->ARM_pc))
#ifdef __KERNEL__
-#define PTRACE_GETREGS 12
-#define PTRACE_SETREGS 13
-#define PTRACE_GETFPREGS 14
-#define PTRACE_SETFPREGS 15
-
extern void show_regs(struct pt_regs *);
#define predicate(x) (x & 0xf0000000)
diff --git a/include/asm-arm/thread_info.h b/include/asm-arm/thread_info.h
index ede2ac4359b1..154a688c170f 100644
--- a/include/asm-arm/thread_info.h
+++ b/include/asm-arm/thread_info.h
@@ -28,7 +28,7 @@ typedef unsigned long mm_segment_t; /* domain register */
* low level task data that entry.S needs immediate access to.
*/
struct thread_info {
- __u32 flags; /* low level flags */
+ unsigned long flags; /* low level flags */
__s32 preempt_count; /* 0 => preemptable, <0 => bug */
mm_segment_t addr_limit; /* address limit */
__u32 cpu; /* cpu */
diff --git a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h
index efb95cb9fdf1..0079e480e0d3 100644
--- a/include/asm-arm/unistd.h
+++ b/include/asm-arm/unistd.h
@@ -13,6 +13,8 @@
#ifndef __ASM_ARM_UNISTD_H
#define __ASM_ARM_UNISTD_H
+#include <linux/linkage.h>
+
#define __NR_SYSCALL_BASE 0x900000
/*