Commit 36b963a6 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://bk.arm.linux.org.uk/linux-2.6-rmk

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 8522703f 912eb572
......@@ -236,7 +236,7 @@ config SHARP_LOCOMO
config SHARP_SCOOP
bool
depends on PXA_SHARPSL
depends on PXA_SHARPSL || SA1100_COLLIE
default y
config FORCE_MAX_ZONEORDER
......
......@@ -406,7 +406,7 @@ err_str:
* calculate the offset.
*
* Returns:
* r3, r6 corrupted
* r3, r4, r6 corrupted
* r5 = proc_info pointer in physical address space
* r9 = cpuid
*/
......@@ -418,9 +418,9 @@ __lookup_processor_type:
add r5, r5, r3 @ convert virt addresses to
add r6, r6, r3 @ physical address space
mrc p15, 0, r9, c0, c0 @ get processor id
1: ldmia r5, {r3, r10} @ value, mask
and r10, r10, r9 @ mask wanted bits
teq r3, r10
1: ldmia r5, {r3, r4} @ value, mask
and r4, r4, r9 @ mask wanted bits
teq r3, r4
beq 2f
add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list)
cmp r5, r6
......@@ -428,6 +428,15 @@ __lookup_processor_type:
mov r5, #0 @ unknown processor
2: mov pc, lr
/*
* This provides a C-API version of the above function.
*/
ENTRY(lookup_processor_type)
stmfd sp!, {r4 - r6, r9, lr}
bl __lookup_processor_type
mov r0, r5
ldmfd sp!, {r4 - r6, r9, pc}
/*
* Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for
* more information about the __proc_info and __arch_info structures.
......@@ -464,3 +473,13 @@ __lookup_machine_type:
blt 1b
mov r5, #0 @ unknown machine
2: mov pc, lr
/*
* This provides a C-API version of the above function.
*/
ENTRY(lookup_machine_type)
stmfd sp!, {r4 - r6, lr}
mov r1, r0
bl __lookup_machine_type
mov r0, r5
ldmfd sp!, {r4 - r6, pc}
......@@ -221,12 +221,12 @@ static const char *proc_arch[] = {
#define CACHE_M(y) ((y) & (1 << 2))
#define CACHE_LINE(y) ((y) & 3)
static inline void dump_cache(const char *prefix, unsigned int cache)
static inline void dump_cache(const char *prefix, int cpu, unsigned int cache)
{
unsigned int mult = 2 + (CACHE_M(cache) ? 1 : 0);
printk("%s: %d bytes, associativity %d, %d byte lines, %d sets\n",
prefix,
printk("CPU%u: %s: %d bytes, associativity %d, %d byte lines, %d sets\n",
cpu, prefix,
mult << (8 + CACHE_SIZE(cache)),
(mult << CACHE_ASSOC(cache)) >> 1,
8 << CACHE_LINE(cache),
......@@ -234,18 +234,18 @@ static inline void dump_cache(const char *prefix, unsigned int cache)
CACHE_LINE(cache)));
}
static void __init dump_cpu_info(void)
static void __init dump_cpu_info(int cpu)
{
unsigned int info = read_cpuid(CPUID_CACHETYPE);
if (info != processor_id) {
printk("CPU: D %s %s cache\n", cache_is_vivt() ? "VIVT" : "VIPT",
printk("CPU%u: D %s %s cache\n", cpu, cache_is_vivt() ? "VIVT" : "VIPT",
cache_types[CACHE_TYPE(info)]);
if (CACHE_S(info)) {
dump_cache("CPU: I cache", CACHE_ISIZE(info));
dump_cache("CPU: D cache", CACHE_DSIZE(info));
dump_cache("I cache", cpu, CACHE_ISIZE(info));
dump_cache("D cache", cpu, CACHE_DSIZE(info));
} else {
dump_cache("CPU: cache", CACHE_ISIZE(info));
dump_cache("cache", cpu, CACHE_ISIZE(info));
}
}
}
......@@ -267,9 +267,15 @@ int cpu_architecture(void)
return cpu_arch;
}
/*
* These functions re-use the assembly code in head.S, which
* already provide the required functionality.
*/
extern struct proc_info_list *lookup_processor_type(void);
extern struct machine_desc *lookup_machine_type(unsigned int);
static void __init setup_processor(void)
{
extern struct proc_info_list __proc_info_begin, __proc_info_end;
struct proc_info_list *list;
/*
......@@ -277,15 +283,8 @@ static void __init setup_processor(void)
* types. The linker builds this table for us from the
* entries in arch/arm/mm/proc-*.S
*/
for (list = &__proc_info_begin; list < &__proc_info_end ; list++)
if ((processor_id & list->cpu_mask) == list->cpu_val)
break;
/*
* If processor type is unrecognised, then we
* can do nothing...
*/
if (list >= &__proc_info_end) {
list = lookup_processor_type();
if (!list) {
printk("CPU configuration botched (ID %08x), unable "
"to continue.\n", processor_id);
while (1);
......@@ -310,7 +309,7 @@ static void __init setup_processor(void)
cpu_name, processor_id, (int)processor_id & 15,
proc_arch[cpu_architecture()]);
dump_cpu_info();
dump_cpu_info(smp_processor_id());
sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
......@@ -321,22 +320,14 @@ static void __init setup_processor(void)
static struct machine_desc * __init setup_machine(unsigned int nr)
{
extern struct machine_desc __arch_info_begin, __arch_info_end;
struct machine_desc *list;
/*
* locate architecture in the list of supported architectures.
*/
for (list = &__arch_info_begin; list < &__arch_info_end; list++)
if (list->nr == nr)
break;
/*
* If the architecture type is not recognised, then we
* can co nothing...
* locate machine in the list of supported machines.
*/
if (list >= &__arch_info_end) {
printk("Architecture configuration botched (nr %d), unable "
list = lookup_machine_type(nr);
if (!list) {
printk("Machine configuration botched (nr %d), unable "
"to continue.\n", nr);
while (1);
}
......
......@@ -314,67 +314,57 @@ static void ipi_cpu_stop(unsigned int cpu)
*
* Bit 0 - Inter-processor function call
*/
void do_IPI(unsigned int ipimask, struct pt_regs *regs)
void do_IPI(struct pt_regs *regs)
{
unsigned int cpu = smp_processor_id();
struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
ipi->ipi_count++;
if (ipimask & (1 << 0)) {
for (;;) {
unsigned long msgs;
for (;;) {
unsigned long msgs;
spin_lock(&ipi->lock);
msgs = ipi->bits;
ipi->bits = 0;
spin_unlock(&ipi->lock);
spin_lock(&ipi->lock);
msgs = ipi->bits;
ipi->bits = 0;
spin_unlock(&ipi->lock);
if (!msgs)
break;
if (!msgs)
do {
unsigned nextmsg;
nextmsg = msgs & -msgs;
msgs &= ~nextmsg;
nextmsg = ffz(~nextmsg);
switch (nextmsg) {
case IPI_TIMER:
ipi_timer(regs);
break;
do {
unsigned nextmsg;
nextmsg = msgs & -msgs;
msgs &= ~nextmsg;
nextmsg = ffz(~nextmsg);
switch (nextmsg) {
case IPI_TIMER:
ipi_timer(regs);
break;
case IPI_RESCHEDULE:
/*
* nothing more to do - eveything is
* done on the interrupt return path
*/
break;
case IPI_CALL_FUNC:
ipi_call_function(cpu);
break;
case IPI_CPU_STOP:
ipi_cpu_stop(cpu);
break;
default:
printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%x\n",
cpu, nextmsg);
break;
}
} while (msgs);
}
ipimask &= ~0x01;
}
case IPI_RESCHEDULE:
/*
* nothing more to do - eveything is
* done on the interrupt return path
*/
break;
case IPI_CALL_FUNC:
ipi_call_function(cpu);
break;
if (ipimask) {
printk(KERN_CRIT "CPU %d: Unknown IPI signal %x!\n",
cpu, ipimask);
BUG();
case IPI_CPU_STOP:
ipi_cpu_stop(cpu);
break;
default:
printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%x\n",
cpu, nextmsg);
break;
}
} while (msgs);
}
}
......
......@@ -23,6 +23,7 @@
* 10-Jan-2005 BJD Removed include of s3c2410.h
* 14-Jan-2005 BJD Added clock init
* 15-Jan-2005 BJD Add serial port device definition
* 20-Jan-2005 BJD Use UPF_IOREMAP for ports
*/
#include <linux/kernel.h>
......@@ -78,10 +79,6 @@ static struct map_desc vr1000_iodesc[] __initdata = {
{ S3C2410_VA_ISA_BYTE, PA_CS2(BAST_PA_ISAIO), SZ_16M, MT_DEVICE },
{ S3C2410_VA_ISA_WORD, PA_CS3(BAST_PA_ISAIO), SZ_16M, MT_DEVICE },
/* serial ports */
{ VR1000_VA_SERIAL, VR1000_PA_SERIAL, SZ_1M, MT_DEVICE },
/* we could possibly compress the next set down into a set of smaller tables
* pagetables, but that would mean using an L2 section, and it still means
* we cannot actually feed the same register to an LDR due to 16K spacing
......@@ -183,42 +180,37 @@ static struct s3c2410_uartcfg vr1000_uartcfgs[] = {
#define VR1000_BAUDBASE (3692307)
#define VR1000_SERIAL_MEMBASE(x) ((void __iomem *)VR1000_VA_SERIAL + 0x80 + ((x) << 5))
#define VR1000_SERIAL_MAPBASE(x) (VR1000_PA_SERIAL + 0x80 + ((x) << 5))
static struct plat_serial8250_port serial_platform_data[] = {
[0] = {
.membase = VR1000_SERIAL_MEMBASE(0),
.mapbase = VR1000_SERIAL_MAPBASE(0),
.irq = IRQ_VR1000_SERIAL + 0,
.flags = UPF_BOOT_AUTOCONF,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
.iotype = UPIO_MEM,
.regshift = 0,
.uartclk = VR1000_BAUDBASE,
},
[1] = {
.membase = VR1000_SERIAL_MEMBASE(1),
.mapbase = VR1000_SERIAL_MAPBASE(1),
.irq = IRQ_VR1000_SERIAL + 1,
.flags = UPF_BOOT_AUTOCONF,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
.iotype = UPIO_MEM,
.regshift = 0,
.uartclk = VR1000_BAUDBASE,
},
[2] = {
.membase = VR1000_SERIAL_MEMBASE(2),
.mapbase = VR1000_SERIAL_MAPBASE(2),
.irq = IRQ_VR1000_SERIAL + 2,
.flags = UPF_BOOT_AUTOCONF,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
.iotype = UPIO_MEM,
.regshift = 0,
.uartclk = VR1000_BAUDBASE,
},
[3] = {
.membase = VR1000_SERIAL_MEMBASE(3),
.mapbase = VR1000_SERIAL_MAPBASE(3),
.irq = IRQ_VR1000_SERIAL + 3,
.flags = UPF_BOOT_AUTOCONF,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
.iotype = UPIO_MEM,
.regshift = 0,
.uartclk = VR1000_BAUDBASE,
......
......@@ -37,36 +37,34 @@
#include <asm/mach/map.h>
#include <asm/mach/serial_sa1100.h>
#include <asm/hardware/scoop.h>
#include <asm/hardware/locomo.h>
#include "generic.h"
static void __init scoop_init(void)
{
static struct resource collie_scoop_resources[] = {
[0] = {
.start = 0x40800000,
.end = 0x40800fff,
.flags = IORESOURCE_MEM,
},
};
#define COLLIE_SCP_INIT_DATA(adr,dat) (((adr)<<16)|(dat))
#define COLLIE_SCP_INIT_DATA_END ((unsigned long)-1)
static const unsigned long scp_init[] = {
COLLIE_SCP_INIT_DATA(COLLIE_SCP_MCR, 0x0140), // 00
COLLIE_SCP_INIT_DATA(COLLIE_SCP_MCR, 0x0100),
COLLIE_SCP_INIT_DATA(COLLIE_SCP_CDR, 0x0000), // 04
COLLIE_SCP_INIT_DATA(COLLIE_SCP_CPR, 0x0000), // 0C
COLLIE_SCP_INIT_DATA(COLLIE_SCP_CCR, 0x0000), // 10
COLLIE_SCP_INIT_DATA(COLLIE_SCP_IMR, 0x0000), // 18
COLLIE_SCP_INIT_DATA(COLLIE_SCP_IRM, 0x00FF), // 14
COLLIE_SCP_INIT_DATA(COLLIE_SCP_ISR, 0x0000), // 1C
COLLIE_SCP_INIT_DATA(COLLIE_SCP_IRM, 0x0000),
COLLIE_SCP_INIT_DATA(COLLIE_SCP_GPCR, COLLIE_SCP_IO_DIR), // 20
COLLIE_SCP_INIT_DATA(COLLIE_SCP_GPWR, COLLIE_SCP_IO_OUT), // 24
COLLIE_SCP_INIT_DATA_END
};
int i;
for (i = 0; scp_init[i] != COLLIE_SCP_INIT_DATA_END; i++) {
int adr = scp_init[i] >> 16;
COLLIE_SCP_REG(adr) = scp_init[i] & 0xFFFF;
}
static struct scoop_config collie_scoop_setup = {
.io_dir = COLLIE_SCOOP_IO_DIR,
.io_out = COLLIE_SCOOP_IO_OUT,
};
static struct platform_device colliescoop_device = {
.name = "sharp-scoop",
.id = -1,
.dev = {
.platform_data = &collie_scoop_setup,
},
.num_resources = ARRAY_SIZE(collie_scoop_resources),
.resource = collie_scoop_resources,
};
}
static struct resource locomo_resources[] = {
[0] = {
......@@ -90,6 +88,7 @@ static struct platform_device locomo_device = {
static struct platform_device *devices[] __initdata = {
&locomo_device,
&colliescoop_device,
};
static struct mtd_partition collie_partitions[] = {
......@@ -111,11 +110,11 @@ static struct mtd_partition collie_partitions[] = {
static void collie_set_vpp(int vpp)
{
COLLIE_SCP_REG_GPCR |= COLLIE_SCP_VPEN;
write_scoop_reg(SCOOP_GPCR, read_scoop_reg(SCOOP_GPCR) | COLLIE_SCP_VPEN);
if (vpp) {
COLLIE_SCP_REG_GPWR |= COLLIE_SCP_VPEN;
write_scoop_reg(SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) | COLLIE_SCP_VPEN);
} else {
COLLIE_SCP_REG_GPWR &= ~COLLIE_SCP_VPEN;
write_scoop_reg(SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) & ~COLLIE_SCP_VPEN);
}
}
......@@ -160,8 +159,6 @@ static void __init collie_init(void)
GPDR |= GPIO_32_768kHz;
TUCR = TUCR_32_768kHz;
scoop_init();
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
if (ret) {
printk(KERN_WARNING "collie: Unable to register LoCoMo device\n");
......@@ -175,7 +172,6 @@ static struct map_desc collie_io_desc[] __initdata = {
/* virtual physical length type */
{0xe8000000, 0x00000000, 0x02000000, MT_DEVICE}, /* 32M main flash (cs0) */
{0xea000000, 0x08000000, 0x02000000, MT_DEVICE}, /* 32M boot flash (cs1) */
{0xf0000000, 0x40000000, 0x01000000, MT_DEVICE}, /* 16M LOCOMO & SCOOP (cs4) */
};
static void __init collie_map_io(void)
......
......@@ -15,57 +15,20 @@
#include <linux/config.h>
#define CF_BUF_CTRL_BASE 0xF0800000
#define COLLIE_SCP_REG(adr) (*(volatile unsigned short*)(CF_BUF_CTRL_BASE+(adr)))
#define COLLIE_SCP_MCR 0x00
#define COLLIE_SCP_CDR 0x04
#define COLLIE_SCP_CSR 0x08
#define COLLIE_SCP_CPR 0x0C
#define COLLIE_SCP_CCR 0x10
#define COLLIE_SCP_IRR 0x14
#define COLLIE_SCP_IRM 0x14
#define COLLIE_SCP_IMR 0x18
#define COLLIE_SCP_ISR 0x1C
#define COLLIE_SCP_GPCR 0x20
#define COLLIE_SCP_GPWR 0x24
#define COLLIE_SCP_GPRR 0x28
#define COLLIE_SCP_REG_MCR COLLIE_SCP_REG(COLLIE_SCP_MCR)
#define COLLIE_SCP_REG_CDR COLLIE_SCP_REG(COLLIE_SCP_CDR)
#define COLLIE_SCP_REG_CSR COLLIE_SCP_REG(COLLIE_SCP_CSR)
#define COLLIE_SCP_REG_CPR COLLIE_SCP_REG(COLLIE_SCP_CPR)
#define COLLIE_SCP_REG_CCR COLLIE_SCP_REG(COLLIE_SCP_CCR)
#define COLLIE_SCP_REG_IRR COLLIE_SCP_REG(COLLIE_SCP_IRR)
#define COLLIE_SCP_REG_IRM COLLIE_SCP_REG(COLLIE_SCP_IRM)
#define COLLIE_SCP_REG_IMR COLLIE_SCP_REG(COLLIE_SCP_IMR)
#define COLLIE_SCP_REG_ISR COLLIE_SCP_REG(COLLIE_SCP_ISR)
#define COLLIE_SCP_REG_GPCR COLLIE_SCP_REG(COLLIE_SCP_GPCR)
#define COLLIE_SCP_REG_GPWR COLLIE_SCP_REG(COLLIE_SCP_GPWR)
#define COLLIE_SCP_REG_GPRR COLLIE_SCP_REG(COLLIE_SCP_GPRR)
#define COLLIE_SCP_GPCR_PA19 ( 1 << 9 )
#define COLLIE_SCP_GPCR_PA18 ( 1 << 8 )
#define COLLIE_SCP_GPCR_PA17 ( 1 << 7 )
#define COLLIE_SCP_GPCR_PA16 ( 1 << 6 )
#define COLLIE_SCP_GPCR_PA15 ( 1 << 5 )
#define COLLIE_SCP_GPCR_PA14 ( 1 << 4 )
#define COLLIE_SCP_GPCR_PA13 ( 1 << 3 )
#define COLLIE_SCP_GPCR_PA12 ( 1 << 2 )
#define COLLIE_SCP_GPCR_PA11 ( 1 << 1 )
#define COLLIE_SCP_CHARGE_ON COLLIE_SCP_GPCR_PA11
#define COLLIE_SCP_DIAG_BOOT1 COLLIE_SCP_GPCR_PA12
#define COLLIE_SCP_DIAG_BOOT2 COLLIE_SCP_GPCR_PA13
#define COLLIE_SCP_MUTE_L COLLIE_SCP_GPCR_PA14
#define COLLIE_SCP_MUTE_R COLLIE_SCP_GPCR_PA15
#define COLLIE_SCP_5VON COLLIE_SCP_GPCR_PA16
#define COLLIE_SCP_AMP_ON COLLIE_SCP_GPCR_PA17
#define COLLIE_SCP_VPEN COLLIE_SCP_GPCR_PA18
#define COLLIE_SCP_LB_VOL_CHG COLLIE_SCP_GPCR_PA19
#define COLLIE_SCP_IO_DIR ( COLLIE_SCP_CHARGE_ON | COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \
#define COLLIE_SCP_CHARGE_ON SCOOP_GPCR_PA11
#define COLLIE_SCP_DIAG_BOOT1 SCOOP_GPCR_PA12
#define COLLIE_SCP_DIAG_BOOT2 SCOOP_GPCR_PA13
#define COLLIE_SCP_MUTE_L SCOOP_GPCR_PA14
#define COLLIE_SCP_MUTE_R SCOOP_GPCR_PA15
#define COLLIE_SCP_5VON SCOOP_GPCR_PA16
#define COLLIE_SCP_AMP_ON SCOOP_GPCR_PA17
#define COLLIE_SCP_VPEN SCOOP_GPCR_PA18
#define COLLIE_SCP_LB_VOL_CHG SCOOP_GPCR_PA19
#define COLLIE_SCOOP_IO_DIR ( COLLIE_SCP_CHARGE_ON | COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \
COLLIE_SCP_5VON | COLLIE_SCP_AMP_ON | COLLIE_SCP_VPEN | \
COLLIE_SCP_LB_VOL_CHG )
#define COLLIE_SCP_IO_OUT ( COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | COLLIE_SCP_VPEN | \
#define COLLIE_SCOOP_IO_OUT ( COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | COLLIE_SCP_VPEN | \
COLLIE_SCP_CHARGE_ON )
/* GPIOs for which the generic definition doesn't say much */
......
......@@ -210,8 +210,8 @@ extern void _change_bit_le(int nr, volatile unsigned long * p);
extern int _test_and_set_bit_le(int nr, volatile unsigned long * p);
extern int _test_and_clear_bit_le(int nr, volatile unsigned long * p);
extern int _test_and_change_bit_le(int nr, volatile unsigned long * p);
extern int _find_first_zero_bit_le(void * p, unsigned size);
extern int _find_next_zero_bit_le(void * p, int size, int offset);
extern int _find_first_zero_bit_le(const void * p, unsigned size);
extern int _find_next_zero_bit_le(const void * p, int size, int offset);
extern int _find_first_bit_le(const unsigned long *p, unsigned size);
extern int _find_next_bit_le(const unsigned long *p, int size, int offset);
......
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