Commit 4bce4b2a authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://bk.arm.linux.org.uk

into home.transmeta.com:/home/torvalds/v2.5/linux
parents a800d54e 752e2bd2
...@@ -26,11 +26,14 @@ apcs-$(CONFIG_CPU_32) :=-mapcs-32 ...@@ -26,11 +26,14 @@ apcs-$(CONFIG_CPU_32) :=-mapcs-32
apcs-$(CONFIG_CPU_26) :=-mapcs-26 -mcpu=arm3 -Os apcs-$(CONFIG_CPU_26) :=-mapcs-26 -mcpu=arm3 -Os
# This selects which instruction set is used. # 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-y :=
arch-$(CONFIG_CPU_32v3) :=-march=armv3 arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3
arch-$(CONFIG_CPU_32v4) :=-march=armv4 arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4
arch-$(CONFIG_CPU_32v5) :=-march=armv5 arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 -march=armv5
arch-$(CONFIG_CPU_XSCALE) :=-march=armv4 -Wa,-mxscale #-march=armv5te arch-$(CONFIG_CPU_XSCALE) :=-D__LINUX_ARM_ARCH__=5 -march=armv4 -Wa,-mxscale #-march=armv5te
# This selects how we optimise for the processor. # This selects how we optimise for the processor.
tune-y := tune-y :=
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <asm/mach-types.h>
#ifndef CONFIG_ARCH_L7200 #ifndef CONFIG_ARCH_L7200
#error What am I doing here... #error What am I doing here...
...@@ -26,4 +27,4 @@ __L7200_start: ...@@ -26,4 +27,4 @@ __L7200_start:
ble 1b ble 1b
mov r8, #0 @ Zero it out mov r8, #0 @ Zero it out
mov r7, #19 @ Set architecture ID mov r7, #MACH_TYPE_L7200 @ Set architecture ID
/* /*
* linux/arch/arm/boot/compressed/head.S * 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 * 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 * it under the terms of the GNU General Public License version 2 as
...@@ -161,7 +161,6 @@ not_relocated: mov r0, #0 ...@@ -161,7 +161,6 @@ not_relocated: mov r0, #0
cmp r2, r3 cmp r2, r3
blo 1b blo 1b
mrc p15, 0, r6, c0, c0 @ get processor ID
bl cache_on bl cache_on
mov r1, sp @ malloc space above stack mov r1, sp @ malloc space above stack
...@@ -200,7 +199,8 @@ not_relocated: mov r0, #0 ...@@ -200,7 +199,8 @@ not_relocated: mov r0, #0
*/ */
add r1, r5, r0 @ end of decompressed kernel add r1, r5, r0 @ end of decompressed kernel
adr r2, reloc_start adr r2, reloc_start
adr r3, reloc_end ldr r3, LC1
add r3, r2, r3
1: ldmia r2!, {r8 - r13} @ copy relocation code 1: ldmia r2!, {r8 - r13} @ copy relocation code
stmia r1!, {r8 - r13} stmia r1!, {r8 - r13}
ldmia r2!, {r8 - r13} ldmia r2!, {r8 - r13}
...@@ -229,8 +229,9 @@ LC0: .word LC0 @ r1 ...@@ -229,8 +229,9 @@ LC0: .word LC0 @ r1
.word _load_addr @ r4 .word _load_addr @ r4
.word _start @ r5 .word _start @ r5
.word _got_start @ r6 .word _got_start @ r6
.word _got_end @ r7 .word _got_end @ ip
.word user_stack+4096 @ r8 .word user_stack+4096 @ sp
LC1: .word reloc_end - reloc_start
.size LC0, . - LC0 .size LC0, . - LC0
/* /*
...@@ -255,7 +256,7 @@ LC0: .word LC0 @ r1 ...@@ -255,7 +256,7 @@ LC0: .word LC0 @ r1
cache_on: mov r3, #8 @ cache_on function cache_on: mov r3, #8 @ cache_on function
b call_cache_fn 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, #0xff @ Align the pointer
bic r3, r3, #0x3f00 bic r3, r3, #0x3f00
/* /*
...@@ -291,20 +292,35 @@ __cache_on: sub r3, r4, #16384 @ Page directory size ...@@ -291,20 +292,35 @@ __cache_on: sub r3, r4, #16384 @ Page directory size
str r1, [r0], #4 str r1, [r0], #4
add r1, r1, #1048576 add r1, r1, #1048576
str r1, [r0] str r1, [r0]
mov pc, lr
__armv4_cache_on:
mov r12, lr
bl __setup_mmu
mov r0, #0 mov r0, #0
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
mcr p15, 0, r0, c8, c7 @ flush I,D TLBs mcr p15, 0, r0, c8, c7, 0 @ flush I,D TLBs
mcr p15, 0, r3, c2, c0 @ load page table pointer mrc p15, 0, r0, c1, c0, 0 @ read control reg
mov r0, #-1
mcr p15, 0, r0, c3, c0 @ load domain access register
mrc p15, 0, r0, c1, c0
orr r0, r0, #0x1000 @ I-cache enable 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 #ifndef DEBUG
orr r0, r0, #0x003d @ Write buffer, mmu orr r0, r0, #0x000d @ Write buffer, mmu
#endif #endif
mcr p15, 0, r0, c1, c0 mov r1, #-1
mov pc, lr 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 * All code following this line is relocatable. It is relocated by
...@@ -349,11 +365,12 @@ call_kernel: bl cache_clean_flush ...@@ -349,11 +365,12 @@ call_kernel: bl cache_clean_flush
* r1 = corrupted * r1 = corrupted
* r2 = corrupted * r2 = corrupted
* r3 = block offset * r3 = block offset
* r6 = CPU ID * r6 = corrupted
* r12 = corrupted * r12 = corrupted
*/ */
call_cache_fn: adr r12, proc_types call_cache_fn: adr r12, proc_types
mrc p15, 0, r6, c0, c0 @ get processor ID
1: ldr r1, [r12, #0] @ get value 1: ldr r1, [r12, #0] @ get value
ldr r2, [r12, #4] @ get mask ldr r2, [r12, #4] @ get mask
eor r1, r1, r6 @ (real ^ match) eor r1, r1, r6 @ (real ^ match)
...@@ -380,9 +397,12 @@ call_cache_fn: adr r12, proc_types ...@@ -380,9 +397,12 @@ call_cache_fn: adr r12, proc_types
proc_types: proc_types:
.word 0x41560600 @ ARM6/610 .word 0x41560600 @ ARM6/610
.word 0xffffffe0 .word 0xffffffe0
b __arm6_cache_off b __arm6_cache_off @ works, but slow
b __arm6_cache_off b __arm6_cache_off
mov pc, lr mov pc, lr
@ b __arm6_cache_on @ untested
@ b __arm6_cache_off
@ b __armv3_cache_flush
.word 0x41007000 @ ARM7/710 .word 0x41007000 @ ARM7/710
.word 0xfff8fe00 .word 0xfff8fe00
...@@ -392,31 +412,31 @@ proc_types: ...@@ -392,31 +412,31 @@ proc_types:
.word 0x41807200 @ ARM720T (writethrough) .word 0x41807200 @ ARM720T (writethrough)
.word 0xffffff00 .word 0xffffff00
b __cache_on b __armv4_cache_on
b __armv4_cache_off b __armv4_cache_off
mov pc, lr mov pc, lr
.word 0x41129200 @ ARM920T .word 0x41129200 @ ARM920T
.word 0xff00fff0 .word 0xff00fff0
b __cache_on b __armv4_cache_on
b __armv4_cache_off b __armv4_cache_off
b __armv4_cache_flush b __armv4_cache_flush
.word 0x4401a100 @ sa110 / sa1100 .word 0x4401a100 @ sa110 / sa1100
.word 0xffffffe0 .word 0xffffffe0
b __cache_on b __armv4_cache_on
b __armv4_cache_off b __armv4_cache_off
b __armv4_cache_flush b __armv4_cache_flush
.word 0x6901b110 @ sa1110 .word 0x6901b110 @ sa1110
.word 0xfffffff0 .word 0xfffffff0
b __cache_on b __armv4_cache_on
b __armv4_cache_off b __armv4_cache_off
b __armv4_cache_flush b __armv4_cache_flush
.word 0x69050000 @ xscale .word 0x69050000 @ xscale
.word 0xffff0000 .word 0xffff0000
b __cache_on b __armv4_cache_on
b __armv4_cache_off b __armv4_cache_off
b __armv4_cache_flush b __armv4_cache_flush
...@@ -450,7 +470,7 @@ __armv4_cache_off: ...@@ -450,7 +470,7 @@ __armv4_cache_off:
mov pc, lr mov pc, lr
__arm6_cache_off: __arm6_cache_off:
mov r0, #0x00000060 @ ARM6 control reg. mov r0, #0x00000030 @ ARM6 control reg.
b __armv3_cache_off b __armv3_cache_off
__arm7_cache_off: __arm7_cache_off:
...@@ -458,10 +478,10 @@ __arm7_cache_off: ...@@ -458,10 +478,10 @@ __arm7_cache_off:
b __armv3_cache_off b __armv3_cache_off
__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 mov r0, #0
mcr p15, 0, r0, c7, c0 @ invalidate whole cache v3 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3
mcr p15, 0, r0, c5, c0 @ invalidate whole TLB v3 mcr p15, 0, r0, c5, c0, 0 @ invalidate whole TLB v3
mov pc, lr mov pc, lr
/* /*
...@@ -490,6 +510,11 @@ __armv4_cache_flush: ...@@ -490,6 +510,11 @@ __armv4_cache_flush:
mcr p15, 0, r1, c7, c10, 4 @ drain WB mcr p15, 0, r1, c7, c10, 4 @ drain WB
mov pc, lr 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 * Various debugging routines for printing hex characters and
* memory, which again must be relocatable. * memory, which again must be relocatable.
......
...@@ -545,73 +545,8 @@ static void __init pcibios_init_hw(struct hw_pci *hw) ...@@ -545,73 +545,8 @@ static void __init pcibios_init_hw(struct hw_pci *hw)
} }
} }
extern struct hw_pci ebsa285_pci; void __init pci_common_init(struct hw_pci *hw)
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)
{ {
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) if (hw->preinit)
hw->preinit(); hw->preinit();
pcibios_init_hw(hw); pcibios_init_hw(hw);
......
...@@ -120,6 +120,10 @@ void set_dma_sg (dmach_t channel, struct scatterlist *sg, int nr_sg) ...@@ -120,6 +120,10 @@ void set_dma_sg (dmach_t channel, struct scatterlist *sg, int nr_sg)
{ {
dma_t *dma = dma_chan + channel; 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->sg = sg;
dma->sgcount = nr_sg; dma->sgcount = nr_sg;
dma->using_sg = 1; dma->using_sg = 1;
...@@ -218,6 +222,14 @@ void disable_dma (dmach_t channel) ...@@ -218,6 +222,14 @@ void disable_dma (dmach_t channel)
BUG(); 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) void set_dma_page(dmach_t channel, char pagenr)
{ {
printk(KERN_ERR "dma%d: trying to set_dma_page\n", channel); printk(KERN_ERR "dma%d: trying to set_dma_page\n", channel);
......
...@@ -541,7 +541,7 @@ static expansioncard_ops_t ecard_default_ops = { ...@@ -541,7 +541,7 @@ static expansioncard_ops_t ecard_default_ops = {
* *
* They are not meant to be called directly, but via enable/disable_irq. * 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); ecard_t *ec = slot_to_ecard(irqnr - 32);
...@@ -557,7 +557,7 @@ static void ecard_irq_mask(unsigned int irqnr) ...@@ -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); ecard_t *ec = slot_to_ecard(irqnr - 32);
...@@ -945,20 +945,20 @@ ecard_probe(int slot, card_type_t type) ...@@ -945,20 +945,20 @@ ecard_probe(int slot, card_type_t type)
break; break;
} }
ec->irq = 32 + slot;
#ifdef IO_EC_MEMC8_BASE
if (slot == 8)
ec->irq = 11;
#endif
/* /*
* hook the interrupt handlers * 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_chip(ec->irq, &ecard_chip);
set_irq_handler(ec->irq, do_level_IRQ); set_irq_handler(ec->irq, do_level_IRQ);
set_irq_flags(ec->irq, IRQF_VALID); set_irq_flags(ec->irq, IRQF_VALID);
} }
#ifdef IO_EC_MEMC8_BASE
if (slot == 8)
ec->irq = 11;
#endif
#ifdef CONFIG_ARCH_RPC #ifdef CONFIG_ARCH_RPC
/* On RiscPC, only first two slots have DMA capability */ /* On RiscPC, only first two slots have DMA capability */
if (slot < 2) if (slot < 2)
......
/* /*
* linux/arch/arm/kernel/head-armv.S * 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 * 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 * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * 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/config.h>
#include <linux/linkage.h> #include <linux/linkage.h>
...@@ -17,12 +17,10 @@ ...@@ -17,12 +17,10 @@
#include <asm/procinfo.h> #include <asm/procinfo.h>
#include <asm/mach/arch.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 * We place the page tables 16K below TEXTADDR. Therefore, we must make sure
* that TEXTADDR is correctly set. Currently, we expect the least significant * 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 * TEXTADDR > PAGE_OFFSET + 0x4000
* *
* Note that swapper_pg_dir is the virtual address of the page tables, and * Note that swapper_pg_dir is the virtual address of the page tables, and
...@@ -35,159 +33,119 @@ ...@@ -35,159 +33,119 @@
#error TEXTADDR must start at 0xXXXX8000 #error TEXTADDR must start at 0xXXXX8000
#endif #endif
.globl swapper_pg_dir .globl swapper_pg_dir
.equ swapper_pg_dir, TEXTADDR - 0x4000 .equ swapper_pg_dir, TEXTADDR - 0x4000
.macro pgtbl, reg, rambase .macro pgtbl, reg, rambase
adr \reg, stext adr \reg, stext
sub \reg, \reg, #0x4000 sub \reg, \reg, #0x4000
.endm .endm
/* /*
* Since the page table is closely related to the kernel start address, we * 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 * can convert the page table base address to the base address of the section
* containing both. * containing both.
*/ */
.macro krnladr, rd, pgtable, rambase .macro krnladr, rd, pgtable, rambase
bic \rd, \pgtable, #0x000ff000 bic \rd, \pgtable, #0x000ff000
.endm .endm
/* /*
* Kernel startup entry point. * Kernel startup entry point.
* ---------------------------
* *
* The rules are: * This is normally called from the decompressor code. The requirements
* r0 - should be 0 * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
* r1 - unique architecture number * r1 = machine nr.
* MMU - off
* I-cache - on or off
* D-cache - off
* *
* See linux/arch/arm/tools/mach-types for the complete list of numbers * This code is mostly position independent, so if you link the kernel at
* for r1. * 0xc0008000, you call this at __pa(0xc0008000).
*/
.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:
* *
* 1. Compatability with old production boot firmware (ie, users * See linux/arch/arm/tools/mach-types for the complete list of machine
* actually have and are booting the kernel with the old firmware) * numbers for r1.
* and therefore will be eventually removed. *
* 2. Cover the case when there is no boot firmware. This is not * We're trying to keep crap to a minimum; DO NOT add any machine specific
* ideal, but in this case, it should ONLY set r0 and r1 to the * crap here - that's what the boot loader (or in extreme, well justified
* appropriate value. * circumstances, zImage) is for.
*/
#if defined(CONFIG_ARCH_NETWINDER)
/*
* Compatability cruft for old NetWinder NeTTroms. This
* code is currently scheduled for destruction in 2.5.xx
*/ */
.rept 8 .section ".text.init",#alloc,#execinstr
mov r0, r0 .type stext, #function
.endr ENTRY(stext)
mov r12, r0
adr r2, 1f mov r0, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ make sure svc mode
ldmdb r2, {r7, r8} msr cpsr_c, r0 @ and all irqs disabled
and r3, r2, #0xc000 bl __lookup_processor_type
teq r3, #0x8000 teq r10, #0 @ invalid processor?
beq __entry moveq r0, #'p' @ yes, error 'p'
bic r3, r2, #0xc000 beq __error
orr r3, r3, #0x8000 bl __lookup_architecture_type
mov r0, r3 teq r7, #0 @ invalid architecture?
mov r4, #64 moveq r0, #'a' @ yes, error 'a'
sub r5, r8, r7 beq __error
b 1f bl __create_page_tables
.word _stext /*
.word __bss_start * The following calls CPU specific code in a position independent
* manner. See arch/arm/mm/proc-*.S for details. r10 = base of
1: * xxx_proc_info structure selected by __lookup_architecture_type
.rept 4 * above. On return, the CPU will be ready for the MMU to be
ldmia r2!, {r6, r7, r8, r9} * turned on, and r0 will hold the CPU control register value.
stmia r3!, {r6, r7, r8, r9} */
.endr adr lr, __turn_mmu_on @ return (PIC) address
subs r4, r4, #64 add pc, r10, #12
bcs 1b
movs r4, r5 .type __switch_data, %object
mov r5, #0 __switch_data:
movne pc, r0 .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 #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 * The following fragment of code is executed with the MMU on, and uses
bl __lookup_processor_type * absolute addresses; this is not position independent.
teq r10, #0 @ invalid processor? *
moveq r0, #'p' @ yes, error 'p' * r0 = processor control register
beq __error * r1 = machine ID
bl __lookup_architecture_type * r9 = processor ID
teq r7, #0 @ invalid architecture? * r12 = value of r0 when kernel was called (currently always zero)
moveq r0, #'a' @ yes, error 'a' */
beq __error .align 5
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
__mmap_switched: __mmap_switched:
adr r3, __switch_data + 4 adr r3, __switch_data + 4
ldmia r3, {r2, r4, r5, r6, r7, r8, sp}@ r2 = compat ldmia r3, {r4, r5, r6, r7, r8, sp}
@ sp = stack pointer mov fp, #0 @ Clear BSS (and zero fp)
str r12, [r2] 1: cmp r4, r5
strcc fp, [r4],#4
mov fp, #0 @ Clear BSS (and zero fp) bcc 1b
1: cmp r4, r5 str r9, [r6] @ Save processor ID
strcc fp, [r4],#4 str r1, [r7] @ Save machine type
bcc 1b 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: ...@@ -205,116 +163,116 @@ __mmap_switched:
* r8 = page table flags * r8 = page table flags
*/ */
__create_page_tables: __create_page_tables:
pgtbl r4, r5 @ page table address pgtbl r4, r5 @ page table address
/* /*
* Clear the 16K level 1 swapper page table * Clear the 16K level 1 swapper page table
*/ */
mov r0, r4 mov r0, r4
mov r3, #0 mov r3, #0
add r2, r0, #0x4000 add r2, r0, #0x4000
1: str r3, [r0], #4 1: str r3, [r0], #4
str r3, [r0], #4 str r3, [r0], #4
str r3, [r0], #4 str r3, [r0], #4
str r3, [r0], #4 str r3, [r0], #4
teq r0, r2 teq r0, r2
bne 1b bne 1b
/* /*
* Create identity mapping for first MB of kernel to * Create identity mapping for first MB of kernel to
* cater for the MMU enable. This identity mapping * cater for the MMU enable. This identity mapping
* will be removed by paging_init() * will be removed by paging_init()
*/ */
krnladr r2, r4, r5 @ start of kernel krnladr r2, r4, r5 @ start of kernel
add r3, r8, r2 @ flags + kernel base add r3, r8, r2 @ flags + kernel base
str r3, [r4, r2, lsr #18] @ identity mapping str r3, [r4, r2, lsr #18] @ identity mapping
/* /*
* Now setup the pagetables for our kernel direct * Now setup the pagetables for our kernel direct
* mapped region. We round TEXTADDR down to the * mapped region. We round TEXTADDR down to the
* nearest megabyte boundary. * nearest megabyte boundary.
*/ */
add r0, r4, #(TEXTADDR & 0xff000000) >> 18 @ start of kernel add r0, r4, #(TEXTADDR & 0xff000000) >> 18 @ start of kernel
bic r2, r3, #0x00f00000 bic r2, r3, #0x00f00000
str r2, [r0] @ PAGE_OFFSET + 0MB str r2, [r0] @ PAGE_OFFSET + 0MB
add r0, r0, #(TEXTADDR & 0x00f00000) >> 18 add r0, r0, #(TEXTADDR & 0x00f00000) >> 18
str r3, [r0], #4 @ KERNEL + 0MB str r3, [r0], #4 @ KERNEL + 0MB
add r3, r3, #1 << 20 add r3, r3, #1 << 20
str r3, [r0], #4 @ KERNEL + 1MB str r3, [r0], #4 @ KERNEL + 1MB
add r3, r3, #1 << 20 add r3, r3, #1 << 20
str r3, [r0], #4 @ KERNEL + 2MB str r3, [r0], #4 @ KERNEL + 2MB
add r3, r3, #1 << 20 add r3, r3, #1 << 20
str r3, [r0], #4 @ KERNEL + 3MB str r3, [r0], #4 @ KERNEL + 3MB
/* /*
* Ensure that the first section of RAM is present. * Ensure that the first section of RAM is present.
* we assume that: * we assume that:
* 1. the RAM is aligned to a 32MB boundary * 1. the RAM is aligned to a 32MB boundary
* 2. the kernel is executing in the same 32MB chunk * 2. the kernel is executing in the same 32MB chunk
* as the start of RAM. * as the start of RAM.
*/ */
bic r0, r0, #0x01f00000 >> 18 @ round down bic r0, r0, #0x01f00000 >> 18 @ round down
and r2, r5, #0xfe000000 @ round down and r2, r5, #0xfe000000 @ round down
add r3, r8, r2 @ flags + rambase add r3, r8, r2 @ flags + rambase
str r3, [r0] str r3, [r0]
bic r8, r8, #0x0c @ turn off cacheable bic r8, r8, #0x0c @ turn off cacheable
@ and bufferable bits @ and bufferable bits
#ifdef CONFIG_DEBUG_LL #ifdef CONFIG_DEBUG_LL
/* /*
* Map in IO space for serial debugging. * Map in IO space for serial debugging.
* This allows debug messages to be output * This allows debug messages to be output
* via a serial console before paging_init. * via a serial console before paging_init.
*/ */
add r0, r4, r7 add r0, r4, r7
rsb r3, r7, #0x4000 @ PTRS_PER_PGD*sizeof(long) rsb r3, r7, #0x4000 @ PTRS_PER_PGD*sizeof(long)
cmp r3, #0x0800 cmp r3, #0x0800
addge r2, r0, #0x0800 addge r2, r0, #0x0800
addlt r2, r0, r3 addlt r2, r0, r3
orr r3, r6, r8 orr r3, r6, r8
1: str r3, [r0], #4 1: str r3, [r0], #4
add r3, r3, #1 << 20 add r3, r3, #1 << 20
teq r0, r2 teq r0, r2
bne 1b bne 1b
#if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS) #if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS)
/* /*
* If we're using the NetWinder, we need to map in * If we're using the NetWinder, we need to map in
* the 16550-type serial port for the debug messages * the 16550-type serial port for the debug messages
*/ */
teq r1, #MACH_TYPE_NETWINDER teq r1, #MACH_TYPE_NETWINDER
teqne r1, #MACH_TYPE_CATS teqne r1, #MACH_TYPE_CATS
bne 1f bne 1f
add r0, r4, #0x3fc0 add r0, r4, #0x3fc0 @ ff000000
mov r3, #0x7c000000 mov r3, #0x7c000000
orr r3, r3, r8 orr r3, r3, r8
str r3, [r0], #4 str r3, [r0], #4
add r3, r3, #1 << 20 add r3, r3, #1 << 20
str r3, [r0], #4 str r3, [r0], #4
1: 1:
#endif #endif
#endif #endif
#ifdef CONFIG_ARCH_RPC #ifdef CONFIG_ARCH_RPC
/* /*
* Map in screen at 0x02000000 & SCREEN2_BASE * Map in screen at 0x02000000 & SCREEN2_BASE
* Similar reasons here - for debug. This is * Similar reasons here - for debug. This is
* only for Acorn RiscPC architectures. * only for Acorn RiscPC architectures.
*/ */
add r0, r4, #0x80 @ 02000000 add r0, r4, #0x80 @ 02000000
mov r3, #0x02000000 mov r3, #0x02000000
orr r3, r3, r8 orr r3, r3, r8
str r3, [r0] str r3, [r0]
add r0, r4, #0x3600 @ d8000000 add r0, r4, #0x3600 @ d8000000
str r3, [r0] str r3, [r0]
#endif #endif
mov pc, lr mov pc, lr
/* /*
* Exception handling. Something went wrong and we can't * Exception handling. Something went wrong and we can't proceed. We
* proceed. We ought to tell the user, but since we * ought to tell the user, but since we don't have any guarantee that
* don't have any guarantee that we're even running on * we're even running on the right architecture, we do virtually nothing.
* the right architecture, we do virtually nothing. *
* r0 = ascii error character: * r0 = ascii error character:
* a = invalid architecture * a = invalid architecture
* p = invalid processor * p = invalid processor
...@@ -324,31 +282,32 @@ __create_page_tables: ...@@ -324,31 +282,32 @@ __create_page_tables:
*/ */
__error: __error:
#ifdef CONFIG_DEBUG_LL #ifdef CONFIG_DEBUG_LL
mov r8, r0 @ preserve r0 mov r8, r0 @ preserve r0
adr r0, err_str adr r0, err_str
bl printascii bl printascii
mov r0, r8 mov r0, r8
bl printch bl printch
#endif #endif
#ifdef CONFIG_ARCH_RPC #ifdef CONFIG_ARCH_RPC
/* /*
* Turn the screen red on a error - RiscPC only. * Turn the screen red on a error - RiscPC only.
*/ */
mov r0, #0x02000000 mov r0, #0x02000000
mov r3, #0x11 mov r3, #0x11
orr r3, r3, r3, lsl #8 orr r3, r3, r3, lsl #8
orr r3, r3, r3, lsl #16 orr r3, r3, r3, lsl #16
str r3, [r0], #4 str r3, [r0], #4
str r3, [r0], #4 str r3, [r0], #4
str r3, [r0], #4 str r3, [r0], #4
str r3, [r0], #4 str r3, [r0], #4
#endif #endif
1: mov r0, r0 1: mov r0, r0
b 1b b 1b
#ifdef CONFIG_DEBUG_LL #ifdef CONFIG_DEBUG_LL
err_str: .asciz "\nError: " err_str:
.align .asciz "\nError: "
.align
#endif #endif
/* /*
...@@ -365,31 +324,31 @@ err_str: .asciz "\nError: " ...@@ -365,31 +324,31 @@ err_str: .asciz "\nError: "
* r10 = pointer to processor structure * r10 = pointer to processor structure
*/ */
__lookup_processor_type: __lookup_processor_type:
adr r5, 2f adr r5, 2f
ldmia r5, {r7, r9, r10} ldmia r5, {r7, r9, r10}
sub r5, r5, r10 @ convert addresses sub r5, r5, r10 @ convert addresses
add r7, r7, r5 @ to our address space add r7, r7, r5 @ to our address space
add r10, r9, r5 add r10, r9, r5
mrc p15, 0, r9, c0, c0 @ get processor id mrc p15, 0, r9, c0, c0 @ get processor id
1: ldmia r10, {r5, r6, r8} @ value, mask, mmuflags 1: ldmia r10, {r5, r6, r8} @ value, mask, mmuflags
and r6, r6, r9 @ mask wanted bits and r6, r6, r9 @ mask wanted bits
teq r5, r6 teq r5, r6
moveq pc, lr moveq pc, lr
add r10, r10, #PROC_INFO_SZ @ sizeof(proc_info_list) add r10, r10, #PROC_INFO_SZ @ sizeof(proc_info_list)
cmp r10, r7 cmp r10, r7
blt 1b blt 1b
mov r10, #0 @ unknown processor mov r10, #0 @ unknown processor
mov pc, lr mov pc, lr
/* /*
* Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for * Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for
* more information about the __proc_info and __arch_info structures. * more information about the __proc_info and __arch_info structures.
*/ */
2: .long __proc_info_end 2: .long __proc_info_end
.long __proc_info_begin .long __proc_info_begin
.long 2b .long 2b
.long __arch_info_begin .long __arch_info_begin
.long __arch_info_end .long __arch_info_end
/* /*
* Lookup machine architecture in the linker-build list of architectures. * Lookup machine architecture in the linker-build list of architectures.
...@@ -405,18 +364,18 @@ __lookup_processor_type: ...@@ -405,18 +364,18 @@ __lookup_processor_type:
* r7 = byte offset into page tables for IO * r7 = byte offset into page tables for IO
*/ */
__lookup_architecture_type: __lookup_architecture_type:
adr r4, 2b adr r4, 2b
ldmia r4, {r2, r3, r5, r6, r7} @ throw away r2, r3 ldmia r4, {r2, r3, r5, r6, r7} @ throw away r2, r3
sub r5, r4, r5 @ convert addresses sub r5, r4, r5 @ convert addresses
add r4, r6, r5 @ to our address space add r4, r6, r5 @ to our address space
add r7, r7, r5 add r7, r7, r5
1: ldr r5, [r4] @ get machine type 1: ldr r5, [r4] @ get machine type
teq r5, r1 teq r5, r1 @ matches loader number?
beq 2f beq 2f @ found
add r4, r4, #SIZEOF_MACHINE_DESC add r4, r4, #SIZEOF_MACHINE_DESC @ next machine_desc
cmp r4, r7 cmp r4, r7
blt 1b blt 1b
mov r7, #0 @ unknown architecture mov r7, #0 @ unknown architecture
mov pc, lr mov pc, lr
2: ldmib r4, {r5, r6, r7} @ found, get results 2: ldmib r4, {r5, r6, r7} @ found, get results
mov pc, lr mov pc, lr
...@@ -386,16 +386,16 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) ...@@ -386,16 +386,16 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
pid_t __ret; pid_t __ret;
__asm__ __volatile__( __asm__ __volatile__(
"orr r0, %1, %2 @ kernel_thread sys_clone "orr r0, %1, %2 @ kernel_thread sys_clone \n\
mov r1, #0 mov r1, #0 \n\
"__syscall(clone)" "__syscall(clone)" \n\
movs %0, r0 @ if we are the child movs %0, r0 @ if we are the child \n\
bne 1f bne 1f \n\
mov fp, #0 @ ensure that fp is zero mov fp, #0 @ ensure that fp is zero \n\
mov r0, %4 mov r0, %4 \n\
mov lr, pc mov lr, pc \n\
mov pc, %3 mov pc, %3 \n\
b sys_exit b sys_exit \n\
1: " 1: "
: "=r" (__ret) : "=r" (__ret)
: "Ir" (flags), "I" (CLONE_VM), "r" (fn), "r" (arg) : "Ir" (flags), "I" (CLONE_VM), "r" (fn), "r" (arg)
......
...@@ -178,76 +178,76 @@ int __down_trylock(struct semaphore * sem) ...@@ -178,76 +178,76 @@ int __down_trylock(struct semaphore * sem)
* value in some cases.. * value in some cases..
*/ */
#ifdef CONFIG_CPU_26 #ifdef CONFIG_CPU_26
asm(" .align 5 asm(" .align 5 \n\
.globl __down_failed .globl __down_failed \n\
__down_failed: __down_failed: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __down bl __down \n\
ldmfd sp!, {r0 - r3, pc}^ ldmfd sp!, {r0 - r3, pc}^ \n\
\n\
.align 5 .align 5 \n\
.globl __down_interruptible_failed .globl __down_interruptible_failed \n\
__down_interruptible_failed: __down_interruptible_failed: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __down_interruptible bl __down_interruptible \n\
mov ip, r0 mov ip, r0 \n\
ldmfd sp!, {r0 - r3, pc}^ ldmfd sp!, {r0 - r3, pc}^ \n\
\n\
.align 5 .align 5 \n\
.globl __down_trylock_failed .globl __down_trylock_failed \n\
__down_trylock_failed: __down_trylock_failed: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __down_trylock bl __down_trylock \n\
mov ip, r0 mov ip, r0 \n\
ldmfd sp!, {r0 - r3, pc}^ ldmfd sp!, {r0 - r3, pc}^ \n\
\n\
.align 5 .align 5 \n\
.globl __up_wakeup .globl __up_wakeup \n\
__up_wakeup: __up_wakeup: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __up bl __up \n\
ldmfd sp!, {r0 - r3, pc}^ ldmfd sp!, {r0 - r3, pc}^ \n\
"); ");
#else #else
/* 32 bit version */ /* 32 bit version */
asm(" .align 5 asm(" .align 5 \n\
.globl __down_failed .globl __down_failed \n\
__down_failed: __down_failed: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __down bl __down \n\
ldmfd sp!, {r0 - r3, pc} ldmfd sp!, {r0 - r3, pc} \n\
\n\
.align 5 .align 5 \n\
.globl __down_interruptible_failed .globl __down_interruptible_failed \n\
__down_interruptible_failed: __down_interruptible_failed: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __down_interruptible bl __down_interruptible \n\
mov ip, r0 mov ip, r0 \n\
ldmfd sp!, {r0 - r3, pc} ldmfd sp!, {r0 - r3, pc} \n\
\n\
.align 5 .align 5 \n\
.globl __down_trylock_failed .globl __down_trylock_failed \n\
__down_trylock_failed: __down_trylock_failed: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __down_trylock bl __down_trylock \n\
mov ip, r0 mov ip, r0 \n\
ldmfd sp!, {r0 - r3, pc} ldmfd sp!, {r0 - r3, pc} \n\
\n\
.align 5 .align 5 \n\
.globl __up_wakeup .globl __up_wakeup \n\
__up_wakeup: __up_wakeup: \n\
stmfd sp!, {r0 - r3, lr} stmfd sp!, {r0 - r3, lr} \n\
mov r0, ip mov r0, ip \n\
bl __up bl __up \n\
ldmfd sp!, {r0 - r3, pc} ldmfd sp!, {r0 - r3, pc} \n\
"); ");
#endif #endif
...@@ -61,7 +61,6 @@ extern int root_mountflags; ...@@ -61,7 +61,6 @@ extern int root_mountflags;
extern int _stext, _text, _etext, _edata, _end; extern int _stext, _text, _etext, _edata, _end;
unsigned int processor_id; unsigned int processor_id;
unsigned int compat;
unsigned int __machine_arch_type; unsigned int __machine_arch_type;
unsigned int system_rev; unsigned int system_rev;
unsigned int system_serial_low; unsigned int system_serial_low;
...@@ -289,11 +288,6 @@ static struct machine_desc * __init setup_machine(unsigned int nr) ...@@ -289,11 +288,6 @@ static struct machine_desc * __init setup_machine(unsigned int nr)
} }
printk("Machine: %s\n", list->name); 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; return list;
} }
......
...@@ -618,7 +618,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) ...@@ -618,7 +618,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
continue; continue;
switch (signr) { switch (signr) {
case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
continue; continue;
case SIGTSTP: case SIGTTIN: case SIGTTOU: case SIGTSTP: case SIGTTIN: case SIGTTOU:
......
...@@ -49,7 +49,7 @@ td3 .req lr ...@@ -49,7 +49,7 @@ td3 .req lr
/* we are now half-word aligned */ /* we are now half-word aligned */
.less8_wordlp: .less8_wordlp:
#ifdef __ARM_ARCH_4__ #if __LINUX_ARM_ARCH__ >= 4
ldrh td0, [buf], #2 ldrh td0, [buf], #2
sub len, len, #2 sub len, len, #2
#else #else
...@@ -83,7 +83,7 @@ td3 .req lr ...@@ -83,7 +83,7 @@ td3 .req lr
adcnes sum, sum, td0, lsl #byte(1) @ update checksum adcnes sum, sum, td0, lsl #byte(1) @ update checksum
tst buf, #2 @ 32-bit aligned? tst buf, #2 @ 32-bit aligned?
#ifdef __ARM_ARCH_4__ #if __LINUX_ARM_ARCH__ >= 4
ldrneh td0, [buf], #2 @ make 32-bit aligned ldrneh td0, [buf], #2 @ make 32-bit aligned
subne len, len, #2 subne len, len, #2
#else #else
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
#if defined (__arm__) #if defined (__arm__)
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("adds %1, %4, %5 __asm__ ("adds %1, %4, %5 \n\
adc %0, %2, %3" \ adc %0, %2, %3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
"%r" ((USItype) (al)), \ "%r" ((USItype) (al)), \
"rI" ((USItype) (bl))) "rI" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, 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" \ sbc %0, %2, %3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
...@@ -94,18 +94,18 @@ ...@@ -94,18 +94,18 @@
"rI" ((USItype) (bl))) "rI" ((USItype) (bl)))
#define umul_ppmm(xh, xl, a, b) \ #define umul_ppmm(xh, xl, a, b) \
{register USItype __t0, __t1, __t2; \ {register USItype __t0, __t1, __t2; \
__asm__ ("%@ Inlined umul_ppmm __asm__ ("%@ Inlined umul_ppmm \n\
mov %2, %5, lsr #16 mov %2, %5, lsr #16 \n\
mov %0, %6, lsr #16 mov %0, %6, lsr #16 \n\
bic %3, %5, %2, lsl #16 bic %3, %5, %2, lsl #16 \n\
bic %4, %6, %0, lsl #16 bic %4, %6, %0, lsl #16 \n\
mul %1, %3, %4 mul %1, %3, %4 \n\
mul %4, %2, %4 mul %4, %2, %4 \n\
mul %3, %0, %3 mul %3, %0, %3 \n\
mul %0, %2, %0 mul %0, %2, %0 \n\
adds %3, %4, %3 adds %3, %4, %3 \n\
addcs %0, %0, #65536 addcs %0, %0, #65536 \n\
adds %1, %1, %3, lsl #16 adds %1, %1, %3, lsl #16 \n\
adc %0, %0, %3, lsr #16" \ adc %0, %0, %3, lsr #16" \
: "=&r" ((USItype) (xh)), \ : "=&r" ((USItype) (xh)), \
"=r" ((USItype) (xl)), \ "=r" ((USItype) (xl)), \
......
...@@ -33,18 +33,18 @@ Boston, MA 02111-1307, USA. */ ...@@ -33,18 +33,18 @@ Boston, MA 02111-1307, USA. */
#define umul_ppmm(xh, xl, a, b) \ #define umul_ppmm(xh, xl, a, b) \
{register USItype __t0, __t1, __t2; \ {register USItype __t0, __t1, __t2; \
__asm__ ("%@ Inlined umul_ppmm __asm__ ("%@ Inlined umul_ppmm \n\
mov %2, %5, lsr #16 mov %2, %5, lsr #16 \n\
mov %0, %6, lsr #16 mov %0, %6, lsr #16 \n\
bic %3, %5, %2, lsl #16 bic %3, %5, %2, lsl #16 \n\
bic %4, %6, %0, lsl #16 bic %4, %6, %0, lsl #16 \n\
mul %1, %3, %4 mul %1, %3, %4 \n\
mul %4, %2, %4 mul %4, %2, %4 \n\
mul %3, %0, %3 mul %3, %0, %3 \n\
mul %0, %2, %0 mul %0, %2, %0 \n\
adds %3, %4, %3 adds %3, %4, %3 \n\
addcs %0, %0, #65536 addcs %0, %0, #65536 \n\
adds %1, %1, %3, lsl #16 adds %1, %1, %3, lsl #16 \n\
adc %0, %0, %3, lsr #16" \ adc %0, %0, %3, lsr #16" \
: "=&r" ((USItype) (xh)), \ : "=&r" ((USItype) (xh)), \
"=r" ((USItype) (xl)), \ "=r" ((USItype) (xl)), \
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/mach-types.h>
/* cats host-specific stuff */ /* cats host-specific stuff */
static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 }; 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) ...@@ -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 * why not the standard PCI swizzle? does this prevent 4-port tulip
* cards being used (ie, pci-pci bridge based cards)? * cards being used (ie, pci-pci bridge based cards)?
*/ */
struct hw_pci cats_pci __initdata = { static struct hw_pci cats_pci __initdata = {
swizzle: NULL, swizzle: NULL,
map_irq: cats_map_irq, map_irq: cats_map_irq,
nr_controllers: 1, nr_controllers: 1,
...@@ -43,3 +44,12 @@ struct hw_pci cats_pci __initdata = { ...@@ -43,3 +44,12 @@ struct hw_pci cats_pci __initdata = {
preinit: dc21285_preinit, preinit: dc21285_preinit,
postinit: dc21285_postinit, 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);
/* /*
* linux/arch/arm/kernel/dec21285.c: PCI functions for DC21285 * 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 * 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 * 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) ...@@ -261,31 +262,45 @@ static void dc21285_parity_irq(int irq, void *dev_id, struct pt_regs *regs)
add_timer(timer); 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); if (nr || !footbridge_cfn_mode())
busmempf = kmalloc(sizeof(*busmempf), GFP_KERNEL); return 0;
memset(busmem, 0, sizeof(*busmem));
memset(busmempf, 0, sizeof(*busmempf));
busmem->flags = IORESOURCE_MEM; res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL);
busmem->name = "Footbridge non-prefetch"; if (!res) {
busmempf->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH; printk("out of memory for root bus resources");
busmempf->name = "Footbridge prefetch"; return 0;
}
memset(res, 0, sizeof(struct resource) * 2);
allocate_resource(&iomem_resource, busmempf, 0x20000000, res[0].flags = IORESOURCE_MEM;
0x80000000, 0xffffffff, 0x20000000, NULL, NULL); res[0].name = "Footbridge non-prefetch";
allocate_resource(&iomem_resource, busmem, 0x40000000, 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); 0x80000000, 0xffffffff, 0x40000000, NULL, NULL);
resource[0] = &ioport_resource; sys->resource[0] = &ioport_resource;
resource[1] = busmem; sys->resource[1] = &res[0];
resource[2] = busmempf; 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; unsigned int mem_size, mem_mask;
int cfn_mode; int cfn_mode;
...@@ -313,17 +328,13 @@ void __init dc21285_init(void *sysdata) ...@@ -313,17 +328,13 @@ void __init dc21285_init(void *sysdata)
"central function" : "addin"); "central function" : "addin");
if (cfn_mode) { if (cfn_mode) {
static struct resource csrmem, csrio; static struct resource csrio;
csrio.flags = IORESOURCE_IO; csrio.flags = IORESOURCE_IO;
csrio.name = "Footbridge"; csrio.name = "Footbridge";
csrmem.flags = IORESOURCE_MEM;
csrmem.name = "Footbridge";
allocate_resource(&ioport_resource, &csrio, 128, allocate_resource(&ioport_resource, &csrio, 128,
0xff00, 0xffff, 128, NULL, NULL); 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 * Map our SDRAM at a known address in PCI space, just in case
...@@ -331,22 +342,12 @@ void __init dc21285_init(void *sysdata) ...@@ -331,22 +342,12 @@ void __init dc21285_init(void *sysdata)
* necessary, since some VGA cards forcefully use PCI addresses * necessary, since some VGA cards forcefully use PCI addresses
* in the range 0x000a0000 to 0x000c0000. (eg, S3 cards). * in the range 0x000a0000 to 0x000c0000. (eg, S3 cards).
*/ */
*CSR_PCICSRBASE = csrmem.start; *CSR_PCICSRBASE = 0xf4000000;
*CSR_PCICSRIOBASE = csrio.start; *CSR_PCICSRIOBASE = csrio.start;
*CSR_PCISDRAMBASE = __virt_to_bus(PAGE_OFFSET); *CSR_PCISDRAMBASE = __virt_to_bus(PAGE_OFFSET);
*CSR_PCIROMBASE = 0; *CSR_PCIROMBASE = 0;
*CSR_PCICMD = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | *CSR_PCICMD = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
PCI_COMMAND_INVALIDATE | PCICMD_ERROR_BITS; 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) { } else if (footbridge_cfn_mode() != 0) {
/* /*
* If we are not compiled to accept "add-in" mode, then * If we are not compiled to accept "add-in" mode, then
...@@ -357,6 +358,19 @@ void __init dc21285_init(void *sysdata) ...@@ -357,6 +358,19 @@ void __init dc21285_init(void *sysdata)
panic("PCI: this kernel is compiled for central " panic("PCI: this kernel is compiled for central "
"function mode only"); "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 * Initialise PCI error IRQ after we've finished probing
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/mach-types.h>
static int irqmap_ebsa285[] __initdata = { IRQ_IN3, IRQ_IN1, IRQ_IN0, IRQ_PCI }; 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) ...@@ -27,7 +28,7 @@ static int __init ebsa285_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
return irqmap_ebsa285[(slot + pin) & 3]; return irqmap_ebsa285[(slot + pin) & 3];
} }
struct hw_pci ebsa285_pci __initdata = { static struct hw_pci ebsa285_pci __initdata = {
swizzle: pci_std_swizzle, swizzle: pci_std_swizzle,
map_irq: ebsa285_map_irq, map_irq: ebsa285_map_irq,
nr_controllers: 1, nr_controllers: 1,
...@@ -36,3 +37,12 @@ struct hw_pci ebsa285_pci __initdata = { ...@@ -36,3 +37,12 @@ struct hw_pci ebsa285_pci __initdata = {
preinit: dc21285_preinit, preinit: dc21285_preinit,
postinit: dc21285_postinit, 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);
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/mach-types.h>
/* /*
* We now use the slot ID instead of the device identifiers to select * 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) ...@@ -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, swizzle: pci_std_swizzle,
map_irq: netwinder_map_irq, map_irq: netwinder_map_irq,
nr_controllers: 1, nr_controllers: 1,
...@@ -50,3 +51,12 @@ struct hw_pci netwinder_pci __initdata = { ...@@ -50,3 +51,12 @@ struct hw_pci netwinder_pci __initdata = {
preinit: dc21285_preinit, preinit: dc21285_preinit,
postinit: dc21285_postinit, 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);
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/mach-types.h>
static int irqmap_personal_server[] __initdata = { static int irqmap_personal_server[] __initdata = {
IRQ_IN0, IRQ_IN1, IRQ_IN2, IRQ_IN3, 0, 0, 0, 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) ...@@ -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]; 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, map_irq: personal_server_map_irq,
nr_controllers: 1, nr_controllers: 1,
setup: dc21285_setup, setup: dc21285_setup,
...@@ -44,3 +45,12 @@ struct hw_pci personal_server_pci __initdata = { ...@@ -44,3 +45,12 @@ struct hw_pci personal_server_pci __initdata = {
preinit: dc21285_preinit, preinit: dc21285_preinit,
postinit: dc21285_postinit, 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);
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/mach-types.h>
/* /*
* Owing to a PCB cockup, issue A backplanes are wired thus: * 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) ...@@ -43,9 +44,17 @@ static u8 __init ftv_swizzle(struct pci_dev *dev, u8 *pin)
} }
/* ftv host-specific stuff */ /* ftv host-specific stuff */
struct hw_pci ftv_pci __initdata = { static struct hw_pci ftv_pci __initdata = {
init: plx90x0_init, init: plx90x0_init,
swizzle: ftv_swizzle, swizzle: ftv_swizzle,
map_irq: ftv_map_irq, 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);
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/mach-types.h>
/* /*
* A small note about bridges and interrupts. The DECchip 21050 (and * 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) ...@@ -112,7 +113,7 @@ static int __init integrator_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
extern void pci_v3_init(void *); extern void pci_v3_init(void *);
struct hw_pci integrator_pci __initdata = { static struct hw_pci integrator_pci __initdata = {
swizzle: integrator_swizzle, swizzle: integrator_swizzle,
map_irq: integrator_map_irq, map_irq: integrator_map_irq,
setup: pci_v3_setup, setup: pci_v3_setup,
...@@ -121,3 +122,12 @@ struct hw_pci integrator_pci __initdata = { ...@@ -121,3 +122,12 @@ struct hw_pci integrator_pci __initdata = {
preinit: pci_v3_preinit, preinit: pci_v3_preinit,
postinit: pci_v3_postinit, 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);
...@@ -452,20 +452,24 @@ int iop310_setup(int nr, struct pci_sys_data *sys) ...@@ -452,20 +452,24 @@ int iop310_setup(int nr, struct pci_sys_data *sys)
res[0].start = IOP310_PCIPRI_LOWER_IO + 0x6e000000; res[0].start = IOP310_PCIPRI_LOWER_IO + 0x6e000000;
res[0].end = IOP310_PCIPRI_LOWER_IO + 0x6e00ffff; res[0].end = IOP310_PCIPRI_LOWER_IO + 0x6e00ffff;
res[0].name = "PCI IO Primary"; res[0].name = "PCI IO Primary";
res[0].flags = IORESOURCE_IO;
res[1].start = IOP310_PCIPRI_LOWER_MEM; res[1].start = IOP310_PCIPRI_LOWER_MEM;
res[1].end = IOP310_PCIPRI_LOWER_MEM + IOP310_PCI_WINDOW_SIZE; res[1].end = IOP310_PCIPRI_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
res[1].name = "PCI Memory Primary"; res[1].name = "PCI Memory Primary";
res[1].flags = IORESOURCE_MEM;
break; break;
case 1: case 1:
res[0].start = IOP310_PCISEC_LOWER_IO + 0x6e000000; res[0].start = IOP310_PCISEC_LOWER_IO + 0x6e000000;
res[0].end = IOP310_PCISEC_LOWER_IO + 0x6e00ffff; res[0].end = IOP310_PCISEC_LOWER_IO + 0x6e00ffff;
res[0].name = "PCI IO Secondary"; res[0].name = "PCI IO Secondary";
res[0].flags = IORESOURCE_IO;
res[1].start = IOP310_PCISEC_LOWER_MEM; res[1].start = IOP310_PCISEC_LOWER_MEM;
res[1].end = IOP310_PCISEC_LOWER_MEM + IOP310_PCI_WINDOW_SIZE; res[1].end = IOP310_PCISEC_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
res[1].name = "PCI Memory Secondary"; res[1].name = "PCI Memory Secondary";
res[1].flags = IORESOURCE_MEM;
break; break;
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/mach-types.h>
/* /*
* The following macro is used to lookup irqs in a standard table * The following macro is used to lookup irqs in a standard table
...@@ -140,10 +141,19 @@ static void iq80310_preinit(void) ...@@ -140,10 +141,19 @@ static void iq80310_preinit(void)
iop310_init(); iop310_init();
} }
struct hw_pci iq80310_pci __initdata = { static struct hw_pci iq80310_pci __initdata = {
swizzle: pci_std_swizzle, swizzle: pci_std_swizzle,
nr_controllers: 2, nr_controllers: 2,
setup: iq80310_setup, setup: iq80310_setup,
scan: iop310_scan_bus, scan: iop310_scan_bus,
preinit: iq80310_preinit, 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);
...@@ -33,10 +33,6 @@ typedef enum { ...@@ -33,10 +33,6 @@ typedef enum {
dma_size_32 = 4, dma_size_32 = 4,
dma_size_128 = 16 dma_size_128 = 16
} dma_size_t; } dma_size_t;
typedef struct {
dma_size_t transfersize;
} dma_t;
#endif #endif
#define TRANSFER_SIZE 2 #define TRANSFER_SIZE 2
...@@ -48,10 +44,6 @@ typedef struct { ...@@ -48,10 +44,6 @@ typedef struct {
#define CR (IOMD_IO0CR - IOMD_IO0CURA) #define CR (IOMD_IO0CR - IOMD_IO0CURA)
#define ST (IOMD_IO0ST - 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) static void iomd_get_next_sg(struct scatterlist *sg, dma_t *dma)
{ {
unsigned long end, offset, flags = 0; unsigned long end, offset, flags = 0;
...@@ -91,76 +83,40 @@ static void iomd_get_next_sg(struct scatterlist *sg, dma_t *dma) ...@@ -91,76 +83,40 @@ static void iomd_get_next_sg(struct scatterlist *sg, dma_t *dma)
sg->length |= flags; 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) static void iomd_dma_handle(int irq, void *dev_id, struct pt_regs *regs)
{ {
dma_t *dma = (dma_t *)dev_id; dma_t *dma = (dma_t *)dev_id;
unsigned int status = 0, no_buffer = dma->sg == NULL; unsigned long base = dma->dma_base;
do { do {
switch (dma->state) { unsigned int status;
case state_prog_a:
iomd_get_next_sg(&dma->cur_sg, dma); status = iomd_readb(base + ST);
iomd_setup_dma_a(&dma->cur_sg, dma); if (!(status & DMA_ST_INT))
dma->state = state_wait_a; return;
case state_wait_a: if (status & DMA_ST_OFL && !dma->sg)
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;
}
break; break;
case state_wait_b: iomd_get_next_sg(&dma->cur_sg, dma);
status = iomd_readb(dma->dma_base + ST);
switch (status & (DMA_ST_OFL|DMA_ST_INT|DMA_ST_AB)) { switch (status & (DMA_ST_OFL | DMA_ST_AB)) {
case DMA_ST_OFL|DMA_ST_INT|DMA_ST_AB: case DMA_ST_OFL: /* OIA */
iomd_get_next_sg(&dma->cur_sg, dma); case DMA_ST_AB: /* .IB */
iomd_setup_dma_b(&dma->cur_sg, dma); iomd_writel(dma->cur_sg.dma_address, base + CURA);
break; iomd_writel(dma->cur_sg.length, base + ENDA);
break;
case DMA_ST_INT|DMA_ST_AB:
iomd_get_next_sg(&dma->cur_sg, dma); case DMA_ST_OFL | DMA_ST_AB: /* OIB */
iomd_setup_dma_a(&dma->cur_sg, dma); case 0: /* .IA */
dma->state = state_wait_a; iomd_writel(dma->cur_sg.dma_address, base + CURB);
break; iomd_writel(dma->cur_sg.length, base + ENDB);
case DMA_ST_OFL|DMA_ST_INT:
iomd_setup_dma_a(&dma->cur_sg, dma);
dma->state = state_wait_a;
break;
}
break; break;
} }
} while (dma->sg && (status & DMA_ST_INT)); } while (1);
if (no_buffer) iomd_writeb(0, dma->dma_base + CR);
disable_irq(irq); disable_irq(irq);
} }
static int iomd_request_dma(dmach_t channel, dma_t *dma) 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) ...@@ -194,7 +150,6 @@ static void iomd_enable_dma(dmach_t channel, dma_t *dma)
} }
iomd_writeb(DMA_CR_C, dma_base + CR); iomd_writeb(DMA_CR_C, dma_base + CR);
dma->state = state_prog_a;
} }
if (dma->dma_mode == DMA_MODE_READ) if (dma->dma_mode == DMA_MODE_READ)
...@@ -207,11 +162,15 @@ static void iomd_enable_dma(dmach_t channel, dma_t *dma) ...@@ -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) static void iomd_disable_dma(dmach_t channel, dma_t *dma)
{ {
unsigned long dma_base = dma->dma_base; unsigned long dma_base = dma->dma_base;
unsigned long flags;
unsigned int ctrl; unsigned int ctrl;
disable_irq(dma->dma_irq); local_irq_save(flags);
ctrl = iomd_readb(dma_base + CR); 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); 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) static int iomd_set_dma_speed(dmach_t channel, dma_t *dma, int cycle)
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/device.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/tty.h> #include <linux/tty.h>
#include <linux/errno.h> #include <linux/errno.h>
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/pci.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) 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) ...@@ -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); extern void __init via82c505_preinit(void *sysdata);
struct hw_pci shark_pci __initdata = { static struct hw_pci shark_pci __initdata = {
setup: via82c505_setup, setup: via82c505_setup,
swizzle: pci_std_swizzle, swizzle: pci_std_swizzle,
map_irq: shark_map_irq, map_irq: shark_map_irq,
...@@ -30,3 +31,12 @@ struct hw_pci shark_pci __initdata = { ...@@ -30,3 +31,12 @@ struct hw_pci shark_pci __initdata = {
scan: via82c505_scan_bus, scan: via82c505_scan_bus,
preinit: via82c505_preinit 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);
...@@ -66,8 +66,8 @@ ENTRY(v4t_late_abort) ...@@ -66,8 +66,8 @@ ENTRY(v4t_late_abort)
add r6, r6, r2, lsr #3 add r6, r6, r2, lsr #3
add r6, r6, r6, lsr #8 add r6, r6, r6, lsr #8
add r6, r6, r6, lsr #4 add r6, r6, r6, lsr #4
and r6, r6, #15 @ r7 = no. of registers to transfer. and r6, r6, #15 @ r6 = no. of registers to transfer.
and r5, r8, #15 << 16 @ Extract 'n' form instruction and r5, r8, #15 << 16 @ Extract 'n' from instruction
ldr r7, [sp, r5, lsr #14] @ Get register 'Rn' ldr r7, [sp, r5, lsr #14] @ Get register 'Rn'
tst r8, #1 << 23 @ Check U bit tst r8, #1 << 23 @ Check U bit
subne r7, r7, r6, lsl #2 @ Undo increment subne r7, r7, r6, lsl #2 @ Undo increment
......
...@@ -339,8 +339,7 @@ int do_page_fault(unsigned long addr, int error_code, struct pt_regs *regs) ...@@ -339,8 +339,7 @@ int do_page_fault(unsigned long addr, int error_code, struct pt_regs *regs)
int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *regs) int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *regs)
{ {
struct task_struct *tsk; struct task_struct *tsk;
struct mm_struct *mm; unsigned int offset;
int offset;
pgd_t *pgd, *pgd_k; pgd_t *pgd, *pgd_k;
pmd_t *pmd, *pmd_k; pmd_t *pmd, *pmd_k;
...@@ -349,16 +348,17 @@ int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *reg ...@@ -349,16 +348,17 @@ int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *reg
offset = __pgd_offset(addr); offset = __pgd_offset(addr);
/*
* FIXME: CP15 C1 is write only on ARMv3 architectures.
*/
pgd = cpu_get_pgd() + offset; pgd = cpu_get_pgd() + offset;
pgd_k = init_mm.pgd + offset; pgd_k = init_mm.pgd + offset;
if (pgd_none(*pgd_k)) if (pgd_none(*pgd_k))
goto bad_area; goto bad_area;
#if 0 /* note that we are two-level */
if (!pgd_present(*pgd)) if (!pgd_present(*pgd))
set_pgd(pgd, *pgd_k); set_pgd(pgd, *pgd_k);
#endif
pmd_k = pmd_offset(pgd_k, addr); pmd_k = pmd_offset(pgd_k, addr);
pmd = pmd_offset(pgd, addr); pmd = pmd_offset(pgd, addr);
...@@ -371,8 +371,7 @@ int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *reg ...@@ -371,8 +371,7 @@ int do_translation_fault(unsigned long addr, int error_code, struct pt_regs *reg
bad_area: bad_area:
tsk = current; 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; return 0;
} }
...@@ -243,6 +243,7 @@ find_memend_and_nodes(struct meminfo *mi, struct node_info *np) ...@@ -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. * also get rid of some of the stuff above as well.
*/ */
max_low_pfn = memend_pfn - O_PFN_DOWN(PHYS_OFFSET); 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; mi->end = memend_pfn << PAGE_SHIFT;
return bootmem_pages; return bootmem_pages;
......
...@@ -184,9 +184,9 @@ INLINE float32 packFloat32( flag zSign, int16 zExp, bits32 zSig ) ...@@ -184,9 +184,9 @@ INLINE float32 packFloat32( flag zSign, int16 zExp, bits32 zSig )
{ {
#if 0 #if 0
float32 f; float32 f;
__asm__("@ packFloat32; __asm__("@ packFloat32; \n\
mov %0, %1, asl #31; mov %0, %1, asl #31; \n\
orr %0, %2, asl #23; orr %0, %2, asl #23; \n\
orr %0, %3" orr %0, %3"
: /* no outputs */ : /* no outputs */
: "g" (f), "g" (zSign), "g" (zExp), "g" (zSig) : "g" (f), "g" (zSign), "g" (zExp), "g" (zSig)
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
# To add an entry into this database, please see Documentation/arm/README, # To add an entry into this database, please see Documentation/arm/README,
# or contact rmk@arm.linux.org.uk # 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 # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
# #
...@@ -149,7 +149,7 @@ h3800 SA1100_H3800 H3800 137 ...@@ -149,7 +149,7 @@ h3800 SA1100_H3800 H3800 137
blue_v1 ARCH_BLUE_V1 BLUE_V1 138 blue_v1 ARCH_BLUE_V1 BLUE_V1 138
pxa_cerf ARCH_PXA_CERF PXA_CERF 139 pxa_cerf ARCH_PXA_CERF PXA_CERF 139
arm7tevb ARCH_ARM7TEVB ARM7TEVB 140 arm7tevb ARCH_ARM7TEVB ARM7TEVB 140
d7400 ARCH_D7400 D7400 141 d7400 SA1100_D7400 D7400 141
piranha ARCH_PIRANHA PIRANHA 142 piranha ARCH_PIRANHA PIRANHA 142
sbcamelot SA1100_SBCAMELOT SBCAMELOT 143 sbcamelot SA1100_SBCAMELOT SBCAMELOT 143
kings SA1100_KINGS KINGS 144 kings SA1100_KINGS KINGS 144
...@@ -180,3 +180,15 @@ active SA1100_ACTIVE ACTIVE 168 ...@@ -180,3 +180,15 @@ active SA1100_ACTIVE ACTIVE 168
iq80321 ARCH_IQ80321 IQ80321 169 iq80321 ARCH_IQ80321 IQ80321 169
wid SA1100_WID WID 170 wid SA1100_WID WID 170
sabinal ARCH_SABINAL SABINAL 171 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
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/errno.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/irq.h> #include <asm/irq.h>
......
...@@ -66,6 +66,7 @@ static const card_ids __init etherh_cids[] = { ...@@ -66,6 +66,7 @@ static const card_ids __init etherh_cids[] = {
}; };
struct etherh_priv { struct etherh_priv {
struct ei_device eidev;
unsigned int id; unsigned int id;
unsigned int ctrl_port; unsigned int ctrl_port;
unsigned int ctrl; unsigned int ctrl;
...@@ -150,8 +151,8 @@ static expansioncard_ops_t etherh_ops = { ...@@ -150,8 +151,8 @@ static expansioncard_ops_t etherh_ops = {
static void static void
etherh_setif(struct net_device *dev) etherh_setif(struct net_device *dev)
{ {
struct ei_device *ei_local = (struct ei_device *) dev->priv; struct etherh_priv *eh = (struct etherh_priv *)dev->priv;
struct etherh_priv *eh = (struct etherh_priv *)dev->rmem_start; struct ei_device *ei_local = &eh->eidev;
unsigned long addr, flags; unsigned long addr, flags;
local_irq_save(flags); local_irq_save(flags);
...@@ -194,8 +195,8 @@ etherh_setif(struct net_device *dev) ...@@ -194,8 +195,8 @@ etherh_setif(struct net_device *dev)
static int static int
etherh_getifstat(struct net_device *dev) etherh_getifstat(struct net_device *dev)
{ {
struct ei_device *ei_local = (struct ei_device *) dev->priv; struct etherh_priv *eh = (struct etherh_priv *)dev->priv;
struct etherh_priv *eh = (struct etherh_priv *)dev->rmem_start; struct ei_device *ei_local = &eh->eidev;
int stat = 0; int stat = 0;
switch (eh->id) { switch (eh->id) {
...@@ -560,6 +561,9 @@ static struct net_device * __init etherh_init_one(struct expansion_card *ec) ...@@ -560,6 +561,9 @@ static struct net_device * __init etherh_init_one(struct expansion_card *ec)
if (!eh) if (!eh)
goto out_nopriv; goto out_nopriv;
memset(eh, 0, sizeof(struct etherh_priv));
spin_lock_init(&eh->eidev.page_lock);
SET_MODULE_OWNER(dev); SET_MODULE_OWNER(dev);
dev->open = etherh_open; dev->open = etherh_open;
...@@ -567,7 +571,7 @@ static struct net_device * __init etherh_init_one(struct expansion_card *ec) ...@@ -567,7 +571,7 @@ static struct net_device * __init etherh_init_one(struct expansion_card *ec)
dev->set_config = etherh_set_config; dev->set_config = etherh_set_config;
dev->irq = ec->irq; dev->irq = ec->irq;
dev->base_addr = ecard_address(ec, ECARD_MEMC, 0); dev->base_addr = ecard_address(ec, ECARD_MEMC, 0);
dev->rmem_start = (unsigned long)eh; dev->priv = eh;
/* /*
* IRQ and control port handling * IRQ and control port handling
......
...@@ -157,6 +157,7 @@ ...@@ -157,6 +157,7 @@
#include "../../scsi/constants.h" #include "../../scsi/constants.h"
#include "acornscsi.h" #include "acornscsi.h"
#include "msgqueue.h" #include "msgqueue.h"
#include "scsi.h"
#include <scsi/scsicam.h> #include <scsi/scsicam.h>
...@@ -902,17 +903,8 @@ void acornscsi_data_updateptr(AS_Host *host, Scsi_Pointer *SCp, unsigned int len ...@@ -902,17 +903,8 @@ void acornscsi_data_updateptr(AS_Host *host, Scsi_Pointer *SCp, unsigned int len
SCp->ptr += length; SCp->ptr += length;
SCp->this_residual -= length; SCp->this_residual -= length;
if (!SCp->this_residual) { if (SCp->this_residual == 0 && next_SCp(SCp) == 0)
if (SCp->buffers_residual) { host->dma.xfer_done = 1;
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;
}
}
} }
/* /*
...@@ -2558,20 +2550,8 @@ int acornscsi_queuecmd(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) ...@@ -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.phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]);
SCpnt->SCp.sent_command = 0; SCpnt->SCp.sent_command = 0;
SCpnt->SCp.scsi_xferred = 0; SCpnt->SCp.scsi_xferred = 0;
SCpnt->SCp.Status = 0;
SCpnt->SCp.Message = 0; init_SCp(SCpnt);
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;
}
host->stats.queues += 1; host->stats.queues += 1;
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "../../scsi/sd.h" #include "../../scsi/sd.h"
#include "../../scsi/hosts.h" #include "../../scsi/hosts.h"
#include "fas216.h" #include "fas216.h"
#include "scsi.h"
#include <scsi/scsicam.h> #include <scsi/scsicam.h>
...@@ -188,15 +189,9 @@ cumanascsi_2_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp, ...@@ -188,15 +189,9 @@ cumanascsi_2_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
if (dmach != NO_DMA && if (dmach != NO_DMA &&
(min_type == fasdma_real_all || SCp->this_residual >= 512)) { (min_type == fasdma_real_all || SCp->this_residual >= 512)) {
int bufs = SCp->buffers_residual; int bufs, pci_dir, dma_dir, alatch_dir;
int pci_dir, dma_dir, alatch_dir;
bufs = copy_SCp_to_sg(&info->sg[0], SCp, NR_SG);
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;
if (direction == DMA_OUT) if (direction == DMA_OUT)
pci_dir = PCI_DMA_TODEVICE, pci_dir = PCI_DMA_TODEVICE,
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "../../scsi/sd.h" #include "../../scsi/sd.h"
#include "../../scsi/hosts.h" #include "../../scsi/hosts.h"
#include "fas216.h" #include "fas216.h"
#include "scsi.h"
#include <scsi/scsicam.h> #include <scsi/scsicam.h>
...@@ -192,15 +193,9 @@ eesoxscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp, ...@@ -192,15 +193,9 @@ eesoxscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
if (dmach != NO_DMA && if (dmach != NO_DMA &&
(min_type == fasdma_real_all || SCp->this_residual >= 512)) { (min_type == fasdma_real_all || SCp->this_residual >= 512)) {
int bufs = SCp->buffers_residual; int bufs, pci_dir, dma_dir;
int pci_dir, dma_dir;
bufs = copy_SCp_to_sg(&info->sg[0], SCp, NR_SG);
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;
if (direction == DMA_OUT) if (direction == DMA_OUT)
pci_dir = PCI_DMA_TODEVICE, pci_dir = PCI_DMA_TODEVICE,
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#include "../../scsi/scsi.h" #include "../../scsi/scsi.h"
#include "../../scsi/hosts.h" #include "../../scsi/hosts.h"
#include "fas216.h" #include "fas216.h"
#include "scsi.h"
#define VER_MAJOR 0 #define VER_MAJOR 0
#define VER_MINOR 0 #define VER_MINOR 0
...@@ -588,38 +589,32 @@ fas216_handlewide(FAS216_Info *info, char *msg) ...@@ -588,38 +589,32 @@ fas216_handlewide(FAS216_Info *info, char *msg)
static void static void
fas216_updateptrs(FAS216_Info *info, int bytes_transferred) fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
{ {
unsigned char *ptr; Scsi_Pointer *SCp = &info->scsi.SCp;
unsigned int residual;
fas216_checkmagic(info); fas216_checkmagic(info);
ptr = info->scsi.SCp.ptr;
residual = info->scsi.SCp.this_residual;
info->SCpnt->request_bufflen -= bytes_transferred; info->SCpnt->request_bufflen -= bytes_transferred;
while (residual <= bytes_transferred && bytes_transferred) { while (bytes_transferred != 0) {
/* We have used up this buffer */ if (SCp->this_residual > bytes_transferred)
bytes_transferred -= residual; break;
if (info->scsi.SCp.buffers_residual) { /*
info->scsi.SCp.buffer++; * We have used up this buffer. Move on to the
info->scsi.SCp.buffers_residual--; * next buffer.
ptr = (unsigned char *)info->scsi.SCp.buffer->address; */
residual = info->scsi.SCp.buffer->length; bytes_transferred -= SCp->this_residual;
} else { if (!next_SCp(&info->scsi.SCp)) {
ptr = NULL; printk(KERN_WARNING "scsi%d.%c: out of buffers\n",
residual = 0; info->host->host_no, '0' + info->SCpnt->target);
return;
} }
} }
residual -= bytes_transferred; SCp->this_residual -= bytes_transferred;
ptr += bytes_transferred; if (SCp->this_residual)
SCp->ptr += bytes_transferred;
if (residual == 0) else
ptr = NULL; SCp->ptr = NULL;
info->scsi.SCp.ptr = ptr;
info->scsi.SCp.this_residual = residual;
} }
/* Function: void fas216_pio(FAS216_Info *info, fasdmadir_t direction) /* Function: void fas216_pio(FAS216_Info *info, fasdmadir_t direction)
...@@ -631,35 +626,12 @@ fas216_updateptrs(FAS216_Info *info, int bytes_transferred) ...@@ -631,35 +626,12 @@ fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
static void static void
fas216_pio(FAS216_Info *info, fasdmadir_t direction) fas216_pio(FAS216_Info *info, fasdmadir_t direction)
{ {
unsigned int residual;
char *ptr;
fas216_checkmagic(info); fas216_checkmagic(info);
residual = info->scsi.SCp.this_residual;
ptr = info->scsi.SCp.ptr;
if (direction == DMA_OUT) if (direction == DMA_OUT)
outb(*ptr++, REG_FF(info)); outb(get_next_SCp_byte(&info->scsi.SCp), REG_FF(info));
else else
*ptr++ = inb(REG_FF(info)); put_next_SCp_byte(&info->scsi.SCp, 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;
} }
/* Function: void fas216_starttransfer(FAS216_Info *info, /* Function: void fas216_starttransfer(FAS216_Info *info,
...@@ -2034,48 +2006,8 @@ int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) ...@@ -2034,48 +2006,8 @@ int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
SCpnt->scsi_done = done; SCpnt->scsi_done = done;
SCpnt->host_scribble = (void *)fas216_std_done; SCpnt->host_scribble = (void *)fas216_std_done;
SCpnt->result = 0; 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; init_SCp(SCpnt);
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;
}
info->stats.queues += 1; info->stats.queues += 1;
SCpnt->tag = 0; SCpnt->tag = 0;
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "../../scsi/sd.h" #include "../../scsi/sd.h"
#include "../../scsi/hosts.h" #include "../../scsi/hosts.h"
#include "fas216.h" #include "fas216.h"
#include "scsi.h"
#include <scsi/scsicam.h> #include <scsi/scsicam.h>
...@@ -180,15 +181,9 @@ powertecscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp, ...@@ -180,15 +181,9 @@ powertecscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
if (dmach != NO_DMA && if (dmach != NO_DMA &&
(min_type == fasdma_real_all || SCp->this_residual >= 512)) { (min_type == fasdma_real_all || SCp->this_residual >= 512)) {
int bufs = SCp->buffers_residual; int bufs, pci_dir, dma_dir;
int pci_dir, dma_dir;
bufs = copy_SCp_to_sg(&info->sg[0], SCp, NR_SG);
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;
if (direction == DMA_OUT) if (direction == DMA_OUT)
pci_dir = PCI_DMA_TODEVICE, pci_dir = PCI_DMA_TODEVICE,
......
/*
* 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;
}
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -56,7 +58,7 @@ ...@@ -56,7 +58,7 @@
static int badge4_pcmvcc = 50; static int badge4_pcmvcc = 50;
static int badge4_pcmvpp = 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) static int badge4_pcmcia_init(struct pcmcia_init *init)
{ {
...@@ -91,8 +93,6 @@ static void complain_about_jumpering(const char *whom, ...@@ -91,8 +93,6 @@ static void complain_about_jumpering(const char *whom,
given / 10, given % 10); given / 10, given % 10);
} }
static unsigned badge4_need_5V_bitmap = 0;
static int static int
badge4_pcmcia_configure_socket(const struct pcmcia_configure *conf) badge4_pcmcia_configure_socket(const struct pcmcia_configure *conf)
{ {
......
...@@ -95,10 +95,11 @@ static struct tq_struct sa1100_pcmcia_task; ...@@ -95,10 +95,11 @@ static struct tq_struct sa1100_pcmcia_task;
* "Expansion Memory (PCMCIA) Configuration Register (MECR)" * "Expansion Memory (PCMCIA) Configuration Register (MECR)"
* that's section 10.2.5 in _my_ version of the manuial ;) * 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, static unsigned int
unsigned int cmd_time ) 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() /* sa1100_pcmcia_set_mecr()
...@@ -109,7 +110,7 @@ static int sa1100_pcmcia_default_mecr_timing(unsigned int sock, unsigned int cpu ...@@ -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 * Call board specific BS value calculation to allow boards
* to tweak the BS values. * 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; struct sa1100_pcmcia_socket *skt;
u32 mecr; u32 mecr;
...@@ -117,15 +118,15 @@ static int sa1100_pcmcia_set_mecr( int sock ) ...@@ -117,15 +118,15 @@ static int sa1100_pcmcia_set_mecr( int sock )
long flags; long flags;
unsigned int bs; unsigned int bs;
if ( sock<0 || sock>SA1100_PCMCIA_MAX_SOCK ) if (sock < 0 || sock > SA1100_PCMCIA_MAX_SOCK)
return -1; return -1;
skt = PCMCIA_SOCKET( sock ); skt = PCMCIA_SOCKET(sock);
local_irq_save(flags); local_irq_save(flags);
clock = cpufreq_get(0); 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 = MECR;
MECR_FAST_SET(mecr, sock, 0); MECR_FAST_SET(mecr, sock, 0);
...@@ -136,10 +137,10 @@ static int sa1100_pcmcia_set_mecr( int sock ) ...@@ -136,10 +137,10 @@ static int sa1100_pcmcia_set_mecr( int sock )
local_irq_restore(flags); local_irq_restore(flags);
DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n", DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n",
__FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock, __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock,
MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock), MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock),
sock, MECR_BSIO_GET(mecr, sock)); sock, MECR_BSIO_GET(mecr, sock));
return 0; return 0;
} }
...@@ -882,11 +883,11 @@ static struct pccard_operations sa1100_pcmcia_operations = { ...@@ -882,11 +883,11 @@ static struct pccard_operations sa1100_pcmcia_operations = {
*/ */
static void sa1100_pcmcia_update_mecr(unsigned int clock) static void sa1100_pcmcia_update_mecr(unsigned int clock)
{ {
unsigned int sock; unsigned int sock;
for (sock = 0; sock < SA1100_PCMCIA_MAX_SOCK; ++sock) { for (sock = 0; sock < SA1100_PCMCIA_MAX_SOCK; ++sock) {
sa1100_pcmcia_set_mecr( sock ); sa1100_pcmcia_set_mecr(sock);
} }
} }
/* sa1100_pcmcia_notifier() /* sa1100_pcmcia_notifier()
......
...@@ -73,8 +73,8 @@ struct pcmcia_low_level { ...@@ -73,8 +73,8 @@ struct pcmcia_low_level {
/* /*
* Calculate MECR timing clock wait states * Calculate MECR timing clock wait states
*/ */
int (*socket_get_timing)(unsigned int sock, unsigned int cpu_speed, unsigned int (*socket_get_timing)(unsigned int sock,
unsigned int cmd_time ); unsigned int cpu_speed, unsigned int cmd_time);
}; };
extern int sa1100_register_pcmcia(struct pcmcia_low_level *); extern int sa1100_register_pcmcia(struct pcmcia_low_level *);
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -133,7 +135,7 @@ int __init pcmcia_neponset_init(void) ...@@ -133,7 +135,7 @@ int __init pcmcia_neponset_init(void)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_assabet() && machine_has_neponset()) if (machine_is_assabet() && sa1111)
ret = sa1100_register_pcmcia(&neponset_pcmcia_ops); ret = sa1100_register_pcmcia(&neponset_pcmcia_ops);
return ret; return ret;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/device.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/hardware/sa1111.h> #include <asm/hardware/sa1111.h>
......
...@@ -601,13 +601,13 @@ acornfb_adjust_timing(struct fb_var_screeninfo *var, int con) ...@@ -601,13 +601,13 @@ acornfb_adjust_timing(struct fb_var_screeninfo *var, int con)
/* Find int 'y', such that y * fll == s * sam < maxsize /* Find int 'y', such that y * fll == s * sam < maxsize
* y = s * sam / fll; s = maxsize / sam * 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) { size -= sam_size) {
nr_y = size / font_line_len;
if (nr_y * font_line_len == size) if (nr_y * font_line_len == size)
break; break;
} }
nr_y *= fontht;
if (var->accel_flags & FB_ACCELF_TEXT) { if (var->accel_flags & FB_ACCELF_TEXT) {
if (min_size > size) { if (min_size > size) {
...@@ -617,8 +617,9 @@ acornfb_adjust_timing(struct fb_var_screeninfo *var, int con) ...@@ -617,8 +617,9 @@ acornfb_adjust_timing(struct fb_var_screeninfo *var, int con)
size = current_par.screen_size; size = current_par.screen_size;
var->yres_virtual = size / (font_line_len / fontht); var->yres_virtual = size / (font_line_len / fontht);
} else } 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; current_par.screen_end = current_par.screen_base_p + size;
...@@ -1100,6 +1101,41 @@ acornfb_pan_display(struct fb_var_screeninfo *var, int con, ...@@ -1100,6 +1101,41 @@ acornfb_pan_display(struct fb_var_screeninfo *var, int con,
return 0; 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. * Note that we are entered with the kernel locked.
*/ */
...@@ -1146,7 +1182,7 @@ static struct fb_ops acornfb_ops = { ...@@ -1146,7 +1182,7 @@ static struct fb_ops acornfb_ops = {
fb_set_var: acornfb_set_var, fb_set_var: acornfb_set_var,
fb_get_cmap: acornfb_get_cmap, fb_get_cmap: acornfb_get_cmap,
fb_set_cmap: gen_set_cmap, fb_set_cmap: gen_set_cmap,
fb_set_colreg: acornfb_setcolreg, fb_setcolreg: acornfb_setcolreg,
fb_pan_display: acornfb_pan_display, fb_pan_display: acornfb_pan_display,
fb_blank: acornfb_blank, fb_blank: acornfb_blank,
fb_mmap: acornfb_mmap, fb_mmap: acornfb_mmap,
...@@ -1182,41 +1218,6 @@ acornfb_switch(int con, struct fb_info *info) ...@@ -1182,41 +1218,6 @@ acornfb_switch(int con, struct fb_info *info)
return 0; 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!!! * Everything after here is initialisation!!!
*/ */
......
...@@ -211,6 +211,53 @@ clps7111fb_set_var(struct fb_var_screeninfo *var, int con, ...@@ -211,6 +211,53 @@ clps7111fb_set_var(struct fb_var_screeninfo *var, int con,
return 0; 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 = { static struct fb_ops clps7111fb_ops = {
owner: THIS_MODULE, owner: THIS_MODULE,
fb_set_var: clps7111fb_set_var, fb_set_var: clps7111fb_set_var,
...@@ -266,53 +313,6 @@ static int clps7111fb_updatevar(int con, struct fb_info *info) ...@@ -266,53 +313,6 @@ static int clps7111fb_updatevar(int con, struct fb_info *info)
return -EINVAL; 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 static int
clps7111fb_proc_backlight_read(char *page, char **start, off_t off, clps7111fb_proc_backlight_read(char *page, char **start, off_t off,
int count, int *eof, void *data) int count, int *eof, void *data)
...@@ -430,7 +430,7 @@ int __init clps711xfb_init(void) ...@@ -430,7 +430,7 @@ int __init clps711xfb_init(void)
clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR); clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
/* Delay for a little while. */ /* Delay for a little while. */
for (i=0; i<65536*4; i++); udelay(100);
/* Power up the LCD DC-DC converter. */ /* Power up the LCD DC-DC converter. */
clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, PDDR); clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, PDDR);
...@@ -463,3 +463,7 @@ static void __exit clps711xfb_exit(void) ...@@ -463,3 +463,7 @@ static void __exit clps711xfb_exit(void)
module_init(clps711xfb_init); module_init(clps711xfb_init);
#endif #endif
module_exit(clps711xfb_exit); module_exit(clps711xfb_exit);
MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
MODULE_DESCRIPTION("CLPS711x framebuffer driver");
MODULE_LICENSE("GPL");
...@@ -1258,69 +1258,6 @@ sa1100fb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info) ...@@ -1258,69 +1258,6 @@ sa1100fb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info)
return 0; 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: * Formal definition of the VESA spec:
* On * On
...@@ -1388,6 +1325,69 @@ static int sa1100fb_blank(int blank, struct fb_info *info) ...@@ -1388,6 +1325,69 @@ static int sa1100fb_blank(int blank, struct fb_info *info)
return 0; 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) static int sa1100fb_updatevar(int con, struct fb_info *info)
{ {
DPRINTK("entered\n"); DPRINTK("entered\n");
......
...@@ -153,13 +153,13 @@ ...@@ -153,13 +153,13 @@
#define NODE_MAX_MEM_SHIFT 24 #define NODE_MAX_MEM_SHIFT 24
#define NODE_MAX_MEM_SIZE (1<<NODE_MAX_MEM_SHIFT) #define NODE_MAX_MEM_SIZE (1<<NODE_MAX_MEM_SHIFT)
#else
#define PFN_TO_NID(pfn) (0)
#endif /* CONFIG_DISCONTIGMEM */ #endif /* CONFIG_DISCONTIGMEM */
#endif /* CONFIG_ARCH_EDB7211 */ #endif /* CONFIG_ARCH_EDB7211 */
#ifndef PFN_TO_NID
#define PFN_TO_NID(pfn) (0)
#endif
#endif #endif
...@@ -74,6 +74,10 @@ extern void enable_dma(dmach_t channel); ...@@ -74,6 +74,10 @@ extern void enable_dma(dmach_t channel);
*/ */
extern void disable_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 /* Set the DMA scatter gather list for this channel
* *
* This should not be called if a DMA channel is enabled, * This should not be called if a DMA channel is enabled,
......
...@@ -198,6 +198,12 @@ ...@@ -198,6 +198,12 @@
#define USB_RESET_PWRSENSELOW (1 << 6) #define USB_RESET_PWRSENSELOW (1 << 6)
#define USB_RESET_PWRCTRLLOW (1 << 7) #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 * Serial Audio Controller
* *
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
extern void setup_initrd(unsigned int start, unsigned int size); extern void setup_initrd(unsigned int start, unsigned int size);
extern void setup_ramdisk(int doload, int prompt, int start, unsigned int rd_sz); extern void setup_ramdisk(int doload, int prompt, int start, unsigned int rd_sz);
struct tag;
struct machine_desc { struct machine_desc {
/* /*
* Note! The first four elements are used * Note! The first four elements are used
...@@ -41,7 +43,7 @@ struct machine_desc { ...@@ -41,7 +43,7 @@ struct machine_desc {
unsigned int reserve_lp2 :1; /* never has lp2 */ unsigned int reserve_lp2 :1; /* never has lp2 */
unsigned int soft_reboot :1; /* soft reboot */ unsigned int soft_reboot :1; /* soft reboot */
void (*fixup)(struct machine_desc *, void (*fixup)(struct machine_desc *,
struct param_struct *, char **, struct tag *, char **,
struct meminfo *); struct meminfo *);
void (*map_io)(void);/* IO mapping function */ void (*map_io)(void);/* IO mapping function */
void (*init_irq)(void); void (*init_irq)(void);
......
...@@ -12,27 +12,13 @@ struct pci_sys_data; ...@@ -12,27 +12,13 @@ struct pci_sys_data;
struct pci_bus; struct pci_bus;
struct hw_pci { 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 nr_controllers;
int (*setup)(int nr, struct pci_sys_data *); int (*setup)(int nr, struct pci_sys_data *);
struct pci_bus *(*scan)(int nr, struct pci_sys_data *); struct pci_bus *(*scan)(int nr, struct pci_sys_data *);
void (*preinit)(void); void (*preinit)(void);
void (*postinit)(void); void (*postinit)(void);
u8 (*swizzle)(struct pci_dev *dev, u8 *pin);
int (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin);
}; };
/* /*
...@@ -56,6 +42,11 @@ struct pci_sys_data { ...@@ -56,6 +42,11 @@ struct pci_sys_data {
*/ */
u8 pci_std_swizzle(struct pci_dev *dev, u8 *pinp); 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 * PCI controllers
*/ */
...@@ -70,7 +61,7 @@ extern void dc21285_postinit(void); ...@@ -70,7 +61,7 @@ extern void dc21285_postinit(void);
extern int via82c505_setup(int nr, struct pci_sys_data *); extern int via82c505_setup(int nr, struct pci_sys_data *);
extern struct pci_bus *via82c505_scan_bus(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 int pci_v3_setup(int nr, struct pci_sys_data *);
extern struct pci_bus *pci_v3_scan_bus(int nr, struct pci_sys_data *); extern struct pci_bus *pci_v3_scan_bus(int nr, struct pci_sys_data *);
......
...@@ -69,7 +69,7 @@ static inline void *phys_to_virt(unsigned long x) ...@@ -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 page_to_pfn(page) (((page) - mem_map) + PHYS_PFN_OFFSET)
#define pfn_to_page(pfn) ((mem_map + (pfn)) - 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_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT))
#define virt_addr_valid(kaddr) ((kaddr) >= PAGE_OFFSET && (kaddr) < (unsigned long)high_memory) #define virt_addr_valid(kaddr) ((kaddr) >= PAGE_OFFSET && (kaddr) < (unsigned long)high_memory)
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
extern unsigned long cr_no_alignment; /* defined in entry-armv.S */ extern unsigned long cr_no_alignment; /* defined in entry-armv.S */
extern unsigned long cr_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) #define vectors_base() ((cr_alignment & CR_V) ? 0xffff0000 : 0)
#else #else
#define vectors_base() (0) #define vectors_base() (0)
...@@ -192,7 +192,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size ...@@ -192,7 +192,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size
: "memory"); : "memory");
break; break;
#endif #endif
default: __bad_xchg(ptr, size); default: __bad_xchg(ptr, size), ret = 0;
} }
return ret; return ret;
......
#ifndef __ASM_ARM_PTRACE_H #ifndef __ASM_ARM_PTRACE_H
#define __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> #include <asm/proc/ptrace.h>
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
...@@ -11,11 +21,6 @@ ...@@ -11,11 +21,6 @@
(pc_pointer((regs)->ARM_pc)) (pc_pointer((regs)->ARM_pc))
#ifdef __KERNEL__ #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 *); extern void show_regs(struct pt_regs *);
#define predicate(x) (x & 0xf0000000) #define predicate(x) (x & 0xf0000000)
......
...@@ -28,7 +28,7 @@ typedef unsigned long mm_segment_t; /* domain register */ ...@@ -28,7 +28,7 @@ typedef unsigned long mm_segment_t; /* domain register */
* low level task data that entry.S needs immediate access to. * low level task data that entry.S needs immediate access to.
*/ */
struct thread_info { struct thread_info {
__u32 flags; /* low level flags */ unsigned long flags; /* low level flags */
__s32 preempt_count; /* 0 => preemptable, <0 => bug */ __s32 preempt_count; /* 0 => preemptable, <0 => bug */
mm_segment_t addr_limit; /* address limit */ mm_segment_t addr_limit; /* address limit */
__u32 cpu; /* cpu */ __u32 cpu; /* cpu */
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#ifndef __ASM_ARM_UNISTD_H #ifndef __ASM_ARM_UNISTD_H
#define __ASM_ARM_UNISTD_H #define __ASM_ARM_UNISTD_H
#include <linux/linkage.h>
#define __NR_SYSCALL_BASE 0x900000 #define __NR_SYSCALL_BASE 0x900000
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment