[ARM] move include/asm-arm to arch/arm/include/asm
Move platform independent header files to arch/arm/include/asm, leaving those in asm/arch* and asm/plat* alone. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Цей коміт міститься в:

зафіксовано
Russell King

джерело
ff4db0a043
коміт
4baa992243
3
arch/arm/include/asm/Kbuild
Звичайний файл
3
arch/arm/include/asm/Kbuild
Звичайний файл
@@ -0,0 +1,3 @@
|
||||
include include/asm-generic/Kbuild.asm
|
||||
|
||||
unifdef-y += hwcap.h
|
49
arch/arm/include/asm/a.out-core.h
Звичайний файл
49
arch/arm/include/asm/a.out-core.h
Звичайний файл
@@ -0,0 +1,49 @@
|
||||
/* a.out coredump register dumper
|
||||
*
|
||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_A_OUT_CORE_H
|
||||
#define _ASM_A_OUT_CORE_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/user.h>
|
||||
#include <linux/elfcore.h>
|
||||
|
||||
/*
|
||||
* fill in the user structure for an a.out core dump
|
||||
*/
|
||||
static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
dump->magic = CMAGIC;
|
||||
dump->start_code = tsk->mm->start_code;
|
||||
dump->start_stack = regs->ARM_sp & ~(PAGE_SIZE - 1);
|
||||
|
||||
dump->u_tsize = (tsk->mm->end_code - tsk->mm->start_code) >> PAGE_SHIFT;
|
||||
dump->u_dsize = (tsk->mm->brk - tsk->mm->start_data + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
dump->u_ssize = 0;
|
||||
|
||||
dump->u_debugreg[0] = tsk->thread.debug.bp[0].address;
|
||||
dump->u_debugreg[1] = tsk->thread.debug.bp[1].address;
|
||||
dump->u_debugreg[2] = tsk->thread.debug.bp[0].insn.arm;
|
||||
dump->u_debugreg[3] = tsk->thread.debug.bp[1].insn.arm;
|
||||
dump->u_debugreg[4] = tsk->thread.debug.nsaved;
|
||||
|
||||
if (dump->start_stack < 0x04000000)
|
||||
dump->u_ssize = (0x04000000 - dump->start_stack) >> PAGE_SHIFT;
|
||||
|
||||
dump->regs = *regs;
|
||||
dump->u_fpvalid = dump_fpu (regs, &dump->u_fp);
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_A_OUT_CORE_H */
|
34
arch/arm/include/asm/a.out.h
Звичайний файл
34
arch/arm/include/asm/a.out.h
Звичайний файл
@@ -0,0 +1,34 @@
|
||||
#ifndef __ARM_A_OUT_H__
|
||||
#define __ARM_A_OUT_H__
|
||||
|
||||
#include <linux/personality.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
struct exec
|
||||
{
|
||||
__u32 a_info; /* Use macros N_MAGIC, etc for access */
|
||||
__u32 a_text; /* length of text, in bytes */
|
||||
__u32 a_data; /* length of data, in bytes */
|
||||
__u32 a_bss; /* length of uninitialized data area for file, in bytes */
|
||||
__u32 a_syms; /* length of symbol table data in file, in bytes */
|
||||
__u32 a_entry; /* start address */
|
||||
__u32 a_trsize; /* length of relocation info for text, in bytes */
|
||||
__u32 a_drsize; /* length of relocation info for data, in bytes */
|
||||
};
|
||||
|
||||
/*
|
||||
* This is always the same
|
||||
*/
|
||||
#define N_TXTADDR(a) (0x00008000)
|
||||
|
||||
#define N_TRSIZE(a) ((a).a_trsize)
|
||||
#define N_DRSIZE(a) ((a).a_drsize)
|
||||
#define N_SYMSIZE(a) ((a).a_syms)
|
||||
|
||||
#define M_ARM 103
|
||||
|
||||
#ifndef LIBRARY_START_TEXT
|
||||
#define LIBRARY_START_TEXT (0x00c00000)
|
||||
#endif
|
||||
|
||||
#endif /* __A_OUT_GNU_H__ */
|
116
arch/arm/include/asm/assembler.h
Звичайний файл
116
arch/arm/include/asm/assembler.h
Звичайний файл
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* arch/arm/include/asm/assembler.h
|
||||
*
|
||||
* Copyright (C) 1996-2000 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.
|
||||
*
|
||||
* This file contains arm architecture specific defines
|
||||
* for the different processors.
|
||||
*
|
||||
* Do not include any C declarations in this file - it is included by
|
||||
* assembler source.
|
||||
*/
|
||||
#ifndef __ASSEMBLY__
|
||||
#error "Only include this from assembly code"
|
||||
#endif
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
/*
|
||||
* Endian independent macros for shifting bytes within registers.
|
||||
*/
|
||||
#ifndef __ARMEB__
|
||||
#define pull lsr
|
||||
#define push lsl
|
||||
#define get_byte_0 lsl #0
|
||||
#define get_byte_1 lsr #8
|
||||
#define get_byte_2 lsr #16
|
||||
#define get_byte_3 lsr #24
|
||||
#define put_byte_0 lsl #0
|
||||
#define put_byte_1 lsl #8
|
||||
#define put_byte_2 lsl #16
|
||||
#define put_byte_3 lsl #24
|
||||
#else
|
||||
#define pull lsl
|
||||
#define push lsr
|
||||
#define get_byte_0 lsr #24
|
||||
#define get_byte_1 lsr #16
|
||||
#define get_byte_2 lsr #8
|
||||
#define get_byte_3 lsl #0
|
||||
#define put_byte_0 lsl #24
|
||||
#define put_byte_1 lsl #16
|
||||
#define put_byte_2 lsl #8
|
||||
#define put_byte_3 lsl #0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Data preload for architectures that support it
|
||||
*/
|
||||
#if __LINUX_ARM_ARCH__ >= 5
|
||||
#define PLD(code...) code
|
||||
#else
|
||||
#define PLD(code...)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This can be used to enable code to cacheline align the destination
|
||||
* pointer when bulk writing to memory. Experiments on StrongARM and
|
||||
* XScale didn't show this a worthwhile thing to do when the cache is not
|
||||
* set to write-allocate (this would need further testing on XScale when WA
|
||||
* is used).
|
||||
*
|
||||
* On Feroceon there is much to gain however, regardless of cache mode.
|
||||
*/
|
||||
#ifdef CONFIG_CPU_FEROCEON
|
||||
#define CALGN(code...) code
|
||||
#else
|
||||
#define CALGN(code...)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Enable and disable interrupts
|
||||
*/
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
.macro disable_irq
|
||||
cpsid i
|
||||
.endm
|
||||
|
||||
.macro enable_irq
|
||||
cpsie i
|
||||
.endm
|
||||
#else
|
||||
.macro disable_irq
|
||||
msr cpsr_c, #PSR_I_BIT | SVC_MODE
|
||||
.endm
|
||||
|
||||
.macro enable_irq
|
||||
msr cpsr_c, #SVC_MODE
|
||||
.endm
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Save the current IRQ state and disable IRQs. Note that this macro
|
||||
* assumes FIQs are enabled, and that the processor is in SVC mode.
|
||||
*/
|
||||
.macro save_and_disable_irqs, oldcpsr
|
||||
mrs \oldcpsr, cpsr
|
||||
disable_irq
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Restore interrupt state previously stored in a register. We don't
|
||||
* guarantee that this will preserve the flags.
|
||||
*/
|
||||
.macro restore_irqs, oldcpsr
|
||||
msr cpsr_c, \oldcpsr
|
||||
.endm
|
||||
|
||||
#define USER(x...) \
|
||||
9999: x; \
|
||||
.section __ex_table,"a"; \
|
||||
.align 3; \
|
||||
.long 9999b,9001f; \
|
||||
.previous
|
212
arch/arm/include/asm/atomic.h
Звичайний файл
212
arch/arm/include/asm/atomic.h
Звичайний файл
@@ -0,0 +1,212 @@
|
||||
/*
|
||||
* arch/arm/include/asm/atomic.h
|
||||
*
|
||||
* Copyright (C) 1996 Russell King.
|
||||
* Copyright (C) 2002 Deep Blue Solutions Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __ASM_ARM_ATOMIC_H
|
||||
#define __ASM_ARM_ATOMIC_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
typedef struct { volatile int counter; } atomic_t;
|
||||
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define atomic_read(v) ((v)->counter)
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
|
||||
/*
|
||||
* ARMv6 UP and SMP safe atomic ops. We use load exclusive and
|
||||
* store exclusive to ensure that these are atomic. We may loop
|
||||
* to ensure that the update happens. Writing to 'v->counter'
|
||||
* without using the following operations WILL break the atomic
|
||||
* nature of these ops.
|
||||
*/
|
||||
static inline void atomic_set(atomic_t *v, int i)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
__asm__ __volatile__("@ atomic_set\n"
|
||||
"1: ldrex %0, [%1]\n"
|
||||
" strex %0, %2, [%1]\n"
|
||||
" teq %0, #0\n"
|
||||
" bne 1b"
|
||||
: "=&r" (tmp)
|
||||
: "r" (&v->counter), "r" (i)
|
||||
: "cc");
|
||||
}
|
||||
|
||||
static inline int atomic_add_return(int i, atomic_t *v)
|
||||
{
|
||||
unsigned long tmp;
|
||||
int result;
|
||||
|
||||
__asm__ __volatile__("@ atomic_add_return\n"
|
||||
"1: ldrex %0, [%2]\n"
|
||||
" add %0, %0, %3\n"
|
||||
" strex %1, %0, [%2]\n"
|
||||
" teq %1, #0\n"
|
||||
" bne 1b"
|
||||
: "=&r" (result), "=&r" (tmp)
|
||||
: "r" (&v->counter), "Ir" (i)
|
||||
: "cc");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline int atomic_sub_return(int i, atomic_t *v)
|
||||
{
|
||||
unsigned long tmp;
|
||||
int result;
|
||||
|
||||
__asm__ __volatile__("@ atomic_sub_return\n"
|
||||
"1: ldrex %0, [%2]\n"
|
||||
" sub %0, %0, %3\n"
|
||||
" strex %1, %0, [%2]\n"
|
||||
" teq %1, #0\n"
|
||||
" bne 1b"
|
||||
: "=&r" (result), "=&r" (tmp)
|
||||
: "r" (&v->counter), "Ir" (i)
|
||||
: "cc");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
|
||||
{
|
||||
unsigned long oldval, res;
|
||||
|
||||
do {
|
||||
__asm__ __volatile__("@ atomic_cmpxchg\n"
|
||||
"ldrex %1, [%2]\n"
|
||||
"mov %0, #0\n"
|
||||
"teq %1, %3\n"
|
||||
"strexeq %0, %4, [%2]\n"
|
||||
: "=&r" (res), "=&r" (oldval)
|
||||
: "r" (&ptr->counter), "Ir" (old), "r" (new)
|
||||
: "cc");
|
||||
} while (res);
|
||||
|
||||
return oldval;
|
||||
}
|
||||
|
||||
static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
|
||||
{
|
||||
unsigned long tmp, tmp2;
|
||||
|
||||
__asm__ __volatile__("@ atomic_clear_mask\n"
|
||||
"1: ldrex %0, [%2]\n"
|
||||
" bic %0, %0, %3\n"
|
||||
" strex %1, %0, [%2]\n"
|
||||
" teq %1, #0\n"
|
||||
" bne 1b"
|
||||
: "=&r" (tmp), "=&r" (tmp2)
|
||||
: "r" (addr), "Ir" (mask)
|
||||
: "cc");
|
||||
}
|
||||
|
||||
#else /* ARM_ARCH_6 */
|
||||
|
||||
#include <asm/system.h>
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#error SMP not supported on pre-ARMv6 CPUs
|
||||
#endif
|
||||
|
||||
#define atomic_set(v,i) (((v)->counter) = (i))
|
||||
|
||||
static inline int atomic_add_return(int i, atomic_t *v)
|
||||
{
|
||||
unsigned long flags;
|
||||
int val;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
val = v->counter;
|
||||
v->counter = val += i;
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline int atomic_sub_return(int i, atomic_t *v)
|
||||
{
|
||||
unsigned long flags;
|
||||
int val;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
val = v->counter;
|
||||
v->counter = val -= i;
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
{
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
ret = v->counter;
|
||||
if (likely(ret == old))
|
||||
v->counter = new;
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
*addr &= ~mask;
|
||||
raw_local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#endif /* __LINUX_ARM_ARCH__ */
|
||||
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
|
||||
static inline int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int c, old;
|
||||
|
||||
c = atomic_read(v);
|
||||
while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c)
|
||||
c = old;
|
||||
return c != u;
|
||||
}
|
||||
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
|
||||
|
||||
#define atomic_add(i, v) (void) atomic_add_return(i, v)
|
||||
#define atomic_inc(v) (void) atomic_add_return(1, v)
|
||||
#define atomic_sub(i, v) (void) atomic_sub_return(i, v)
|
||||
#define atomic_dec(v) (void) atomic_sub_return(1, v)
|
||||
|
||||
#define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0)
|
||||
#define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0)
|
||||
#define atomic_inc_return(v) (atomic_add_return(1, v))
|
||||
#define atomic_dec_return(v) (atomic_sub_return(1, v))
|
||||
#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
|
||||
|
||||
#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
|
||||
|
||||
/* Atomic operations are already serializing on ARM */
|
||||
#define smp_mb__before_atomic_dec() barrier()
|
||||
#define smp_mb__after_atomic_dec() barrier()
|
||||
#define smp_mb__before_atomic_inc() barrier()
|
||||
#define smp_mb__after_atomic_inc() barrier()
|
||||
|
||||
#include <asm-generic/atomic.h>
|
||||
#endif
|
||||
#endif
|
4
arch/arm/include/asm/auxvec.h
Звичайний файл
4
arch/arm/include/asm/auxvec.h
Звичайний файл
@@ -0,0 +1,4 @@
|
||||
#ifndef __ASMARM_AUXVEC_H
|
||||
#define __ASMARM_AUXVEC_H
|
||||
|
||||
#endif
|
340
arch/arm/include/asm/bitops.h
Звичайний файл
340
arch/arm/include/asm/bitops.h
Звичайний файл
@@ -0,0 +1,340 @@
|
||||
/*
|
||||
* Copyright 1995, Russell King.
|
||||
* Various bits and pieces copyrights include:
|
||||
* Linus Torvalds (test_bit).
|
||||
* Big endian support: Copyright 2001, Nicolas Pitre
|
||||
* reworked by rmk.
|
||||
*
|
||||
* bit 0 is the LSB of an "unsigned long" quantity.
|
||||
*
|
||||
* Please note that the code in this file should never be included
|
||||
* from user space. Many of these are not implemented in assembler
|
||||
* since they would be too costly. Also, they require privileged
|
||||
* instructions (which are not available from user mode) to ensure
|
||||
* that they are atomic.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_BITOPS_H
|
||||
#define __ASM_ARM_BITOPS_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifndef _LINUX_BITOPS_H
|
||||
#error only <linux/bitops.h> can be included directly
|
||||
#endif
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define smp_mb__before_clear_bit() mb()
|
||||
#define smp_mb__after_clear_bit() mb()
|
||||
|
||||
/*
|
||||
* These functions are the basis of our bit ops.
|
||||
*
|
||||
* First, the atomic bitops. These use native endian.
|
||||
*/
|
||||
static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long mask = 1UL << (bit & 31);
|
||||
|
||||
p += bit >> 5;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
*p |= mask;
|
||||
raw_local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void ____atomic_clear_bit(unsigned int bit, volatile unsigned long *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long mask = 1UL << (bit & 31);
|
||||
|
||||
p += bit >> 5;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
*p &= ~mask;
|
||||
raw_local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void ____atomic_change_bit(unsigned int bit, volatile unsigned long *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long mask = 1UL << (bit & 31);
|
||||
|
||||
p += bit >> 5;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
*p ^= mask;
|
||||
raw_local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline int
|
||||
____atomic_test_and_set_bit(unsigned int bit, volatile unsigned long *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int res;
|
||||
unsigned long mask = 1UL << (bit & 31);
|
||||
|
||||
p += bit >> 5;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
res = *p;
|
||||
*p = res | mask;
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
return res & mask;
|
||||
}
|
||||
|
||||
static inline int
|
||||
____atomic_test_and_clear_bit(unsigned int bit, volatile unsigned long *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int res;
|
||||
unsigned long mask = 1UL << (bit & 31);
|
||||
|
||||
p += bit >> 5;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
res = *p;
|
||||
*p = res & ~mask;
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
return res & mask;
|
||||
}
|
||||
|
||||
static inline int
|
||||
____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int res;
|
||||
unsigned long mask = 1UL << (bit & 31);
|
||||
|
||||
p += bit >> 5;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
res = *p;
|
||||
*p = res ^ mask;
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
return res & mask;
|
||||
}
|
||||
|
||||
#include <asm-generic/bitops/non-atomic.h>
|
||||
|
||||
/*
|
||||
* A note about Endian-ness.
|
||||
* -------------------------
|
||||
*
|
||||
* When the ARM is put into big endian mode via CR15, the processor
|
||||
* merely swaps the order of bytes within words, thus:
|
||||
*
|
||||
* ------------ physical data bus bits -----------
|
||||
* D31 ... D24 D23 ... D16 D15 ... D8 D7 ... D0
|
||||
* little byte 3 byte 2 byte 1 byte 0
|
||||
* big byte 0 byte 1 byte 2 byte 3
|
||||
*
|
||||
* This means that reading a 32-bit word at address 0 returns the same
|
||||
* value irrespective of the endian mode bit.
|
||||
*
|
||||
* Peripheral devices should be connected with the data bus reversed in
|
||||
* "Big Endian" mode. ARM Application Note 61 is applicable, and is
|
||||
* available from http://www.arm.com/.
|
||||
*
|
||||
* The following assumes that the data bus connectivity for big endian
|
||||
* mode has been followed.
|
||||
*
|
||||
* Note that bit 0 is defined to be 32-bit word bit 0, not byte 0 bit 0.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Little endian assembly bitops. nr = 0 -> byte 0 bit 0.
|
||||
*/
|
||||
extern void _set_bit_le(int nr, volatile unsigned long * p);
|
||||
extern void _clear_bit_le(int nr, volatile unsigned long * p);
|
||||
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(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);
|
||||
|
||||
/*
|
||||
* Big endian assembly bitops. nr = 0 -> byte 3 bit 0.
|
||||
*/
|
||||
extern void _set_bit_be(int nr, volatile unsigned long * p);
|
||||
extern void _clear_bit_be(int nr, volatile unsigned long * p);
|
||||
extern void _change_bit_be(int nr, volatile unsigned long * p);
|
||||
extern int _test_and_set_bit_be(int nr, volatile unsigned long * p);
|
||||
extern int _test_and_clear_bit_be(int nr, volatile unsigned long * p);
|
||||
extern int _test_and_change_bit_be(int nr, volatile unsigned long * p);
|
||||
extern int _find_first_zero_bit_be(const void * p, unsigned size);
|
||||
extern int _find_next_zero_bit_be(const void * p, int size, int offset);
|
||||
extern int _find_first_bit_be(const unsigned long *p, unsigned size);
|
||||
extern int _find_next_bit_be(const unsigned long *p, int size, int offset);
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
/*
|
||||
* The __* form of bitops are non-atomic and may be reordered.
|
||||
*/
|
||||
#define ATOMIC_BITOP_LE(name,nr,p) \
|
||||
(__builtin_constant_p(nr) ? \
|
||||
____atomic_##name(nr, p) : \
|
||||
_##name##_le(nr,p))
|
||||
|
||||
#define ATOMIC_BITOP_BE(name,nr,p) \
|
||||
(__builtin_constant_p(nr) ? \
|
||||
____atomic_##name(nr, p) : \
|
||||
_##name##_be(nr,p))
|
||||
#else
|
||||
#define ATOMIC_BITOP_LE(name,nr,p) _##name##_le(nr,p)
|
||||
#define ATOMIC_BITOP_BE(name,nr,p) _##name##_be(nr,p)
|
||||
#endif
|
||||
|
||||
#define NONATOMIC_BITOP(name,nr,p) \
|
||||
(____nonatomic_##name(nr, p))
|
||||
|
||||
#ifndef __ARMEB__
|
||||
/*
|
||||
* These are the little endian, atomic definitions.
|
||||
*/
|
||||
#define set_bit(nr,p) ATOMIC_BITOP_LE(set_bit,nr,p)
|
||||
#define clear_bit(nr,p) ATOMIC_BITOP_LE(clear_bit,nr,p)
|
||||
#define change_bit(nr,p) ATOMIC_BITOP_LE(change_bit,nr,p)
|
||||
#define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p)
|
||||
#define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p)
|
||||
#define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p)
|
||||
#define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz)
|
||||
#define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off)
|
||||
#define find_first_bit(p,sz) _find_first_bit_le(p,sz)
|
||||
#define find_next_bit(p,sz,off) _find_next_bit_le(p,sz,off)
|
||||
|
||||
#define WORD_BITOFF_TO_LE(x) ((x))
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* These are the big endian, atomic definitions.
|
||||
*/
|
||||
#define set_bit(nr,p) ATOMIC_BITOP_BE(set_bit,nr,p)
|
||||
#define clear_bit(nr,p) ATOMIC_BITOP_BE(clear_bit,nr,p)
|
||||
#define change_bit(nr,p) ATOMIC_BITOP_BE(change_bit,nr,p)
|
||||
#define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p)
|
||||
#define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p)
|
||||
#define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p)
|
||||
#define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz)
|
||||
#define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off)
|
||||
#define find_first_bit(p,sz) _find_first_bit_be(p,sz)
|
||||
#define find_next_bit(p,sz,off) _find_next_bit_be(p,sz,off)
|
||||
|
||||
#define WORD_BITOFF_TO_LE(x) ((x) ^ 0x18)
|
||||
|
||||
#endif
|
||||
|
||||
#if __LINUX_ARM_ARCH__ < 5
|
||||
|
||||
#include <asm-generic/bitops/ffz.h>
|
||||
#include <asm-generic/bitops/__ffs.h>
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/ffs.h>
|
||||
|
||||
#else
|
||||
|
||||
static inline int constant_fls(int x)
|
||||
{
|
||||
int r = 32;
|
||||
|
||||
if (!x)
|
||||
return 0;
|
||||
if (!(x & 0xffff0000u)) {
|
||||
x <<= 16;
|
||||
r -= 16;
|
||||
}
|
||||
if (!(x & 0xff000000u)) {
|
||||
x <<= 8;
|
||||
r -= 8;
|
||||
}
|
||||
if (!(x & 0xf0000000u)) {
|
||||
x <<= 4;
|
||||
r -= 4;
|
||||
}
|
||||
if (!(x & 0xc0000000u)) {
|
||||
x <<= 2;
|
||||
r -= 2;
|
||||
}
|
||||
if (!(x & 0x80000000u)) {
|
||||
x <<= 1;
|
||||
r -= 1;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
* On ARMv5 and above those functions can be implemented around
|
||||
* the clz instruction for much better code efficiency.
|
||||
*/
|
||||
|
||||
#define __fls(x) \
|
||||
( __builtin_constant_p(x) ? constant_fls(x) : \
|
||||
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
|
||||
|
||||
/* Implement fls() in C so that 64-bit args are suitably truncated */
|
||||
static inline int fls(int x)
|
||||
{
|
||||
return __fls(x);
|
||||
}
|
||||
|
||||
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
|
||||
#define __ffs(x) (ffs(x) - 1)
|
||||
#define ffz(x) __ffs( ~(x) )
|
||||
|
||||
#endif
|
||||
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
|
||||
#include <asm-generic/bitops/sched.h>
|
||||
#include <asm-generic/bitops/hweight.h>
|
||||
#include <asm-generic/bitops/lock.h>
|
||||
|
||||
/*
|
||||
* Ext2 is defined to use little-endian byte ordering.
|
||||
* These do not need to be atomic.
|
||||
*/
|
||||
#define ext2_set_bit(nr,p) \
|
||||
__test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define ext2_set_bit_atomic(lock,nr,p) \
|
||||
test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define ext2_clear_bit(nr,p) \
|
||||
__test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define ext2_clear_bit_atomic(lock,nr,p) \
|
||||
test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define ext2_test_bit(nr,p) \
|
||||
test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define ext2_find_first_zero_bit(p,sz) \
|
||||
_find_first_zero_bit_le(p,sz)
|
||||
#define ext2_find_next_zero_bit(p,sz,off) \
|
||||
_find_next_zero_bit_le(p,sz,off)
|
||||
#define ext2_find_next_bit(p, sz, off) \
|
||||
_find_next_bit_le(p, sz, off)
|
||||
|
||||
/*
|
||||
* Minix is defined to use little-endian byte ordering.
|
||||
* These do not need to be atomic.
|
||||
*/
|
||||
#define minix_set_bit(nr,p) \
|
||||
__set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define minix_test_bit(nr,p) \
|
||||
test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define minix_test_and_set_bit(nr,p) \
|
||||
__test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define minix_test_and_clear_bit(nr,p) \
|
||||
__test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
|
||||
#define minix_find_first_zero_bit(p,sz) \
|
||||
_find_first_zero_bit_le(p,sz)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ARM_BITOPS_H */
|
24
arch/arm/include/asm/bug.h
Звичайний файл
24
arch/arm/include/asm/bug.h
Звичайний файл
@@ -0,0 +1,24 @@
|
||||
#ifndef _ASMARM_BUG_H
|
||||
#define _ASMARM_BUG_H
|
||||
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
extern void __bug(const char *file, int line) __attribute__((noreturn));
|
||||
|
||||
/* give file/line information */
|
||||
#define BUG() __bug(__FILE__, __LINE__)
|
||||
|
||||
#else
|
||||
|
||||
/* this just causes an oops */
|
||||
#define BUG() (*(int *)0 = 0)
|
||||
|
||||
#endif
|
||||
|
||||
#define HAVE_ARCH_BUG
|
||||
#endif
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#endif
|
21
arch/arm/include/asm/bugs.h
Звичайний файл
21
arch/arm/include/asm/bugs.h
Звичайний файл
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* arch/arm/include/asm/bugs.h
|
||||
*
|
||||
* Copyright (C) 1995-2003 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.
|
||||
*/
|
||||
#ifndef __ASM_BUGS_H
|
||||
#define __ASM_BUGS_H
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern void check_writebuffer_bugs(void);
|
||||
|
||||
#define check_bugs() check_writebuffer_bugs()
|
||||
#else
|
||||
#define check_bugs() do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
58
arch/arm/include/asm/byteorder.h
Звичайний файл
58
arch/arm/include/asm/byteorder.h
Звичайний файл
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* arch/arm/include/asm/byteorder.h
|
||||
*
|
||||
* ARM Endian-ness. In little endian mode, the data bus is connected such
|
||||
* that byte accesses appear as:
|
||||
* 0 = d0...d7, 1 = d8...d15, 2 = d16...d23, 3 = d24...d31
|
||||
* and word accesses (data or instruction) appear as:
|
||||
* d0...d31
|
||||
*
|
||||
* When in big endian mode, byte accesses appear as:
|
||||
* 0 = d24...d31, 1 = d16...d23, 2 = d8...d15, 3 = d0...d7
|
||||
* and word accesses (data or instruction) appear as:
|
||||
* d0...d31
|
||||
*/
|
||||
#ifndef __ASM_ARM_BYTEORDER_H
|
||||
#define __ASM_ARM_BYTEORDER_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||
{
|
||||
__u32 t;
|
||||
|
||||
#ifndef __thumb__
|
||||
if (!__builtin_constant_p(x)) {
|
||||
/*
|
||||
* The compiler needs a bit of a hint here to always do the
|
||||
* right thing and not screw it up to different degrees
|
||||
* depending on the gcc version.
|
||||
*/
|
||||
asm ("eor\t%0, %1, %1, ror #16" : "=r" (t) : "r" (x));
|
||||
} else
|
||||
#endif
|
||||
t = x ^ ((x << 16) | (x >> 16)); /* eor r1,r0,r0,ror #16 */
|
||||
|
||||
x = (x << 24) | (x >> 8); /* mov r0,r0,ror #8 */
|
||||
t &= ~0x00FF0000; /* bic r1,r1,#0x00FF0000 */
|
||||
x ^= (t >> 8); /* eor r0,r0,r1,lsr #8 */
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
#define __arch__swab32(x) ___arch__swab32(x)
|
||||
|
||||
#if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
|
||||
# define __BYTEORDER_HAS_U64__
|
||||
# define __SWAB_64_THRU_32__
|
||||
#endif
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#include <linux/byteorder/big_endian.h>
|
||||
#else
|
||||
#include <linux/byteorder/little_endian.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
10
arch/arm/include/asm/cache.h
Звичайний файл
10
arch/arm/include/asm/cache.h
Звичайний файл
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* arch/arm/include/asm/cache.h
|
||||
*/
|
||||
#ifndef __ASMARM_CACHE_H
|
||||
#define __ASMARM_CACHE_H
|
||||
|
||||
#define L1_CACHE_SHIFT 5
|
||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||
|
||||
#endif
|
537
arch/arm/include/asm/cacheflush.h
Звичайний файл
537
arch/arm/include/asm/cacheflush.h
Звичайний файл
@@ -0,0 +1,537 @@
|
||||
/*
|
||||
* arch/arm/include/asm/cacheflush.h
|
||||
*
|
||||
* Copyright (C) 1999-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.
|
||||
*/
|
||||
#ifndef _ASMARM_CACHEFLUSH_H
|
||||
#define _ASMARM_CACHEFLUSH_H
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/glue.h>
|
||||
#include <asm/shmparam.h>
|
||||
|
||||
#define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
|
||||
|
||||
/*
|
||||
* Cache Model
|
||||
* ===========
|
||||
*/
|
||||
#undef _CACHE
|
||||
#undef MULTI_CACHE
|
||||
|
||||
#if defined(CONFIG_CPU_CACHE_V3)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE v3
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_CACHE_V4)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE v4
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \
|
||||
defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020)
|
||||
# define MULTI_CACHE 1
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_ARM926T)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE arm926
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_ARM940T)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE arm940
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_ARM946E)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE arm946
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_CACHE_V4WB)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE v4wb
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_XSCALE)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE xscale
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_XSC3)
|
||||
# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
# else
|
||||
# define _CACHE xsc3
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_FEROCEON)
|
||||
# define MULTI_CACHE 1
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_V6)
|
||||
//# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
//# else
|
||||
//# define _CACHE v6
|
||||
//# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_V7)
|
||||
//# ifdef _CACHE
|
||||
# define MULTI_CACHE 1
|
||||
//# else
|
||||
//# define _CACHE v7
|
||||
//# endif
|
||||
#endif
|
||||
|
||||
#if !defined(_CACHE) && !defined(MULTI_CACHE)
|
||||
#error Unknown cache maintainence model
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This flag is used to indicate that the page pointed to by a pte
|
||||
* is dirty and requires cleaning before returning it to the user.
|
||||
*/
|
||||
#define PG_dcache_dirty PG_arch_1
|
||||
|
||||
/*
|
||||
* MM Cache Management
|
||||
* ===================
|
||||
*
|
||||
* The arch/arm/mm/cache-*.S and arch/arm/mm/proc-*.S files
|
||||
* implement these methods.
|
||||
*
|
||||
* Start addresses are inclusive and end addresses are exclusive;
|
||||
* start addresses should be rounded down, end addresses up.
|
||||
*
|
||||
* See Documentation/cachetlb.txt for more information.
|
||||
* Please note that the implementation of these, and the required
|
||||
* effects are cache-type (VIVT/VIPT/PIPT) specific.
|
||||
*
|
||||
* flush_cache_kern_all()
|
||||
*
|
||||
* Unconditionally clean and invalidate the entire cache.
|
||||
*
|
||||
* flush_cache_user_mm(mm)
|
||||
*
|
||||
* Clean and invalidate all user space cache entries
|
||||
* before a change of page tables.
|
||||
*
|
||||
* flush_cache_user_range(start, end, flags)
|
||||
*
|
||||
* Clean and invalidate a range of cache entries in the
|
||||
* specified address space before a change of page tables.
|
||||
* - start - user start address (inclusive, page aligned)
|
||||
* - end - user end address (exclusive, page aligned)
|
||||
* - flags - vma->vm_flags field
|
||||
*
|
||||
* coherent_kern_range(start, end)
|
||||
*
|
||||
* Ensure coherency between the Icache and the Dcache in the
|
||||
* region described by start, end. If you have non-snooping
|
||||
* Harvard caches, you need to implement this function.
|
||||
* - start - virtual start address
|
||||
* - end - virtual end address
|
||||
*
|
||||
* DMA Cache Coherency
|
||||
* ===================
|
||||
*
|
||||
* dma_inv_range(start, end)
|
||||
*
|
||||
* Invalidate (discard) the specified virtual address range.
|
||||
* May not write back any entries. If 'start' or 'end'
|
||||
* are not cache line aligned, those lines must be written
|
||||
* back.
|
||||
* - start - virtual start address
|
||||
* - end - virtual end address
|
||||
*
|
||||
* dma_clean_range(start, end)
|
||||
*
|
||||
* Clean (write back) the specified virtual address range.
|
||||
* - start - virtual start address
|
||||
* - end - virtual end address
|
||||
*
|
||||
* dma_flush_range(start, end)
|
||||
*
|
||||
* Clean and invalidate the specified virtual address range.
|
||||
* - start - virtual start address
|
||||
* - end - virtual end address
|
||||
*/
|
||||
|
||||
struct cpu_cache_fns {
|
||||
void (*flush_kern_all)(void);
|
||||
void (*flush_user_all)(void);
|
||||
void (*flush_user_range)(unsigned long, unsigned long, unsigned int);
|
||||
|
||||
void (*coherent_kern_range)(unsigned long, unsigned long);
|
||||
void (*coherent_user_range)(unsigned long, unsigned long);
|
||||
void (*flush_kern_dcache_page)(void *);
|
||||
|
||||
void (*dma_inv_range)(const void *, const void *);
|
||||
void (*dma_clean_range)(const void *, const void *);
|
||||
void (*dma_flush_range)(const void *, const void *);
|
||||
};
|
||||
|
||||
struct outer_cache_fns {
|
||||
void (*inv_range)(unsigned long, unsigned long);
|
||||
void (*clean_range)(unsigned long, unsigned long);
|
||||
void (*flush_range)(unsigned long, unsigned long);
|
||||
};
|
||||
|
||||
/*
|
||||
* Select the calling method
|
||||
*/
|
||||
#ifdef MULTI_CACHE
|
||||
|
||||
extern struct cpu_cache_fns cpu_cache;
|
||||
|
||||
#define __cpuc_flush_kern_all cpu_cache.flush_kern_all
|
||||
#define __cpuc_flush_user_all cpu_cache.flush_user_all
|
||||
#define __cpuc_flush_user_range cpu_cache.flush_user_range
|
||||
#define __cpuc_coherent_kern_range cpu_cache.coherent_kern_range
|
||||
#define __cpuc_coherent_user_range cpu_cache.coherent_user_range
|
||||
#define __cpuc_flush_dcache_page cpu_cache.flush_kern_dcache_page
|
||||
|
||||
/*
|
||||
* These are private to the dma-mapping API. Do not use directly.
|
||||
* Their sole purpose is to ensure that data held in the cache
|
||||
* is visible to DMA, or data written by DMA to system memory is
|
||||
* visible to the CPU.
|
||||
*/
|
||||
#define dmac_inv_range cpu_cache.dma_inv_range
|
||||
#define dmac_clean_range cpu_cache.dma_clean_range
|
||||
#define dmac_flush_range cpu_cache.dma_flush_range
|
||||
|
||||
#else
|
||||
|
||||
#define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all)
|
||||
#define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all)
|
||||
#define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range)
|
||||
#define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range)
|
||||
#define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range)
|
||||
#define __cpuc_flush_dcache_page __glue(_CACHE,_flush_kern_dcache_page)
|
||||
|
||||
extern void __cpuc_flush_kern_all(void);
|
||||
extern void __cpuc_flush_user_all(void);
|
||||
extern void __cpuc_flush_user_range(unsigned long, unsigned long, unsigned int);
|
||||
extern void __cpuc_coherent_kern_range(unsigned long, unsigned long);
|
||||
extern void __cpuc_coherent_user_range(unsigned long, unsigned long);
|
||||
extern void __cpuc_flush_dcache_page(void *);
|
||||
|
||||
/*
|
||||
* These are private to the dma-mapping API. Do not use directly.
|
||||
* Their sole purpose is to ensure that data held in the cache
|
||||
* is visible to DMA, or data written by DMA to system memory is
|
||||
* visible to the CPU.
|
||||
*/
|
||||
#define dmac_inv_range __glue(_CACHE,_dma_inv_range)
|
||||
#define dmac_clean_range __glue(_CACHE,_dma_clean_range)
|
||||
#define dmac_flush_range __glue(_CACHE,_dma_flush_range)
|
||||
|
||||
extern void dmac_inv_range(const void *, const void *);
|
||||
extern void dmac_clean_range(const void *, const void *);
|
||||
extern void dmac_flush_range(const void *, const void *);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OUTER_CACHE
|
||||
|
||||
extern struct outer_cache_fns outer_cache;
|
||||
|
||||
static inline void outer_inv_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
if (outer_cache.inv_range)
|
||||
outer_cache.inv_range(start, end);
|
||||
}
|
||||
static inline void outer_clean_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
if (outer_cache.clean_range)
|
||||
outer_cache.clean_range(start, end);
|
||||
}
|
||||
static inline void outer_flush_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
if (outer_cache.flush_range)
|
||||
outer_cache.flush_range(start, end);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void outer_inv_range(unsigned long start, unsigned long end)
|
||||
{ }
|
||||
static inline void outer_clean_range(unsigned long start, unsigned long end)
|
||||
{ }
|
||||
static inline void outer_flush_range(unsigned long start, unsigned long end)
|
||||
{ }
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* flush_cache_vmap() is used when creating mappings (eg, via vmap,
|
||||
* vmalloc, ioremap etc) in kernel space for pages. Since the
|
||||
* direct-mappings of these pages may contain cached data, we need
|
||||
* to do a full cache flush to ensure that writebacks don't corrupt
|
||||
* data placed into these pages via the new mappings.
|
||||
*/
|
||||
#define flush_cache_vmap(start, end) flush_cache_all()
|
||||
#define flush_cache_vunmap(start, end) flush_cache_all()
|
||||
|
||||
/*
|
||||
* Copy user data from/to a page which is mapped into a different
|
||||
* processes address space. Really, we want to allow our "user
|
||||
* space" model to handle this.
|
||||
*/
|
||||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
||||
do { \
|
||||
memcpy(dst, src, len); \
|
||||
flush_ptrace_access(vma, page, vaddr, dst, len, 1);\
|
||||
} while (0)
|
||||
|
||||
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
|
||||
do { \
|
||||
memcpy(dst, src, len); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Convert calls to our calling convention.
|
||||
*/
|
||||
#define flush_cache_all() __cpuc_flush_kern_all()
|
||||
#ifndef CONFIG_CPU_CACHE_VIPT
|
||||
static inline void flush_cache_mm(struct mm_struct *mm)
|
||||
{
|
||||
if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask))
|
||||
__cpuc_flush_user_all();
|
||||
}
|
||||
|
||||
static inline void
|
||||
flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
|
||||
{
|
||||
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask))
|
||||
__cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),
|
||||
vma->vm_flags);
|
||||
}
|
||||
|
||||
static inline void
|
||||
flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn)
|
||||
{
|
||||
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
|
||||
unsigned long addr = user_addr & PAGE_MASK;
|
||||
__cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
|
||||
unsigned long uaddr, void *kaddr,
|
||||
unsigned long len, int write)
|
||||
{
|
||||
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
|
||||
unsigned long addr = (unsigned long)kaddr;
|
||||
__cpuc_coherent_kern_range(addr, addr + len);
|
||||
}
|
||||
}
|
||||
#else
|
||||
extern void flush_cache_mm(struct mm_struct *mm);
|
||||
extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
|
||||
extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn);
|
||||
extern void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
|
||||
unsigned long uaddr, void *kaddr,
|
||||
unsigned long len, int write);
|
||||
#endif
|
||||
|
||||
#define flush_cache_dup_mm(mm) flush_cache_mm(mm)
|
||||
|
||||
/*
|
||||
* flush_cache_user_range is used when we want to ensure that the
|
||||
* Harvard caches are synchronised for the user space address range.
|
||||
* This is used for the ARM private sys_cacheflush system call.
|
||||
*/
|
||||
#define flush_cache_user_range(vma,start,end) \
|
||||
__cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end))
|
||||
|
||||
/*
|
||||
* Perform necessary cache operations to ensure that data previously
|
||||
* stored within this range of addresses can be executed by the CPU.
|
||||
*/
|
||||
#define flush_icache_range(s,e) __cpuc_coherent_kern_range(s,e)
|
||||
|
||||
/*
|
||||
* Perform necessary cache operations to ensure that the TLB will
|
||||
* see data written in the specified area.
|
||||
*/
|
||||
#define clean_dcache_area(start,size) cpu_dcache_clean_area(start, size)
|
||||
|
||||
/*
|
||||
* flush_dcache_page is used when the kernel has written to the page
|
||||
* cache page at virtual address page->virtual.
|
||||
*
|
||||
* If this page isn't mapped (ie, page_mapping == NULL), or it might
|
||||
* have userspace mappings, then we _must_ always clean + invalidate
|
||||
* the dcache entries associated with the kernel mapping.
|
||||
*
|
||||
* Otherwise we can defer the operation, and clean the cache when we are
|
||||
* about to change to user space. This is the same method as used on SPARC64.
|
||||
* See update_mmu_cache for the user space part.
|
||||
*/
|
||||
extern void flush_dcache_page(struct page *);
|
||||
|
||||
extern void __flush_dcache_page(struct address_space *mapping, struct page *page);
|
||||
|
||||
static inline void __flush_icache_all(void)
|
||||
{
|
||||
asm("mcr p15, 0, %0, c7, c5, 0 @ invalidate I-cache\n"
|
||||
:
|
||||
: "r" (0));
|
||||
}
|
||||
|
||||
#define ARCH_HAS_FLUSH_ANON_PAGE
|
||||
static inline void flush_anon_page(struct vm_area_struct *vma,
|
||||
struct page *page, unsigned long vmaddr)
|
||||
{
|
||||
extern void __flush_anon_page(struct vm_area_struct *vma,
|
||||
struct page *, unsigned long);
|
||||
if (PageAnon(page))
|
||||
__flush_anon_page(vma, page, vmaddr);
|
||||
}
|
||||
|
||||
#define flush_dcache_mmap_lock(mapping) \
|
||||
spin_lock_irq(&(mapping)->tree_lock)
|
||||
#define flush_dcache_mmap_unlock(mapping) \
|
||||
spin_unlock_irq(&(mapping)->tree_lock)
|
||||
|
||||
#define flush_icache_user_range(vma,page,addr,len) \
|
||||
flush_dcache_page(page)
|
||||
|
||||
/*
|
||||
* We don't appear to need to do anything here. In fact, if we did, we'd
|
||||
* duplicate cache flushing elsewhere performed by flush_dcache_page().
|
||||
*/
|
||||
#define flush_icache_page(vma,page) do { } while (0)
|
||||
|
||||
static inline void flush_ioremap_region(unsigned long phys, void __iomem *virt,
|
||||
unsigned offset, size_t size)
|
||||
{
|
||||
const void *start = (void __force *)virt + offset;
|
||||
dmac_inv_range(start, start + size);
|
||||
}
|
||||
|
||||
#define __cacheid_present(val) (val != read_cpuid(CPUID_ID))
|
||||
#define __cacheid_type_v7(val) ((val & (7 << 29)) == (4 << 29))
|
||||
|
||||
#define __cacheid_vivt_prev7(val) ((val & (15 << 25)) != (14 << 25))
|
||||
#define __cacheid_vipt_prev7(val) ((val & (15 << 25)) == (14 << 25))
|
||||
#define __cacheid_vipt_nonaliasing_prev7(val) ((val & (15 << 25 | 1 << 23)) == (14 << 25))
|
||||
#define __cacheid_vipt_aliasing_prev7(val) ((val & (15 << 25 | 1 << 23)) == (14 << 25 | 1 << 23))
|
||||
|
||||
#define __cacheid_vivt(val) (__cacheid_type_v7(val) ? 0 : __cacheid_vivt_prev7(val))
|
||||
#define __cacheid_vipt(val) (__cacheid_type_v7(val) ? 1 : __cacheid_vipt_prev7(val))
|
||||
#define __cacheid_vipt_nonaliasing(val) (__cacheid_type_v7(val) ? 1 : __cacheid_vipt_nonaliasing_prev7(val))
|
||||
#define __cacheid_vipt_aliasing(val) (__cacheid_type_v7(val) ? 0 : __cacheid_vipt_aliasing_prev7(val))
|
||||
#define __cacheid_vivt_asid_tagged_instr(val) (__cacheid_type_v7(val) ? ((val & (3 << 14)) == (1 << 14)) : 0)
|
||||
|
||||
#if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT)
|
||||
/*
|
||||
* VIVT caches only
|
||||
*/
|
||||
#define cache_is_vivt() 1
|
||||
#define cache_is_vipt() 0
|
||||
#define cache_is_vipt_nonaliasing() 0
|
||||
#define cache_is_vipt_aliasing() 0
|
||||
#define icache_is_vivt_asid_tagged() 0
|
||||
|
||||
#elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT)
|
||||
/*
|
||||
* VIPT caches only
|
||||
*/
|
||||
#define cache_is_vivt() 0
|
||||
#define cache_is_vipt() 1
|
||||
#define cache_is_vipt_nonaliasing() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
__cacheid_vipt_nonaliasing(__val); \
|
||||
})
|
||||
|
||||
#define cache_is_vipt_aliasing() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
__cacheid_vipt_aliasing(__val); \
|
||||
})
|
||||
|
||||
#define icache_is_vivt_asid_tagged() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
__cacheid_vivt_asid_tagged_instr(__val); \
|
||||
})
|
||||
|
||||
#else
|
||||
/*
|
||||
* VIVT or VIPT caches. Note that this is unreliable since ARM926
|
||||
* and V6 CPUs satisfy the "(val & (15 << 25)) == (14 << 25)" test.
|
||||
* There's no way to tell from the CacheType register what type (!)
|
||||
* the cache is.
|
||||
*/
|
||||
#define cache_is_vivt() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
(!__cacheid_present(__val)) || __cacheid_vivt(__val); \
|
||||
})
|
||||
|
||||
#define cache_is_vipt() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
__cacheid_present(__val) && __cacheid_vipt(__val); \
|
||||
})
|
||||
|
||||
#define cache_is_vipt_nonaliasing() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
__cacheid_present(__val) && \
|
||||
__cacheid_vipt_nonaliasing(__val); \
|
||||
})
|
||||
|
||||
#define cache_is_vipt_aliasing() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
__cacheid_present(__val) && \
|
||||
__cacheid_vipt_aliasing(__val); \
|
||||
})
|
||||
|
||||
#define icache_is_vivt_asid_tagged() \
|
||||
({ \
|
||||
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
|
||||
__cacheid_present(__val) && \
|
||||
__cacheid_vivt_asid_tagged_instr(__val); \
|
||||
})
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
139
arch/arm/include/asm/checksum.h
Звичайний файл
139
arch/arm/include/asm/checksum.h
Звичайний файл
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* arch/arm/include/asm/checksum.h
|
||||
*
|
||||
* IP checksum routines
|
||||
*
|
||||
* Copyright (C) Original authors of ../asm-i386/checksum.h
|
||||
* Copyright (C) 1996-1999 Russell King
|
||||
*/
|
||||
#ifndef __ASM_ARM_CHECKSUM_H
|
||||
#define __ASM_ARM_CHECKSUM_H
|
||||
|
||||
#include <linux/in6.h>
|
||||
|
||||
/*
|
||||
* computes the checksum of a memory block at buff, length len,
|
||||
* and adds in "sum" (32-bit)
|
||||
*
|
||||
* returns a 32-bit number suitable for feeding into itself
|
||||
* or csum_tcpudp_magic
|
||||
*
|
||||
* this function must be called with even lengths, except
|
||||
* for the last fragment, which may be odd
|
||||
*
|
||||
* it's best to have buff aligned on a 32-bit boundary
|
||||
*/
|
||||
__wsum csum_partial(const void *buff, int len, __wsum sum);
|
||||
|
||||
/*
|
||||
* the same as csum_partial, but copies from src while it
|
||||
* checksums, and handles user-space pointer exceptions correctly, when needed.
|
||||
*
|
||||
* here even more important to align src and dst on a 32-bit (or even
|
||||
* better 64-bit) boundary
|
||||
*/
|
||||
|
||||
__wsum
|
||||
csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum);
|
||||
|
||||
__wsum
|
||||
csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *err_ptr);
|
||||
|
||||
/*
|
||||
* Fold a partial checksum without adding pseudo headers
|
||||
*/
|
||||
static inline __sum16 csum_fold(__wsum sum)
|
||||
{
|
||||
__asm__(
|
||||
"add %0, %1, %1, ror #16 @ csum_fold"
|
||||
: "=r" (sum)
|
||||
: "r" (sum)
|
||||
: "cc");
|
||||
return (__force __sum16)(~(__force u32)sum >> 16);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a version of ip_compute_csum() optimized for IP headers,
|
||||
* which always checksum on 4 octet boundaries.
|
||||
*/
|
||||
static inline __sum16
|
||||
ip_fast_csum(const void *iph, unsigned int ihl)
|
||||
{
|
||||
unsigned int tmp1;
|
||||
__wsum sum;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"ldr %0, [%1], #4 @ ip_fast_csum \n\
|
||||
ldr %3, [%1], #4 \n\
|
||||
sub %2, %2, #5 \n\
|
||||
adds %0, %0, %3 \n\
|
||||
ldr %3, [%1], #4 \n\
|
||||
adcs %0, %0, %3 \n\
|
||||
ldr %3, [%1], #4 \n\
|
||||
1: adcs %0, %0, %3 \n\
|
||||
ldr %3, [%1], #4 \n\
|
||||
tst %2, #15 @ do this carefully \n\
|
||||
subne %2, %2, #1 @ without destroying \n\
|
||||
bne 1b @ the carry flag \n\
|
||||
adcs %0, %0, %3 \n\
|
||||
adc %0, %0, #0"
|
||||
: "=r" (sum), "=r" (iph), "=r" (ihl), "=r" (tmp1)
|
||||
: "1" (iph), "2" (ihl)
|
||||
: "cc", "memory");
|
||||
return csum_fold(sum);
|
||||
}
|
||||
|
||||
static inline __wsum
|
||||
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
||||
unsigned short proto, __wsum sum)
|
||||
{
|
||||
__asm__(
|
||||
"adds %0, %1, %2 @ csum_tcpudp_nofold \n\
|
||||
adcs %0, %0, %3 \n"
|
||||
#ifdef __ARMEB__
|
||||
"adcs %0, %0, %4 \n"
|
||||
#else
|
||||
"adcs %0, %0, %4, lsl #8 \n"
|
||||
#endif
|
||||
"adcs %0, %0, %5 \n\
|
||||
adc %0, %0, #0"
|
||||
: "=&r"(sum)
|
||||
: "r" (sum), "r" (daddr), "r" (saddr), "r" (len), "Ir" (htons(proto))
|
||||
: "cc");
|
||||
return sum;
|
||||
}
|
||||
/*
|
||||
* computes the checksum of the TCP/UDP pseudo-header
|
||||
* returns a 16-bit checksum, already complemented
|
||||
*/
|
||||
static inline __sum16
|
||||
csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
|
||||
unsigned short proto, __wsum sum)
|
||||
{
|
||||
return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* this routine is used for miscellaneous IP-like checksums, mainly
|
||||
* in icmp.c
|
||||
*/
|
||||
static inline __sum16
|
||||
ip_compute_csum(const void *buff, int len)
|
||||
{
|
||||
return csum_fold(csum_partial(buff, len, 0));
|
||||
}
|
||||
|
||||
#define _HAVE_ARCH_IPV6_CSUM
|
||||
extern __wsum
|
||||
__csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, __be32 len,
|
||||
__be32 proto, __wsum sum);
|
||||
|
||||
static inline __sum16
|
||||
csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, __u32 len,
|
||||
unsigned short proto, __wsum sum)
|
||||
{
|
||||
return csum_fold(__csum_ipv6_magic(saddr, daddr, htonl(len),
|
||||
htonl(proto), sum));
|
||||
}
|
||||
#endif
|
78
arch/arm/include/asm/cnt32_to_63.h
Звичайний файл
78
arch/arm/include/asm/cnt32_to_63.h
Звичайний файл
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* include/asm/cnt32_to_63.h -- extend a 32-bit counter to 63 bits
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: December 3, 2006
|
||||
* Copyright: MontaVista Software, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __INCLUDE_CNT32_TO_63_H__
|
||||
#define __INCLUDE_CNT32_TO_63_H__
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/*
|
||||
* Prototype: u64 cnt32_to_63(u32 cnt)
|
||||
* Many hardware clock counters are only 32 bits wide and therefore have
|
||||
* a relatively short period making wrap-arounds rather frequent. This
|
||||
* is a problem when implementing sched_clock() for example, where a 64-bit
|
||||
* non-wrapping monotonic value is expected to be returned.
|
||||
*
|
||||
* To overcome that limitation, let's extend a 32-bit counter to 63 bits
|
||||
* in a completely lock free fashion. Bits 0 to 31 of the clock are provided
|
||||
* by the hardware while bits 32 to 62 are stored in memory. The top bit in
|
||||
* memory is used to synchronize with the hardware clock half-period. When
|
||||
* the top bit of both counters (hardware and in memory) differ then the
|
||||
* memory is updated with a new value, incrementing it when the hardware
|
||||
* counter wraps around.
|
||||
*
|
||||
* Because a word store in memory is atomic then the incremented value will
|
||||
* always be in synch with the top bit indicating to any potential concurrent
|
||||
* reader if the value in memory is up to date or not with regards to the
|
||||
* needed increment. And any race in updating the value in memory is harmless
|
||||
* as the same value would simply be stored more than once.
|
||||
*
|
||||
* The only restriction for the algorithm to work properly is that this
|
||||
* code must be executed at least once per each half period of the 32-bit
|
||||
* counter to properly update the state bit in memory. This is usually not a
|
||||
* problem in practice, but if it is then a kernel timer could be scheduled
|
||||
* to manage for this code to be executed often enough.
|
||||
*
|
||||
* Note that the top bit (bit 63) in the returned value should be considered
|
||||
* as garbage. It is not cleared here because callers are likely to use a
|
||||
* multiplier on the returned value which can get rid of the top bit
|
||||
* implicitly by making the multiplier even, therefore saving on a runtime
|
||||
* clear-bit instruction. Otherwise caller must remember to clear the top
|
||||
* bit explicitly.
|
||||
*/
|
||||
|
||||
/* this is used only to give gcc a clue about good code generation */
|
||||
typedef union {
|
||||
struct {
|
||||
#if defined(__LITTLE_ENDIAN)
|
||||
u32 lo, hi;
|
||||
#elif defined(__BIG_ENDIAN)
|
||||
u32 hi, lo;
|
||||
#endif
|
||||
};
|
||||
u64 val;
|
||||
} cnt32_to_63_t;
|
||||
|
||||
#define cnt32_to_63(cnt_lo) \
|
||||
({ \
|
||||
static volatile u32 __m_cnt_hi = 0; \
|
||||
cnt32_to_63_t __x; \
|
||||
__x.hi = __m_cnt_hi; \
|
||||
__x.lo = (cnt_lo); \
|
||||
if (unlikely((s32)(__x.hi ^ __x.lo) < 0)) \
|
||||
__m_cnt_hi = __x.hi = (__x.hi ^ 0x80000000) + (__x.hi >> 31); \
|
||||
__x.val; \
|
||||
})
|
||||
|
||||
#endif
|
69
arch/arm/include/asm/cpu-multi32.h
Звичайний файл
69
arch/arm/include/asm/cpu-multi32.h
Звичайний файл
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* arch/arm/include/asm/cpu-multi32.h
|
||||
*
|
||||
* Copyright (C) 2000 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.
|
||||
*/
|
||||
#include <asm/page.h>
|
||||
|
||||
struct mm_struct;
|
||||
|
||||
/*
|
||||
* Don't change this structure - ASM code
|
||||
* relies on it.
|
||||
*/
|
||||
extern struct processor {
|
||||
/* MISC
|
||||
* get data abort address/flags
|
||||
*/
|
||||
void (*_data_abort)(unsigned long pc);
|
||||
/*
|
||||
* Retrieve prefetch fault address
|
||||
*/
|
||||
unsigned long (*_prefetch_abort)(unsigned long lr);
|
||||
/*
|
||||
* Set up any processor specifics
|
||||
*/
|
||||
void (*_proc_init)(void);
|
||||
/*
|
||||
* Disable any processor specifics
|
||||
*/
|
||||
void (*_proc_fin)(void);
|
||||
/*
|
||||
* Special stuff for a reset
|
||||
*/
|
||||
void (*reset)(unsigned long addr) __attribute__((noreturn));
|
||||
/*
|
||||
* Idle the processor
|
||||
*/
|
||||
int (*_do_idle)(void);
|
||||
/*
|
||||
* Processor architecture specific
|
||||
*/
|
||||
/*
|
||||
* clean a virtual address range from the
|
||||
* D-cache without flushing the cache.
|
||||
*/
|
||||
void (*dcache_clean_area)(void *addr, int size);
|
||||
|
||||
/*
|
||||
* Set the page table
|
||||
*/
|
||||
void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm);
|
||||
/*
|
||||
* Set a possibly extended PTE. Non-extended PTEs should
|
||||
* ignore 'ext'.
|
||||
*/
|
||||
void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext);
|
||||
} processor;
|
||||
|
||||
#define cpu_proc_init() processor._proc_init()
|
||||
#define cpu_proc_fin() processor._proc_fin()
|
||||
#define cpu_reset(addr) processor.reset(addr)
|
||||
#define cpu_do_idle() processor._do_idle()
|
||||
#define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz)
|
||||
#define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext)
|
||||
#define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm)
|
44
arch/arm/include/asm/cpu-single.h
Звичайний файл
44
arch/arm/include/asm/cpu-single.h
Звичайний файл
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* arch/arm/include/asm/cpu-single.h
|
||||
*
|
||||
* Copyright (C) 2000 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.
|
||||
*/
|
||||
/*
|
||||
* Single CPU
|
||||
*/
|
||||
#ifdef __STDC__
|
||||
#define __catify_fn(name,x) name##x
|
||||
#else
|
||||
#define __catify_fn(name,x) name/**/x
|
||||
#endif
|
||||
#define __cpu_fn(name,x) __catify_fn(name,x)
|
||||
|
||||
/*
|
||||
* If we are supporting multiple CPUs, then we must use a table of
|
||||
* function pointers for this lot. Otherwise, we can optimise the
|
||||
* table away.
|
||||
*/
|
||||
#define cpu_proc_init __cpu_fn(CPU_NAME,_proc_init)
|
||||
#define cpu_proc_fin __cpu_fn(CPU_NAME,_proc_fin)
|
||||
#define cpu_reset __cpu_fn(CPU_NAME,_reset)
|
||||
#define cpu_do_idle __cpu_fn(CPU_NAME,_do_idle)
|
||||
#define cpu_dcache_clean_area __cpu_fn(CPU_NAME,_dcache_clean_area)
|
||||
#define cpu_do_switch_mm __cpu_fn(CPU_NAME,_switch_mm)
|
||||
#define cpu_set_pte_ext __cpu_fn(CPU_NAME,_set_pte_ext)
|
||||
|
||||
#include <asm/page.h>
|
||||
|
||||
struct mm_struct;
|
||||
|
||||
/* declare all the functions as extern */
|
||||
extern void cpu_proc_init(void);
|
||||
extern void cpu_proc_fin(void);
|
||||
extern int cpu_do_idle(void);
|
||||
extern void cpu_dcache_clean_area(void *, int);
|
||||
extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm);
|
||||
extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext);
|
||||
extern void cpu_reset(unsigned long addr) __attribute__((noreturn));
|
25
arch/arm/include/asm/cpu.h
Звичайний файл
25
arch/arm/include/asm/cpu.h
Звичайний файл
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* arch/arm/include/asm/cpu.h
|
||||
*
|
||||
* Copyright (C) 2004-2005 ARM Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __ASM_ARM_CPU_H
|
||||
#define __ASM_ARM_CPU_H
|
||||
|
||||
#include <linux/percpu.h>
|
||||
|
||||
struct cpuinfo_arm {
|
||||
struct cpu cpu;
|
||||
#ifdef CONFIG_SMP
|
||||
struct task_struct *idle;
|
||||
unsigned int loops_per_jiffy;
|
||||
#endif
|
||||
};
|
||||
|
||||
DECLARE_PER_CPU(struct cpuinfo_arm, cpu_data);
|
||||
|
||||
#endif
|
6
arch/arm/include/asm/cputime.h
Звичайний файл
6
arch/arm/include/asm/cputime.h
Звичайний файл
@@ -0,0 +1,6 @@
|
||||
#ifndef __ARM_CPUTIME_H
|
||||
#define __ARM_CPUTIME_H
|
||||
|
||||
#include <asm-generic/cputime.h>
|
||||
|
||||
#endif /* __ARM_CPUTIME_H */
|
15
arch/arm/include/asm/current.h
Звичайний файл
15
arch/arm/include/asm/current.h
Звичайний файл
@@ -0,0 +1,15 @@
|
||||
#ifndef _ASMARM_CURRENT_H
|
||||
#define _ASMARM_CURRENT_H
|
||||
|
||||
#include <linux/thread_info.h>
|
||||
|
||||
static inline struct task_struct *get_current(void) __attribute_const__;
|
||||
|
||||
static inline struct task_struct *get_current(void)
|
||||
{
|
||||
return current_thread_info()->task;
|
||||
}
|
||||
|
||||
#define current (get_current())
|
||||
|
||||
#endif /* _ASMARM_CURRENT_H */
|
44
arch/arm/include/asm/delay.h
Звичайний файл
44
arch/arm/include/asm/delay.h
Звичайний файл
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 1995-2004 Russell King
|
||||
*
|
||||
* Delay routines, using a pre-computed "loops_per_second" value.
|
||||
*/
|
||||
#ifndef __ASM_ARM_DELAY_H
|
||||
#define __ASM_ARM_DELAY_H
|
||||
|
||||
#include <asm/param.h> /* HZ */
|
||||
|
||||
extern void __delay(int loops);
|
||||
|
||||
/*
|
||||
* This function intentionally does not exist; if you see references to
|
||||
* it, it means that you're calling udelay() with an out of range value.
|
||||
*
|
||||
* With currently imposed limits, this means that we support a max delay
|
||||
* of 2000us. Further limits: HZ<=1000 and bogomips<=3355
|
||||
*/
|
||||
extern void __bad_udelay(void);
|
||||
|
||||
/*
|
||||
* division by multiplication: you don't have to worry about
|
||||
* loss of precision.
|
||||
*
|
||||
* Use only for very small delays ( < 1 msec). Should probably use a
|
||||
* lookup table, really, as the multiplications take much too long with
|
||||
* short delays. This is a "reasonable" implementation, though (and the
|
||||
* first constant multiplications gets optimized away if the delay is
|
||||
* a constant)
|
||||
*/
|
||||
extern void __udelay(unsigned long usecs);
|
||||
extern void __const_udelay(unsigned long);
|
||||
|
||||
#define MAX_UDELAY_MS 2
|
||||
|
||||
#define udelay(n) \
|
||||
(__builtin_constant_p(n) ? \
|
||||
((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \
|
||||
__const_udelay((n) * ((2199023U*HZ)>>11))) : \
|
||||
__udelay(n))
|
||||
|
||||
#endif /* defined(_ARM_DELAY_H) */
|
||||
|
15
arch/arm/include/asm/device.h
Звичайний файл
15
arch/arm/include/asm/device.h
Звичайний файл
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Arch specific extensions to struct device
|
||||
*
|
||||
* This file is released under the GPLv2
|
||||
*/
|
||||
#ifndef ASMARM_DEVICE_H
|
||||
#define ASMARM_DEVICE_H
|
||||
|
||||
struct dev_archdata {
|
||||
#ifdef CONFIG_DMABOUNCE
|
||||
struct dmabounce_device_info *dmabounce;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
227
arch/arm/include/asm/div64.h
Звичайний файл
227
arch/arm/include/asm/div64.h
Звичайний файл
@@ -0,0 +1,227 @@
|
||||
#ifndef __ASM_ARM_DIV64
|
||||
#define __ASM_ARM_DIV64
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* The semantics of do_div() are:
|
||||
*
|
||||
* uint32_t do_div(uint64_t *n, uint32_t base)
|
||||
* {
|
||||
* uint32_t remainder = *n % base;
|
||||
* *n = *n / base;
|
||||
* return remainder;
|
||||
* }
|
||||
*
|
||||
* In other words, a 64-bit dividend with a 32-bit divisor producing
|
||||
* a 64-bit result and a 32-bit remainder. To accomplish this optimally
|
||||
* we call a special __do_div64 helper with completely non standard
|
||||
* calling convention for arguments and results (beware).
|
||||
*/
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define __xh "r0"
|
||||
#define __xl "r1"
|
||||
#else
|
||||
#define __xl "r0"
|
||||
#define __xh "r1"
|
||||
#endif
|
||||
|
||||
#define __do_div_asm(n, base) \
|
||||
({ \
|
||||
register unsigned int __base asm("r4") = base; \
|
||||
register unsigned long long __n asm("r0") = n; \
|
||||
register unsigned long long __res asm("r2"); \
|
||||
register unsigned int __rem asm(__xh); \
|
||||
asm( __asmeq("%0", __xh) \
|
||||
__asmeq("%1", "r2") \
|
||||
__asmeq("%2", "r0") \
|
||||
__asmeq("%3", "r4") \
|
||||
"bl __do_div64" \
|
||||
: "=r" (__rem), "=r" (__res) \
|
||||
: "r" (__n), "r" (__base) \
|
||||
: "ip", "lr", "cc"); \
|
||||
n = __res; \
|
||||
__rem; \
|
||||
})
|
||||
|
||||
#if __GNUC__ < 4
|
||||
|
||||
/*
|
||||
* gcc versions earlier than 4.0 are simply too problematic for the
|
||||
* optimized implementation below. First there is gcc PR 15089 that
|
||||
* tend to trig on more complex constructs, spurious .global __udivsi3
|
||||
* are inserted even if none of those symbols are referenced in the
|
||||
* generated code, and those gcc versions are not able to do constant
|
||||
* propagation on long long values anyway.
|
||||
*/
|
||||
#define do_div(n, base) __do_div_asm(n, base)
|
||||
|
||||
#elif __GNUC__ >= 4
|
||||
|
||||
#include <asm/bug.h>
|
||||
|
||||
/*
|
||||
* If the divisor happens to be constant, we determine the appropriate
|
||||
* inverse at compile time to turn the division into a few inline
|
||||
* multiplications instead which is much faster. And yet only if compiling
|
||||
* for ARMv4 or higher (we need umull/umlal) and if the gcc version is
|
||||
* sufficiently recent to perform proper long long constant propagation.
|
||||
* (It is unfortunate that gcc doesn't perform all this internally.)
|
||||
*/
|
||||
#define do_div(n, base) \
|
||||
({ \
|
||||
unsigned int __r, __b = (base); \
|
||||
if (!__builtin_constant_p(__b) || __b == 0 || \
|
||||
(__LINUX_ARM_ARCH__ < 4 && (__b & (__b - 1)) != 0)) { \
|
||||
/* non-constant divisor (or zero): slow path */ \
|
||||
__r = __do_div_asm(n, __b); \
|
||||
} else if ((__b & (__b - 1)) == 0) { \
|
||||
/* Trivial: __b is constant and a power of 2 */ \
|
||||
/* gcc does the right thing with this code. */ \
|
||||
__r = n; \
|
||||
__r &= (__b - 1); \
|
||||
n /= __b; \
|
||||
} else { \
|
||||
/* Multiply by inverse of __b: n/b = n*(p/b)/p */ \
|
||||
/* We rely on the fact that most of this code gets */ \
|
||||
/* optimized away at compile time due to constant */ \
|
||||
/* propagation and only a couple inline assembly */ \
|
||||
/* instructions should remain. Better avoid any */ \
|
||||
/* code construct that might prevent that. */ \
|
||||
unsigned long long __res, __x, __t, __m, __n = n; \
|
||||
unsigned int __c, __p, __z = 0; \
|
||||
/* preserve low part of n for reminder computation */ \
|
||||
__r = __n; \
|
||||
/* determine number of bits to represent __b */ \
|
||||
__p = 1 << __div64_fls(__b); \
|
||||
/* compute __m = ((__p << 64) + __b - 1) / __b */ \
|
||||
__m = (~0ULL / __b) * __p; \
|
||||
__m += (((~0ULL % __b + 1) * __p) + __b - 1) / __b; \
|
||||
/* compute __res = __m*(~0ULL/__b*__b-1)/(__p << 64) */ \
|
||||
__x = ~0ULL / __b * __b - 1; \
|
||||
__res = (__m & 0xffffffff) * (__x & 0xffffffff); \
|
||||
__res >>= 32; \
|
||||
__res += (__m & 0xffffffff) * (__x >> 32); \
|
||||
__t = __res; \
|
||||
__res += (__x & 0xffffffff) * (__m >> 32); \
|
||||
__t = (__res < __t) ? (1ULL << 32) : 0; \
|
||||
__res = (__res >> 32) + __t; \
|
||||
__res += (__m >> 32) * (__x >> 32); \
|
||||
__res /= __p; \
|
||||
/* Now sanitize and optimize what we've got. */ \
|
||||
if (~0ULL % (__b / (__b & -__b)) == 0) { \
|
||||
/* those cases can be simplified with: */ \
|
||||
__n /= (__b & -__b); \
|
||||
__m = ~0ULL / (__b / (__b & -__b)); \
|
||||
__p = 1; \
|
||||
__c = 1; \
|
||||
} else if (__res != __x / __b) { \
|
||||
/* We can't get away without a correction */ \
|
||||
/* to compensate for bit truncation errors. */ \
|
||||
/* To avoid it we'd need an additional bit */ \
|
||||
/* to represent __m which would overflow it. */ \
|
||||
/* Instead we do m=p/b and n/b=(n*m+m)/p. */ \
|
||||
__c = 1; \
|
||||
/* Compute __m = (__p << 64) / __b */ \
|
||||
__m = (~0ULL / __b) * __p; \
|
||||
__m += ((~0ULL % __b + 1) * __p) / __b; \
|
||||
} else { \
|
||||
/* Reduce __m/__p, and try to clear bit 31 */ \
|
||||
/* of __m when possible otherwise that'll */ \
|
||||
/* need extra overflow handling later. */ \
|
||||
unsigned int __bits = -(__m & -__m); \
|
||||
__bits |= __m >> 32; \
|
||||
__bits = (~__bits) << 1; \
|
||||
/* If __bits == 0 then setting bit 31 is */ \
|
||||
/* unavoidable. Simply apply the maximum */ \
|
||||
/* possible reduction in that case. */ \
|
||||
/* Otherwise the MSB of __bits indicates the */ \
|
||||
/* best reduction we should apply. */ \
|
||||
if (!__bits) { \
|
||||
__p /= (__m & -__m); \
|
||||
__m /= (__m & -__m); \
|
||||
} else { \
|
||||
__p >>= __div64_fls(__bits); \
|
||||
__m >>= __div64_fls(__bits); \
|
||||
} \
|
||||
/* No correction needed. */ \
|
||||
__c = 0; \
|
||||
} \
|
||||
/* Now we have a combination of 2 conditions: */ \
|
||||
/* 1) whether or not we need a correction (__c), and */ \
|
||||
/* 2) whether or not there might be an overflow in */ \
|
||||
/* the cross product (__m & ((1<<63) | (1<<31))) */ \
|
||||
/* Select the best insn combination to perform the */ \
|
||||
/* actual __m * __n / (__p << 64) operation. */ \
|
||||
if (!__c) { \
|
||||
asm ( "umull %Q0, %R0, %1, %Q2\n\t" \
|
||||
"mov %Q0, #0" \
|
||||
: "=&r" (__res) \
|
||||
: "r" (__m), "r" (__n) \
|
||||
: "cc" ); \
|
||||
} else if (!(__m & ((1ULL << 63) | (1ULL << 31)))) { \
|
||||
__res = __m; \
|
||||
asm ( "umlal %Q0, %R0, %Q1, %Q2\n\t" \
|
||||
"mov %Q0, #0" \
|
||||
: "+r" (__res) \
|
||||
: "r" (__m), "r" (__n) \
|
||||
: "cc" ); \
|
||||
} else { \
|
||||
asm ( "umull %Q0, %R0, %Q1, %Q2\n\t" \
|
||||
"cmn %Q0, %Q1\n\t" \
|
||||
"adcs %R0, %R0, %R1\n\t" \
|
||||
"adc %Q0, %3, #0" \
|
||||
: "=&r" (__res) \
|
||||
: "r" (__m), "r" (__n), "r" (__z) \
|
||||
: "cc" ); \
|
||||
} \
|
||||
if (!(__m & ((1ULL << 63) | (1ULL << 31)))) { \
|
||||
asm ( "umlal %R0, %Q0, %R1, %Q2\n\t" \
|
||||
"umlal %R0, %Q0, %Q1, %R2\n\t" \
|
||||
"mov %R0, #0\n\t" \
|
||||
"umlal %Q0, %R0, %R1, %R2" \
|
||||
: "+r" (__res) \
|
||||
: "r" (__m), "r" (__n) \
|
||||
: "cc" ); \
|
||||
} else { \
|
||||
asm ( "umlal %R0, %Q0, %R2, %Q3\n\t" \
|
||||
"umlal %R0, %1, %Q2, %R3\n\t" \
|
||||
"mov %R0, #0\n\t" \
|
||||
"adds %Q0, %1, %Q0\n\t" \
|
||||
"adc %R0, %R0, #0\n\t" \
|
||||
"umlal %Q0, %R0, %R2, %R3" \
|
||||
: "+r" (__res), "+r" (__z) \
|
||||
: "r" (__m), "r" (__n) \
|
||||
: "cc" ); \
|
||||
} \
|
||||
__res /= __p; \
|
||||
/* The reminder can be computed with 32-bit regs */ \
|
||||
/* only, and gcc is good at that. */ \
|
||||
{ \
|
||||
unsigned int __res0 = __res; \
|
||||
unsigned int __b0 = __b; \
|
||||
__r -= __res0 * __b0; \
|
||||
} \
|
||||
/* BUG_ON(__r >= __b || __res * __b + __r != n); */ \
|
||||
n = __res; \
|
||||
} \
|
||||
__r; \
|
||||
})
|
||||
|
||||
/* our own fls implementation to make sure constant propagation is fine */
|
||||
#define __div64_fls(bits) \
|
||||
({ \
|
||||
unsigned int __left = (bits), __nr = 0; \
|
||||
if (__left & 0xffff0000) __nr += 16, __left >>= 16; \
|
||||
if (__left & 0x0000ff00) __nr += 8, __left >>= 8; \
|
||||
if (__left & 0x000000f0) __nr += 4, __left >>= 4; \
|
||||
if (__left & 0x0000000c) __nr += 2, __left >>= 2; \
|
||||
if (__left & 0x00000002) __nr += 1; \
|
||||
__nr; \
|
||||
})
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
456
arch/arm/include/asm/dma-mapping.h
Звичайний файл
456
arch/arm/include/asm/dma-mapping.h
Звичайний файл
@@ -0,0 +1,456 @@
|
||||
#ifndef ASMARM_DMA_MAPPING_H
|
||||
#define ASMARM_DMA_MAPPING_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/mm.h> /* need struct page */
|
||||
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
/*
|
||||
* DMA-consistent mapping functions. These allocate/free a region of
|
||||
* uncached, unwrite-buffered mapped memory space for use with DMA
|
||||
* devices. This is the "generic" version. The PCI specific version
|
||||
* is in pci.h
|
||||
*
|
||||
* Note: Drivers should NOT use this function directly, as it will break
|
||||
* platforms with CONFIG_DMABOUNCE.
|
||||
* Use the driver DMA support - see dma-mapping.h (dma_sync_*)
|
||||
*/
|
||||
extern void dma_cache_maint(const void *kaddr, size_t size, int rw);
|
||||
|
||||
/*
|
||||
* Return whether the given device DMA address mask can be supported
|
||||
* properly. For example, if your device can only drive the low 24-bits
|
||||
* during bus mastering, then you would pass 0x00ffffff as the mask
|
||||
* to this function.
|
||||
*
|
||||
* FIXME: This should really be a platform specific issue - we should
|
||||
* return false if GFP_DMA allocations may not satisfy the supplied 'mask'.
|
||||
*/
|
||||
static inline int dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
return dev->dma_mask && *dev->dma_mask != 0;
|
||||
}
|
||||
|
||||
static inline int dma_set_mask(struct device *dev, u64 dma_mask)
|
||||
{
|
||||
if (!dev->dma_mask || !dma_supported(dev, dma_mask))
|
||||
return -EIO;
|
||||
|
||||
*dev->dma_mask = dma_mask;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int dma_get_cache_alignment(void)
|
||||
{
|
||||
return 32;
|
||||
}
|
||||
|
||||
static inline int dma_is_consistent(struct device *dev, dma_addr_t handle)
|
||||
{
|
||||
return !!arch_is_coherent();
|
||||
}
|
||||
|
||||
/*
|
||||
* DMA errors are defined by all-bits-set in the DMA address.
|
||||
*/
|
||||
static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
||||
{
|
||||
return dma_addr == ~0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Dummy noncoherent implementation. We don't provide a dma_cache_sync
|
||||
* function so drivers using this API are highlighted with build warnings.
|
||||
*/
|
||||
static inline void *
|
||||
dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr,
|
||||
dma_addr_t handle)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* dma_alloc_coherent - allocate consistent memory for DMA
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @size: required memory size
|
||||
* @handle: bus-specific DMA address
|
||||
*
|
||||
* Allocate some uncached, unbuffered memory for a device for
|
||||
* performing DMA. This function allocates pages, and will
|
||||
* return the CPU-viewed address, and sets @handle to be the
|
||||
* device-viewed address.
|
||||
*/
|
||||
extern void *
|
||||
dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp);
|
||||
|
||||
/**
|
||||
* dma_free_coherent - free memory allocated by dma_alloc_coherent
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @size: size of memory originally requested in dma_alloc_coherent
|
||||
* @cpu_addr: CPU-view address returned from dma_alloc_coherent
|
||||
* @handle: device-view address returned from dma_alloc_coherent
|
||||
*
|
||||
* Free (and unmap) a DMA buffer previously allocated by
|
||||
* dma_alloc_coherent().
|
||||
*
|
||||
* References to memory and mappings associated with cpu_addr/handle
|
||||
* during and after this call executing are illegal.
|
||||
*/
|
||||
extern void
|
||||
dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
|
||||
dma_addr_t handle);
|
||||
|
||||
/**
|
||||
* dma_mmap_coherent - map a coherent DMA allocation into user space
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @vma: vm_area_struct describing requested user mapping
|
||||
* @cpu_addr: kernel CPU-view address returned from dma_alloc_coherent
|
||||
* @handle: device-view address returned from dma_alloc_coherent
|
||||
* @size: size of memory originally requested in dma_alloc_coherent
|
||||
*
|
||||
* Map a coherent DMA buffer previously allocated by dma_alloc_coherent
|
||||
* into user space. The coherent DMA buffer must not be freed by the
|
||||
* driver until the user space mapping has been released.
|
||||
*/
|
||||
int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t handle, size_t size);
|
||||
|
||||
|
||||
/**
|
||||
* dma_alloc_writecombine - allocate writecombining memory for DMA
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @size: required memory size
|
||||
* @handle: bus-specific DMA address
|
||||
*
|
||||
* Allocate some uncached, buffered memory for a device for
|
||||
* performing DMA. This function allocates pages, and will
|
||||
* return the CPU-viewed address, and sets @handle to be the
|
||||
* device-viewed address.
|
||||
*/
|
||||
extern void *
|
||||
dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp);
|
||||
|
||||
#define dma_free_writecombine(dev,size,cpu_addr,handle) \
|
||||
dma_free_coherent(dev,size,cpu_addr,handle)
|
||||
|
||||
int dma_mmap_writecombine(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t handle, size_t size);
|
||||
|
||||
|
||||
/**
|
||||
* dma_map_single - map a single buffer for streaming DMA
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @cpu_addr: CPU direct mapped address of buffer
|
||||
* @size: size of buffer to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Ensure that any data held in the cache is appropriately discarded
|
||||
* or written back.
|
||||
*
|
||||
* The device owns this memory once this call has completed. The CPU
|
||||
* can regain ownership by calling dma_unmap_single() or
|
||||
* dma_sync_single_for_cpu().
|
||||
*/
|
||||
#ifndef CONFIG_DMABOUNCE
|
||||
static inline dma_addr_t
|
||||
dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
if (!arch_is_coherent())
|
||||
dma_cache_maint(cpu_addr, size, dir);
|
||||
|
||||
return virt_to_dma(dev, (unsigned long)cpu_addr);
|
||||
}
|
||||
#else
|
||||
extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dma_map_page - map a portion of a page for streaming DMA
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @page: page that buffer resides in
|
||||
* @offset: offset into page for start of buffer
|
||||
* @size: size of buffer to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Ensure that any data held in the cache is appropriately discarded
|
||||
* or written back.
|
||||
*
|
||||
* The device owns this memory once this call has completed. The CPU
|
||||
* can regain ownership by calling dma_unmap_page() or
|
||||
* dma_sync_single_for_cpu().
|
||||
*/
|
||||
static inline dma_addr_t
|
||||
dma_map_page(struct device *dev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
return dma_map_single(dev, page_address(page) + offset, size, (int)dir);
|
||||
}
|
||||
|
||||
/**
|
||||
* dma_unmap_single - unmap a single buffer previously mapped
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @handle: DMA address of buffer
|
||||
* @size: size of buffer to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Unmap a single streaming mode DMA translation. The handle and size
|
||||
* must match what was provided in the previous dma_map_single() call.
|
||||
* All other usages are undefined.
|
||||
*
|
||||
* After this call, reads by the CPU to the buffer are guaranteed to see
|
||||
* whatever the device wrote there.
|
||||
*/
|
||||
#ifndef CONFIG_DMABOUNCE
|
||||
static inline void
|
||||
dma_unmap_single(struct device *dev, dma_addr_t handle, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
/* nothing to do */
|
||||
}
|
||||
#else
|
||||
extern void dma_unmap_single(struct device *, dma_addr_t, size_t, enum dma_data_direction);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dma_unmap_page - unmap a buffer previously mapped through dma_map_page()
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @handle: DMA address of buffer
|
||||
* @size: size of buffer to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Unmap a single streaming mode DMA translation. The handle and size
|
||||
* must match what was provided in the previous dma_map_single() call.
|
||||
* All other usages are undefined.
|
||||
*
|
||||
* After this call, reads by the CPU to the buffer are guaranteed to see
|
||||
* whatever the device wrote there.
|
||||
*/
|
||||
static inline void
|
||||
dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
dma_unmap_single(dev, handle, size, (int)dir);
|
||||
}
|
||||
|
||||
/**
|
||||
* dma_map_sg - map a set of SG buffers for streaming mode DMA
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @sg: list of buffers
|
||||
* @nents: number of buffers to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Map a set of buffers described by scatterlist in streaming
|
||||
* mode for DMA. This is the scatter-gather version of the
|
||||
* above dma_map_single interface. Here the scatter gather list
|
||||
* elements are each tagged with the appropriate dma address
|
||||
* and length. They are obtained via sg_dma_{address,length}(SG).
|
||||
*
|
||||
* NOTE: An implementation may be able to use a smaller number of
|
||||
* DMA address/length pairs than there are SG table elements.
|
||||
* (for example via virtual mapping capabilities)
|
||||
* The routine returns the number of addr/length pairs actually
|
||||
* used, at most nents.
|
||||
*
|
||||
* Device ownership issues as mentioned above for dma_map_single are
|
||||
* the same here.
|
||||
*/
|
||||
#ifndef CONFIG_DMABOUNCE
|
||||
static inline int
|
||||
dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nents; i++, sg++) {
|
||||
char *virt;
|
||||
|
||||
sg->dma_address = page_to_dma(dev, sg_page(sg)) + sg->offset;
|
||||
virt = sg_virt(sg);
|
||||
|
||||
if (!arch_is_coherent())
|
||||
dma_cache_maint(virt, sg->length, dir);
|
||||
}
|
||||
|
||||
return nents;
|
||||
}
|
||||
#else
|
||||
extern int dma_map_sg(struct device *, struct scatterlist *, int, enum dma_data_direction);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dma_unmap_sg - unmap a set of SG buffers mapped by dma_map_sg
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @sg: list of buffers
|
||||
* @nents: number of buffers to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Unmap a set of streaming mode DMA translations.
|
||||
* Again, CPU read rules concerning calls here are the same as for
|
||||
* dma_unmap_single() above.
|
||||
*/
|
||||
#ifndef CONFIG_DMABOUNCE
|
||||
static inline void
|
||||
dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
|
||||
/* nothing to do */
|
||||
}
|
||||
#else
|
||||
extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_data_direction);
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* dma_sync_single_for_cpu
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @handle: DMA address of buffer
|
||||
* @size: size of buffer to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Make physical memory consistent for a single streaming mode DMA
|
||||
* translation after a transfer.
|
||||
*
|
||||
* If you perform a dma_map_single() but wish to interrogate the
|
||||
* buffer using the cpu, yet do not wish to teardown the PCI dma
|
||||
* mapping, you must call this function before doing so. At the
|
||||
* next point you give the PCI dma address back to the card, you
|
||||
* must first the perform a dma_sync_for_device, and then the
|
||||
* device again owns the buffer.
|
||||
*/
|
||||
#ifndef CONFIG_DMABOUNCE
|
||||
static inline void
|
||||
dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
if (!arch_is_coherent())
|
||||
dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
if (!arch_is_coherent())
|
||||
dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir);
|
||||
}
|
||||
#else
|
||||
extern void dma_sync_single_for_cpu(struct device*, dma_addr_t, size_t, enum dma_data_direction);
|
||||
extern void dma_sync_single_for_device(struct device*, dma_addr_t, size_t, enum dma_data_direction);
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* dma_sync_sg_for_cpu
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
* @sg: list of buffers
|
||||
* @nents: number of buffers to map
|
||||
* @dir: DMA transfer direction
|
||||
*
|
||||
* Make physical memory consistent for a set of streaming
|
||||
* mode DMA translations after a transfer.
|
||||
*
|
||||
* The same as dma_sync_single_for_* but for a scatter-gather list,
|
||||
* same rules and usage.
|
||||
*/
|
||||
#ifndef CONFIG_DMABOUNCE
|
||||
static inline void
|
||||
dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nents; i++, sg++) {
|
||||
char *virt = sg_virt(sg);
|
||||
if (!arch_is_coherent())
|
||||
dma_cache_maint(virt, sg->length, dir);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nents; i++, sg++) {
|
||||
char *virt = sg_virt(sg);
|
||||
if (!arch_is_coherent())
|
||||
dma_cache_maint(virt, sg->length, dir);
|
||||
}
|
||||
}
|
||||
#else
|
||||
extern void dma_sync_sg_for_cpu(struct device*, struct scatterlist*, int, enum dma_data_direction);
|
||||
extern void dma_sync_sg_for_device(struct device*, struct scatterlist*, int, enum dma_data_direction);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DMABOUNCE
|
||||
/*
|
||||
* For SA-1111, IXP425, and ADI systems the dma-mapping functions are "magic"
|
||||
* and utilize bounce buffers as needed to work around limited DMA windows.
|
||||
*
|
||||
* On the SA-1111, a bug limits DMA to only certain regions of RAM.
|
||||
* On the IXP425, the PCI inbound window is 64MB (256MB total RAM)
|
||||
* On some ADI engineering systems, PCI inbound window is 32MB (12MB total RAM)
|
||||
*
|
||||
* The following are helper functions used by the dmabounce subystem
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* dmabounce_register_dev
|
||||
*
|
||||
* @dev: valid struct device pointer
|
||||
* @small_buf_size: size of buffers to use with small buffer pool
|
||||
* @large_buf_size: size of buffers to use with large buffer pool (can be 0)
|
||||
*
|
||||
* This function should be called by low-level platform code to register
|
||||
* a device as requireing DMA buffer bouncing. The function will allocate
|
||||
* appropriate DMA pools for the device.
|
||||
*
|
||||
*/
|
||||
extern int dmabounce_register_dev(struct device *, unsigned long, unsigned long);
|
||||
|
||||
/**
|
||||
* dmabounce_unregister_dev
|
||||
*
|
||||
* @dev: valid struct device pointer
|
||||
*
|
||||
* This function should be called by low-level platform code when device
|
||||
* that was previously registered with dmabounce_register_dev is removed
|
||||
* from the system.
|
||||
*
|
||||
*/
|
||||
extern void dmabounce_unregister_dev(struct device *);
|
||||
|
||||
/**
|
||||
* dma_needs_bounce
|
||||
*
|
||||
* @dev: valid struct device pointer
|
||||
* @dma_handle: dma_handle of unbounced buffer
|
||||
* @size: size of region being mapped
|
||||
*
|
||||
* Platforms that utilize the dmabounce mechanism must implement
|
||||
* this function.
|
||||
*
|
||||
* The dmabounce routines call this function whenever a dma-mapping
|
||||
* is requested to determine whether a given buffer needs to be bounced
|
||||
* or not. The function must return 0 if the buffer is OK for
|
||||
* DMA access and 1 if the buffer needs to be bounced.
|
||||
*
|
||||
*/
|
||||
extern int dma_needs_bounce(struct device*, dma_addr_t, size_t);
|
||||
#endif /* CONFIG_DMABOUNCE */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif
|
143
arch/arm/include/asm/dma.h
Звичайний файл
143
arch/arm/include/asm/dma.h
Звичайний файл
@@ -0,0 +1,143 @@
|
||||
#ifndef __ASM_ARM_DMA_H
|
||||
#define __ASM_ARM_DMA_H
|
||||
|
||||
typedef unsigned int dmach_t;
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/scatterlist.h>
|
||||
#include <asm/arch/dma.h>
|
||||
|
||||
/*
|
||||
* This is the maximum virtual address which can be DMA'd from.
|
||||
*/
|
||||
#ifndef MAX_DMA_ADDRESS
|
||||
#define MAX_DMA_ADDRESS 0xffffffff
|
||||
#endif
|
||||
|
||||
/*
|
||||
* DMA modes
|
||||
*/
|
||||
typedef unsigned int dmamode_t;
|
||||
|
||||
#define DMA_MODE_MASK 3
|
||||
|
||||
#define DMA_MODE_READ 0
|
||||
#define DMA_MODE_WRITE 1
|
||||
#define DMA_MODE_CASCADE 2
|
||||
#define DMA_AUTOINIT 4
|
||||
|
||||
extern spinlock_t dma_spin_lock;
|
||||
|
||||
static inline unsigned long claim_dma_lock(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&dma_spin_lock, flags);
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void release_dma_lock(unsigned long flags)
|
||||
{
|
||||
spin_unlock_irqrestore(&dma_spin_lock, flags);
|
||||
}
|
||||
|
||||
/* Clear the 'DMA Pointer Flip Flop'.
|
||||
* Write 0 for LSB/MSB, 1 for MSB/LSB access.
|
||||
*/
|
||||
#define clear_dma_ff(channel)
|
||||
|
||||
/* Set only the page register bits of the transfer address.
|
||||
*
|
||||
* NOTE: This is an architecture specific function, and should
|
||||
* be hidden from the drivers
|
||||
*/
|
||||
extern void set_dma_page(dmach_t channel, char pagenr);
|
||||
|
||||
/* Request a DMA channel
|
||||
*
|
||||
* Some architectures may need to do allocate an interrupt
|
||||
*/
|
||||
extern int request_dma(dmach_t channel, const char * device_id);
|
||||
|
||||
/* Free a DMA channel
|
||||
*
|
||||
* Some architectures may need to do free an interrupt
|
||||
*/
|
||||
extern void free_dma(dmach_t channel);
|
||||
|
||||
/* Enable DMA for this channel
|
||||
*
|
||||
* On some architectures, this may have other side effects like
|
||||
* enabling an interrupt and setting the DMA registers.
|
||||
*/
|
||||
extern void enable_dma(dmach_t channel);
|
||||
|
||||
/* Disable DMA for this channel
|
||||
*
|
||||
* On some architectures, this may have other side effects like
|
||||
* disabling an interrupt or whatever.
|
||||
*/
|
||||
extern void disable_dma(dmach_t channel);
|
||||
|
||||
/* Test whether the specified channel has an active DMA transfer
|
||||
*/
|
||||
extern int dma_channel_active(dmach_t channel);
|
||||
|
||||
/* Set the DMA scatter gather list for this channel
|
||||
*
|
||||
* This should not be called if a DMA channel is enabled,
|
||||
* especially since some DMA architectures don't update the
|
||||
* DMA address immediately, but defer it to the enable_dma().
|
||||
*/
|
||||
extern void set_dma_sg(dmach_t channel, struct scatterlist *sg, int nr_sg);
|
||||
|
||||
/* Set the DMA address for this channel
|
||||
*
|
||||
* This should not be called if a DMA channel is enabled,
|
||||
* especially since some DMA architectures don't update the
|
||||
* DMA address immediately, but defer it to the enable_dma().
|
||||
*/
|
||||
extern void __set_dma_addr(dmach_t channel, void *addr);
|
||||
#define set_dma_addr(channel, addr) \
|
||||
__set_dma_addr(channel, bus_to_virt(addr))
|
||||
|
||||
/* Set the DMA byte count for this channel
|
||||
*
|
||||
* This should not be called if a DMA channel is enabled,
|
||||
* especially since some DMA architectures don't update the
|
||||
* DMA count immediately, but defer it to the enable_dma().
|
||||
*/
|
||||
extern void set_dma_count(dmach_t channel, unsigned long count);
|
||||
|
||||
/* Set the transfer direction for this channel
|
||||
*
|
||||
* This should not be called if a DMA channel is enabled,
|
||||
* especially since some DMA architectures don't update the
|
||||
* DMA transfer direction immediately, but defer it to the
|
||||
* enable_dma().
|
||||
*/
|
||||
extern void set_dma_mode(dmach_t channel, dmamode_t mode);
|
||||
|
||||
/* Set the transfer speed for this channel
|
||||
*/
|
||||
extern void set_dma_speed(dmach_t channel, int cycle_ns);
|
||||
|
||||
/* Get DMA residue count. After a DMA transfer, this
|
||||
* should return zero. Reading this while a DMA transfer is
|
||||
* still in progress will return unpredictable results.
|
||||
* If called before the channel has been used, it may return 1.
|
||||
* Otherwise, it returns the number of _bytes_ left to transfer.
|
||||
*/
|
||||
extern int get_dma_residue(dmach_t channel);
|
||||
|
||||
#ifndef NO_DMA
|
||||
#define NO_DMA 255
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
extern int isa_dma_bridge_buggy;
|
||||
#else
|
||||
#define isa_dma_bridge_buggy (0)
|
||||
#endif
|
||||
|
||||
#endif /* _ARM_DMA_H */
|
78
arch/arm/include/asm/domain.h
Звичайний файл
78
arch/arm/include/asm/domain.h
Звичайний файл
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* arch/arm/include/asm/domain.h
|
||||
*
|
||||
* Copyright (C) 1999 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.
|
||||
*/
|
||||
#ifndef __ASM_PROC_DOMAIN_H
|
||||
#define __ASM_PROC_DOMAIN_H
|
||||
|
||||
/*
|
||||
* Domain numbers
|
||||
*
|
||||
* DOMAIN_IO - domain 2 includes all IO only
|
||||
* DOMAIN_USER - domain 1 includes all user memory only
|
||||
* DOMAIN_KERNEL - domain 0 includes all kernel memory only
|
||||
*
|
||||
* The domain numbering depends on whether we support 36 physical
|
||||
* address for I/O or not. Addresses above the 32 bit boundary can
|
||||
* only be mapped using supersections and supersections can only
|
||||
* be set for domain 0. We could just default to DOMAIN_IO as zero,
|
||||
* but there may be systems with supersection support and no 36-bit
|
||||
* addressing. In such cases, we want to map system memory with
|
||||
* supersections to reduce TLB misses and footprint.
|
||||
*
|
||||
* 36-bit addressing and supersections are only available on
|
||||
* CPUs based on ARMv6+ or the Intel XSC3 core.
|
||||
*/
|
||||
#ifndef CONFIG_IO_36
|
||||
#define DOMAIN_KERNEL 0
|
||||
#define DOMAIN_TABLE 0
|
||||
#define DOMAIN_USER 1
|
||||
#define DOMAIN_IO 2
|
||||
#else
|
||||
#define DOMAIN_KERNEL 2
|
||||
#define DOMAIN_TABLE 2
|
||||
#define DOMAIN_USER 1
|
||||
#define DOMAIN_IO 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Domain types
|
||||
*/
|
||||
#define DOMAIN_NOACCESS 0
|
||||
#define DOMAIN_CLIENT 1
|
||||
#define DOMAIN_MANAGER 3
|
||||
|
||||
#define domain_val(dom,type) ((type) << (2*(dom)))
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#define set_domain(x) \
|
||||
do { \
|
||||
__asm__ __volatile__( \
|
||||
"mcr p15, 0, %0, c3, c0 @ set domain" \
|
||||
: : "r" (x)); \
|
||||
isb(); \
|
||||
} while (0)
|
||||
|
||||
#define modify_domain(dom,type) \
|
||||
do { \
|
||||
struct thread_info *thread = current_thread_info(); \
|
||||
unsigned int domain = thread->cpu_domain; \
|
||||
domain &= ~domain_val(dom, DOMAIN_MANAGER); \
|
||||
thread->cpu_domain = domain | domain_val(dom, type); \
|
||||
set_domain(thread->cpu_domain); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
#define set_domain(x) do { } while (0)
|
||||
#define modify_domain(dom,type) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* !__ASSEMBLY__ */
|
219
arch/arm/include/asm/ecard.h
Звичайний файл
219
arch/arm/include/asm/ecard.h
Звичайний файл
@@ -0,0 +1,219 @@
|
||||
/*
|
||||
* arch/arm/include/asm/ecard.h
|
||||
*
|
||||
* definitions for expansion cards
|
||||
*
|
||||
* This is a new system as from Linux 1.2.3
|
||||
*
|
||||
* Changelog:
|
||||
* 11-12-1996 RMK Further minor improvements
|
||||
* 12-09-1997 RMK Added interrupt enable/disable for card level
|
||||
*
|
||||
* Reference: Acorns Risc OS 3 Programmers Reference Manuals.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ECARD_H
|
||||
#define __ASM_ECARD_H
|
||||
|
||||
/*
|
||||
* Currently understood cards (but not necessarily
|
||||
* supported):
|
||||
* Manufacturer Product ID
|
||||
*/
|
||||
#define MANU_ACORN 0x0000
|
||||
#define PROD_ACORN_SCSI 0x0002
|
||||
#define PROD_ACORN_ETHER1 0x0003
|
||||
#define PROD_ACORN_MFM 0x000b
|
||||
|
||||
#define MANU_ANT2 0x0011
|
||||
#define PROD_ANT_ETHER3 0x00a4
|
||||
|
||||
#define MANU_ATOMWIDE 0x0017
|
||||
#define PROD_ATOMWIDE_3PSERIAL 0x0090
|
||||
|
||||
#define MANU_IRLAM_INSTRUMENTS 0x001f
|
||||
#define MANU_IRLAM_INSTRUMENTS_ETHERN 0x5678
|
||||
|
||||
#define MANU_OAK 0x0021
|
||||
#define PROD_OAK_SCSI 0x0058
|
||||
|
||||
#define MANU_MORLEY 0x002b
|
||||
#define PROD_MORLEY_SCSI_UNCACHED 0x0067
|
||||
|
||||
#define MANU_CUMANA 0x003a
|
||||
#define PROD_CUMANA_SCSI_2 0x003a
|
||||
#define PROD_CUMANA_SCSI_1 0x00a0
|
||||
|
||||
#define MANU_ICS 0x003c
|
||||
#define PROD_ICS_IDE 0x00ae
|
||||
|
||||
#define MANU_ICS2 0x003d
|
||||
#define PROD_ICS2_IDE 0x00ae
|
||||
|
||||
#define MANU_SERPORT 0x003f
|
||||
#define PROD_SERPORT_DSPORT 0x00b9
|
||||
|
||||
#define MANU_ARXE 0x0041
|
||||
#define PROD_ARXE_SCSI 0x00be
|
||||
|
||||
#define MANU_I3 0x0046
|
||||
#define PROD_I3_ETHERLAN500 0x00d4
|
||||
#define PROD_I3_ETHERLAN600 0x00ec
|
||||
#define PROD_I3_ETHERLAN600A 0x011e
|
||||
|
||||
#define MANU_ANT 0x0053
|
||||
#define PROD_ANT_ETHERM 0x00d8
|
||||
#define PROD_ANT_ETHERB 0x00e4
|
||||
|
||||
#define MANU_ALSYSTEMS 0x005b
|
||||
#define PROD_ALSYS_SCSIATAPI 0x0107
|
||||
|
||||
#define MANU_MCS 0x0063
|
||||
#define PROD_MCS_CONNECT32 0x0125
|
||||
|
||||
#define MANU_EESOX 0x0064
|
||||
#define PROD_EESOX_SCSI2 0x008c
|
||||
|
||||
#define MANU_YELLOWSTONE 0x0096
|
||||
#define PROD_YELLOWSTONE_RAPIDE32 0x0120
|
||||
|
||||
#ifdef ECARD_C
|
||||
#define CONST
|
||||
#else
|
||||
#define CONST const
|
||||
#endif
|
||||
|
||||
#define MAX_ECARDS 9
|
||||
|
||||
struct ecard_id { /* Card ID structure */
|
||||
unsigned short manufacturer;
|
||||
unsigned short product;
|
||||
void *data;
|
||||
};
|
||||
|
||||
struct in_ecid { /* Packed card ID information */
|
||||
unsigned short product; /* Product code */
|
||||
unsigned short manufacturer; /* Manufacturer code */
|
||||
unsigned char id:4; /* Simple ID */
|
||||
unsigned char cd:1; /* Chunk dir present */
|
||||
unsigned char is:1; /* Interrupt status pointers */
|
||||
unsigned char w:2; /* Width */
|
||||
unsigned char country; /* Country */
|
||||
unsigned char irqmask; /* IRQ mask */
|
||||
unsigned char fiqmask; /* FIQ mask */
|
||||
unsigned long irqoff; /* IRQ offset */
|
||||
unsigned long fiqoff; /* FIQ offset */
|
||||
};
|
||||
|
||||
typedef struct expansion_card ecard_t;
|
||||
typedef unsigned long *loader_t;
|
||||
|
||||
typedef struct expansion_card_ops { /* Card handler routines */
|
||||
void (*irqenable)(ecard_t *ec, int irqnr);
|
||||
void (*irqdisable)(ecard_t *ec, int irqnr);
|
||||
int (*irqpending)(ecard_t *ec);
|
||||
void (*fiqenable)(ecard_t *ec, int fiqnr);
|
||||
void (*fiqdisable)(ecard_t *ec, int fiqnr);
|
||||
int (*fiqpending)(ecard_t *ec);
|
||||
} expansioncard_ops_t;
|
||||
|
||||
#define ECARD_NUM_RESOURCES (6)
|
||||
|
||||
#define ECARD_RES_IOCSLOW (0)
|
||||
#define ECARD_RES_IOCMEDIUM (1)
|
||||
#define ECARD_RES_IOCFAST (2)
|
||||
#define ECARD_RES_IOCSYNC (3)
|
||||
#define ECARD_RES_MEMC (4)
|
||||
#define ECARD_RES_EASI (5)
|
||||
|
||||
#define ecard_resource_start(ec,nr) ((ec)->resource[nr].start)
|
||||
#define ecard_resource_end(ec,nr) ((ec)->resource[nr].end)
|
||||
#define ecard_resource_len(ec,nr) ((ec)->resource[nr].end - \
|
||||
(ec)->resource[nr].start + 1)
|
||||
#define ecard_resource_flags(ec,nr) ((ec)->resource[nr].flags)
|
||||
|
||||
/*
|
||||
* This contains all the info needed on an expansion card
|
||||
*/
|
||||
struct expansion_card {
|
||||
struct expansion_card *next;
|
||||
|
||||
struct device dev;
|
||||
struct resource resource[ECARD_NUM_RESOURCES];
|
||||
|
||||
/* Public data */
|
||||
void __iomem *irqaddr; /* address of IRQ register */
|
||||
void __iomem *fiqaddr; /* address of FIQ register */
|
||||
unsigned char irqmask; /* IRQ mask */
|
||||
unsigned char fiqmask; /* FIQ mask */
|
||||
unsigned char claimed; /* Card claimed? */
|
||||
unsigned char easi; /* EASI card */
|
||||
|
||||
void *irq_data; /* Data for use for IRQ by card */
|
||||
void *fiq_data; /* Data for use for FIQ by card */
|
||||
const expansioncard_ops_t *ops; /* Enable/Disable Ops for card */
|
||||
|
||||
CONST unsigned int slot_no; /* Slot number */
|
||||
CONST unsigned int dma; /* DMA number (for request_dma) */
|
||||
CONST unsigned int irq; /* IRQ number (for request_irq) */
|
||||
CONST unsigned int fiq; /* FIQ number (for request_irq) */
|
||||
CONST struct in_ecid cid; /* Card Identification */
|
||||
|
||||
/* Private internal data */
|
||||
const char *card_desc; /* Card description */
|
||||
CONST unsigned int podaddr; /* Base Linux address for card */
|
||||
CONST loader_t loader; /* loader program */
|
||||
u64 dma_mask;
|
||||
};
|
||||
|
||||
void ecard_setirq(struct expansion_card *ec, const struct expansion_card_ops *ops, void *irq_data);
|
||||
|
||||
struct in_chunk_dir {
|
||||
unsigned int start_offset;
|
||||
union {
|
||||
unsigned char string[256];
|
||||
unsigned char data[1];
|
||||
} d;
|
||||
};
|
||||
|
||||
/*
|
||||
* Read a chunk from an expansion card
|
||||
* cd : where to put read data
|
||||
* ec : expansion card info struct
|
||||
* id : id number to find
|
||||
* num: (n+1)'th id to find.
|
||||
*/
|
||||
extern int ecard_readchunk (struct in_chunk_dir *cd, struct expansion_card *ec, int id, int num);
|
||||
|
||||
/*
|
||||
* Request and release ecard resources
|
||||
*/
|
||||
extern int ecard_request_resources(struct expansion_card *ec);
|
||||
extern void ecard_release_resources(struct expansion_card *ec);
|
||||
|
||||
void __iomem *ecardm_iomap(struct expansion_card *ec, unsigned int res,
|
||||
unsigned long offset, unsigned long maxsize);
|
||||
#define ecardm_iounmap(__ec, __addr) devm_iounmap(&(__ec)->dev, __addr)
|
||||
|
||||
extern struct bus_type ecard_bus_type;
|
||||
|
||||
#define ECARD_DEV(_d) container_of((_d), struct expansion_card, dev)
|
||||
|
||||
struct ecard_driver {
|
||||
int (*probe)(struct expansion_card *, const struct ecard_id *id);
|
||||
void (*remove)(struct expansion_card *);
|
||||
void (*shutdown)(struct expansion_card *);
|
||||
const struct ecard_id *id_table;
|
||||
unsigned int id;
|
||||
struct device_driver drv;
|
||||
};
|
||||
|
||||
#define ECARD_DRV(_d) container_of((_d), struct ecard_driver, drv)
|
||||
|
||||
#define ecard_set_drvdata(ec,data) dev_set_drvdata(&(ec)->dev, (data))
|
||||
#define ecard_get_drvdata(ec) dev_get_drvdata(&(ec)->dev)
|
||||
|
||||
int ecard_register_driver(struct ecard_driver *);
|
||||
void ecard_remove_driver(struct ecard_driver *);
|
||||
|
||||
#endif
|
116
arch/arm/include/asm/elf.h
Звичайний файл
116
arch/arm/include/asm/elf.h
Звичайний файл
@@ -0,0 +1,116 @@
|
||||
#ifndef __ASMARM_ELF_H
|
||||
#define __ASMARM_ELF_H
|
||||
|
||||
#include <asm/hwcap.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* ELF register definitions..
|
||||
*/
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/user.h>
|
||||
|
||||
typedef unsigned long elf_greg_t;
|
||||
typedef unsigned long elf_freg_t[3];
|
||||
|
||||
#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
|
||||
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
||||
|
||||
typedef struct user_fp elf_fpregset_t;
|
||||
#endif
|
||||
|
||||
#define EM_ARM 40
|
||||
#define EF_ARM_APCS26 0x08
|
||||
#define EF_ARM_SOFT_FLOAT 0x200
|
||||
#define EF_ARM_EABI_MASK 0xFF000000
|
||||
|
||||
#define R_ARM_NONE 0
|
||||
#define R_ARM_PC24 1
|
||||
#define R_ARM_ABS32 2
|
||||
#define R_ARM_CALL 28
|
||||
#define R_ARM_JUMP24 29
|
||||
|
||||
/*
|
||||
* These are used to set parameters in the core dumps.
|
||||
*/
|
||||
#define ELF_CLASS ELFCLASS32
|
||||
#ifdef __ARMEB__
|
||||
#define ELF_DATA ELFDATA2MSB
|
||||
#else
|
||||
#define ELF_DATA ELFDATA2LSB
|
||||
#endif
|
||||
#define ELF_ARCH EM_ARM
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* This yields a string that ld.so will use to load implementation
|
||||
* specific libraries for optimization. This is more specific in
|
||||
* intent than poking at uname or /proc/cpuinfo.
|
||||
*
|
||||
* For now we just provide a fairly general string that describes the
|
||||
* processor family. This could be made more specific later if someone
|
||||
* implemented optimisations that require it. 26-bit CPUs give you
|
||||
* "v1l" for ARM2 (no SWP) and "v2l" for anything else (ARM1 isn't
|
||||
* supported). 32-bit CPUs give you "v3[lb]" for anything based on an
|
||||
* ARM6 or ARM7 core and "armv4[lb]" for anything based on a StrongARM-1
|
||||
* core.
|
||||
*/
|
||||
#define ELF_PLATFORM_SIZE 8
|
||||
#define ELF_PLATFORM (elf_platform)
|
||||
|
||||
extern char elf_platform[];
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is used to ensure we don't load something for the wrong architecture.
|
||||
*/
|
||||
#define elf_check_arch(x) ((x)->e_machine == EM_ARM && ELF_PROC_OK(x))
|
||||
|
||||
/*
|
||||
* 32-bit code is always OK. Some cpus can do 26-bit, some can't.
|
||||
*/
|
||||
#define ELF_PROC_OK(x) (ELF_THUMB_OK(x) && ELF_26BIT_OK(x))
|
||||
|
||||
#define ELF_THUMB_OK(x) \
|
||||
((elf_hwcap & HWCAP_THUMB && ((x)->e_entry & 1) == 1) || \
|
||||
((x)->e_entry & 3) == 0)
|
||||
|
||||
#define ELF_26BIT_OK(x) \
|
||||
((elf_hwcap & HWCAP_26BIT && (x)->e_flags & EF_ARM_APCS26) || \
|
||||
((x)->e_flags & EF_ARM_APCS26) == 0)
|
||||
|
||||
#define USE_ELF_CORE_DUMP
|
||||
#define ELF_EXEC_PAGESIZE 4096
|
||||
|
||||
/* This is the location that an ET_DYN program is loaded if exec'ed. Typical
|
||||
use of this is to invoke "./ld.so someprog" to test out a new version of
|
||||
the loader. We need to make sure that it is out of the way of the program
|
||||
that it will "exec", and that there is sufficient room for the brk. */
|
||||
|
||||
#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)
|
||||
|
||||
/* When the program starts, a1 contains a pointer to a function to be
|
||||
registered with atexit, as per the SVR4 ABI. A value of 0 means we
|
||||
have no such handler. */
|
||||
#define ELF_PLAT_INIT(_r, load_addr) (_r)->ARM_r0 = 0
|
||||
|
||||
/*
|
||||
* Since the FPA coprocessor uses CP1 and CP2, and iWMMXt uses CP0
|
||||
* and CP1, we only enable access to the iWMMXt coprocessor if the
|
||||
* binary is EABI or softfloat (and thus, guaranteed not to use
|
||||
* FPA instructions.)
|
||||
*/
|
||||
#define SET_PERSONALITY(ex, ibcs2) \
|
||||
do { \
|
||||
if ((ex).e_flags & EF_ARM_APCS26) { \
|
||||
set_personality(PER_LINUX); \
|
||||
} else { \
|
||||
set_personality(PER_LINUX_32BIT); \
|
||||
if (elf_hwcap & HWCAP_IWMMXT && (ex).e_flags & (EF_ARM_EABI_MASK | EF_ARM_SOFT_FLOAT)) \
|
||||
set_thread_flag(TIF_USING_IWMMXT); \
|
||||
else \
|
||||
clear_thread_flag(TIF_USING_IWMMXT); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
6
arch/arm/include/asm/emergency-restart.h
Звичайний файл
6
arch/arm/include/asm/emergency-restart.h
Звичайний файл
@@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_EMERGENCY_RESTART_H
|
||||
#define _ASM_EMERGENCY_RESTART_H
|
||||
|
||||
#include <asm-generic/emergency-restart.h>
|
||||
|
||||
#endif /* _ASM_EMERGENCY_RESTART_H */
|
6
arch/arm/include/asm/errno.h
Звичайний файл
6
arch/arm/include/asm/errno.h
Звичайний файл
@@ -0,0 +1,6 @@
|
||||
#ifndef _ARM_ERRNO_H
|
||||
#define _ARM_ERRNO_H
|
||||
|
||||
#include <asm-generic/errno.h>
|
||||
|
||||
#endif
|
19
arch/arm/include/asm/fb.h
Звичайний файл
19
arch/arm/include/asm/fb.h
Звичайний файл
@@ -0,0 +1,19 @@
|
||||
#ifndef _ASM_FB_H_
|
||||
#define _ASM_FB_H_
|
||||
|
||||
#include <linux/fb.h>
|
||||
#include <linux/fs.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma,
|
||||
unsigned long off)
|
||||
{
|
||||
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
|
||||
}
|
||||
|
||||
static inline int fb_is_primary_device(struct fb_info *info)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _ASM_FB_H_ */
|
11
arch/arm/include/asm/fcntl.h
Звичайний файл
11
arch/arm/include/asm/fcntl.h
Звичайний файл
@@ -0,0 +1,11 @@
|
||||
#ifndef _ARM_FCNTL_H
|
||||
#define _ARM_FCNTL_H
|
||||
|
||||
#define O_DIRECTORY 040000 /* must be a directory */
|
||||
#define O_NOFOLLOW 0100000 /* don't follow links */
|
||||
#define O_DIRECT 0200000 /* direct disk access hint - currently ignored */
|
||||
#define O_LARGEFILE 0400000
|
||||
|
||||
#include <asm-generic/fcntl.h>
|
||||
|
||||
#endif
|
37
arch/arm/include/asm/fiq.h
Звичайний файл
37
arch/arm/include/asm/fiq.h
Звичайний файл
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* arch/arm/include/asm/fiq.h
|
||||
*
|
||||
* Support for FIQ on ARM architectures.
|
||||
* Written by Philip Blundell <philb@gnu.org>, 1998
|
||||
* Re-written by Russell King
|
||||
*/
|
||||
|
||||
#ifndef __ASM_FIQ_H
|
||||
#define __ASM_FIQ_H
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
struct fiq_handler {
|
||||
struct fiq_handler *next;
|
||||
/* Name
|
||||
*/
|
||||
const char *name;
|
||||
/* Called to ask driver to relinquish/
|
||||
* reacquire FIQ
|
||||
* return zero to accept, or -<errno>
|
||||
*/
|
||||
int (*fiq_op)(void *, int relinquish);
|
||||
/* data for the relinquish/reacquire functions
|
||||
*/
|
||||
void *dev_id;
|
||||
};
|
||||
|
||||
extern int claim_fiq(struct fiq_handler *f);
|
||||
extern void release_fiq(struct fiq_handler *f);
|
||||
extern void set_fiq_handler(void *start, unsigned int length);
|
||||
extern void set_fiq_regs(struct pt_regs *regs);
|
||||
extern void get_fiq_regs(struct pt_regs *regs);
|
||||
extern void enable_fiq(int fiq);
|
||||
extern void disable_fiq(int fiq);
|
||||
|
||||
#endif
|
19
arch/arm/include/asm/flat.h
Звичайний файл
19
arch/arm/include/asm/flat.h
Звичайний файл
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* arch/arm/include/asm/flat.h -- uClinux flat-format executables
|
||||
*/
|
||||
|
||||
#ifndef __ARM_FLAT_H__
|
||||
#define __ARM_FLAT_H__
|
||||
|
||||
/* An odd number of words will be pushed after this alignment, so
|
||||
deliberately misalign the value. */
|
||||
#define flat_stack_align(sp) sp = (void *)(((unsigned long)(sp) - 4) | 4)
|
||||
#define flat_argvp_envp_on_stack() 1
|
||||
#define flat_old_ram_flag(flags) (flags)
|
||||
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
|
||||
#define flat_get_addr_from_rp(rp, relval, flags, persistent) get_unaligned(rp)
|
||||
#define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp)
|
||||
#define flat_get_relocate_addr(rel) (rel)
|
||||
#define flat_set_persistent(relval, p) 0
|
||||
|
||||
#endif /* __ARM_FLAT_H__ */
|
148
arch/arm/include/asm/floppy.h
Звичайний файл
148
arch/arm/include/asm/floppy.h
Звичайний файл
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
* arch/arm/include/asm/floppy.h
|
||||
*
|
||||
* Copyright (C) 1996-2000 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.
|
||||
*
|
||||
* Note that we don't touch FLOPPY_DMA nor FLOPPY_IRQ here
|
||||
*/
|
||||
#ifndef __ASM_ARM_FLOPPY_H
|
||||
#define __ASM_ARM_FLOPPY_H
|
||||
#if 0
|
||||
#include <asm/arch/floppy.h>
|
||||
#endif
|
||||
|
||||
#define fd_outb(val,port) \
|
||||
do { \
|
||||
if ((port) == FD_DOR) \
|
||||
fd_setdor((val)); \
|
||||
else \
|
||||
outb((val),(port)); \
|
||||
} while(0)
|
||||
|
||||
#define fd_inb(port) inb((port))
|
||||
#define fd_request_irq() request_irq(IRQ_FLOPPYDISK,floppy_interrupt,\
|
||||
IRQF_DISABLED,"floppy",NULL)
|
||||
#define fd_free_irq() free_irq(IRQ_FLOPPYDISK,NULL)
|
||||
#define fd_disable_irq() disable_irq(IRQ_FLOPPYDISK)
|
||||
#define fd_enable_irq() enable_irq(IRQ_FLOPPYDISK)
|
||||
|
||||
static inline int fd_dma_setup(void *data, unsigned int length,
|
||||
unsigned int mode, unsigned long addr)
|
||||
{
|
||||
set_dma_mode(DMA_FLOPPY, mode);
|
||||
__set_dma_addr(DMA_FLOPPY, data);
|
||||
set_dma_count(DMA_FLOPPY, length);
|
||||
virtual_dma_port = addr;
|
||||
enable_dma(DMA_FLOPPY);
|
||||
return 0;
|
||||
}
|
||||
#define fd_dma_setup fd_dma_setup
|
||||
|
||||
#define fd_request_dma() request_dma(DMA_FLOPPY,"floppy")
|
||||
#define fd_free_dma() free_dma(DMA_FLOPPY)
|
||||
#define fd_disable_dma() disable_dma(DMA_FLOPPY)
|
||||
|
||||
/* need to clean up dma.h */
|
||||
#define DMA_FLOPPYDISK DMA_FLOPPY
|
||||
|
||||
/* Floppy_selects is the list of DOR's to select drive fd
|
||||
*
|
||||
* On initialisation, the floppy list is scanned, and the drives allocated
|
||||
* in the order that they are found. This is done by seeking the drive
|
||||
* to a non-zero track, and then restoring it to track 0. If an error occurs,
|
||||
* then there is no floppy drive present. [to be put back in again]
|
||||
*/
|
||||
static unsigned char floppy_selects[2][4] =
|
||||
{
|
||||
{ 0x10, 0x21, 0x23, 0x33 },
|
||||
{ 0x10, 0x21, 0x23, 0x33 }
|
||||
};
|
||||
|
||||
#define fd_setdor(dor) \
|
||||
do { \
|
||||
int new_dor = (dor); \
|
||||
if (new_dor & 0xf0) \
|
||||
new_dor = (new_dor & 0x0c) | floppy_selects[fdc][new_dor & 3]; \
|
||||
else \
|
||||
new_dor &= 0x0c; \
|
||||
outb(new_dor, FD_DOR); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Someday, we'll automatically detect which drives are present...
|
||||
*/
|
||||
static inline void fd_scandrives (void)
|
||||
{
|
||||
#if 0
|
||||
int floppy, drive_count;
|
||||
|
||||
fd_disable_irq();
|
||||
raw_cmd = &default_raw_cmd;
|
||||
raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_SEEK;
|
||||
raw_cmd->track = 0;
|
||||
raw_cmd->rate = ?;
|
||||
drive_count = 0;
|
||||
for (floppy = 0; floppy < 4; floppy ++) {
|
||||
current_drive = drive_count;
|
||||
/*
|
||||
* Turn on floppy motor
|
||||
*/
|
||||
if (start_motor(redo_fd_request))
|
||||
continue;
|
||||
/*
|
||||
* Set up FDC
|
||||
*/
|
||||
fdc_specify();
|
||||
/*
|
||||
* Tell FDC to recalibrate
|
||||
*/
|
||||
output_byte(FD_RECALIBRATE);
|
||||
LAST_OUT(UNIT(floppy));
|
||||
/* wait for command to complete */
|
||||
if (!successful) {
|
||||
int i;
|
||||
for (i = drive_count; i < 3; i--)
|
||||
floppy_selects[fdc][i] = floppy_selects[fdc][i + 1];
|
||||
floppy_selects[fdc][3] = 0;
|
||||
floppy -= 1;
|
||||
} else
|
||||
drive_count++;
|
||||
}
|
||||
#else
|
||||
floppy_selects[0][0] = 0x10;
|
||||
floppy_selects[0][1] = 0x21;
|
||||
floppy_selects[0][2] = 0x23;
|
||||
floppy_selects[0][3] = 0x33;
|
||||
#endif
|
||||
}
|
||||
|
||||
#define FDC1 (0x3f0)
|
||||
|
||||
#define FLOPPY0_TYPE 4
|
||||
#define FLOPPY1_TYPE 4
|
||||
|
||||
#define N_FDC 1
|
||||
#define N_DRIVE 4
|
||||
|
||||
#define CROSS_64KB(a,s) (0)
|
||||
|
||||
/*
|
||||
* This allows people to reverse the order of
|
||||
* fd0 and fd1, in case their hardware is
|
||||
* strangely connected (as some RiscPCs
|
||||
* and A5000s seem to be).
|
||||
*/
|
||||
static void driveswap(int *ints, int dummy, int dummy2)
|
||||
{
|
||||
floppy_selects[0][0] ^= floppy_selects[0][1];
|
||||
floppy_selects[0][1] ^= floppy_selects[0][0];
|
||||
floppy_selects[0][0] ^= floppy_selects[0][1];
|
||||
}
|
||||
|
||||
#define EXTRA_FLOPPY_PARAMS ,{ "driveswap", &driveswap, NULL, 0, 0 }
|
||||
|
||||
#endif
|
93
arch/arm/include/asm/fpstate.h
Звичайний файл
93
arch/arm/include/asm/fpstate.h
Звичайний файл
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* arch/arm/include/asm/fpstate.h
|
||||
*
|
||||
* Copyright (C) 1995 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.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_FPSTATE_H
|
||||
#define __ASM_ARM_FPSTATE_H
|
||||
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* VFP storage area has:
|
||||
* - FPEXC, FPSCR, FPINST and FPINST2.
|
||||
* - 16 or 32 double precision data registers
|
||||
* - an implementation-dependant word of state for FLDMX/FSTMX (pre-ARMv6)
|
||||
*
|
||||
* FPEXC will always be non-zero once the VFP has been used in this process.
|
||||
*/
|
||||
|
||||
struct vfp_hard_struct {
|
||||
#ifdef CONFIG_VFPv3
|
||||
__u64 fpregs[32];
|
||||
#else
|
||||
__u64 fpregs[16];
|
||||
#endif
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
__u32 fpmx_state;
|
||||
#endif
|
||||
__u32 fpexc;
|
||||
__u32 fpscr;
|
||||
/*
|
||||
* VFP implementation specific state
|
||||
*/
|
||||
__u32 fpinst;
|
||||
__u32 fpinst2;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
__u32 cpu;
|
||||
#endif
|
||||
};
|
||||
|
||||
union vfp_state {
|
||||
struct vfp_hard_struct hard;
|
||||
};
|
||||
|
||||
extern void vfp_flush_thread(union vfp_state *);
|
||||
extern void vfp_release_thread(union vfp_state *);
|
||||
|
||||
#define FP_HARD_SIZE 35
|
||||
|
||||
struct fp_hard_struct {
|
||||
unsigned int save[FP_HARD_SIZE]; /* as yet undefined */
|
||||
};
|
||||
|
||||
#define FP_SOFT_SIZE 35
|
||||
|
||||
struct fp_soft_struct {
|
||||
unsigned int save[FP_SOFT_SIZE]; /* undefined information */
|
||||
};
|
||||
|
||||
#define IWMMXT_SIZE 0x98
|
||||
|
||||
struct iwmmxt_struct {
|
||||
unsigned int save[IWMMXT_SIZE / sizeof(unsigned int)];
|
||||
};
|
||||
|
||||
union fp_state {
|
||||
struct fp_hard_struct hard;
|
||||
struct fp_soft_struct soft;
|
||||
#ifdef CONFIG_IWMMXT
|
||||
struct iwmmxt_struct iwmmxt;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define FP_SIZE (sizeof(union fp_state) / sizeof(int))
|
||||
|
||||
struct crunch_state {
|
||||
unsigned int mvdx[16][2];
|
||||
unsigned int mvax[4][3];
|
||||
unsigned int dspsc[2];
|
||||
};
|
||||
|
||||
#define CRUNCH_SIZE sizeof(struct crunch_state)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
14
arch/arm/include/asm/ftrace.h
Звичайний файл
14
arch/arm/include/asm/ftrace.h
Звичайний файл
@@ -0,0 +1,14 @@
|
||||
#ifndef _ASM_ARM_FTRACE
|
||||
#define _ASM_ARM_FTRACE
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#define MCOUNT_ADDR ((long)(mcount))
|
||||
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern void mcount(void);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_ARM_FTRACE */
|
6
arch/arm/include/asm/futex.h
Звичайний файл
6
arch/arm/include/asm/futex.h
Звичайний файл
@@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_FUTEX_H
|
||||
#define _ASM_FUTEX_H
|
||||
|
||||
#include <asm-generic/futex.h>
|
||||
|
||||
#endif
|
149
arch/arm/include/asm/glue.h
Звичайний файл
149
arch/arm/include/asm/glue.h
Звичайний файл
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
* arch/arm/include/asm/glue.h
|
||||
*
|
||||
* Copyright (C) 1997-1999 Russell King
|
||||
* Copyright (C) 2000-2002 Deep Blue Solutions Ltd.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This file provides the glue to stick the processor-specific bits
|
||||
* into the kernel in an efficient manner. The idea is to use branches
|
||||
* when we're only targetting one class of TLB, or indirect calls
|
||||
* when we're targetting multiple classes of TLBs.
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
||||
#ifdef __STDC__
|
||||
#define ____glue(name,fn) name##fn
|
||||
#else
|
||||
#define ____glue(name,fn) name/**/fn
|
||||
#endif
|
||||
#define __glue(name,fn) ____glue(name,fn)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Data Abort Model
|
||||
* ================
|
||||
*
|
||||
* We have the following to choose from:
|
||||
* arm6 - ARM6 style
|
||||
* arm7 - ARM7 style
|
||||
* v4_early - ARMv4 without Thumb early abort handler
|
||||
* v4t_late - ARMv4 with Thumb late abort handler
|
||||
* v4t_early - ARMv4 with Thumb early abort handler
|
||||
* v5tej_early - ARMv5 with Thumb and Java early abort handler
|
||||
* xscale - ARMv5 with Thumb with Xscale extensions
|
||||
* v6_early - ARMv6 generic early abort handler
|
||||
* v7_early - ARMv7 generic early abort handler
|
||||
*/
|
||||
#undef CPU_DABORT_HANDLER
|
||||
#undef MULTI_DABORT
|
||||
|
||||
#if defined(CONFIG_CPU_ARM610)
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER cpu_arm6_data_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_ARM710)
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER cpu_arm7_data_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_ABRT_LV4T
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER v4t_late_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_ABRT_EV4
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER v4_early_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_ABRT_EV4T
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER v4t_early_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_ABRT_EV5TJ
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER v5tj_early_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_ABRT_EV5T
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER v5t_early_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_ABRT_EV6
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER v6_early_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_ABRT_EV7
|
||||
# ifdef CPU_DABORT_HANDLER
|
||||
# define MULTI_DABORT 1
|
||||
# else
|
||||
# define CPU_DABORT_HANDLER v7_early_abort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef CPU_DABORT_HANDLER
|
||||
#error Unknown data abort handler type
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Prefetch abort handler. If the CPU has an IFAR use that, otherwise
|
||||
* use the address of the aborted instruction
|
||||
*/
|
||||
#undef CPU_PABORT_HANDLER
|
||||
#undef MULTI_PABORT
|
||||
|
||||
#ifdef CONFIG_CPU_PABRT_IFAR
|
||||
# ifdef CPU_PABORT_HANDLER
|
||||
# define MULTI_PABORT 1
|
||||
# else
|
||||
# define CPU_PABORT_HANDLER(reg, insn) mrc p15, 0, reg, cr6, cr0, 2
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_PABRT_NOIFAR
|
||||
# ifdef CPU_PABORT_HANDLER
|
||||
# define MULTI_PABORT 1
|
||||
# else
|
||||
# define CPU_PABORT_HANDLER(reg, insn) mov reg, insn
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef CPU_PABORT_HANDLER
|
||||
#error Unknown prefetch abort handler type
|
||||
#endif
|
||||
|
||||
#endif
|
7
arch/arm/include/asm/gpio.h
Звичайний файл
7
arch/arm/include/asm/gpio.h
Звичайний файл
@@ -0,0 +1,7 @@
|
||||
#ifndef _ARCH_ARM_GPIO_H
|
||||
#define _ARCH_ARM_GPIO_H
|
||||
|
||||
/* not all ARM platforms necessarily support this API ... */
|
||||
#include <asm/arch/gpio.h>
|
||||
|
||||
#endif /* _ARCH_ARM_GPIO_H */
|
32
arch/arm/include/asm/hardirq.h
Звичайний файл
32
arch/arm/include/asm/hardirq.h
Звичайний файл
@@ -0,0 +1,32 @@
|
||||
#ifndef __ASM_HARDIRQ_H
|
||||
#define __ASM_HARDIRQ_H
|
||||
|
||||
#include <linux/cache.h>
|
||||
#include <linux/threads.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
typedef struct {
|
||||
unsigned int __softirq_pending;
|
||||
unsigned int local_timer_irqs;
|
||||
} ____cacheline_aligned irq_cpustat_t;
|
||||
|
||||
#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
|
||||
|
||||
#if NR_IRQS > 256
|
||||
#define HARDIRQ_BITS 9
|
||||
#else
|
||||
#define HARDIRQ_BITS 8
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The hardirq mask has to be large enough to have space
|
||||
* for potentially all IRQ sources in the system nesting
|
||||
* on a single CPU:
|
||||
*/
|
||||
#if (1 << HARDIRQ_BITS) < NR_IRQS
|
||||
# error HARDIRQ_BITS is too low!
|
||||
#endif
|
||||
|
||||
#define __ARCH_IRQ_EXIT_IRQS_DISABLED 1
|
||||
|
||||
#endif /* __ASM_HARDIRQ_H */
|
18
arch/arm/include/asm/hardware.h
Звичайний файл
18
arch/arm/include/asm/hardware.h
Звичайний файл
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware.h
|
||||
*
|
||||
* Copyright (C) 1996 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.
|
||||
*
|
||||
* Common hardware definitions
|
||||
*/
|
||||
|
||||
#ifndef __ASM_HARDWARE_H
|
||||
#define __ASM_HARDWARE_H
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
#endif
|
21
arch/arm/include/asm/hardware/arm_timer.h
Звичайний файл
21
arch/arm/include/asm/hardware/arm_timer.h
Звичайний файл
@@ -0,0 +1,21 @@
|
||||
#ifndef __ASM_ARM_HARDWARE_ARM_TIMER_H
|
||||
#define __ASM_ARM_HARDWARE_ARM_TIMER_H
|
||||
|
||||
#define TIMER_LOAD 0x00
|
||||
#define TIMER_VALUE 0x04
|
||||
#define TIMER_CTRL 0x08
|
||||
#define TIMER_CTRL_ONESHOT (1 << 0)
|
||||
#define TIMER_CTRL_32BIT (1 << 1)
|
||||
#define TIMER_CTRL_DIV1 (0 << 2)
|
||||
#define TIMER_CTRL_DIV16 (1 << 2)
|
||||
#define TIMER_CTRL_DIV256 (2 << 2)
|
||||
#define TIMER_CTRL_IE (1 << 5) /* Interrupt Enable (versatile only) */
|
||||
#define TIMER_CTRL_PERIODIC (1 << 6)
|
||||
#define TIMER_CTRL_ENABLE (1 << 7)
|
||||
|
||||
#define TIMER_INTCLR 0x0c
|
||||
#define TIMER_RIS 0x10
|
||||
#define TIMER_MIS 0x14
|
||||
#define TIMER_BGLOAD 0x18
|
||||
|
||||
#endif
|
21
arch/arm/include/asm/hardware/arm_twd.h
Звичайний файл
21
arch/arm/include/asm/hardware/arm_twd.h
Звичайний файл
@@ -0,0 +1,21 @@
|
||||
#ifndef __ASM_HARDWARE_TWD_H
|
||||
#define __ASM_HARDWARE_TWD_H
|
||||
|
||||
#define TWD_TIMER_LOAD 0x00
|
||||
#define TWD_TIMER_COUNTER 0x04
|
||||
#define TWD_TIMER_CONTROL 0x08
|
||||
#define TWD_TIMER_INTSTAT 0x0C
|
||||
|
||||
#define TWD_WDOG_LOAD 0x20
|
||||
#define TWD_WDOG_COUNTER 0x24
|
||||
#define TWD_WDOG_CONTROL 0x28
|
||||
#define TWD_WDOG_INTSTAT 0x2C
|
||||
#define TWD_WDOG_RESETSTAT 0x30
|
||||
#define TWD_WDOG_DISABLE 0x34
|
||||
|
||||
#define TWD_TIMER_CONTROL_ENABLE (1 << 0)
|
||||
#define TWD_TIMER_CONTROL_ONESHOT (0 << 1)
|
||||
#define TWD_TIMER_CONTROL_PERIODIC (1 << 1)
|
||||
#define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2)
|
||||
|
||||
#endif
|
56
arch/arm/include/asm/hardware/cache-l2x0.h
Звичайний файл
56
arch/arm/include/asm/hardware/cache-l2x0.h
Звичайний файл
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/cache-l2x0.h
|
||||
*
|
||||
* Copyright (C) 2007 ARM Limited
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_HARDWARE_L2X0_H
|
||||
#define __ASM_ARM_HARDWARE_L2X0_H
|
||||
|
||||
#define L2X0_CACHE_ID 0x000
|
||||
#define L2X0_CACHE_TYPE 0x004
|
||||
#define L2X0_CTRL 0x100
|
||||
#define L2X0_AUX_CTRL 0x104
|
||||
#define L2X0_EVENT_CNT_CTRL 0x200
|
||||
#define L2X0_EVENT_CNT1_CFG 0x204
|
||||
#define L2X0_EVENT_CNT0_CFG 0x208
|
||||
#define L2X0_EVENT_CNT1_VAL 0x20C
|
||||
#define L2X0_EVENT_CNT0_VAL 0x210
|
||||
#define L2X0_INTR_MASK 0x214
|
||||
#define L2X0_MASKED_INTR_STAT 0x218
|
||||
#define L2X0_RAW_INTR_STAT 0x21C
|
||||
#define L2X0_INTR_CLEAR 0x220
|
||||
#define L2X0_CACHE_SYNC 0x730
|
||||
#define L2X0_INV_LINE_PA 0x770
|
||||
#define L2X0_INV_WAY 0x77C
|
||||
#define L2X0_CLEAN_LINE_PA 0x7B0
|
||||
#define L2X0_CLEAN_LINE_IDX 0x7B8
|
||||
#define L2X0_CLEAN_WAY 0x7BC
|
||||
#define L2X0_CLEAN_INV_LINE_PA 0x7F0
|
||||
#define L2X0_CLEAN_INV_LINE_IDX 0x7F8
|
||||
#define L2X0_CLEAN_INV_WAY 0x7FC
|
||||
#define L2X0_LOCKDOWN_WAY_D 0x900
|
||||
#define L2X0_LOCKDOWN_WAY_I 0x904
|
||||
#define L2X0_TEST_OPERATION 0xF00
|
||||
#define L2X0_LINE_DATA 0xF10
|
||||
#define L2X0_LINE_TAG 0xF30
|
||||
#define L2X0_DEBUG_CTRL 0xF40
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask);
|
||||
#endif
|
||||
|
||||
#endif
|
184
arch/arm/include/asm/hardware/clps7111.h
Звичайний файл
184
arch/arm/include/asm/hardware/clps7111.h
Звичайний файл
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/clps7111.h
|
||||
*
|
||||
* This file contains the hardware definitions of the CLPS7111 internal
|
||||
* registers.
|
||||
*
|
||||
* Copyright (C) 2000 Deep Blue Solutions Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef __ASM_HARDWARE_CLPS7111_H
|
||||
#define __ASM_HARDWARE_CLPS7111_H
|
||||
|
||||
#define CLPS7111_PHYS_BASE (0x80000000)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define clps_readb(off) __raw_readb(CLPS7111_BASE + (off))
|
||||
#define clps_readw(off) __raw_readw(CLPS7111_BASE + (off))
|
||||
#define clps_readl(off) __raw_readl(CLPS7111_BASE + (off))
|
||||
#define clps_writeb(val,off) __raw_writeb(val, CLPS7111_BASE + (off))
|
||||
#define clps_writew(val,off) __raw_writew(val, CLPS7111_BASE + (off))
|
||||
#define clps_writel(val,off) __raw_writel(val, CLPS7111_BASE + (off))
|
||||
#endif
|
||||
|
||||
#define PADR (0x0000)
|
||||
#define PBDR (0x0001)
|
||||
#define PDDR (0x0003)
|
||||
#define PADDR (0x0040)
|
||||
#define PBDDR (0x0041)
|
||||
#define PDDDR (0x0043)
|
||||
#define PEDR (0x0080)
|
||||
#define PEDDR (0x00c0)
|
||||
#define SYSCON1 (0x0100)
|
||||
#define SYSFLG1 (0x0140)
|
||||
#define MEMCFG1 (0x0180)
|
||||
#define MEMCFG2 (0x01c0)
|
||||
#define DRFPR (0x0200)
|
||||
#define INTSR1 (0x0240)
|
||||
#define INTMR1 (0x0280)
|
||||
#define LCDCON (0x02c0)
|
||||
#define TC1D (0x0300)
|
||||
#define TC2D (0x0340)
|
||||
#define RTCDR (0x0380)
|
||||
#define RTCMR (0x03c0)
|
||||
#define PMPCON (0x0400)
|
||||
#define CODR (0x0440)
|
||||
#define UARTDR1 (0x0480)
|
||||
#define UBRLCR1 (0x04c0)
|
||||
#define SYNCIO (0x0500)
|
||||
#define PALLSW (0x0540)
|
||||
#define PALMSW (0x0580)
|
||||
#define STFCLR (0x05c0)
|
||||
#define BLEOI (0x0600)
|
||||
#define MCEOI (0x0640)
|
||||
#define TEOI (0x0680)
|
||||
#define TC1EOI (0x06c0)
|
||||
#define TC2EOI (0x0700)
|
||||
#define RTCEOI (0x0740)
|
||||
#define UMSEOI (0x0780)
|
||||
#define COEOI (0x07c0)
|
||||
#define HALT (0x0800)
|
||||
#define STDBY (0x0840)
|
||||
|
||||
#define FBADDR (0x1000)
|
||||
#define SYSCON2 (0x1100)
|
||||
#define SYSFLG2 (0x1140)
|
||||
#define INTSR2 (0x1240)
|
||||
#define INTMR2 (0x1280)
|
||||
#define UARTDR2 (0x1480)
|
||||
#define UBRLCR2 (0x14c0)
|
||||
#define SS2DR (0x1500)
|
||||
#define SRXEOF (0x1600)
|
||||
#define SS2POP (0x16c0)
|
||||
#define KBDEOI (0x1700)
|
||||
|
||||
/* common bits: SYSCON1 / SYSCON2 */
|
||||
#define SYSCON_UARTEN (1 << 8)
|
||||
|
||||
#define SYSCON1_KBDSCAN(x) ((x) & 15)
|
||||
#define SYSCON1_KBDSCANMASK (15)
|
||||
#define SYSCON1_TC1M (1 << 4)
|
||||
#define SYSCON1_TC1S (1 << 5)
|
||||
#define SYSCON1_TC2M (1 << 6)
|
||||
#define SYSCON1_TC2S (1 << 7)
|
||||
#define SYSCON1_UART1EN SYSCON_UARTEN
|
||||
#define SYSCON1_BZTOG (1 << 9)
|
||||
#define SYSCON1_BZMOD (1 << 10)
|
||||
#define SYSCON1_DBGEN (1 << 11)
|
||||
#define SYSCON1_LCDEN (1 << 12)
|
||||
#define SYSCON1_CDENTX (1 << 13)
|
||||
#define SYSCON1_CDENRX (1 << 14)
|
||||
#define SYSCON1_SIREN (1 << 15)
|
||||
#define SYSCON1_ADCKSEL(x) (((x) & 3) << 16)
|
||||
#define SYSCON1_ADCKSEL_MASK (3 << 16)
|
||||
#define SYSCON1_EXCKEN (1 << 18)
|
||||
#define SYSCON1_WAKEDIS (1 << 19)
|
||||
#define SYSCON1_IRTXM (1 << 20)
|
||||
|
||||
/* common bits: SYSFLG1 / SYSFLG2 */
|
||||
#define SYSFLG_UBUSY (1 << 11)
|
||||
#define SYSFLG_URXFE (1 << 22)
|
||||
#define SYSFLG_UTXFF (1 << 23)
|
||||
|
||||
#define SYSFLG1_MCDR (1 << 0)
|
||||
#define SYSFLG1_DCDET (1 << 1)
|
||||
#define SYSFLG1_WUDR (1 << 2)
|
||||
#define SYSFLG1_WUON (1 << 3)
|
||||
#define SYSFLG1_CTS (1 << 8)
|
||||
#define SYSFLG1_DSR (1 << 9)
|
||||
#define SYSFLG1_DCD (1 << 10)
|
||||
#define SYSFLG1_UBUSY SYSFLG_UBUSY
|
||||
#define SYSFLG1_NBFLG (1 << 12)
|
||||
#define SYSFLG1_RSTFLG (1 << 13)
|
||||
#define SYSFLG1_PFFLG (1 << 14)
|
||||
#define SYSFLG1_CLDFLG (1 << 15)
|
||||
#define SYSFLG1_URXFE SYSFLG_URXFE
|
||||
#define SYSFLG1_UTXFF SYSFLG_UTXFF
|
||||
#define SYSFLG1_CRXFE (1 << 24)
|
||||
#define SYSFLG1_CTXFF (1 << 25)
|
||||
#define SYSFLG1_SSIBUSY (1 << 26)
|
||||
#define SYSFLG1_ID (1 << 29)
|
||||
|
||||
#define SYSFLG2_SSRXOF (1 << 0)
|
||||
#define SYSFLG2_RESVAL (1 << 1)
|
||||
#define SYSFLG2_RESFRM (1 << 2)
|
||||
#define SYSFLG2_SS2RXFE (1 << 3)
|
||||
#define SYSFLG2_SS2TXFF (1 << 4)
|
||||
#define SYSFLG2_SS2TXUF (1 << 5)
|
||||
#define SYSFLG2_CKMODE (1 << 6)
|
||||
#define SYSFLG2_UBUSY SYSFLG_UBUSY
|
||||
#define SYSFLG2_URXFE SYSFLG_URXFE
|
||||
#define SYSFLG2_UTXFF SYSFLG_UTXFF
|
||||
|
||||
#define LCDCON_GSEN (1 << 30)
|
||||
#define LCDCON_GSMD (1 << 31)
|
||||
|
||||
#define SYSCON2_SERSEL (1 << 0)
|
||||
#define SYSCON2_KBD6 (1 << 1)
|
||||
#define SYSCON2_DRAMZ (1 << 2)
|
||||
#define SYSCON2_KBWEN (1 << 3)
|
||||
#define SYSCON2_SS2TXEN (1 << 4)
|
||||
#define SYSCON2_PCCARD1 (1 << 5)
|
||||
#define SYSCON2_PCCARD2 (1 << 6)
|
||||
#define SYSCON2_SS2RXEN (1 << 7)
|
||||
#define SYSCON2_UART2EN SYSCON_UARTEN
|
||||
#define SYSCON2_SS2MAEN (1 << 9)
|
||||
#define SYSCON2_OSTB (1 << 12)
|
||||
#define SYSCON2_CLKENSL (1 << 13)
|
||||
#define SYSCON2_BUZFREQ (1 << 14)
|
||||
|
||||
/* common bits: UARTDR1 / UARTDR2 */
|
||||
#define UARTDR_FRMERR (1 << 8)
|
||||
#define UARTDR_PARERR (1 << 9)
|
||||
#define UARTDR_OVERR (1 << 10)
|
||||
|
||||
/* common bits: UBRLCR1 / UBRLCR2 */
|
||||
#define UBRLCR_BAUD_MASK ((1 << 12) - 1)
|
||||
#define UBRLCR_BREAK (1 << 12)
|
||||
#define UBRLCR_PRTEN (1 << 13)
|
||||
#define UBRLCR_EVENPRT (1 << 14)
|
||||
#define UBRLCR_XSTOP (1 << 15)
|
||||
#define UBRLCR_FIFOEN (1 << 16)
|
||||
#define UBRLCR_WRDLEN5 (0 << 17)
|
||||
#define UBRLCR_WRDLEN6 (1 << 17)
|
||||
#define UBRLCR_WRDLEN7 (2 << 17)
|
||||
#define UBRLCR_WRDLEN8 (3 << 17)
|
||||
#define UBRLCR_WRDLEN_MASK (3 << 17)
|
||||
|
||||
#define SYNCIO_SMCKEN (1 << 13)
|
||||
#define SYNCIO_TXFRMEN (1 << 14)
|
||||
|
||||
#endif /* __ASM_HARDWARE_CLPS7111_H */
|
49
arch/arm/include/asm/hardware/cs89712.h
Звичайний файл
49
arch/arm/include/asm/hardware/cs89712.h
Звичайний файл
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/cs89712.h
|
||||
*
|
||||
* This file contains the hardware definitions of the CS89712
|
||||
* additional internal registers.
|
||||
*
|
||||
* Copyright (C) 2001 Thomas Gleixner autronix automation <gleixner@autronix.de>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef __ASM_HARDWARE_CS89712_H
|
||||
#define __ASM_HARDWARE_CS89712_H
|
||||
|
||||
/*
|
||||
* CS89712 additional registers
|
||||
*/
|
||||
|
||||
#define PCDR 0x0002 /* Port C Data register ---------------------------- */
|
||||
#define PCDDR 0x0042 /* Port C Data Direction register ------------------ */
|
||||
#define SDCONF 0x2300 /* SDRAM Configuration register ---------------------*/
|
||||
#define SDRFPR 0x2340 /* SDRAM Refresh period register --------------------*/
|
||||
|
||||
#define SDCONF_ACTIVE (1 << 10)
|
||||
#define SDCONF_CLKCTL (1 << 9)
|
||||
#define SDCONF_WIDTH_4 (0 << 7)
|
||||
#define SDCONF_WIDTH_8 (1 << 7)
|
||||
#define SDCONF_WIDTH_16 (2 << 7)
|
||||
#define SDCONF_WIDTH_32 (3 << 7)
|
||||
#define SDCONF_SIZE_16 (0 << 5)
|
||||
#define SDCONF_SIZE_64 (1 << 5)
|
||||
#define SDCONF_SIZE_128 (2 << 5)
|
||||
#define SDCONF_SIZE_256 (3 << 5)
|
||||
#define SDCONF_CASLAT_2 (2)
|
||||
#define SDCONF_CASLAT_3 (3)
|
||||
|
||||
#endif /* __ASM_HARDWARE_CS89712_H */
|
29
arch/arm/include/asm/hardware/debug-8250.S
Звичайний файл
29
arch/arm/include/asm/hardware/debug-8250.S
Звичайний файл
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/debug-8250.S
|
||||
*
|
||||
* Copyright (C) 1994-1999 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.
|
||||
*/
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
.macro senduart,rd,rx
|
||||
strb \rd, [\rx, #UART_TX << UART_SHIFT]
|
||||
.endm
|
||||
|
||||
.macro busyuart,rd,rx
|
||||
1002: ldrb \rd, [\rx, #UART_LSR << UART_SHIFT]
|
||||
and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
|
||||
teq \rd, #UART_LSR_TEMT | UART_LSR_THRE
|
||||
bne 1002b
|
||||
.endm
|
||||
|
||||
.macro waituart,rd,rx
|
||||
#ifdef FLOW_CONTROL
|
||||
1001: ldrb \rd, [\rx, #UART_MSR << UART_SHIFT]
|
||||
tst \rd, #UART_MSR_CTS
|
||||
beq 1001b
|
||||
#endif
|
||||
.endm
|
29
arch/arm/include/asm/hardware/debug-pl01x.S
Звичайний файл
29
arch/arm/include/asm/hardware/debug-pl01x.S
Звичайний файл
@@ -0,0 +1,29 @@
|
||||
/* arch/arm/include/asm/hardware/debug-pl01x.S
|
||||
*
|
||||
* Debugging macro include header
|
||||
*
|
||||
* Copyright (C) 1994-1999 Russell King
|
||||
* Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#include <linux/amba/serial.h>
|
||||
|
||||
.macro senduart,rd,rx
|
||||
strb \rd, [\rx, #UART01x_DR]
|
||||
.endm
|
||||
|
||||
.macro waituart,rd,rx
|
||||
1001: ldr \rd, [\rx, #UART01x_FR]
|
||||
tst \rd, #UART01x_FR_TXFF
|
||||
bne 1001b
|
||||
.endm
|
||||
|
||||
.macro busyuart,rd,rx
|
||||
1001: ldr \rd, [\rx, #UART01x_FR]
|
||||
tst \rd, #UART01x_FR_BUSY
|
||||
bne 1001b
|
||||
.endm
|
147
arch/arm/include/asm/hardware/dec21285.h
Звичайний файл
147
arch/arm/include/asm/hardware/dec21285.h
Звичайний файл
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/dec21285.h
|
||||
*
|
||||
* Copyright (C) 1998 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.
|
||||
*
|
||||
* DC21285 registers
|
||||
*/
|
||||
#define DC21285_PCI_IACK 0x79000000
|
||||
#define DC21285_ARMCSR_BASE 0x42000000
|
||||
#define DC21285_PCI_TYPE_0_CONFIG 0x7b000000
|
||||
#define DC21285_PCI_TYPE_1_CONFIG 0x7a000000
|
||||
#define DC21285_OUTBOUND_WRITE_FLUSH 0x78000000
|
||||
#define DC21285_FLASH 0x41000000
|
||||
#define DC21285_PCI_IO 0x7c000000
|
||||
#define DC21285_PCI_MEM 0x80000000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/hardware.h>
|
||||
#define DC21285_IO(x) ((volatile unsigned long *)(ARMCSR_BASE+(x)))
|
||||
#else
|
||||
#define DC21285_IO(x) (x)
|
||||
#endif
|
||||
|
||||
#define CSR_PCICMD DC21285_IO(0x0004)
|
||||
#define CSR_CLASSREV DC21285_IO(0x0008)
|
||||
#define CSR_PCICACHELINESIZE DC21285_IO(0x000c)
|
||||
#define CSR_PCICSRBASE DC21285_IO(0x0010)
|
||||
#define CSR_PCICSRIOBASE DC21285_IO(0x0014)
|
||||
#define CSR_PCISDRAMBASE DC21285_IO(0x0018)
|
||||
#define CSR_PCIROMBASE DC21285_IO(0x0030)
|
||||
#define CSR_MBOX0 DC21285_IO(0x0050)
|
||||
#define CSR_MBOX1 DC21285_IO(0x0054)
|
||||
#define CSR_MBOX2 DC21285_IO(0x0058)
|
||||
#define CSR_MBOX3 DC21285_IO(0x005c)
|
||||
#define CSR_DOORBELL DC21285_IO(0x0060)
|
||||
#define CSR_DOORBELL_SETUP DC21285_IO(0x0064)
|
||||
#define CSR_ROMWRITEREG DC21285_IO(0x0068)
|
||||
#define CSR_CSRBASEMASK DC21285_IO(0x00f8)
|
||||
#define CSR_CSRBASEOFFSET DC21285_IO(0x00fc)
|
||||
#define CSR_SDRAMBASEMASK DC21285_IO(0x0100)
|
||||
#define CSR_SDRAMBASEOFFSET DC21285_IO(0x0104)
|
||||
#define CSR_ROMBASEMASK DC21285_IO(0x0108)
|
||||
#define CSR_SDRAMTIMING DC21285_IO(0x010c)
|
||||
#define CSR_SDRAMADDRSIZE0 DC21285_IO(0x0110)
|
||||
#define CSR_SDRAMADDRSIZE1 DC21285_IO(0x0114)
|
||||
#define CSR_SDRAMADDRSIZE2 DC21285_IO(0x0118)
|
||||
#define CSR_SDRAMADDRSIZE3 DC21285_IO(0x011c)
|
||||
#define CSR_I2O_INFREEHEAD DC21285_IO(0x0120)
|
||||
#define CSR_I2O_INPOSTTAIL DC21285_IO(0x0124)
|
||||
#define CSR_I2O_OUTPOSTHEAD DC21285_IO(0x0128)
|
||||
#define CSR_I2O_OUTFREETAIL DC21285_IO(0x012c)
|
||||
#define CSR_I2O_INFREECOUNT DC21285_IO(0x0130)
|
||||
#define CSR_I2O_OUTPOSTCOUNT DC21285_IO(0x0134)
|
||||
#define CSR_I2O_INPOSTCOUNT DC21285_IO(0x0138)
|
||||
#define CSR_SA110_CNTL DC21285_IO(0x013c)
|
||||
#define SA110_CNTL_INITCMPLETE (1 << 0)
|
||||
#define SA110_CNTL_ASSERTSERR (1 << 1)
|
||||
#define SA110_CNTL_RXSERR (1 << 3)
|
||||
#define SA110_CNTL_SA110DRAMPARITY (1 << 4)
|
||||
#define SA110_CNTL_PCISDRAMPARITY (1 << 5)
|
||||
#define SA110_CNTL_DMASDRAMPARITY (1 << 6)
|
||||
#define SA110_CNTL_DISCARDTIMER (1 << 8)
|
||||
#define SA110_CNTL_PCINRESET (1 << 9)
|
||||
#define SA110_CNTL_I2O_256 (0 << 10)
|
||||
#define SA110_CNTL_I20_512 (1 << 10)
|
||||
#define SA110_CNTL_I2O_1024 (2 << 10)
|
||||
#define SA110_CNTL_I2O_2048 (3 << 10)
|
||||
#define SA110_CNTL_I2O_4096 (4 << 10)
|
||||
#define SA110_CNTL_I2O_8192 (5 << 10)
|
||||
#define SA110_CNTL_I2O_16384 (6 << 10)
|
||||
#define SA110_CNTL_I2O_32768 (7 << 10)
|
||||
#define SA110_CNTL_WATCHDOG (1 << 13)
|
||||
#define SA110_CNTL_ROMWIDTH_UNDEF (0 << 14)
|
||||
#define SA110_CNTL_ROMWIDTH_16 (1 << 14)
|
||||
#define SA110_CNTL_ROMWIDTH_32 (2 << 14)
|
||||
#define SA110_CNTL_ROMWIDTH_8 (3 << 14)
|
||||
#define SA110_CNTL_ROMACCESSTIME(x) ((x)<<16)
|
||||
#define SA110_CNTL_ROMBURSTTIME(x) ((x)<<20)
|
||||
#define SA110_CNTL_ROMTRISTATETIME(x) ((x)<<24)
|
||||
#define SA110_CNTL_XCSDIR(x) ((x)<<28)
|
||||
#define SA110_CNTL_PCICFN (1 << 31)
|
||||
|
||||
/*
|
||||
* footbridge_cfn_mode() is used when we want
|
||||
* to check whether we are the central function
|
||||
*/
|
||||
#define __footbridge_cfn_mode() (*CSR_SA110_CNTL & SA110_CNTL_PCICFN)
|
||||
#if defined(CONFIG_FOOTBRIDGE_HOST) && defined(CONFIG_FOOTBRIDGE_ADDIN)
|
||||
#define footbridge_cfn_mode() __footbridge_cfn_mode()
|
||||
#elif defined(CONFIG_FOOTBRIDGE_HOST)
|
||||
#define footbridge_cfn_mode() (1)
|
||||
#else
|
||||
#define footbridge_cfn_mode() (0)
|
||||
#endif
|
||||
|
||||
#define CSR_PCIADDR_EXTN DC21285_IO(0x0140)
|
||||
#define CSR_PREFETCHMEMRANGE DC21285_IO(0x0144)
|
||||
#define CSR_XBUS_CYCLE DC21285_IO(0x0148)
|
||||
#define CSR_XBUS_IOSTROBE DC21285_IO(0x014c)
|
||||
#define CSR_DOORBELL_PCI DC21285_IO(0x0150)
|
||||
#define CSR_DOORBELL_SA110 DC21285_IO(0x0154)
|
||||
#define CSR_UARTDR DC21285_IO(0x0160)
|
||||
#define CSR_RXSTAT DC21285_IO(0x0164)
|
||||
#define CSR_H_UBRLCR DC21285_IO(0x0168)
|
||||
#define CSR_M_UBRLCR DC21285_IO(0x016c)
|
||||
#define CSR_L_UBRLCR DC21285_IO(0x0170)
|
||||
#define CSR_UARTCON DC21285_IO(0x0174)
|
||||
#define CSR_UARTFLG DC21285_IO(0x0178)
|
||||
#define CSR_IRQ_STATUS DC21285_IO(0x0180)
|
||||
#define CSR_IRQ_RAWSTATUS DC21285_IO(0x0184)
|
||||
#define CSR_IRQ_ENABLE DC21285_IO(0x0188)
|
||||
#define CSR_IRQ_DISABLE DC21285_IO(0x018c)
|
||||
#define CSR_IRQ_SOFT DC21285_IO(0x0190)
|
||||
#define CSR_FIQ_STATUS DC21285_IO(0x0280)
|
||||
#define CSR_FIQ_RAWSTATUS DC21285_IO(0x0284)
|
||||
#define CSR_FIQ_ENABLE DC21285_IO(0x0288)
|
||||
#define CSR_FIQ_DISABLE DC21285_IO(0x028c)
|
||||
#define CSR_FIQ_SOFT DC21285_IO(0x0290)
|
||||
#define CSR_TIMER1_LOAD DC21285_IO(0x0300)
|
||||
#define CSR_TIMER1_VALUE DC21285_IO(0x0304)
|
||||
#define CSR_TIMER1_CNTL DC21285_IO(0x0308)
|
||||
#define CSR_TIMER1_CLR DC21285_IO(0x030c)
|
||||
#define CSR_TIMER2_LOAD DC21285_IO(0x0320)
|
||||
#define CSR_TIMER2_VALUE DC21285_IO(0x0324)
|
||||
#define CSR_TIMER2_CNTL DC21285_IO(0x0328)
|
||||
#define CSR_TIMER2_CLR DC21285_IO(0x032c)
|
||||
#define CSR_TIMER3_LOAD DC21285_IO(0x0340)
|
||||
#define CSR_TIMER3_VALUE DC21285_IO(0x0344)
|
||||
#define CSR_TIMER3_CNTL DC21285_IO(0x0348)
|
||||
#define CSR_TIMER3_CLR DC21285_IO(0x034c)
|
||||
#define CSR_TIMER4_LOAD DC21285_IO(0x0360)
|
||||
#define CSR_TIMER4_VALUE DC21285_IO(0x0364)
|
||||
#define CSR_TIMER4_CNTL DC21285_IO(0x0368)
|
||||
#define CSR_TIMER4_CLR DC21285_IO(0x036c)
|
||||
|
||||
#define TIMER_CNTL_ENABLE (1 << 7)
|
||||
#define TIMER_CNTL_AUTORELOAD (1 << 6)
|
||||
#define TIMER_CNTL_DIV1 (0)
|
||||
#define TIMER_CNTL_DIV16 (1 << 2)
|
||||
#define TIMER_CNTL_DIV256 (2 << 2)
|
||||
#define TIMER_CNTL_CNTEXT (3 << 2)
|
||||
|
||||
|
139
arch/arm/include/asm/hardware/entry-macro-iomd.S
Звичайний файл
139
arch/arm/include/asm/hardware/entry-macro-iomd.S
Звичайний файл
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/entry-macro-iomd.S
|
||||
*
|
||||
* Low-level IRQ helper macros for IOC/IOMD based platforms
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
/* IOC / IOMD based hardware */
|
||||
#include <asm/hardware/iomd.h>
|
||||
|
||||
.macro disable_fiq
|
||||
mov r12, #ioc_base_high
|
||||
.if ioc_base_low
|
||||
orr r12, r12, #ioc_base_low
|
||||
.endif
|
||||
strb r12, [r12, #0x38] @ Disable FIQ register
|
||||
.endm
|
||||
|
||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
||||
ldrb \irqstat, [\base, #IOMD_IRQREQB] @ get high priority first
|
||||
ldr \tmp, =irq_prio_h
|
||||
teq \irqstat, #0
|
||||
#ifdef IOMD_BASE
|
||||
ldreqb \irqstat, [\base, #IOMD_DMAREQ] @ get dma
|
||||
addeq \tmp, \tmp, #256 @ irq_prio_h table size
|
||||
teqeq \irqstat, #0
|
||||
bne 2406f
|
||||
#endif
|
||||
ldreqb \irqstat, [\base, #IOMD_IRQREQA] @ get low priority
|
||||
addeq \tmp, \tmp, #256 @ irq_prio_d table size
|
||||
teqeq \irqstat, #0
|
||||
#ifdef IOMD_IRQREQC
|
||||
ldreqb \irqstat, [\base, #IOMD_IRQREQC]
|
||||
addeq \tmp, \tmp, #256 @ irq_prio_l table size
|
||||
teqeq \irqstat, #0
|
||||
#endif
|
||||
#ifdef IOMD_IRQREQD
|
||||
ldreqb \irqstat, [\base, #IOMD_IRQREQD]
|
||||
addeq \tmp, \tmp, #256 @ irq_prio_lc table size
|
||||
teqeq \irqstat, #0
|
||||
#endif
|
||||
2406: ldrneb \irqnr, [\tmp, \irqstat] @ get IRQ number
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Interrupt table (incorporates priority). Please note that we
|
||||
* rely on the order of these tables (see above code).
|
||||
*/
|
||||
.align 5
|
||||
irq_prio_h: .byte 0, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 12, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||||
#ifdef IOMD_BASE
|
||||
irq_prio_d: .byte 0,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 20,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||||
#endif
|
||||
irq_prio_l: .byte 0, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
|
||||
.byte 4, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
|
||||
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||||
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||||
.byte 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
|
||||
.byte 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
|
||||
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||||
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||||
#ifdef IOMD_IRQREQC
|
||||
irq_prio_lc: .byte 24,24,25,24,26,26,26,26,27,27,27,27,27,27,27,27
|
||||
.byte 28,24,25,24,26,26,26,26,27,27,27,27,27,27,27,27
|
||||
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||||
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||||
.byte 30,30,30,30,30,30,30,30,27,27,27,27,27,27,27,27
|
||||
.byte 30,30,30,30,30,30,30,30,27,27,27,27,27,27,27,27
|
||||
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||||
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||||
#endif
|
||||
#ifdef IOMD_IRQREQD
|
||||
irq_prio_ld: .byte 40,40,41,40,42,42,42,42,43,43,43,43,43,43,43,43
|
||||
.byte 44,40,41,40,42,42,42,42,43,43,43,43,43,43,43,43
|
||||
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||||
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||||
.byte 46,46,46,46,46,46,46,46,43,43,43,43,43,43,43,43
|
||||
.byte 46,46,46,46,46,46,46,46,43,43,43,43,43,43,43,43
|
||||
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||||
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||||
#endif
|
||||
|
40
arch/arm/include/asm/hardware/ep7211.h
Звичайний файл
40
arch/arm/include/asm/hardware/ep7211.h
Звичайний файл
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/ep7211.h
|
||||
*
|
||||
* This file contains the hardware definitions of the EP7211 internal
|
||||
* registers.
|
||||
*
|
||||
* Copyright (C) 2001 Blue Mug, Inc. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef __ASM_HARDWARE_EP7211_H
|
||||
#define __ASM_HARDWARE_EP7211_H
|
||||
|
||||
#include <asm/hardware/clps7111.h>
|
||||
|
||||
/*
|
||||
* define EP7211_BASE to be the base address of the region
|
||||
* you want to access.
|
||||
*/
|
||||
|
||||
#define EP7211_PHYS_BASE (0x80000000)
|
||||
|
||||
/*
|
||||
* XXX miket@bluemug.com: need to introduce EP7211 registers (those not
|
||||
* present in 7212) here.
|
||||
*/
|
||||
|
||||
#endif /* __ASM_HARDWARE_EP7211_H */
|
83
arch/arm/include/asm/hardware/ep7212.h
Звичайний файл
83
arch/arm/include/asm/hardware/ep7212.h
Звичайний файл
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/ep7212.h
|
||||
*
|
||||
* This file contains the hardware definitions of the EP7212 internal
|
||||
* registers.
|
||||
*
|
||||
* Copyright (C) 2000 Deep Blue Solutions Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef __ASM_HARDWARE_EP7212_H
|
||||
#define __ASM_HARDWARE_EP7212_H
|
||||
|
||||
/*
|
||||
* define EP7212_BASE to be the base address of the region
|
||||
* you want to access.
|
||||
*/
|
||||
|
||||
#define EP7212_PHYS_BASE (0x80000000)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define ep_readl(off) __raw_readl(EP7212_BASE + (off))
|
||||
#define ep_writel(val,off) __raw_writel(val, EP7212_BASE + (off))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These registers are specific to the EP7212 only
|
||||
*/
|
||||
#define DAIR 0x2000
|
||||
#define DAIR0 0x2040
|
||||
#define DAIDR1 0x2080
|
||||
#define DAIDR2 0x20c0
|
||||
#define DAISR 0x2100
|
||||
#define SYSCON3 0x2200
|
||||
#define INTSR3 0x2240
|
||||
#define INTMR3 0x2280
|
||||
#define LEDFLSH 0x22c0
|
||||
|
||||
#define DAIR_DAIEN (1 << 16)
|
||||
#define DAIR_ECS (1 << 17)
|
||||
#define DAIR_LCTM (1 << 19)
|
||||
#define DAIR_LCRM (1 << 20)
|
||||
#define DAIR_RCTM (1 << 21)
|
||||
#define DAIR_RCRM (1 << 22)
|
||||
#define DAIR_LBM (1 << 23)
|
||||
|
||||
#define DAIDR2_FIFOEN (1 << 15)
|
||||
#define DAIDR2_FIFOLEFT (0x0d << 16)
|
||||
#define DAIDR2_FIFORIGHT (0x11 << 16)
|
||||
|
||||
#define DAISR_RCTS (1 << 0)
|
||||
#define DAISR_RCRS (1 << 1)
|
||||
#define DAISR_LCTS (1 << 2)
|
||||
#define DAISR_LCRS (1 << 3)
|
||||
#define DAISR_RCTU (1 << 4)
|
||||
#define DAISR_RCRO (1 << 5)
|
||||
#define DAISR_LCTU (1 << 6)
|
||||
#define DAISR_LCRO (1 << 7)
|
||||
#define DAISR_RCNF (1 << 8)
|
||||
#define DAISR_RCNE (1 << 9)
|
||||
#define DAISR_LCNF (1 << 10)
|
||||
#define DAISR_LCNE (1 << 11)
|
||||
#define DAISR_FIFO (1 << 12)
|
||||
|
||||
#define SYSCON3_ADCCON (1 << 0)
|
||||
#define SYSCON3_DAISEL (1 << 3)
|
||||
#define SYSCON3_ADCCKNSEN (1 << 4)
|
||||
#define SYSCON3_FASTWAKE (1 << 8)
|
||||
#define SYSCON3_DAIEN (1 << 9)
|
||||
|
||||
#endif /* __ASM_HARDWARE_EP7212_H */
|
42
arch/arm/include/asm/hardware/gic.h
Звичайний файл
42
arch/arm/include/asm/hardware/gic.h
Звичайний файл
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/gic.h
|
||||
*
|
||||
* Copyright (C) 2002 ARM Limited, All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __ASM_ARM_HARDWARE_GIC_H
|
||||
#define __ASM_ARM_HARDWARE_GIC_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#define GIC_CPU_CTRL 0x00
|
||||
#define GIC_CPU_PRIMASK 0x04
|
||||
#define GIC_CPU_BINPOINT 0x08
|
||||
#define GIC_CPU_INTACK 0x0c
|
||||
#define GIC_CPU_EOI 0x10
|
||||
#define GIC_CPU_RUNNINGPRI 0x14
|
||||
#define GIC_CPU_HIGHPRI 0x18
|
||||
|
||||
#define GIC_DIST_CTRL 0x000
|
||||
#define GIC_DIST_CTR 0x004
|
||||
#define GIC_DIST_ENABLE_SET 0x100
|
||||
#define GIC_DIST_ENABLE_CLEAR 0x180
|
||||
#define GIC_DIST_PENDING_SET 0x200
|
||||
#define GIC_DIST_PENDING_CLEAR 0x280
|
||||
#define GIC_DIST_ACTIVE_BIT 0x300
|
||||
#define GIC_DIST_PRI 0x400
|
||||
#define GIC_DIST_TARGET 0x800
|
||||
#define GIC_DIST_CONFIG 0xc00
|
||||
#define GIC_DIST_SOFTINT 0xf00
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
void gic_dist_init(unsigned int gic_nr, void __iomem *base, unsigned int irq_start);
|
||||
void gic_cpu_init(unsigned int gic_nr, void __iomem *base);
|
||||
void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
|
||||
void gic_raise_softirq(cpumask_t cpumask, unsigned int irq);
|
||||
#endif
|
||||
|
||||
#endif
|
38
arch/arm/include/asm/hardware/icst307.h
Звичайний файл
38
arch/arm/include/asm/hardware/icst307.h
Звичайний файл
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/icst307.h
|
||||
*
|
||||
* Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Support functions for calculating clocks/divisors for the ICS307
|
||||
* clock generators. See http://www.icst.com/ for more information
|
||||
* on these devices.
|
||||
*
|
||||
* This file is similar to the icst525.h file
|
||||
*/
|
||||
#ifndef ASMARM_HARDWARE_ICST307_H
|
||||
#define ASMARM_HARDWARE_ICST307_H
|
||||
|
||||
struct icst307_params {
|
||||
unsigned long ref;
|
||||
unsigned long vco_max; /* inclusive */
|
||||
unsigned short vd_min; /* inclusive */
|
||||
unsigned short vd_max; /* inclusive */
|
||||
unsigned char rd_min; /* inclusive */
|
||||
unsigned char rd_max; /* inclusive */
|
||||
};
|
||||
|
||||
struct icst307_vco {
|
||||
unsigned short v;
|
||||
unsigned char r;
|
||||
unsigned char s;
|
||||
};
|
||||
|
||||
unsigned long icst307_khz(const struct icst307_params *p, struct icst307_vco vco);
|
||||
struct icst307_vco icst307_khz_to_vco(const struct icst307_params *p, unsigned long freq);
|
||||
struct icst307_vco icst307_ps_to_vco(const struct icst307_params *p, unsigned long period);
|
||||
|
||||
#endif
|
36
arch/arm/include/asm/hardware/icst525.h
Звичайний файл
36
arch/arm/include/asm/hardware/icst525.h
Звичайний файл
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/icst525.h
|
||||
*
|
||||
* Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Support functions for calculating clocks/divisors for the ICST525
|
||||
* clock generators. See http://www.icst.com/ for more information
|
||||
* on these devices.
|
||||
*/
|
||||
#ifndef ASMARM_HARDWARE_ICST525_H
|
||||
#define ASMARM_HARDWARE_ICST525_H
|
||||
|
||||
struct icst525_params {
|
||||
unsigned long ref;
|
||||
unsigned long vco_max; /* inclusive */
|
||||
unsigned short vd_min; /* inclusive */
|
||||
unsigned short vd_max; /* inclusive */
|
||||
unsigned char rd_min; /* inclusive */
|
||||
unsigned char rd_max; /* inclusive */
|
||||
};
|
||||
|
||||
struct icst525_vco {
|
||||
unsigned short v;
|
||||
unsigned char r;
|
||||
unsigned char s;
|
||||
};
|
||||
|
||||
unsigned long icst525_khz(const struct icst525_params *p, struct icst525_vco vco);
|
||||
struct icst525_vco icst525_khz_to_vco(const struct icst525_params *p, unsigned long freq);
|
||||
struct icst525_vco icst525_ps_to_vco(const struct icst525_params *p, unsigned long period);
|
||||
|
||||
#endif
|
72
arch/arm/include/asm/hardware/ioc.h
Звичайний файл
72
arch/arm/include/asm/hardware/ioc.h
Звичайний файл
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/ioc.h
|
||||
*
|
||||
* Copyright (C) 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.
|
||||
*
|
||||
* Use these macros to read/write the IOC. All it does is perform the actual
|
||||
* read/write.
|
||||
*/
|
||||
#ifndef __ASMARM_HARDWARE_IOC_H
|
||||
#define __ASMARM_HARDWARE_IOC_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* We use __raw_base variants here so that we give the compiler the
|
||||
* chance to keep IOC_BASE in a register.
|
||||
*/
|
||||
#define ioc_readb(off) __raw_readb(IOC_BASE + (off))
|
||||
#define ioc_writeb(val,off) __raw_writeb(val, IOC_BASE + (off))
|
||||
|
||||
#endif
|
||||
|
||||
#define IOC_CONTROL (0x00)
|
||||
#define IOC_KARTTX (0x04)
|
||||
#define IOC_KARTRX (0x04)
|
||||
|
||||
#define IOC_IRQSTATA (0x10)
|
||||
#define IOC_IRQREQA (0x14)
|
||||
#define IOC_IRQCLRA (0x14)
|
||||
#define IOC_IRQMASKA (0x18)
|
||||
|
||||
#define IOC_IRQSTATB (0x20)
|
||||
#define IOC_IRQREQB (0x24)
|
||||
#define IOC_IRQMASKB (0x28)
|
||||
|
||||
#define IOC_FIQSTAT (0x30)
|
||||
#define IOC_FIQREQ (0x34)
|
||||
#define IOC_FIQMASK (0x38)
|
||||
|
||||
#define IOC_T0CNTL (0x40)
|
||||
#define IOC_T0LTCHL (0x40)
|
||||
#define IOC_T0CNTH (0x44)
|
||||
#define IOC_T0LTCHH (0x44)
|
||||
#define IOC_T0GO (0x48)
|
||||
#define IOC_T0LATCH (0x4c)
|
||||
|
||||
#define IOC_T1CNTL (0x50)
|
||||
#define IOC_T1LTCHL (0x50)
|
||||
#define IOC_T1CNTH (0x54)
|
||||
#define IOC_T1LTCHH (0x54)
|
||||
#define IOC_T1GO (0x58)
|
||||
#define IOC_T1LATCH (0x5c)
|
||||
|
||||
#define IOC_T2CNTL (0x60)
|
||||
#define IOC_T2LTCHL (0x60)
|
||||
#define IOC_T2CNTH (0x64)
|
||||
#define IOC_T2LTCHH (0x64)
|
||||
#define IOC_T2GO (0x68)
|
||||
#define IOC_T2LATCH (0x6c)
|
||||
|
||||
#define IOC_T3CNTL (0x70)
|
||||
#define IOC_T3LTCHL (0x70)
|
||||
#define IOC_T3CNTH (0x74)
|
||||
#define IOC_T3LTCHH (0x74)
|
||||
#define IOC_T3GO (0x78)
|
||||
#define IOC_T3LATCH (0x7c)
|
||||
|
||||
#endif
|
226
arch/arm/include/asm/hardware/iomd.h
Звичайний файл
226
arch/arm/include/asm/hardware/iomd.h
Звичайний файл
@@ -0,0 +1,226 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/iomd.h
|
||||
*
|
||||
* Copyright (C) 1999 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.
|
||||
*
|
||||
* This file contains information out the IOMD ASIC used in the
|
||||
* Acorn RiscPC and subsequently integrated into the CLPS7500 chips.
|
||||
*/
|
||||
#ifndef __ASMARM_HARDWARE_IOMD_H
|
||||
#define __ASMARM_HARDWARE_IOMD_H
|
||||
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* We use __raw_base variants here so that we give the compiler the
|
||||
* chance to keep IOC_BASE in a register.
|
||||
*/
|
||||
#define iomd_readb(off) __raw_readb(IOMD_BASE + (off))
|
||||
#define iomd_readl(off) __raw_readl(IOMD_BASE + (off))
|
||||
#define iomd_writeb(val,off) __raw_writeb(val, IOMD_BASE + (off))
|
||||
#define iomd_writel(val,off) __raw_writel(val, IOMD_BASE + (off))
|
||||
|
||||
#endif
|
||||
|
||||
#define IOMD_CONTROL (0x000)
|
||||
#define IOMD_KARTTX (0x004)
|
||||
#define IOMD_KARTRX (0x004)
|
||||
#define IOMD_KCTRL (0x008)
|
||||
|
||||
#ifdef CONFIG_ARCH_CLPS7500
|
||||
#define IOMD_IOLINES (0x00C)
|
||||
#endif
|
||||
|
||||
#define IOMD_IRQSTATA (0x010)
|
||||
#define IOMD_IRQREQA (0x014)
|
||||
#define IOMD_IRQCLRA (0x014)
|
||||
#define IOMD_IRQMASKA (0x018)
|
||||
|
||||
#ifdef CONFIG_ARCH_CLPS7500
|
||||
#define IOMD_SUSMODE (0x01C)
|
||||
#endif
|
||||
|
||||
#define IOMD_IRQSTATB (0x020)
|
||||
#define IOMD_IRQREQB (0x024)
|
||||
#define IOMD_IRQMASKB (0x028)
|
||||
|
||||
#define IOMD_FIQSTAT (0x030)
|
||||
#define IOMD_FIQREQ (0x034)
|
||||
#define IOMD_FIQMASK (0x038)
|
||||
|
||||
#ifdef CONFIG_ARCH_CLPS7500
|
||||
#define IOMD_CLKCTL (0x03C)
|
||||
#endif
|
||||
|
||||
#define IOMD_T0CNTL (0x040)
|
||||
#define IOMD_T0LTCHL (0x040)
|
||||
#define IOMD_T0CNTH (0x044)
|
||||
#define IOMD_T0LTCHH (0x044)
|
||||
#define IOMD_T0GO (0x048)
|
||||
#define IOMD_T0LATCH (0x04c)
|
||||
|
||||
#define IOMD_T1CNTL (0x050)
|
||||
#define IOMD_T1LTCHL (0x050)
|
||||
#define IOMD_T1CNTH (0x054)
|
||||
#define IOMD_T1LTCHH (0x054)
|
||||
#define IOMD_T1GO (0x058)
|
||||
#define IOMD_T1LATCH (0x05c)
|
||||
|
||||
#ifdef CONFIG_ARCH_CLPS7500
|
||||
#define IOMD_IRQSTATC (0x060)
|
||||
#define IOMD_IRQREQC (0x064)
|
||||
#define IOMD_IRQMASKC (0x068)
|
||||
|
||||
#define IOMD_VIDMUX (0x06c)
|
||||
|
||||
#define IOMD_IRQSTATD (0x070)
|
||||
#define IOMD_IRQREQD (0x074)
|
||||
#define IOMD_IRQMASKD (0x078)
|
||||
#endif
|
||||
|
||||
#define IOMD_ROMCR0 (0x080)
|
||||
#define IOMD_ROMCR1 (0x084)
|
||||
#ifdef CONFIG_ARCH_RPC
|
||||
#define IOMD_DRAMCR (0x088)
|
||||
#endif
|
||||
#define IOMD_REFCR (0x08C)
|
||||
|
||||
#define IOMD_FSIZE (0x090)
|
||||
#define IOMD_ID0 (0x094)
|
||||
#define IOMD_ID1 (0x098)
|
||||
#define IOMD_VERSION (0x09C)
|
||||
|
||||
#ifdef CONFIG_ARCH_RPC
|
||||
#define IOMD_MOUSEX (0x0A0)
|
||||
#define IOMD_MOUSEY (0x0A4)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_CLPS7500
|
||||
#define IOMD_MSEDAT (0x0A8)
|
||||
#define IOMD_MSECTL (0x0Ac)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_RPC
|
||||
#define IOMD_DMATCR (0x0C0)
|
||||
#endif
|
||||
#define IOMD_IOTCR (0x0C4)
|
||||
#define IOMD_ECTCR (0x0C8)
|
||||
#ifdef CONFIG_ARCH_RPC
|
||||
#define IOMD_DMAEXT (0x0CC)
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_CLPS7500
|
||||
#define IOMD_ASTCR (0x0CC)
|
||||
#define IOMD_DRAMCR (0x0D0)
|
||||
#define IOMD_SELFREF (0x0D4)
|
||||
#define IOMD_ATODICR (0x0E0)
|
||||
#define IOMD_ATODSR (0x0E4)
|
||||
#define IOMD_ATODCC (0x0E8)
|
||||
#define IOMD_ATODCNT1 (0x0EC)
|
||||
#define IOMD_ATODCNT2 (0x0F0)
|
||||
#define IOMD_ATODCNT3 (0x0F4)
|
||||
#define IOMD_ATODCNT4 (0x0F8)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_RPC
|
||||
#define DMA_EXT_IO0 1
|
||||
#define DMA_EXT_IO1 2
|
||||
#define DMA_EXT_IO2 4
|
||||
#define DMA_EXT_IO3 8
|
||||
|
||||
#define IOMD_IO0CURA (0x100)
|
||||
#define IOMD_IO0ENDA (0x104)
|
||||
#define IOMD_IO0CURB (0x108)
|
||||
#define IOMD_IO0ENDB (0x10C)
|
||||
#define IOMD_IO0CR (0x110)
|
||||
#define IOMD_IO0ST (0x114)
|
||||
|
||||
#define IOMD_IO1CURA (0x120)
|
||||
#define IOMD_IO1ENDA (0x124)
|
||||
#define IOMD_IO1CURB (0x128)
|
||||
#define IOMD_IO1ENDB (0x12C)
|
||||
#define IOMD_IO1CR (0x130)
|
||||
#define IOMD_IO1ST (0x134)
|
||||
|
||||
#define IOMD_IO2CURA (0x140)
|
||||
#define IOMD_IO2ENDA (0x144)
|
||||
#define IOMD_IO2CURB (0x148)
|
||||
#define IOMD_IO2ENDB (0x14C)
|
||||
#define IOMD_IO2CR (0x150)
|
||||
#define IOMD_IO2ST (0x154)
|
||||
|
||||
#define IOMD_IO3CURA (0x160)
|
||||
#define IOMD_IO3ENDA (0x164)
|
||||
#define IOMD_IO3CURB (0x168)
|
||||
#define IOMD_IO3ENDB (0x16C)
|
||||
#define IOMD_IO3CR (0x170)
|
||||
#define IOMD_IO3ST (0x174)
|
||||
#endif
|
||||
|
||||
#define IOMD_SD0CURA (0x180)
|
||||
#define IOMD_SD0ENDA (0x184)
|
||||
#define IOMD_SD0CURB (0x188)
|
||||
#define IOMD_SD0ENDB (0x18C)
|
||||
#define IOMD_SD0CR (0x190)
|
||||
#define IOMD_SD0ST (0x194)
|
||||
|
||||
#ifdef CONFIG_ARCH_RPC
|
||||
#define IOMD_SD1CURA (0x1A0)
|
||||
#define IOMD_SD1ENDA (0x1A4)
|
||||
#define IOMD_SD1CURB (0x1A8)
|
||||
#define IOMD_SD1ENDB (0x1AC)
|
||||
#define IOMD_SD1CR (0x1B0)
|
||||
#define IOMD_SD1ST (0x1B4)
|
||||
#endif
|
||||
|
||||
#define IOMD_CURSCUR (0x1C0)
|
||||
#define IOMD_CURSINIT (0x1C4)
|
||||
|
||||
#define IOMD_VIDCUR (0x1D0)
|
||||
#define IOMD_VIDEND (0x1D4)
|
||||
#define IOMD_VIDSTART (0x1D8)
|
||||
#define IOMD_VIDINIT (0x1DC)
|
||||
#define IOMD_VIDCR (0x1E0)
|
||||
|
||||
#define IOMD_DMASTAT (0x1F0)
|
||||
#define IOMD_DMAREQ (0x1F4)
|
||||
#define IOMD_DMAMASK (0x1F8)
|
||||
|
||||
#define DMA_END_S (1 << 31)
|
||||
#define DMA_END_L (1 << 30)
|
||||
|
||||
#define DMA_CR_C 0x80
|
||||
#define DMA_CR_D 0x40
|
||||
#define DMA_CR_E 0x20
|
||||
|
||||
#define DMA_ST_OFL 4
|
||||
#define DMA_ST_INT 2
|
||||
#define DMA_ST_AB 1
|
||||
|
||||
/*
|
||||
* DMA (MEMC) compatibility
|
||||
*/
|
||||
#define HALF_SAM vram_half_sam
|
||||
#define VDMA_ALIGNMENT (HALF_SAM * 2)
|
||||
#define VDMA_XFERSIZE (HALF_SAM)
|
||||
#define VDMA_INIT IOMD_VIDINIT
|
||||
#define VDMA_START IOMD_VIDSTART
|
||||
#define VDMA_END IOMD_VIDEND
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned int vram_half_sam;
|
||||
#define video_set_dma(start,end,offset) \
|
||||
do { \
|
||||
outl (SCREEN_START + start, VDMA_START); \
|
||||
outl (SCREEN_START + end - VDMA_XFERSIZE, VDMA_END); \
|
||||
if (offset >= end - VDMA_XFERSIZE) \
|
||||
offset |= 0x40000000; \
|
||||
outl (SCREEN_START + offset, VDMA_INIT); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
888
arch/arm/include/asm/hardware/iop3xx-adma.h
Звичайний файл
888
arch/arm/include/asm/hardware/iop3xx-adma.h
Звичайний файл
@@ -0,0 +1,888 @@
|
||||
/*
|
||||
* Copyright © 2006, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*/
|
||||
#ifndef _ADMA_H
|
||||
#define _ADMA_H
|
||||
#include <linux/types.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/hardware/iop_adma.h>
|
||||
|
||||
/* Memory copy units */
|
||||
#define DMA_CCR(chan) (chan->mmr_base + 0x0)
|
||||
#define DMA_CSR(chan) (chan->mmr_base + 0x4)
|
||||
#define DMA_DAR(chan) (chan->mmr_base + 0xc)
|
||||
#define DMA_NDAR(chan) (chan->mmr_base + 0x10)
|
||||
#define DMA_PADR(chan) (chan->mmr_base + 0x14)
|
||||
#define DMA_PUADR(chan) (chan->mmr_base + 0x18)
|
||||
#define DMA_LADR(chan) (chan->mmr_base + 0x1c)
|
||||
#define DMA_BCR(chan) (chan->mmr_base + 0x20)
|
||||
#define DMA_DCR(chan) (chan->mmr_base + 0x24)
|
||||
|
||||
/* Application accelerator unit */
|
||||
#define AAU_ACR(chan) (chan->mmr_base + 0x0)
|
||||
#define AAU_ASR(chan) (chan->mmr_base + 0x4)
|
||||
#define AAU_ADAR(chan) (chan->mmr_base + 0x8)
|
||||
#define AAU_ANDAR(chan) (chan->mmr_base + 0xc)
|
||||
#define AAU_SAR(src, chan) (chan->mmr_base + (0x10 + ((src) << 2)))
|
||||
#define AAU_DAR(chan) (chan->mmr_base + 0x20)
|
||||
#define AAU_ABCR(chan) (chan->mmr_base + 0x24)
|
||||
#define AAU_ADCR(chan) (chan->mmr_base + 0x28)
|
||||
#define AAU_SAR_EDCR(src_edc) (chan->mmr_base + (0x02c + ((src_edc-4) << 2)))
|
||||
#define AAU_EDCR0_IDX 8
|
||||
#define AAU_EDCR1_IDX 17
|
||||
#define AAU_EDCR2_IDX 26
|
||||
|
||||
#define DMA0_ID 0
|
||||
#define DMA1_ID 1
|
||||
#define AAU_ID 2
|
||||
|
||||
struct iop3xx_aau_desc_ctrl {
|
||||
unsigned int int_en:1;
|
||||
unsigned int blk1_cmd_ctrl:3;
|
||||
unsigned int blk2_cmd_ctrl:3;
|
||||
unsigned int blk3_cmd_ctrl:3;
|
||||
unsigned int blk4_cmd_ctrl:3;
|
||||
unsigned int blk5_cmd_ctrl:3;
|
||||
unsigned int blk6_cmd_ctrl:3;
|
||||
unsigned int blk7_cmd_ctrl:3;
|
||||
unsigned int blk8_cmd_ctrl:3;
|
||||
unsigned int blk_ctrl:2;
|
||||
unsigned int dual_xor_en:1;
|
||||
unsigned int tx_complete:1;
|
||||
unsigned int zero_result_err:1;
|
||||
unsigned int zero_result_en:1;
|
||||
unsigned int dest_write_en:1;
|
||||
};
|
||||
|
||||
struct iop3xx_aau_e_desc_ctrl {
|
||||
unsigned int reserved:1;
|
||||
unsigned int blk1_cmd_ctrl:3;
|
||||
unsigned int blk2_cmd_ctrl:3;
|
||||
unsigned int blk3_cmd_ctrl:3;
|
||||
unsigned int blk4_cmd_ctrl:3;
|
||||
unsigned int blk5_cmd_ctrl:3;
|
||||
unsigned int blk6_cmd_ctrl:3;
|
||||
unsigned int blk7_cmd_ctrl:3;
|
||||
unsigned int blk8_cmd_ctrl:3;
|
||||
unsigned int reserved2:7;
|
||||
};
|
||||
|
||||
struct iop3xx_dma_desc_ctrl {
|
||||
unsigned int pci_transaction:4;
|
||||
unsigned int int_en:1;
|
||||
unsigned int dac_cycle_en:1;
|
||||
unsigned int mem_to_mem_en:1;
|
||||
unsigned int crc_data_tx_en:1;
|
||||
unsigned int crc_gen_en:1;
|
||||
unsigned int crc_seed_dis:1;
|
||||
unsigned int reserved:21;
|
||||
unsigned int crc_tx_complete:1;
|
||||
};
|
||||
|
||||
struct iop3xx_desc_dma {
|
||||
u32 next_desc;
|
||||
union {
|
||||
u32 pci_src_addr;
|
||||
u32 pci_dest_addr;
|
||||
u32 src_addr;
|
||||
};
|
||||
union {
|
||||
u32 upper_pci_src_addr;
|
||||
u32 upper_pci_dest_addr;
|
||||
};
|
||||
union {
|
||||
u32 local_pci_src_addr;
|
||||
u32 local_pci_dest_addr;
|
||||
u32 dest_addr;
|
||||
};
|
||||
u32 byte_count;
|
||||
union {
|
||||
u32 desc_ctrl;
|
||||
struct iop3xx_dma_desc_ctrl desc_ctrl_field;
|
||||
};
|
||||
u32 crc_addr;
|
||||
};
|
||||
|
||||
struct iop3xx_desc_aau {
|
||||
u32 next_desc;
|
||||
u32 src[4];
|
||||
u32 dest_addr;
|
||||
u32 byte_count;
|
||||
union {
|
||||
u32 desc_ctrl;
|
||||
struct iop3xx_aau_desc_ctrl desc_ctrl_field;
|
||||
};
|
||||
union {
|
||||
u32 src_addr;
|
||||
u32 e_desc_ctrl;
|
||||
struct iop3xx_aau_e_desc_ctrl e_desc_ctrl_field;
|
||||
} src_edc[31];
|
||||
};
|
||||
|
||||
struct iop3xx_aau_gfmr {
|
||||
unsigned int gfmr1:8;
|
||||
unsigned int gfmr2:8;
|
||||
unsigned int gfmr3:8;
|
||||
unsigned int gfmr4:8;
|
||||
};
|
||||
|
||||
struct iop3xx_desc_pq_xor {
|
||||
u32 next_desc;
|
||||
u32 src[3];
|
||||
union {
|
||||
u32 data_mult1;
|
||||
struct iop3xx_aau_gfmr data_mult1_field;
|
||||
};
|
||||
u32 dest_addr;
|
||||
u32 byte_count;
|
||||
union {
|
||||
u32 desc_ctrl;
|
||||
struct iop3xx_aau_desc_ctrl desc_ctrl_field;
|
||||
};
|
||||
union {
|
||||
u32 src_addr;
|
||||
u32 e_desc_ctrl;
|
||||
struct iop3xx_aau_e_desc_ctrl e_desc_ctrl_field;
|
||||
u32 data_multiplier;
|
||||
struct iop3xx_aau_gfmr data_mult_field;
|
||||
u32 reserved;
|
||||
} src_edc_gfmr[19];
|
||||
};
|
||||
|
||||
struct iop3xx_desc_dual_xor {
|
||||
u32 next_desc;
|
||||
u32 src0_addr;
|
||||
u32 src1_addr;
|
||||
u32 h_src_addr;
|
||||
u32 d_src_addr;
|
||||
u32 h_dest_addr;
|
||||
u32 byte_count;
|
||||
union {
|
||||
u32 desc_ctrl;
|
||||
struct iop3xx_aau_desc_ctrl desc_ctrl_field;
|
||||
};
|
||||
u32 d_dest_addr;
|
||||
};
|
||||
|
||||
union iop3xx_desc {
|
||||
struct iop3xx_desc_aau *aau;
|
||||
struct iop3xx_desc_dma *dma;
|
||||
struct iop3xx_desc_pq_xor *pq_xor;
|
||||
struct iop3xx_desc_dual_xor *dual_xor;
|
||||
void *ptr;
|
||||
};
|
||||
|
||||
static inline int iop_adma_get_max_xor(void)
|
||||
{
|
||||
return 32;
|
||||
}
|
||||
|
||||
static inline u32 iop_chan_get_current_descriptor(struct iop_adma_chan *chan)
|
||||
{
|
||||
int id = chan->device->id;
|
||||
|
||||
switch (id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return __raw_readl(DMA_DAR(chan));
|
||||
case AAU_ID:
|
||||
return __raw_readl(AAU_ADAR(chan));
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void iop_chan_set_next_descriptor(struct iop_adma_chan *chan,
|
||||
u32 next_desc_addr)
|
||||
{
|
||||
int id = chan->device->id;
|
||||
|
||||
switch (id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
__raw_writel(next_desc_addr, DMA_NDAR(chan));
|
||||
break;
|
||||
case AAU_ID:
|
||||
__raw_writel(next_desc_addr, AAU_ANDAR(chan));
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#define IOP_ADMA_STATUS_BUSY (1 << 10)
|
||||
#define IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT (1024)
|
||||
#define IOP_ADMA_XOR_MAX_BYTE_COUNT (16 * 1024 * 1024)
|
||||
#define IOP_ADMA_MAX_BYTE_COUNT (16 * 1024 * 1024)
|
||||
|
||||
static inline int iop_chan_is_busy(struct iop_adma_chan *chan)
|
||||
{
|
||||
u32 status = __raw_readl(DMA_CSR(chan));
|
||||
return (status & IOP_ADMA_STATUS_BUSY) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int iop_desc_is_aligned(struct iop_adma_desc_slot *desc,
|
||||
int num_slots)
|
||||
{
|
||||
/* num_slots will only ever be 1, 2, 4, or 8 */
|
||||
return (desc->idx & (num_slots - 1)) ? 0 : 1;
|
||||
}
|
||||
|
||||
/* to do: support large (i.e. > hw max) buffer sizes */
|
||||
static inline int iop_chan_memcpy_slot_count(size_t len, int *slots_per_op)
|
||||
{
|
||||
*slots_per_op = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* to do: support large (i.e. > hw max) buffer sizes */
|
||||
static inline int iop_chan_memset_slot_count(size_t len, int *slots_per_op)
|
||||
{
|
||||
*slots_per_op = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int iop3xx_aau_xor_slot_count(size_t len, int src_cnt,
|
||||
int *slots_per_op)
|
||||
{
|
||||
static const char slot_count_table[] = {
|
||||
1, 1, 1, 1, /* 01 - 04 */
|
||||
2, 2, 2, 2, /* 05 - 08 */
|
||||
4, 4, 4, 4, /* 09 - 12 */
|
||||
4, 4, 4, 4, /* 13 - 16 */
|
||||
8, 8, 8, 8, /* 17 - 20 */
|
||||
8, 8, 8, 8, /* 21 - 24 */
|
||||
8, 8, 8, 8, /* 25 - 28 */
|
||||
8, 8, 8, 8, /* 29 - 32 */
|
||||
};
|
||||
*slots_per_op = slot_count_table[src_cnt - 1];
|
||||
return *slots_per_op;
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_chan_interrupt_slot_count(int *slots_per_op, struct iop_adma_chan *chan)
|
||||
{
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return iop_chan_memcpy_slot_count(0, slots_per_op);
|
||||
case AAU_ID:
|
||||
return iop3xx_aau_xor_slot_count(0, 2, slots_per_op);
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int iop_chan_xor_slot_count(size_t len, int src_cnt,
|
||||
int *slots_per_op)
|
||||
{
|
||||
int slot_cnt = iop3xx_aau_xor_slot_count(len, src_cnt, slots_per_op);
|
||||
|
||||
if (len <= IOP_ADMA_XOR_MAX_BYTE_COUNT)
|
||||
return slot_cnt;
|
||||
|
||||
len -= IOP_ADMA_XOR_MAX_BYTE_COUNT;
|
||||
while (len > IOP_ADMA_XOR_MAX_BYTE_COUNT) {
|
||||
len -= IOP_ADMA_XOR_MAX_BYTE_COUNT;
|
||||
slot_cnt += *slots_per_op;
|
||||
}
|
||||
|
||||
if (len)
|
||||
slot_cnt += *slots_per_op;
|
||||
|
||||
return slot_cnt;
|
||||
}
|
||||
|
||||
/* zero sum on iop3xx is limited to 1k at a time so it requires multiple
|
||||
* descriptors
|
||||
*/
|
||||
static inline int iop_chan_zero_sum_slot_count(size_t len, int src_cnt,
|
||||
int *slots_per_op)
|
||||
{
|
||||
int slot_cnt = iop3xx_aau_xor_slot_count(len, src_cnt, slots_per_op);
|
||||
|
||||
if (len <= IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT)
|
||||
return slot_cnt;
|
||||
|
||||
len -= IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT;
|
||||
while (len > IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT) {
|
||||
len -= IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT;
|
||||
slot_cnt += *slots_per_op;
|
||||
}
|
||||
|
||||
if (len)
|
||||
slot_cnt += *slots_per_op;
|
||||
|
||||
return slot_cnt;
|
||||
}
|
||||
|
||||
static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc,
|
||||
struct iop_adma_chan *chan)
|
||||
{
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return hw_desc.dma->dest_addr;
|
||||
case AAU_ID:
|
||||
return hw_desc.aau->dest_addr;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 iop_desc_get_byte_count(struct iop_adma_desc_slot *desc,
|
||||
struct iop_adma_chan *chan)
|
||||
{
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return hw_desc.dma->byte_count;
|
||||
case AAU_ID:
|
||||
return hw_desc.aau->byte_count;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* translate the src_idx to a descriptor word index */
|
||||
static inline int __desc_idx(int src_idx)
|
||||
{
|
||||
static const int desc_idx_table[] = { 0, 0, 0, 0,
|
||||
0, 1, 2, 3,
|
||||
5, 6, 7, 8,
|
||||
9, 10, 11, 12,
|
||||
14, 15, 16, 17,
|
||||
18, 19, 20, 21,
|
||||
23, 24, 25, 26,
|
||||
27, 28, 29, 30,
|
||||
};
|
||||
|
||||
return desc_idx_table[src_idx];
|
||||
}
|
||||
|
||||
static inline u32 iop_desc_get_src_addr(struct iop_adma_desc_slot *desc,
|
||||
struct iop_adma_chan *chan,
|
||||
int src_idx)
|
||||
{
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return hw_desc.dma->src_addr;
|
||||
case AAU_ID:
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (src_idx < 4)
|
||||
return hw_desc.aau->src[src_idx];
|
||||
else
|
||||
return hw_desc.aau->src_edc[__desc_idx(src_idx)].src_addr;
|
||||
}
|
||||
|
||||
static inline void iop3xx_aau_desc_set_src_addr(struct iop3xx_desc_aau *hw_desc,
|
||||
int src_idx, dma_addr_t addr)
|
||||
{
|
||||
if (src_idx < 4)
|
||||
hw_desc->src[src_idx] = addr;
|
||||
else
|
||||
hw_desc->src_edc[__desc_idx(src_idx)].src_addr = addr;
|
||||
}
|
||||
|
||||
static inline void
|
||||
iop_desc_init_memcpy(struct iop_adma_desc_slot *desc, unsigned long flags)
|
||||
{
|
||||
struct iop3xx_desc_dma *hw_desc = desc->hw_desc;
|
||||
union {
|
||||
u32 value;
|
||||
struct iop3xx_dma_desc_ctrl field;
|
||||
} u_desc_ctrl;
|
||||
|
||||
u_desc_ctrl.value = 0;
|
||||
u_desc_ctrl.field.mem_to_mem_en = 1;
|
||||
u_desc_ctrl.field.pci_transaction = 0xe; /* memory read block */
|
||||
u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT;
|
||||
hw_desc->desc_ctrl = u_desc_ctrl.value;
|
||||
hw_desc->upper_pci_src_addr = 0;
|
||||
hw_desc->crc_addr = 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
iop_desc_init_memset(struct iop_adma_desc_slot *desc, unsigned long flags)
|
||||
{
|
||||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc;
|
||||
union {
|
||||
u32 value;
|
||||
struct iop3xx_aau_desc_ctrl field;
|
||||
} u_desc_ctrl;
|
||||
|
||||
u_desc_ctrl.value = 0;
|
||||
u_desc_ctrl.field.blk1_cmd_ctrl = 0x2; /* memory block fill */
|
||||
u_desc_ctrl.field.dest_write_en = 1;
|
||||
u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT;
|
||||
hw_desc->desc_ctrl = u_desc_ctrl.value;
|
||||
}
|
||||
|
||||
static inline u32
|
||||
iop3xx_desc_init_xor(struct iop3xx_desc_aau *hw_desc, int src_cnt,
|
||||
unsigned long flags)
|
||||
{
|
||||
int i, shift;
|
||||
u32 edcr;
|
||||
union {
|
||||
u32 value;
|
||||
struct iop3xx_aau_desc_ctrl field;
|
||||
} u_desc_ctrl;
|
||||
|
||||
u_desc_ctrl.value = 0;
|
||||
switch (src_cnt) {
|
||||
case 25 ... 32:
|
||||
u_desc_ctrl.field.blk_ctrl = 0x3; /* use EDCR[2:0] */
|
||||
edcr = 0;
|
||||
shift = 1;
|
||||
for (i = 24; i < src_cnt; i++) {
|
||||
edcr |= (1 << shift);
|
||||
shift += 3;
|
||||
}
|
||||
hw_desc->src_edc[AAU_EDCR2_IDX].e_desc_ctrl = edcr;
|
||||
src_cnt = 24;
|
||||
/* fall through */
|
||||
case 17 ... 24:
|
||||
if (!u_desc_ctrl.field.blk_ctrl) {
|
||||
hw_desc->src_edc[AAU_EDCR2_IDX].e_desc_ctrl = 0;
|
||||
u_desc_ctrl.field.blk_ctrl = 0x3; /* use EDCR[2:0] */
|
||||
}
|
||||
edcr = 0;
|
||||
shift = 1;
|
||||
for (i = 16; i < src_cnt; i++) {
|
||||
edcr |= (1 << shift);
|
||||
shift += 3;
|
||||
}
|
||||
hw_desc->src_edc[AAU_EDCR1_IDX].e_desc_ctrl = edcr;
|
||||
src_cnt = 16;
|
||||
/* fall through */
|
||||
case 9 ... 16:
|
||||
if (!u_desc_ctrl.field.blk_ctrl)
|
||||
u_desc_ctrl.field.blk_ctrl = 0x2; /* use EDCR0 */
|
||||
edcr = 0;
|
||||
shift = 1;
|
||||
for (i = 8; i < src_cnt; i++) {
|
||||
edcr |= (1 << shift);
|
||||
shift += 3;
|
||||
}
|
||||
hw_desc->src_edc[AAU_EDCR0_IDX].e_desc_ctrl = edcr;
|
||||
src_cnt = 8;
|
||||
/* fall through */
|
||||
case 2 ... 8:
|
||||
shift = 1;
|
||||
for (i = 0; i < src_cnt; i++) {
|
||||
u_desc_ctrl.value |= (1 << shift);
|
||||
shift += 3;
|
||||
}
|
||||
|
||||
if (!u_desc_ctrl.field.blk_ctrl && src_cnt > 4)
|
||||
u_desc_ctrl.field.blk_ctrl = 0x1; /* use mini-desc */
|
||||
}
|
||||
|
||||
u_desc_ctrl.field.dest_write_en = 1;
|
||||
u_desc_ctrl.field.blk1_cmd_ctrl = 0x7; /* direct fill */
|
||||
u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT;
|
||||
hw_desc->desc_ctrl = u_desc_ctrl.value;
|
||||
|
||||
return u_desc_ctrl.value;
|
||||
}
|
||||
|
||||
static inline void
|
||||
iop_desc_init_xor(struct iop_adma_desc_slot *desc, int src_cnt,
|
||||
unsigned long flags)
|
||||
{
|
||||
iop3xx_desc_init_xor(desc->hw_desc, src_cnt, flags);
|
||||
}
|
||||
|
||||
/* return the number of operations */
|
||||
static inline int
|
||||
iop_desc_init_zero_sum(struct iop_adma_desc_slot *desc, int src_cnt,
|
||||
unsigned long flags)
|
||||
{
|
||||
int slot_cnt = desc->slot_cnt, slots_per_op = desc->slots_per_op;
|
||||
struct iop3xx_desc_aau *hw_desc, *prev_hw_desc, *iter;
|
||||
union {
|
||||
u32 value;
|
||||
struct iop3xx_aau_desc_ctrl field;
|
||||
} u_desc_ctrl;
|
||||
int i, j;
|
||||
|
||||
hw_desc = desc->hw_desc;
|
||||
|
||||
for (i = 0, j = 0; (slot_cnt -= slots_per_op) >= 0;
|
||||
i += slots_per_op, j++) {
|
||||
iter = iop_hw_desc_slot_idx(hw_desc, i);
|
||||
u_desc_ctrl.value = iop3xx_desc_init_xor(iter, src_cnt, flags);
|
||||
u_desc_ctrl.field.dest_write_en = 0;
|
||||
u_desc_ctrl.field.zero_result_en = 1;
|
||||
u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT;
|
||||
iter->desc_ctrl = u_desc_ctrl.value;
|
||||
|
||||
/* for the subsequent descriptors preserve the store queue
|
||||
* and chain them together
|
||||
*/
|
||||
if (i) {
|
||||
prev_hw_desc =
|
||||
iop_hw_desc_slot_idx(hw_desc, i - slots_per_op);
|
||||
prev_hw_desc->next_desc =
|
||||
(u32) (desc->async_tx.phys + (i << 5));
|
||||
}
|
||||
}
|
||||
|
||||
return j;
|
||||
}
|
||||
|
||||
static inline void
|
||||
iop_desc_init_null_xor(struct iop_adma_desc_slot *desc, int src_cnt,
|
||||
unsigned long flags)
|
||||
{
|
||||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc;
|
||||
union {
|
||||
u32 value;
|
||||
struct iop3xx_aau_desc_ctrl field;
|
||||
} u_desc_ctrl;
|
||||
|
||||
u_desc_ctrl.value = 0;
|
||||
switch (src_cnt) {
|
||||
case 25 ... 32:
|
||||
u_desc_ctrl.field.blk_ctrl = 0x3; /* use EDCR[2:0] */
|
||||
hw_desc->src_edc[AAU_EDCR2_IDX].e_desc_ctrl = 0;
|
||||
/* fall through */
|
||||
case 17 ... 24:
|
||||
if (!u_desc_ctrl.field.blk_ctrl) {
|
||||
hw_desc->src_edc[AAU_EDCR2_IDX].e_desc_ctrl = 0;
|
||||
u_desc_ctrl.field.blk_ctrl = 0x3; /* use EDCR[2:0] */
|
||||
}
|
||||
hw_desc->src_edc[AAU_EDCR1_IDX].e_desc_ctrl = 0;
|
||||
/* fall through */
|
||||
case 9 ... 16:
|
||||
if (!u_desc_ctrl.field.blk_ctrl)
|
||||
u_desc_ctrl.field.blk_ctrl = 0x2; /* use EDCR0 */
|
||||
hw_desc->src_edc[AAU_EDCR0_IDX].e_desc_ctrl = 0;
|
||||
/* fall through */
|
||||
case 1 ... 8:
|
||||
if (!u_desc_ctrl.field.blk_ctrl && src_cnt > 4)
|
||||
u_desc_ctrl.field.blk_ctrl = 0x1; /* use mini-desc */
|
||||
}
|
||||
|
||||
u_desc_ctrl.field.dest_write_en = 0;
|
||||
u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT;
|
||||
hw_desc->desc_ctrl = u_desc_ctrl.value;
|
||||
}
|
||||
|
||||
static inline void iop_desc_set_byte_count(struct iop_adma_desc_slot *desc,
|
||||
struct iop_adma_chan *chan,
|
||||
u32 byte_count)
|
||||
{
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
hw_desc.dma->byte_count = byte_count;
|
||||
break;
|
||||
case AAU_ID:
|
||||
hw_desc.aau->byte_count = byte_count;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
iop_desc_init_interrupt(struct iop_adma_desc_slot *desc,
|
||||
struct iop_adma_chan *chan)
|
||||
{
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
iop_desc_init_memcpy(desc, 1);
|
||||
hw_desc.dma->byte_count = 0;
|
||||
hw_desc.dma->dest_addr = 0;
|
||||
hw_desc.dma->src_addr = 0;
|
||||
break;
|
||||
case AAU_ID:
|
||||
iop_desc_init_null_xor(desc, 2, 1);
|
||||
hw_desc.aau->byte_count = 0;
|
||||
hw_desc.aau->dest_addr = 0;
|
||||
hw_desc.aau->src[0] = 0;
|
||||
hw_desc.aau->src[1] = 0;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
iop_desc_set_zero_sum_byte_count(struct iop_adma_desc_slot *desc, u32 len)
|
||||
{
|
||||
int slots_per_op = desc->slots_per_op;
|
||||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc, *iter;
|
||||
int i = 0;
|
||||
|
||||
if (len <= IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT) {
|
||||
hw_desc->byte_count = len;
|
||||
} else {
|
||||
do {
|
||||
iter = iop_hw_desc_slot_idx(hw_desc, i);
|
||||
iter->byte_count = IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT;
|
||||
len -= IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT;
|
||||
i += slots_per_op;
|
||||
} while (len > IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT);
|
||||
|
||||
if (len) {
|
||||
iter = iop_hw_desc_slot_idx(hw_desc, i);
|
||||
iter->byte_count = len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void iop_desc_set_dest_addr(struct iop_adma_desc_slot *desc,
|
||||
struct iop_adma_chan *chan,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
hw_desc.dma->dest_addr = addr;
|
||||
break;
|
||||
case AAU_ID:
|
||||
hw_desc.aau->dest_addr = addr;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
static inline void iop_desc_set_memcpy_src_addr(struct iop_adma_desc_slot *desc,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
struct iop3xx_desc_dma *hw_desc = desc->hw_desc;
|
||||
hw_desc->src_addr = addr;
|
||||
}
|
||||
|
||||
static inline void
|
||||
iop_desc_set_zero_sum_src_addr(struct iop_adma_desc_slot *desc, int src_idx,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
|
||||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc, *iter;
|
||||
int slot_cnt = desc->slot_cnt, slots_per_op = desc->slots_per_op;
|
||||
int i;
|
||||
|
||||
for (i = 0; (slot_cnt -= slots_per_op) >= 0;
|
||||
i += slots_per_op, addr += IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT) {
|
||||
iter = iop_hw_desc_slot_idx(hw_desc, i);
|
||||
iop3xx_aau_desc_set_src_addr(iter, src_idx, addr);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void iop_desc_set_xor_src_addr(struct iop_adma_desc_slot *desc,
|
||||
int src_idx, dma_addr_t addr)
|
||||
{
|
||||
|
||||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc, *iter;
|
||||
int slot_cnt = desc->slot_cnt, slots_per_op = desc->slots_per_op;
|
||||
int i;
|
||||
|
||||
for (i = 0; (slot_cnt -= slots_per_op) >= 0;
|
||||
i += slots_per_op, addr += IOP_ADMA_XOR_MAX_BYTE_COUNT) {
|
||||
iter = iop_hw_desc_slot_idx(hw_desc, i);
|
||||
iop3xx_aau_desc_set_src_addr(iter, src_idx, addr);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc,
|
||||
u32 next_desc_addr)
|
||||
{
|
||||
/* hw_desc->next_desc is the same location for all channels */
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
BUG_ON(hw_desc.dma->next_desc);
|
||||
hw_desc.dma->next_desc = next_desc_addr;
|
||||
}
|
||||
|
||||
static inline u32 iop_desc_get_next_desc(struct iop_adma_desc_slot *desc)
|
||||
{
|
||||
/* hw_desc->next_desc is the same location for all channels */
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
return hw_desc.dma->next_desc;
|
||||
}
|
||||
|
||||
static inline void iop_desc_clear_next_desc(struct iop_adma_desc_slot *desc)
|
||||
{
|
||||
/* hw_desc->next_desc is the same location for all channels */
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
hw_desc.dma->next_desc = 0;
|
||||
}
|
||||
|
||||
static inline void iop_desc_set_block_fill_val(struct iop_adma_desc_slot *desc,
|
||||
u32 val)
|
||||
{
|
||||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc;
|
||||
hw_desc->src[0] = val;
|
||||
}
|
||||
|
||||
static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc)
|
||||
{
|
||||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc;
|
||||
struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field;
|
||||
|
||||
BUG_ON(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en));
|
||||
return desc_ctrl.zero_result_err;
|
||||
}
|
||||
|
||||
static inline void iop_chan_append(struct iop_adma_chan *chan)
|
||||
{
|
||||
u32 dma_chan_ctrl;
|
||||
|
||||
dma_chan_ctrl = __raw_readl(DMA_CCR(chan));
|
||||
dma_chan_ctrl |= 0x2;
|
||||
__raw_writel(dma_chan_ctrl, DMA_CCR(chan));
|
||||
}
|
||||
|
||||
static inline u32 iop_chan_get_status(struct iop_adma_chan *chan)
|
||||
{
|
||||
return __raw_readl(DMA_CSR(chan));
|
||||
}
|
||||
|
||||
static inline void iop_chan_disable(struct iop_adma_chan *chan)
|
||||
{
|
||||
u32 dma_chan_ctrl = __raw_readl(DMA_CCR(chan));
|
||||
dma_chan_ctrl &= ~1;
|
||||
__raw_writel(dma_chan_ctrl, DMA_CCR(chan));
|
||||
}
|
||||
|
||||
static inline void iop_chan_enable(struct iop_adma_chan *chan)
|
||||
{
|
||||
u32 dma_chan_ctrl = __raw_readl(DMA_CCR(chan));
|
||||
|
||||
dma_chan_ctrl |= 1;
|
||||
__raw_writel(dma_chan_ctrl, DMA_CCR(chan));
|
||||
}
|
||||
|
||||
static inline void iop_adma_device_clear_eot_status(struct iop_adma_chan *chan)
|
||||
{
|
||||
u32 status = __raw_readl(DMA_CSR(chan));
|
||||
status &= (1 << 9);
|
||||
__raw_writel(status, DMA_CSR(chan));
|
||||
}
|
||||
|
||||
static inline void iop_adma_device_clear_eoc_status(struct iop_adma_chan *chan)
|
||||
{
|
||||
u32 status = __raw_readl(DMA_CSR(chan));
|
||||
status &= (1 << 8);
|
||||
__raw_writel(status, DMA_CSR(chan));
|
||||
}
|
||||
|
||||
static inline void iop_adma_device_clear_err_status(struct iop_adma_chan *chan)
|
||||
{
|
||||
u32 status = __raw_readl(DMA_CSR(chan));
|
||||
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
status &= (1 << 5) | (1 << 3) | (1 << 2) | (1 << 1);
|
||||
break;
|
||||
case AAU_ID:
|
||||
status &= (1 << 5);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
__raw_writel(status, DMA_CSR(chan));
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_is_err_int_parity(unsigned long status, struct iop_adma_chan *chan)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_is_err_mcu_abort(unsigned long status, struct iop_adma_chan *chan)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_is_err_int_tabort(unsigned long status, struct iop_adma_chan *chan)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_is_err_int_mabort(unsigned long status, struct iop_adma_chan *chan)
|
||||
{
|
||||
return test_bit(5, &status);
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_is_err_pci_tabort(unsigned long status, struct iop_adma_chan *chan)
|
||||
{
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return test_bit(2, &status);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_is_err_pci_mabort(unsigned long status, struct iop_adma_chan *chan)
|
||||
{
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return test_bit(3, &status);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int
|
||||
iop_is_err_split_tx(unsigned long status, struct iop_adma_chan *chan)
|
||||
{
|
||||
switch (chan->device->id) {
|
||||
case DMA0_ID:
|
||||
case DMA1_ID:
|
||||
return test_bit(1, &status);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif /* _ADMA_H */
|
73
arch/arm/include/asm/hardware/iop3xx-gpio.h
Звичайний файл
73
arch/arm/include/asm/hardware/iop3xx-gpio.h
Звичайний файл
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/iop3xx-gpio.h
|
||||
*
|
||||
* IOP3xx GPIO wrappers
|
||||
*
|
||||
* Copyright (c) 2008 Arnaud Patard <arnaud.patard@rtp-net.org>
|
||||
* Based on IXP4XX gpio.h file
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_HARDWARE_IOP3XX_GPIO_H
|
||||
#define __ASM_ARM_HARDWARE_IOP3XX_GPIO_H
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
#define IOP3XX_N_GPIOS 8
|
||||
|
||||
static inline int gpio_get_value(unsigned gpio)
|
||||
{
|
||||
if (gpio > IOP3XX_N_GPIOS)
|
||||
return __gpio_get_value(gpio);
|
||||
|
||||
return gpio_line_get(gpio);
|
||||
}
|
||||
|
||||
static inline void gpio_set_value(unsigned gpio, int value)
|
||||
{
|
||||
if (gpio > IOP3XX_N_GPIOS) {
|
||||
__gpio_set_value(gpio, value);
|
||||
return;
|
||||
}
|
||||
gpio_line_set(gpio, value);
|
||||
}
|
||||
|
||||
static inline int gpio_cansleep(unsigned gpio)
|
||||
{
|
||||
if (gpio < IOP3XX_N_GPIOS)
|
||||
return 0;
|
||||
else
|
||||
return __gpio_cansleep(gpio);
|
||||
}
|
||||
|
||||
/*
|
||||
* The GPIOs are not generating any interrupt
|
||||
* Note : manuals are not clear about this
|
||||
*/
|
||||
static inline int gpio_to_irq(int gpio)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int irq_to_gpio(int gpio)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
312
arch/arm/include/asm/hardware/iop3xx.h
Звичайний файл
312
arch/arm/include/asm/hardware/iop3xx.h
Звичайний файл
@@ -0,0 +1,312 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/iop3xx.h
|
||||
*
|
||||
* Intel IOP32X and IOP33X register definitions
|
||||
*
|
||||
* Author: Rory Bolt <rorybolt@pacbell.net>
|
||||
* Copyright (C) 2002 Rory Bolt
|
||||
* Copyright (C) 2004 Intel Corp.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __IOP3XX_H
|
||||
#define __IOP3XX_H
|
||||
|
||||
/*
|
||||
* IOP3XX GPIO handling
|
||||
*/
|
||||
#define GPIO_IN 0
|
||||
#define GPIO_OUT 1
|
||||
#define GPIO_LOW 0
|
||||
#define GPIO_HIGH 1
|
||||
#define IOP3XX_GPIO_LINE(x) (x)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern void gpio_line_config(int line, int direction);
|
||||
extern int gpio_line_get(int line);
|
||||
extern void gpio_line_set(int line, int value);
|
||||
extern int init_atu;
|
||||
extern int iop3xx_get_init_atu(void);
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* IOP3XX processor registers
|
||||
*/
|
||||
#define IOP3XX_PERIPHERAL_PHYS_BASE 0xffffe000
|
||||
#define IOP3XX_PERIPHERAL_VIRT_BASE 0xfeffe000
|
||||
#define IOP3XX_PERIPHERAL_SIZE 0x00002000
|
||||
#define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\
|
||||
IOP3XX_PERIPHERAL_SIZE - 1)
|
||||
#define IOP3XX_PERIPHERAL_UPPER_VA (IOP3XX_PERIPHERAL_VIRT_BASE +\
|
||||
IOP3XX_PERIPHERAL_SIZE - 1)
|
||||
#define IOP3XX_PMMR_PHYS_TO_VIRT(addr) (u32) ((u32) (addr) -\
|
||||
(IOP3XX_PERIPHERAL_PHYS_BASE\
|
||||
- IOP3XX_PERIPHERAL_VIRT_BASE))
|
||||
#define IOP3XX_REG_ADDR(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + (reg))
|
||||
|
||||
/* Address Translation Unit */
|
||||
#define IOP3XX_ATUVID (volatile u16 *)IOP3XX_REG_ADDR(0x0100)
|
||||
#define IOP3XX_ATUDID (volatile u16 *)IOP3XX_REG_ADDR(0x0102)
|
||||
#define IOP3XX_ATUCMD (volatile u16 *)IOP3XX_REG_ADDR(0x0104)
|
||||
#define IOP3XX_ATUSR (volatile u16 *)IOP3XX_REG_ADDR(0x0106)
|
||||
#define IOP3XX_ATURID (volatile u8 *)IOP3XX_REG_ADDR(0x0108)
|
||||
#define IOP3XX_ATUCCR (volatile u32 *)IOP3XX_REG_ADDR(0x0109)
|
||||
#define IOP3XX_ATUCLSR (volatile u8 *)IOP3XX_REG_ADDR(0x010c)
|
||||
#define IOP3XX_ATULT (volatile u8 *)IOP3XX_REG_ADDR(0x010d)
|
||||
#define IOP3XX_ATUHTR (volatile u8 *)IOP3XX_REG_ADDR(0x010e)
|
||||
#define IOP3XX_ATUBIST (volatile u8 *)IOP3XX_REG_ADDR(0x010f)
|
||||
#define IOP3XX_IABAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0110)
|
||||
#define IOP3XX_IAUBAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0114)
|
||||
#define IOP3XX_IABAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0118)
|
||||
#define IOP3XX_IAUBAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x011c)
|
||||
#define IOP3XX_IABAR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0120)
|
||||
#define IOP3XX_IAUBAR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0124)
|
||||
#define IOP3XX_ASVIR (volatile u16 *)IOP3XX_REG_ADDR(0x012c)
|
||||
#define IOP3XX_ASIR (volatile u16 *)IOP3XX_REG_ADDR(0x012e)
|
||||
#define IOP3XX_ERBAR (volatile u32 *)IOP3XX_REG_ADDR(0x0130)
|
||||
#define IOP3XX_ATUILR (volatile u8 *)IOP3XX_REG_ADDR(0x013c)
|
||||
#define IOP3XX_ATUIPR (volatile u8 *)IOP3XX_REG_ADDR(0x013d)
|
||||
#define IOP3XX_ATUMGNT (volatile u8 *)IOP3XX_REG_ADDR(0x013e)
|
||||
#define IOP3XX_ATUMLAT (volatile u8 *)IOP3XX_REG_ADDR(0x013f)
|
||||
#define IOP3XX_IALR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0140)
|
||||
#define IOP3XX_IATVR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0144)
|
||||
#define IOP3XX_ERLR (volatile u32 *)IOP3XX_REG_ADDR(0x0148)
|
||||
#define IOP3XX_ERTVR (volatile u32 *)IOP3XX_REG_ADDR(0x014c)
|
||||
#define IOP3XX_IALR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0150)
|
||||
#define IOP3XX_IALR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0154)
|
||||
#define IOP3XX_IATVR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0158)
|
||||
#define IOP3XX_OIOWTVR (volatile u32 *)IOP3XX_REG_ADDR(0x015c)
|
||||
#define IOP3XX_OMWTVR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0160)
|
||||
#define IOP3XX_OUMWTVR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0164)
|
||||
#define IOP3XX_OMWTVR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0168)
|
||||
#define IOP3XX_OUMWTVR1 (volatile u32 *)IOP3XX_REG_ADDR(0x016c)
|
||||
#define IOP3XX_OUDWTVR (volatile u32 *)IOP3XX_REG_ADDR(0x0178)
|
||||
#define IOP3XX_ATUCR (volatile u32 *)IOP3XX_REG_ADDR(0x0180)
|
||||
#define IOP3XX_PCSR (volatile u32 *)IOP3XX_REG_ADDR(0x0184)
|
||||
#define IOP3XX_ATUISR (volatile u32 *)IOP3XX_REG_ADDR(0x0188)
|
||||
#define IOP3XX_ATUIMR (volatile u32 *)IOP3XX_REG_ADDR(0x018c)
|
||||
#define IOP3XX_IABAR3 (volatile u32 *)IOP3XX_REG_ADDR(0x0190)
|
||||
#define IOP3XX_IAUBAR3 (volatile u32 *)IOP3XX_REG_ADDR(0x0194)
|
||||
#define IOP3XX_IALR3 (volatile u32 *)IOP3XX_REG_ADDR(0x0198)
|
||||
#define IOP3XX_IATVR3 (volatile u32 *)IOP3XX_REG_ADDR(0x019c)
|
||||
#define IOP3XX_OCCAR (volatile u32 *)IOP3XX_REG_ADDR(0x01a4)
|
||||
#define IOP3XX_OCCDR (volatile u32 *)IOP3XX_REG_ADDR(0x01ac)
|
||||
#define IOP3XX_PDSCR (volatile u32 *)IOP3XX_REG_ADDR(0x01bc)
|
||||
#define IOP3XX_PMCAPID (volatile u8 *)IOP3XX_REG_ADDR(0x01c0)
|
||||
#define IOP3XX_PMNEXT (volatile u8 *)IOP3XX_REG_ADDR(0x01c1)
|
||||
#define IOP3XX_APMCR (volatile u16 *)IOP3XX_REG_ADDR(0x01c2)
|
||||
#define IOP3XX_APMCSR (volatile u16 *)IOP3XX_REG_ADDR(0x01c4)
|
||||
#define IOP3XX_PCIXCAPID (volatile u8 *)IOP3XX_REG_ADDR(0x01e0)
|
||||
#define IOP3XX_PCIXNEXT (volatile u8 *)IOP3XX_REG_ADDR(0x01e1)
|
||||
#define IOP3XX_PCIXCMD (volatile u16 *)IOP3XX_REG_ADDR(0x01e2)
|
||||
#define IOP3XX_PCIXSR (volatile u32 *)IOP3XX_REG_ADDR(0x01e4)
|
||||
#define IOP3XX_PCIIRSR (volatile u32 *)IOP3XX_REG_ADDR(0x01ec)
|
||||
#define IOP3XX_PCSR_OUT_Q_BUSY (1 << 15)
|
||||
#define IOP3XX_PCSR_IN_Q_BUSY (1 << 14)
|
||||
#define IOP3XX_ATUCR_OUT_EN (1 << 1)
|
||||
|
||||
#define IOP3XX_INIT_ATU_DEFAULT 0
|
||||
#define IOP3XX_INIT_ATU_DISABLE -1
|
||||
#define IOP3XX_INIT_ATU_ENABLE 1
|
||||
|
||||
/* Messaging Unit */
|
||||
#define IOP3XX_IMR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0310)
|
||||
#define IOP3XX_IMR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0314)
|
||||
#define IOP3XX_OMR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0318)
|
||||
#define IOP3XX_OMR1 (volatile u32 *)IOP3XX_REG_ADDR(0x031c)
|
||||
#define IOP3XX_IDR (volatile u32 *)IOP3XX_REG_ADDR(0x0320)
|
||||
#define IOP3XX_IISR (volatile u32 *)IOP3XX_REG_ADDR(0x0324)
|
||||
#define IOP3XX_IIMR (volatile u32 *)IOP3XX_REG_ADDR(0x0328)
|
||||
#define IOP3XX_ODR (volatile u32 *)IOP3XX_REG_ADDR(0x032c)
|
||||
#define IOP3XX_OISR (volatile u32 *)IOP3XX_REG_ADDR(0x0330)
|
||||
#define IOP3XX_OIMR (volatile u32 *)IOP3XX_REG_ADDR(0x0334)
|
||||
#define IOP3XX_MUCR (volatile u32 *)IOP3XX_REG_ADDR(0x0350)
|
||||
#define IOP3XX_QBAR (volatile u32 *)IOP3XX_REG_ADDR(0x0354)
|
||||
#define IOP3XX_IFHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0360)
|
||||
#define IOP3XX_IFTPR (volatile u32 *)IOP3XX_REG_ADDR(0x0364)
|
||||
#define IOP3XX_IPHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0368)
|
||||
#define IOP3XX_IPTPR (volatile u32 *)IOP3XX_REG_ADDR(0x036c)
|
||||
#define IOP3XX_OFHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0370)
|
||||
#define IOP3XX_OFTPR (volatile u32 *)IOP3XX_REG_ADDR(0x0374)
|
||||
#define IOP3XX_OPHPR (volatile u32 *)IOP3XX_REG_ADDR(0x0378)
|
||||
#define IOP3XX_OPTPR (volatile u32 *)IOP3XX_REG_ADDR(0x037c)
|
||||
#define IOP3XX_IAR (volatile u32 *)IOP3XX_REG_ADDR(0x0380)
|
||||
|
||||
/* DMA Controller */
|
||||
#define IOP3XX_DMA_PHYS_BASE(chan) (IOP3XX_PERIPHERAL_PHYS_BASE + \
|
||||
(0x400 + (chan << 6)))
|
||||
#define IOP3XX_DMA_UPPER_PA(chan) (IOP3XX_DMA_PHYS_BASE(chan) + 0x27)
|
||||
|
||||
/* Peripheral bus interface */
|
||||
#define IOP3XX_PBCR (volatile u32 *)IOP3XX_REG_ADDR(0x0680)
|
||||
#define IOP3XX_PBISR (volatile u32 *)IOP3XX_REG_ADDR(0x0684)
|
||||
#define IOP3XX_PBBAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0688)
|
||||
#define IOP3XX_PBLR0 (volatile u32 *)IOP3XX_REG_ADDR(0x068c)
|
||||
#define IOP3XX_PBBAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0690)
|
||||
#define IOP3XX_PBLR1 (volatile u32 *)IOP3XX_REG_ADDR(0x0694)
|
||||
#define IOP3XX_PBBAR2 (volatile u32 *)IOP3XX_REG_ADDR(0x0698)
|
||||
#define IOP3XX_PBLR2 (volatile u32 *)IOP3XX_REG_ADDR(0x069c)
|
||||
#define IOP3XX_PBBAR3 (volatile u32 *)IOP3XX_REG_ADDR(0x06a0)
|
||||
#define IOP3XX_PBLR3 (volatile u32 *)IOP3XX_REG_ADDR(0x06a4)
|
||||
#define IOP3XX_PBBAR4 (volatile u32 *)IOP3XX_REG_ADDR(0x06a8)
|
||||
#define IOP3XX_PBLR4 (volatile u32 *)IOP3XX_REG_ADDR(0x06ac)
|
||||
#define IOP3XX_PBBAR5 (volatile u32 *)IOP3XX_REG_ADDR(0x06b0)
|
||||
#define IOP3XX_PBLR5 (volatile u32 *)IOP3XX_REG_ADDR(0x06b4)
|
||||
#define IOP3XX_PMBR0 (volatile u32 *)IOP3XX_REG_ADDR(0x06c0)
|
||||
#define IOP3XX_PMBR1 (volatile u32 *)IOP3XX_REG_ADDR(0x06e0)
|
||||
#define IOP3XX_PMBR2 (volatile u32 *)IOP3XX_REG_ADDR(0x06e4)
|
||||
|
||||
/* Peripheral performance monitoring unit */
|
||||
#define IOP3XX_GTMR (volatile u32 *)IOP3XX_REG_ADDR(0x0700)
|
||||
#define IOP3XX_ESR (volatile u32 *)IOP3XX_REG_ADDR(0x0704)
|
||||
#define IOP3XX_EMISR (volatile u32 *)IOP3XX_REG_ADDR(0x0708)
|
||||
#define IOP3XX_GTSR (volatile u32 *)IOP3XX_REG_ADDR(0x0710)
|
||||
/* PERCR0 DOESN'T EXIST - index from 1! */
|
||||
#define IOP3XX_PERCR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0710)
|
||||
|
||||
/* General Purpose I/O */
|
||||
#define IOP3XX_GPOE (volatile u32 *)IOP3XX_GPIO_REG(0x0000)
|
||||
#define IOP3XX_GPID (volatile u32 *)IOP3XX_GPIO_REG(0x0004)
|
||||
#define IOP3XX_GPOD (volatile u32 *)IOP3XX_GPIO_REG(0x0008)
|
||||
|
||||
/* Timers */
|
||||
#define IOP3XX_TU_TMR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0000)
|
||||
#define IOP3XX_TU_TMR1 (volatile u32 *)IOP3XX_TIMER_REG(0x0004)
|
||||
#define IOP3XX_TU_TCR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0008)
|
||||
#define IOP3XX_TU_TCR1 (volatile u32 *)IOP3XX_TIMER_REG(0x000c)
|
||||
#define IOP3XX_TU_TRR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0010)
|
||||
#define IOP3XX_TU_TRR1 (volatile u32 *)IOP3XX_TIMER_REG(0x0014)
|
||||
#define IOP3XX_TU_TISR (volatile u32 *)IOP3XX_TIMER_REG(0x0018)
|
||||
#define IOP3XX_TU_WDTCR (volatile u32 *)IOP3XX_TIMER_REG(0x001c)
|
||||
#define IOP_TMR_EN 0x02
|
||||
#define IOP_TMR_RELOAD 0x04
|
||||
#define IOP_TMR_PRIVILEGED 0x08
|
||||
#define IOP_TMR_RATIO_1_1 0x00
|
||||
|
||||
/* Watchdog timer definitions */
|
||||
#define IOP_WDTCR_EN_ARM 0x1e1e1e1e
|
||||
#define IOP_WDTCR_EN 0xe1e1e1e1
|
||||
/* iop3xx does not support stopping the watchdog, so we just re-arm */
|
||||
#define IOP_WDTCR_DIS_ARM (IOP_WDTCR_EN_ARM)
|
||||
#define IOP_WDTCR_DIS (IOP_WDTCR_EN)
|
||||
|
||||
/* Application accelerator unit */
|
||||
#define IOP3XX_AAU_PHYS_BASE (IOP3XX_PERIPHERAL_PHYS_BASE + 0x800)
|
||||
#define IOP3XX_AAU_UPPER_PA (IOP3XX_AAU_PHYS_BASE + 0xa7)
|
||||
|
||||
/* I2C bus interface unit */
|
||||
#define IOP3XX_ICR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1680)
|
||||
#define IOP3XX_ISR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1684)
|
||||
#define IOP3XX_ISAR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1688)
|
||||
#define IOP3XX_IDBR0 (volatile u32 *)IOP3XX_REG_ADDR(0x168c)
|
||||
#define IOP3XX_IBMR0 (volatile u32 *)IOP3XX_REG_ADDR(0x1694)
|
||||
#define IOP3XX_ICR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16a0)
|
||||
#define IOP3XX_ISR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16a4)
|
||||
#define IOP3XX_ISAR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16a8)
|
||||
#define IOP3XX_IDBR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16ac)
|
||||
#define IOP3XX_IBMR1 (volatile u32 *)IOP3XX_REG_ADDR(0x16b4)
|
||||
|
||||
|
||||
/*
|
||||
* IOP3XX I/O and Mem space regions for PCI autoconfiguration
|
||||
*/
|
||||
#define IOP3XX_PCI_LOWER_MEM_PA 0x80000000
|
||||
|
||||
#define IOP3XX_PCI_IO_WINDOW_SIZE 0x00010000
|
||||
#define IOP3XX_PCI_LOWER_IO_PA 0x90000000
|
||||
#define IOP3XX_PCI_LOWER_IO_VA 0xfe000000
|
||||
#define IOP3XX_PCI_LOWER_IO_BA 0x90000000
|
||||
#define IOP3XX_PCI_UPPER_IO_PA (IOP3XX_PCI_LOWER_IO_PA +\
|
||||
IOP3XX_PCI_IO_WINDOW_SIZE - 1)
|
||||
#define IOP3XX_PCI_UPPER_IO_VA (IOP3XX_PCI_LOWER_IO_VA +\
|
||||
IOP3XX_PCI_IO_WINDOW_SIZE - 1)
|
||||
#define IOP3XX_PCI_IO_PHYS_TO_VIRT(addr) (((u32) (addr) -\
|
||||
IOP3XX_PCI_LOWER_IO_PA) +\
|
||||
IOP3XX_PCI_LOWER_IO_VA)
|
||||
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
void iop3xx_map_io(void);
|
||||
void iop_init_cp6_handler(void);
|
||||
void iop_init_time(unsigned long tickrate);
|
||||
unsigned long iop_gettimeoffset(void);
|
||||
|
||||
static inline void write_tmr0(u32 val)
|
||||
{
|
||||
asm volatile("mcr p6, 0, %0, c0, c1, 0" : : "r" (val));
|
||||
}
|
||||
|
||||
static inline void write_tmr1(u32 val)
|
||||
{
|
||||
asm volatile("mcr p6, 0, %0, c1, c1, 0" : : "r" (val));
|
||||
}
|
||||
|
||||
static inline u32 read_tcr0(void)
|
||||
{
|
||||
u32 val;
|
||||
asm volatile("mrc p6, 0, %0, c2, c1, 0" : "=r" (val));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline u32 read_tcr1(void)
|
||||
{
|
||||
u32 val;
|
||||
asm volatile("mrc p6, 0, %0, c3, c1, 0" : "=r" (val));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void write_trr0(u32 val)
|
||||
{
|
||||
asm volatile("mcr p6, 0, %0, c4, c1, 0" : : "r" (val));
|
||||
}
|
||||
|
||||
static inline void write_trr1(u32 val)
|
||||
{
|
||||
asm volatile("mcr p6, 0, %0, c5, c1, 0" : : "r" (val));
|
||||
}
|
||||
|
||||
static inline void write_tisr(u32 val)
|
||||
{
|
||||
asm volatile("mcr p6, 0, %0, c6, c1, 0" : : "r" (val));
|
||||
}
|
||||
|
||||
static inline u32 read_wdtcr(void)
|
||||
{
|
||||
u32 val;
|
||||
asm volatile("mrc p6, 0, %0, c7, c1, 0":"=r" (val));
|
||||
return val;
|
||||
}
|
||||
static inline void write_wdtcr(u32 val)
|
||||
{
|
||||
asm volatile("mcr p6, 0, %0, c7, c1, 0"::"r" (val));
|
||||
}
|
||||
|
||||
extern unsigned long get_iop_tick_rate(void);
|
||||
|
||||
/* only iop13xx has these registers, we define these to present a
|
||||
* common register interface for the iop_wdt driver.
|
||||
*/
|
||||
#define IOP_RCSR_WDT (0)
|
||||
static inline u32 read_rcsr(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void write_wdtsr(u32 val)
|
||||
{
|
||||
do { } while (0);
|
||||
}
|
||||
|
||||
extern struct platform_device iop3xx_dma_0_channel;
|
||||
extern struct platform_device iop3xx_dma_1_channel;
|
||||
extern struct platform_device iop3xx_aau_channel;
|
||||
extern struct platform_device iop3xx_i2c0_device;
|
||||
extern struct platform_device iop3xx_i2c1_device;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
116
arch/arm/include/asm/hardware/iop_adma.h
Звичайний файл
116
arch/arm/include/asm/hardware/iop_adma.h
Звичайний файл
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright © 2006, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*/
|
||||
#ifndef IOP_ADMA_H
|
||||
#define IOP_ADMA_H
|
||||
#include <linux/types.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define IOP_ADMA_SLOT_SIZE 32
|
||||
#define IOP_ADMA_THRESHOLD 4
|
||||
|
||||
/**
|
||||
* struct iop_adma_device - internal representation of an ADMA device
|
||||
* @pdev: Platform device
|
||||
* @id: HW ADMA Device selector
|
||||
* @dma_desc_pool: base of DMA descriptor region (DMA address)
|
||||
* @dma_desc_pool_virt: base of DMA descriptor region (CPU address)
|
||||
* @common: embedded struct dma_device
|
||||
*/
|
||||
struct iop_adma_device {
|
||||
struct platform_device *pdev;
|
||||
int id;
|
||||
dma_addr_t dma_desc_pool;
|
||||
void *dma_desc_pool_virt;
|
||||
struct dma_device common;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iop_adma_chan - internal representation of an ADMA device
|
||||
* @pending: allows batching of hardware operations
|
||||
* @completed_cookie: identifier for the most recently completed operation
|
||||
* @lock: serializes enqueue/dequeue operations to the slot pool
|
||||
* @mmr_base: memory mapped register base
|
||||
* @chain: device chain view of the descriptors
|
||||
* @device: parent device
|
||||
* @common: common dmaengine channel object members
|
||||
* @last_used: place holder for allocation to continue from where it left off
|
||||
* @all_slots: complete domain of slots usable by the channel
|
||||
* @slots_allocated: records the actual size of the descriptor slot pool
|
||||
* @irq_tasklet: bottom half where iop_adma_slot_cleanup runs
|
||||
*/
|
||||
struct iop_adma_chan {
|
||||
int pending;
|
||||
dma_cookie_t completed_cookie;
|
||||
spinlock_t lock; /* protects the descriptor slot pool */
|
||||
void __iomem *mmr_base;
|
||||
struct list_head chain;
|
||||
struct iop_adma_device *device;
|
||||
struct dma_chan common;
|
||||
struct iop_adma_desc_slot *last_used;
|
||||
struct list_head all_slots;
|
||||
int slots_allocated;
|
||||
struct tasklet_struct irq_tasklet;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iop_adma_desc_slot - IOP-ADMA software descriptor
|
||||
* @slot_node: node on the iop_adma_chan.all_slots list
|
||||
* @chain_node: node on the op_adma_chan.chain list
|
||||
* @hw_desc: virtual address of the hardware descriptor chain
|
||||
* @phys: hardware address of the hardware descriptor chain
|
||||
* @group_head: first operation in a transaction
|
||||
* @slot_cnt: total slots used in an transaction (group of operations)
|
||||
* @slots_per_op: number of slots per operation
|
||||
* @idx: pool index
|
||||
* @unmap_src_cnt: number of xor sources
|
||||
* @unmap_len: transaction bytecount
|
||||
* @async_tx: support for the async_tx api
|
||||
* @group_list: list of slots that make up a multi-descriptor transaction
|
||||
* for example transfer lengths larger than the supported hw max
|
||||
* @xor_check_result: result of zero sum
|
||||
* @crc32_result: result crc calculation
|
||||
*/
|
||||
struct iop_adma_desc_slot {
|
||||
struct list_head slot_node;
|
||||
struct list_head chain_node;
|
||||
void *hw_desc;
|
||||
struct iop_adma_desc_slot *group_head;
|
||||
u16 slot_cnt;
|
||||
u16 slots_per_op;
|
||||
u16 idx;
|
||||
u16 unmap_src_cnt;
|
||||
size_t unmap_len;
|
||||
struct dma_async_tx_descriptor async_tx;
|
||||
union {
|
||||
u32 *xor_check_result;
|
||||
u32 *crc32_result;
|
||||
};
|
||||
};
|
||||
|
||||
struct iop_adma_platform_data {
|
||||
int hw_id;
|
||||
dma_cap_mask_t cap_mask;
|
||||
size_t pool_size;
|
||||
};
|
||||
|
||||
#define to_iop_sw_desc(addr_hw_desc) \
|
||||
container_of(addr_hw_desc, struct iop_adma_desc_slot, hw_desc)
|
||||
#define iop_hw_desc_slot_idx(hw_desc, idx) \
|
||||
( (void *) (((unsigned long) hw_desc) + ((idx) << 5)) )
|
||||
#endif
|
99
arch/arm/include/asm/hardware/it8152.h
Звичайний файл
99
arch/arm/include/asm/hardware/it8152.h
Звичайний файл
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* linux/include/arm/hardware/it8152.h
|
||||
*
|
||||
* Copyright Compulab Ltd., 2006,2007
|
||||
* Mike Rapoport <mike@compulab.co.il>
|
||||
*
|
||||
* ITE 8152 companion chip register definitions
|
||||
*/
|
||||
|
||||
#ifndef __ASM_HARDWARE_IT8152_H
|
||||
#define __ASM_HARDWARE_IT8152_H
|
||||
extern unsigned long it8152_base_address;
|
||||
|
||||
#define IT8152_IO_BASE (it8152_base_address + 0x03e00000)
|
||||
#define IT8152_CFGREG_BASE (it8152_base_address + 0x03f00000)
|
||||
|
||||
#define __REG_IT8152(x) (it8152_base_address + (x))
|
||||
|
||||
#define IT8152_PCI_CFG_ADDR __REG_IT8152(0x3f00800)
|
||||
#define IT8152_PCI_CFG_DATA __REG_IT8152(0x3f00804)
|
||||
|
||||
#define IT8152_INTC_LDCNIRR __REG_IT8152(0x3f00300)
|
||||
#define IT8152_INTC_LDPNIRR __REG_IT8152(0x3f00304)
|
||||
#define IT8152_INTC_LDCNIMR __REG_IT8152(0x3f00308)
|
||||
#define IT8152_INTC_LDPNIMR __REG_IT8152(0x3f0030C)
|
||||
#define IT8152_INTC_LDNITR __REG_IT8152(0x3f00310)
|
||||
#define IT8152_INTC_LDNIAR __REG_IT8152(0x3f00314)
|
||||
#define IT8152_INTC_LPCNIRR __REG_IT8152(0x3f00320)
|
||||
#define IT8152_INTC_LPPNIRR __REG_IT8152(0x3f00324)
|
||||
#define IT8152_INTC_LPCNIMR __REG_IT8152(0x3f00328)
|
||||
#define IT8152_INTC_LPPNIMR __REG_IT8152(0x3f0032C)
|
||||
#define IT8152_INTC_LPNITR __REG_IT8152(0x3f00330)
|
||||
#define IT8152_INTC_LPNIAR __REG_IT8152(0x3f00334)
|
||||
#define IT8152_INTC_PDCNIRR __REG_IT8152(0x3f00340)
|
||||
#define IT8152_INTC_PDPNIRR __REG_IT8152(0x3f00344)
|
||||
#define IT8152_INTC_PDCNIMR __REG_IT8152(0x3f00348)
|
||||
#define IT8152_INTC_PDPNIMR __REG_IT8152(0x3f0034C)
|
||||
#define IT8152_INTC_PDNITR __REG_IT8152(0x3f00350)
|
||||
#define IT8152_INTC_PDNIAR __REG_IT8152(0x3f00354)
|
||||
#define IT8152_INTC_INTC_TYPER __REG_IT8152(0x3f003FC)
|
||||
|
||||
#define IT8152_GPIO_GPDR __REG_IT8152(0x3f00500)
|
||||
|
||||
/*
|
||||
Interrupt controller per register summary:
|
||||
---------------------------------------
|
||||
LCDNIRR:
|
||||
IT8152_LD_IRQ(8) PCICLK stop
|
||||
IT8152_LD_IRQ(7) MCLK ready
|
||||
IT8152_LD_IRQ(6) s/w
|
||||
IT8152_LD_IRQ(5) UART
|
||||
IT8152_LD_IRQ(4) GPIO
|
||||
IT8152_LD_IRQ(3) TIMER 4
|
||||
IT8152_LD_IRQ(2) TIMER 3
|
||||
IT8152_LD_IRQ(1) TIMER 2
|
||||
IT8152_LD_IRQ(0) TIMER 1
|
||||
|
||||
LPCNIRR:
|
||||
IT8152_LP_IRQ(x) serial IRQ x
|
||||
|
||||
PCIDNIRR:
|
||||
IT8152_PD_IRQ(14) PCISERR
|
||||
IT8152_PD_IRQ(13) CPU/PCI bridge target abort (h2pTADR)
|
||||
IT8152_PD_IRQ(12) CPU/PCI bridge master abort (h2pMADR)
|
||||
IT8152_PD_IRQ(11) PCI INTD
|
||||
IT8152_PD_IRQ(10) PCI INTC
|
||||
IT8152_PD_IRQ(9) PCI INTB
|
||||
IT8152_PD_IRQ(8) PCI INTA
|
||||
IT8152_PD_IRQ(7) serial INTD
|
||||
IT8152_PD_IRQ(6) serial INTC
|
||||
IT8152_PD_IRQ(5) serial INTB
|
||||
IT8152_PD_IRQ(4) serial INTA
|
||||
IT8152_PD_IRQ(3) serial IRQ IOCHK (IOCHKR)
|
||||
IT8152_PD_IRQ(2) chaining DMA (CDMAR)
|
||||
IT8152_PD_IRQ(1) USB (USBR)
|
||||
IT8152_PD_IRQ(0) Audio controller (ACR)
|
||||
*/
|
||||
/* frequently used interrupts */
|
||||
#define IT8152_PCISERR IT8152_PD_IRQ(14)
|
||||
#define IT8152_H2PTADR IT8152_PD_IRQ(13)
|
||||
#define IT8152_H2PMAR IT8152_PD_IRQ(12)
|
||||
#define IT8152_PCI_INTD IT8152_PD_IRQ(11)
|
||||
#define IT8152_PCI_INTC IT8152_PD_IRQ(10)
|
||||
#define IT8152_PCI_INTB IT8152_PD_IRQ(9)
|
||||
#define IT8152_PCI_INTA IT8152_PD_IRQ(8)
|
||||
#define IT8152_CDMA_INT IT8152_PD_IRQ(2)
|
||||
#define IT8152_USB_INT IT8152_PD_IRQ(1)
|
||||
#define IT8152_AUDIO_INT IT8152_PD_IRQ(0)
|
||||
|
||||
struct pci_dev;
|
||||
struct pci_sys_data;
|
||||
|
||||
extern void it8152_irq_demux(unsigned int irq, struct irq_desc *desc);
|
||||
extern void it8152_init_irq(void);
|
||||
extern int it8152_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin);
|
||||
extern int it8152_pci_setup(int nr, struct pci_sys_data *sys);
|
||||
extern struct pci_bus *it8152_pci_scan_bus(int nr, struct pci_sys_data *sys);
|
||||
|
||||
#endif /* __ASM_HARDWARE_IT8152_H */
|
48
arch/arm/include/asm/hardware/linkup-l1110.h
Звичайний файл
48
arch/arm/include/asm/hardware/linkup-l1110.h
Звичайний файл
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
*
|
||||
* Definitions for H3600 Handheld Computer
|
||||
*
|
||||
* Copyright 2001 Compaq Computer Corporation.
|
||||
*
|
||||
* Use consistent with the GNU GPL is permitted,
|
||||
* provided that this copyright notice is
|
||||
* preserved in its entirety in all copies and derived works.
|
||||
*
|
||||
* COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
|
||||
* AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
|
||||
* FITNESS FOR ANY PARTICULAR PURPOSE.
|
||||
*
|
||||
* Author: Jamey Hicks.
|
||||
*
|
||||
*/
|
||||
|
||||
/* LinkUp Systems PCCard/CompactFlash Interface for SA-1100 */
|
||||
|
||||
/* PC Card Status Register */
|
||||
#define LINKUP_PRS_S1 (1 << 0) /* voltage control bits S1-S4 */
|
||||
#define LINKUP_PRS_S2 (1 << 1)
|
||||
#define LINKUP_PRS_S3 (1 << 2)
|
||||
#define LINKUP_PRS_S4 (1 << 3)
|
||||
#define LINKUP_PRS_BVD1 (1 << 4)
|
||||
#define LINKUP_PRS_BVD2 (1 << 5)
|
||||
#define LINKUP_PRS_VS1 (1 << 6)
|
||||
#define LINKUP_PRS_VS2 (1 << 7)
|
||||
#define LINKUP_PRS_RDY (1 << 8)
|
||||
#define LINKUP_PRS_CD1 (1 << 9)
|
||||
#define LINKUP_PRS_CD2 (1 << 10)
|
||||
|
||||
/* PC Card Command Register */
|
||||
#define LINKUP_PRC_S1 (1 << 0)
|
||||
#define LINKUP_PRC_S2 (1 << 1)
|
||||
#define LINKUP_PRC_S3 (1 << 2)
|
||||
#define LINKUP_PRC_S4 (1 << 3)
|
||||
#define LINKUP_PRC_RESET (1 << 4)
|
||||
#define LINKUP_PRC_APOE (1 << 5) /* Auto Power Off Enable: clears S1-S4 when either nCD goes high */
|
||||
#define LINKUP_PRC_CFE (1 << 6) /* CompactFlash mode Enable: addresses A[10:0] only, A[25:11] high */
|
||||
#define LINKUP_PRC_SOE (1 << 7) /* signal output driver enable */
|
||||
#define LINKUP_PRC_SSP (1 << 8) /* sock select polarity: 0 for socket 0, 1 for socket 1 */
|
||||
#define LINKUP_PRC_MBZ (1 << 15) /* must be zero */
|
||||
|
||||
struct linkup_l1110 {
|
||||
volatile short prc;
|
||||
};
|
217
arch/arm/include/asm/hardware/locomo.h
Звичайний файл
217
arch/arm/include/asm/hardware/locomo.h
Звичайний файл
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/locomo.h
|
||||
*
|
||||
* This file contains the definitions for the LoCoMo G/A Chip
|
||||
*
|
||||
* (C) Copyright 2004 John Lenz
|
||||
*
|
||||
* May be copied or modified under the terms of the GNU General Public
|
||||
* License. See linux/COPYING for more information.
|
||||
*
|
||||
* Based on sa1111.h
|
||||
*/
|
||||
#ifndef _ASM_ARCH_LOCOMO
|
||||
#define _ASM_ARCH_LOCOMO
|
||||
|
||||
#define locomo_writel(val,addr) ({ *(volatile u16 *)(addr) = (val); })
|
||||
#define locomo_readl(addr) (*(volatile u16 *)(addr))
|
||||
|
||||
/* LOCOMO version */
|
||||
#define LOCOMO_VER 0x00
|
||||
|
||||
/* Pin status */
|
||||
#define LOCOMO_ST 0x04
|
||||
|
||||
/* Pin status */
|
||||
#define LOCOMO_C32K 0x08
|
||||
|
||||
/* Interrupt controller */
|
||||
#define LOCOMO_ICR 0x0C
|
||||
|
||||
/* MCS decoder for boot selecting */
|
||||
#define LOCOMO_MCSX0 0x10
|
||||
#define LOCOMO_MCSX1 0x14
|
||||
#define LOCOMO_MCSX2 0x18
|
||||
#define LOCOMO_MCSX3 0x1c
|
||||
|
||||
/* Touch panel controller */
|
||||
#define LOCOMO_ASD 0x20 /* AD start delay */
|
||||
#define LOCOMO_HSD 0x28 /* HSYS delay */
|
||||
#define LOCOMO_HSC 0x2c /* HSYS period */
|
||||
#define LOCOMO_TADC 0x30 /* tablet ADC clock */
|
||||
|
||||
|
||||
/* Long time timer */
|
||||
#define LOCOMO_LTC 0xd8 /* LTC interrupt setting */
|
||||
#define LOCOMO_LTINT 0xdc /* LTC interrupt */
|
||||
|
||||
/* DAC control signal for LCD (COMADJ ) */
|
||||
#define LOCOMO_DAC 0xe0
|
||||
/* DAC control */
|
||||
#define LOCOMO_DAC_SCLOEB 0x08 /* SCL pin output data */
|
||||
#define LOCOMO_DAC_TEST 0x04 /* Test bit */
|
||||
#define LOCOMO_DAC_SDA 0x02 /* SDA pin level (read-only) */
|
||||
#define LOCOMO_DAC_SDAOEB 0x01 /* SDA pin output data */
|
||||
|
||||
/* SPI interface */
|
||||
#define LOCOMO_SPI 0x60
|
||||
#define LOCOMO_SPIMD 0x00 /* SPI mode setting */
|
||||
#define LOCOMO_SPICT 0x04 /* SPI mode control */
|
||||
#define LOCOMO_SPIST 0x08 /* SPI status */
|
||||
#define LOCOMO_SPI_TEND (1 << 3) /* Transfer end bit */
|
||||
#define LOCOMO_SPI_REND (1 << 2) /* Receive end bit */
|
||||
#define LOCOMO_SPI_RFW (1 << 1) /* write buffer bit */
|
||||
#define LOCOMO_SPI_RFR (1) /* read buffer bit */
|
||||
|
||||
#define LOCOMO_SPIIS 0x10 /* SPI interrupt status */
|
||||
#define LOCOMO_SPIWE 0x14 /* SPI interrupt status write enable */
|
||||
#define LOCOMO_SPIIE 0x18 /* SPI interrupt enable */
|
||||
#define LOCOMO_SPIIR 0x1c /* SPI interrupt request */
|
||||
#define LOCOMO_SPITD 0x20 /* SPI transfer data write */
|
||||
#define LOCOMO_SPIRD 0x24 /* SPI receive data read */
|
||||
#define LOCOMO_SPITS 0x28 /* SPI transfer data shift */
|
||||
#define LOCOMO_SPIRS 0x2C /* SPI receive data shift */
|
||||
|
||||
/* GPIO */
|
||||
#define LOCOMO_GPD 0x90 /* GPIO direction */
|
||||
#define LOCOMO_GPE 0x94 /* GPIO input enable */
|
||||
#define LOCOMO_GPL 0x98 /* GPIO level */
|
||||
#define LOCOMO_GPO 0x9c /* GPIO out data setting */
|
||||
#define LOCOMO_GRIE 0xa0 /* GPIO rise detection */
|
||||
#define LOCOMO_GFIE 0xa4 /* GPIO fall detection */
|
||||
#define LOCOMO_GIS 0xa8 /* GPIO edge detection status */
|
||||
#define LOCOMO_GWE 0xac /* GPIO status write enable */
|
||||
#define LOCOMO_GIE 0xb0 /* GPIO interrupt enable */
|
||||
#define LOCOMO_GIR 0xb4 /* GPIO interrupt request */
|
||||
#define LOCOMO_GPIO(Nb) (0x01 << (Nb))
|
||||
#define LOCOMO_GPIO_RTS LOCOMO_GPIO(0)
|
||||
#define LOCOMO_GPIO_CTS LOCOMO_GPIO(1)
|
||||
#define LOCOMO_GPIO_DSR LOCOMO_GPIO(2)
|
||||
#define LOCOMO_GPIO_DTR LOCOMO_GPIO(3)
|
||||
#define LOCOMO_GPIO_LCD_VSHA_ON LOCOMO_GPIO(4)
|
||||
#define LOCOMO_GPIO_LCD_VSHD_ON LOCOMO_GPIO(5)
|
||||
#define LOCOMO_GPIO_LCD_VEE_ON LOCOMO_GPIO(6)
|
||||
#define LOCOMO_GPIO_LCD_MOD LOCOMO_GPIO(7)
|
||||
#define LOCOMO_GPIO_DAC_ON LOCOMO_GPIO(8)
|
||||
#define LOCOMO_GPIO_FL_VR LOCOMO_GPIO(9)
|
||||
#define LOCOMO_GPIO_DAC_SDATA LOCOMO_GPIO(10)
|
||||
#define LOCOMO_GPIO_DAC_SCK LOCOMO_GPIO(11)
|
||||
#define LOCOMO_GPIO_DAC_SLOAD LOCOMO_GPIO(12)
|
||||
#define LOCOMO_GPIO_CARD_DETECT LOCOMO_GPIO(13)
|
||||
#define LOCOMO_GPIO_WRITE_PROT LOCOMO_GPIO(14)
|
||||
#define LOCOMO_GPIO_CARD_POWER LOCOMO_GPIO(15)
|
||||
|
||||
/* Start the definitions of the devices. Each device has an initial
|
||||
* base address and a series of offsets from that base address. */
|
||||
|
||||
/* Keyboard controller */
|
||||
#define LOCOMO_KEYBOARD 0x40
|
||||
#define LOCOMO_KIB 0x00 /* KIB level */
|
||||
#define LOCOMO_KSC 0x04 /* KSTRB control */
|
||||
#define LOCOMO_KCMD 0x08 /* KSTRB command */
|
||||
#define LOCOMO_KIC 0x0c /* Key interrupt */
|
||||
|
||||
/* Front light adjustment controller */
|
||||
#define LOCOMO_FRONTLIGHT 0xc8
|
||||
#define LOCOMO_ALS 0x00 /* Adjust light cycle */
|
||||
#define LOCOMO_ALD 0x04 /* Adjust light duty */
|
||||
|
||||
#define LOCOMO_ALC_EN 0x8000
|
||||
|
||||
/* Backlight controller: TFT signal */
|
||||
#define LOCOMO_BACKLIGHT 0x38
|
||||
#define LOCOMO_TC 0x00 /* TFT control signal */
|
||||
#define LOCOMO_CPSD 0x04 /* CPS delay */
|
||||
|
||||
/* Audio controller */
|
||||
#define LOCOMO_AUDIO 0x54
|
||||
#define LOCOMO_ACC 0x00 /* Audio clock */
|
||||
#define LOCOMO_PAIF 0xD0 /* PCM audio interface */
|
||||
/* Audio clock */
|
||||
#define LOCOMO_ACC_XON 0x80
|
||||
#define LOCOMO_ACC_XEN 0x40
|
||||
#define LOCOMO_ACC_XSEL0 0x00
|
||||
#define LOCOMO_ACC_XSEL1 0x20
|
||||
#define LOCOMO_ACC_MCLKEN 0x10
|
||||
#define LOCOMO_ACC_64FSEN 0x08
|
||||
#define LOCOMO_ACC_CLKSEL000 0x00 /* mclk 2 */
|
||||
#define LOCOMO_ACC_CLKSEL001 0x01 /* mclk 3 */
|
||||
#define LOCOMO_ACC_CLKSEL010 0x02 /* mclk 4 */
|
||||
#define LOCOMO_ACC_CLKSEL011 0x03 /* mclk 6 */
|
||||
#define LOCOMO_ACC_CLKSEL100 0x04 /* mclk 8 */
|
||||
#define LOCOMO_ACC_CLKSEL101 0x05 /* mclk 12 */
|
||||
/* PCM audio interface */
|
||||
#define LOCOMO_PAIF_SCINV 0x20
|
||||
#define LOCOMO_PAIF_SCEN 0x10
|
||||
#define LOCOMO_PAIF_LRCRST 0x08
|
||||
#define LOCOMO_PAIF_LRCEVE 0x04
|
||||
#define LOCOMO_PAIF_LRCINV 0x02
|
||||
#define LOCOMO_PAIF_LRCEN 0x01
|
||||
|
||||
/* LED controller */
|
||||
#define LOCOMO_LED 0xe8
|
||||
#define LOCOMO_LPT0 0x00
|
||||
#define LOCOMO_LPT1 0x04
|
||||
/* LED control */
|
||||
#define LOCOMO_LPT_TOFH 0x80
|
||||
#define LOCOMO_LPT_TOFL 0x08
|
||||
#define LOCOMO_LPT_TOH(TOH) ((TOH & 0x7) << 4)
|
||||
#define LOCOMO_LPT_TOL(TOL) ((TOL & 0x7))
|
||||
|
||||
extern struct bus_type locomo_bus_type;
|
||||
|
||||
#define LOCOMO_DEVID_KEYBOARD 0
|
||||
#define LOCOMO_DEVID_FRONTLIGHT 1
|
||||
#define LOCOMO_DEVID_BACKLIGHT 2
|
||||
#define LOCOMO_DEVID_AUDIO 3
|
||||
#define LOCOMO_DEVID_LED 4
|
||||
#define LOCOMO_DEVID_UART 5
|
||||
#define LOCOMO_DEVID_SPI 6
|
||||
|
||||
struct locomo_dev {
|
||||
struct device dev;
|
||||
unsigned int devid;
|
||||
unsigned int irq[1];
|
||||
|
||||
void *mapbase;
|
||||
unsigned long length;
|
||||
|
||||
u64 dma_mask;
|
||||
};
|
||||
|
||||
#define LOCOMO_DEV(_d) container_of((_d), struct locomo_dev, dev)
|
||||
|
||||
#define locomo_get_drvdata(d) dev_get_drvdata(&(d)->dev)
|
||||
#define locomo_set_drvdata(d,p) dev_set_drvdata(&(d)->dev, p)
|
||||
|
||||
struct locomo_driver {
|
||||
struct device_driver drv;
|
||||
unsigned int devid;
|
||||
int (*probe)(struct locomo_dev *);
|
||||
int (*remove)(struct locomo_dev *);
|
||||
int (*suspend)(struct locomo_dev *, pm_message_t);
|
||||
int (*resume)(struct locomo_dev *);
|
||||
};
|
||||
|
||||
#define LOCOMO_DRV(_d) container_of((_d), struct locomo_driver, drv)
|
||||
|
||||
#define LOCOMO_DRIVER_NAME(_ldev) ((_ldev)->dev.driver->name)
|
||||
|
||||
void locomo_lcd_power(struct locomo_dev *, int, unsigned int);
|
||||
|
||||
int locomo_driver_register(struct locomo_driver *);
|
||||
void locomo_driver_unregister(struct locomo_driver *);
|
||||
|
||||
/* GPIO control functions */
|
||||
void locomo_gpio_set_dir(struct device *dev, unsigned int bits, unsigned int dir);
|
||||
int locomo_gpio_read_level(struct device *dev, unsigned int bits);
|
||||
int locomo_gpio_read_output(struct device *dev, unsigned int bits);
|
||||
void locomo_gpio_write(struct device *dev, unsigned int bits, unsigned int set);
|
||||
|
||||
/* M62332 control function */
|
||||
void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int channel);
|
||||
|
||||
/* Frontlight control */
|
||||
void locomo_frontlight_set(struct locomo_dev *dev, int duty, int vr, int bpwf);
|
||||
|
||||
#endif
|
26
arch/arm/include/asm/hardware/memc.h
Звичайний файл
26
arch/arm/include/asm/hardware/memc.h
Звичайний файл
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/memc.h
|
||||
*
|
||||
* Copyright (C) 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.
|
||||
*/
|
||||
#define VDMA_ALIGNMENT PAGE_SIZE
|
||||
#define VDMA_XFERSIZE 16
|
||||
#define VDMA_INIT 0
|
||||
#define VDMA_START 1
|
||||
#define VDMA_END 2
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern void memc_write(unsigned int reg, unsigned long val);
|
||||
|
||||
#define video_set_dma(start,end,offset) \
|
||||
do { \
|
||||
memc_write (VDMA_START, (start >> 2)); \
|
||||
memc_write (VDMA_END, (end - VDMA_XFERSIZE) >> 2); \
|
||||
memc_write (VDMA_INIT, (offset >> 2)); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
186
arch/arm/include/asm/hardware/pci_v3.h
Звичайний файл
186
arch/arm/include/asm/hardware/pci_v3.h
Звичайний файл
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/pci_v3.h
|
||||
*
|
||||
* Internal header file PCI V3 chip
|
||||
*
|
||||
* Copyright (C) ARM Limited
|
||||
* Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef ASM_ARM_HARDWARE_PCI_V3_H
|
||||
#define ASM_ARM_HARDWARE_PCI_V3_H
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* V3 Local Bus to PCI Bridge definitions
|
||||
* -------------------------------------------------------------------------------
|
||||
* Registers (these are taken from page 129 of the EPC User's Manual Rev 1.04
|
||||
* All V3 register names are prefaced by V3_ to avoid clashing with any other
|
||||
* PCI definitions. Their names match the user's manual.
|
||||
*
|
||||
* I'm assuming that I20 is disabled.
|
||||
*
|
||||
*/
|
||||
#define V3_PCI_VENDOR 0x00000000
|
||||
#define V3_PCI_DEVICE 0x00000002
|
||||
#define V3_PCI_CMD 0x00000004
|
||||
#define V3_PCI_STAT 0x00000006
|
||||
#define V3_PCI_CC_REV 0x00000008
|
||||
#define V3_PCI_HDR_CFG 0x0000000C
|
||||
#define V3_PCI_IO_BASE 0x00000010
|
||||
#define V3_PCI_BASE0 0x00000014
|
||||
#define V3_PCI_BASE1 0x00000018
|
||||
#define V3_PCI_SUB_VENDOR 0x0000002C
|
||||
#define V3_PCI_SUB_ID 0x0000002E
|
||||
#define V3_PCI_ROM 0x00000030
|
||||
#define V3_PCI_BPARAM 0x0000003C
|
||||
#define V3_PCI_MAP0 0x00000040
|
||||
#define V3_PCI_MAP1 0x00000044
|
||||
#define V3_PCI_INT_STAT 0x00000048
|
||||
#define V3_PCI_INT_CFG 0x0000004C
|
||||
#define V3_LB_BASE0 0x00000054
|
||||
#define V3_LB_BASE1 0x00000058
|
||||
#define V3_LB_MAP0 0x0000005E
|
||||
#define V3_LB_MAP1 0x00000062
|
||||
#define V3_LB_BASE2 0x00000064
|
||||
#define V3_LB_MAP2 0x00000066
|
||||
#define V3_LB_SIZE 0x00000068
|
||||
#define V3_LB_IO_BASE 0x0000006E
|
||||
#define V3_FIFO_CFG 0x00000070
|
||||
#define V3_FIFO_PRIORITY 0x00000072
|
||||
#define V3_FIFO_STAT 0x00000074
|
||||
#define V3_LB_ISTAT 0x00000076
|
||||
#define V3_LB_IMASK 0x00000077
|
||||
#define V3_SYSTEM 0x00000078
|
||||
#define V3_LB_CFG 0x0000007A
|
||||
#define V3_PCI_CFG 0x0000007C
|
||||
#define V3_DMA_PCI_ADR0 0x00000080
|
||||
#define V3_DMA_PCI_ADR1 0x00000090
|
||||
#define V3_DMA_LOCAL_ADR0 0x00000084
|
||||
#define V3_DMA_LOCAL_ADR1 0x00000094
|
||||
#define V3_DMA_LENGTH0 0x00000088
|
||||
#define V3_DMA_LENGTH1 0x00000098
|
||||
#define V3_DMA_CSR0 0x0000008B
|
||||
#define V3_DMA_CSR1 0x0000009B
|
||||
#define V3_DMA_CTLB_ADR0 0x0000008C
|
||||
#define V3_DMA_CTLB_ADR1 0x0000009C
|
||||
#define V3_DMA_DELAY 0x000000E0
|
||||
#define V3_MAIL_DATA 0x000000C0
|
||||
#define V3_PCI_MAIL_IEWR 0x000000D0
|
||||
#define V3_PCI_MAIL_IERD 0x000000D2
|
||||
#define V3_LB_MAIL_IEWR 0x000000D4
|
||||
#define V3_LB_MAIL_IERD 0x000000D6
|
||||
#define V3_MAIL_WR_STAT 0x000000D8
|
||||
#define V3_MAIL_RD_STAT 0x000000DA
|
||||
#define V3_QBA_MAP 0x000000DC
|
||||
|
||||
/* PCI COMMAND REGISTER bits
|
||||
*/
|
||||
#define V3_COMMAND_M_FBB_EN (1 << 9)
|
||||
#define V3_COMMAND_M_SERR_EN (1 << 8)
|
||||
#define V3_COMMAND_M_PAR_EN (1 << 6)
|
||||
#define V3_COMMAND_M_MASTER_EN (1 << 2)
|
||||
#define V3_COMMAND_M_MEM_EN (1 << 1)
|
||||
#define V3_COMMAND_M_IO_EN (1 << 0)
|
||||
|
||||
/* SYSTEM REGISTER bits
|
||||
*/
|
||||
#define V3_SYSTEM_M_RST_OUT (1 << 15)
|
||||
#define V3_SYSTEM_M_LOCK (1 << 14)
|
||||
|
||||
/* PCI_CFG bits
|
||||
*/
|
||||
#define V3_PCI_CFG_M_I2O_EN (1 << 15)
|
||||
#define V3_PCI_CFG_M_IO_REG_DIS (1 << 14)
|
||||
#define V3_PCI_CFG_M_IO_DIS (1 << 13)
|
||||
#define V3_PCI_CFG_M_EN3V (1 << 12)
|
||||
#define V3_PCI_CFG_M_RETRY_EN (1 << 10)
|
||||
#define V3_PCI_CFG_M_AD_LOW1 (1 << 9)
|
||||
#define V3_PCI_CFG_M_AD_LOW0 (1 << 8)
|
||||
|
||||
/* PCI_BASE register bits (PCI -> Local Bus)
|
||||
*/
|
||||
#define V3_PCI_BASE_M_ADR_BASE 0xFFF00000
|
||||
#define V3_PCI_BASE_M_ADR_BASEL 0x000FFF00
|
||||
#define V3_PCI_BASE_M_PREFETCH (1 << 3)
|
||||
#define V3_PCI_BASE_M_TYPE (3 << 1)
|
||||
#define V3_PCI_BASE_M_IO (1 << 0)
|
||||
|
||||
/* PCI MAP register bits (PCI -> Local bus)
|
||||
*/
|
||||
#define V3_PCI_MAP_M_MAP_ADR 0xFFF00000
|
||||
#define V3_PCI_MAP_M_RD_POST_INH (1 << 15)
|
||||
#define V3_PCI_MAP_M_ROM_SIZE (3 << 10)
|
||||
#define V3_PCI_MAP_M_SWAP (3 << 8)
|
||||
#define V3_PCI_MAP_M_ADR_SIZE 0x000000F0
|
||||
#define V3_PCI_MAP_M_REG_EN (1 << 1)
|
||||
#define V3_PCI_MAP_M_ENABLE (1 << 0)
|
||||
|
||||
/*
|
||||
* LB_BASE0,1 register bits (Local bus -> PCI)
|
||||
*/
|
||||
#define V3_LB_BASE_ADR_BASE 0xfff00000
|
||||
#define V3_LB_BASE_SWAP (3 << 8)
|
||||
#define V3_LB_BASE_ADR_SIZE (15 << 4)
|
||||
#define V3_LB_BASE_PREFETCH (1 << 3)
|
||||
#define V3_LB_BASE_ENABLE (1 << 0)
|
||||
|
||||
#define V3_LB_BASE_ADR_SIZE_1MB (0 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_2MB (1 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_4MB (2 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_8MB (3 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_16MB (4 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_32MB (5 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_64MB (6 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_128MB (7 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_256MB (8 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_512MB (9 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_1GB (10 << 4)
|
||||
#define V3_LB_BASE_ADR_SIZE_2GB (11 << 4)
|
||||
|
||||
#define v3_addr_to_lb_base(a) ((a) & V3_LB_BASE_ADR_BASE)
|
||||
|
||||
/*
|
||||
* LB_MAP0,1 register bits (Local bus -> PCI)
|
||||
*/
|
||||
#define V3_LB_MAP_MAP_ADR 0xfff0
|
||||
#define V3_LB_MAP_TYPE (7 << 1)
|
||||
#define V3_LB_MAP_AD_LOW_EN (1 << 0)
|
||||
|
||||
#define V3_LB_MAP_TYPE_IACK (0 << 1)
|
||||
#define V3_LB_MAP_TYPE_IO (1 << 1)
|
||||
#define V3_LB_MAP_TYPE_MEM (3 << 1)
|
||||
#define V3_LB_MAP_TYPE_CONFIG (5 << 1)
|
||||
#define V3_LB_MAP_TYPE_MEM_MULTIPLE (6 << 1)
|
||||
|
||||
#define v3_addr_to_lb_map(a) (((a) >> 16) & V3_LB_MAP_MAP_ADR)
|
||||
|
||||
/*
|
||||
* LB_BASE2 register bits (Local bus -> PCI IO)
|
||||
*/
|
||||
#define V3_LB_BASE2_ADR_BASE 0xff00
|
||||
#define V3_LB_BASE2_SWAP (3 << 6)
|
||||
#define V3_LB_BASE2_ENABLE (1 << 0)
|
||||
|
||||
#define v3_addr_to_lb_base2(a) (((a) >> 16) & V3_LB_BASE2_ADR_BASE)
|
||||
|
||||
/*
|
||||
* LB_MAP2 register bits (Local bus -> PCI IO)
|
||||
*/
|
||||
#define V3_LB_MAP2_MAP_ADR 0xff00
|
||||
|
||||
#define v3_addr_to_lb_map2(a) (((a) >> 16) & V3_LB_MAP2_MAP_ADR)
|
||||
|
||||
#endif
|
581
arch/arm/include/asm/hardware/sa1111.h
Звичайний файл
581
arch/arm/include/asm/hardware/sa1111.h
Звичайний файл
@@ -0,0 +1,581 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/sa1111.h
|
||||
*
|
||||
* Copyright (C) 2000 John G Dorsey <john+@cs.cmu.edu>
|
||||
*
|
||||
* This file contains definitions for the SA-1111 Companion Chip.
|
||||
* (Structure and naming borrowed from SA-1101.h, by Peter Danielsson.)
|
||||
*
|
||||
* Macro that calculates real address for registers in the SA-1111
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ARCH_SA1111
|
||||
#define _ASM_ARCH_SA1111
|
||||
|
||||
#include <asm/arch/bitfield.h>
|
||||
|
||||
/*
|
||||
* The SA1111 is always located at virtual 0xf4000000, and is always
|
||||
* "native" endian.
|
||||
*/
|
||||
|
||||
#define SA1111_VBASE 0xf4000000
|
||||
|
||||
/* Don't use these! */
|
||||
#define SA1111_p2v( x ) ((x) - SA1111_BASE + SA1111_VBASE)
|
||||
#define SA1111_v2p( x ) ((x) - SA1111_VBASE + SA1111_BASE)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define _SA1111(x) ((x) + sa1111->resource.start)
|
||||
#endif
|
||||
|
||||
#define sa1111_writel(val,addr) __raw_writel(val, addr)
|
||||
#define sa1111_readl(addr) __raw_readl(addr)
|
||||
|
||||
/*
|
||||
* 26 bits of the SA-1110 address bus are available to the SA-1111.
|
||||
* Use these when feeding target addresses to the DMA engines.
|
||||
*/
|
||||
|
||||
#define SA1111_ADDR_WIDTH (26)
|
||||
#define SA1111_ADDR_MASK ((1<<SA1111_ADDR_WIDTH)-1)
|
||||
#define SA1111_DMA_ADDR(x) ((x)&SA1111_ADDR_MASK)
|
||||
|
||||
/*
|
||||
* Don't ask the (SAC) DMA engines to move less than this amount.
|
||||
*/
|
||||
|
||||
#define SA1111_SAC_DMA_MIN_XFER (0x800)
|
||||
|
||||
/*
|
||||
* System Bus Interface (SBI)
|
||||
*
|
||||
* Registers
|
||||
* SKCR Control Register
|
||||
* SMCR Shared Memory Controller Register
|
||||
* SKID ID Register
|
||||
*/
|
||||
#define SA1111_SKCR 0x0000
|
||||
#define SA1111_SMCR 0x0004
|
||||
#define SA1111_SKID 0x0008
|
||||
|
||||
#define SKCR_PLL_BYPASS (1<<0)
|
||||
#define SKCR_RCLKEN (1<<1)
|
||||
#define SKCR_SLEEP (1<<2)
|
||||
#define SKCR_DOZE (1<<3)
|
||||
#define SKCR_VCO_OFF (1<<4)
|
||||
#define SKCR_SCANTSTEN (1<<5)
|
||||
#define SKCR_CLKTSTEN (1<<6)
|
||||
#define SKCR_RDYEN (1<<7)
|
||||
#define SKCR_SELAC (1<<8)
|
||||
#define SKCR_OPPC (1<<9)
|
||||
#define SKCR_PLLTSTEN (1<<10)
|
||||
#define SKCR_USBIOTSTEN (1<<11)
|
||||
/*
|
||||
* Don't believe the specs! Take them, throw them outside. Leave them
|
||||
* there for a week. Spit on them. Walk on them. Stamp on them.
|
||||
* Pour gasoline over them and finally burn them. Now think about coding.
|
||||
* - The October 1999 errata (278260-007) says its bit 13, 1 to enable.
|
||||
* - The Feb 2001 errata (278260-010) says that the previous errata
|
||||
* (278260-009) is wrong, and its bit actually 12, fixed in spec
|
||||
* 278242-003.
|
||||
* - The SA1111 manual (278242) says bit 12, but 0 to enable.
|
||||
* - Reality is bit 13, 1 to enable.
|
||||
* -- rmk
|
||||
*/
|
||||
#define SKCR_OE_EN (1<<13)
|
||||
|
||||
#define SMCR_DTIM (1<<0)
|
||||
#define SMCR_MBGE (1<<1)
|
||||
#define SMCR_DRAC_0 (1<<2)
|
||||
#define SMCR_DRAC_1 (1<<3)
|
||||
#define SMCR_DRAC_2 (1<<4)
|
||||
#define SMCR_DRAC Fld(3, 2)
|
||||
#define SMCR_CLAT (1<<5)
|
||||
|
||||
#define SKID_SIREV_MASK (0x000000f0)
|
||||
#define SKID_MTREV_MASK (0x0000000f)
|
||||
#define SKID_ID_MASK (0xffffff00)
|
||||
#define SKID_SA1111_ID (0x690cc200)
|
||||
|
||||
/*
|
||||
* System Controller
|
||||
*
|
||||
* Registers
|
||||
* SKPCR Power Control Register
|
||||
* SKCDR Clock Divider Register
|
||||
* SKAUD Audio Clock Divider Register
|
||||
* SKPMC PS/2 Mouse Clock Divider Register
|
||||
* SKPTC PS/2 Track Pad Clock Divider Register
|
||||
* SKPEN0 PWM0 Enable Register
|
||||
* SKPWM0 PWM0 Clock Register
|
||||
* SKPEN1 PWM1 Enable Register
|
||||
* SKPWM1 PWM1 Clock Register
|
||||
*/
|
||||
#define SA1111_SKPCR 0x0200
|
||||
#define SA1111_SKCDR 0x0204
|
||||
#define SA1111_SKAUD 0x0208
|
||||
#define SA1111_SKPMC 0x020c
|
||||
#define SA1111_SKPTC 0x0210
|
||||
#define SA1111_SKPEN0 0x0214
|
||||
#define SA1111_SKPWM0 0x0218
|
||||
#define SA1111_SKPEN1 0x021c
|
||||
#define SA1111_SKPWM1 0x0220
|
||||
|
||||
#define SKPCR_UCLKEN (1<<0)
|
||||
#define SKPCR_ACCLKEN (1<<1)
|
||||
#define SKPCR_I2SCLKEN (1<<2)
|
||||
#define SKPCR_L3CLKEN (1<<3)
|
||||
#define SKPCR_SCLKEN (1<<4)
|
||||
#define SKPCR_PMCLKEN (1<<5)
|
||||
#define SKPCR_PTCLKEN (1<<6)
|
||||
#define SKPCR_DCLKEN (1<<7)
|
||||
#define SKPCR_PWMCLKEN (1<<8)
|
||||
|
||||
/*
|
||||
* USB Host controller
|
||||
*/
|
||||
#define SA1111_USB 0x0400
|
||||
|
||||
/*
|
||||
* Offsets from SA1111_USB_BASE
|
||||
*/
|
||||
#define SA1111_USB_STATUS 0x0118
|
||||
#define SA1111_USB_RESET 0x011c
|
||||
#define SA1111_USB_IRQTEST 0x0120
|
||||
|
||||
#define USB_RESET_FORCEIFRESET (1 << 0)
|
||||
#define USB_RESET_FORCEHCRESET (1 << 1)
|
||||
#define USB_RESET_CLKGENRESET (1 << 2)
|
||||
#define USB_RESET_SIMSCALEDOWN (1 << 3)
|
||||
#define USB_RESET_USBINTTEST (1 << 4)
|
||||
#define USB_RESET_SLEEPSTBYEN (1 << 5)
|
||||
#define USB_RESET_PWRSENSELOW (1 << 6)
|
||||
#define USB_RESET_PWRCTRLLOW (1 << 7)
|
||||
|
||||
#define USB_STATUS_IRQHCIRMTWKUP (1 << 7)
|
||||
#define USB_STATUS_IRQHCIBUFFACC (1 << 8)
|
||||
#define USB_STATUS_NIRQHCIM (1 << 9)
|
||||
#define USB_STATUS_NHCIMFCLR (1 << 10)
|
||||
#define USB_STATUS_USBPWRSENSE (1 << 11)
|
||||
|
||||
/*
|
||||
* Serial Audio Controller
|
||||
*
|
||||
* Registers
|
||||
* SACR0 Serial Audio Common Control Register
|
||||
* SACR1 Serial Audio Alternate Mode (I2C/MSB) Control Register
|
||||
* SACR2 Serial Audio AC-link Control Register
|
||||
* SASR0 Serial Audio I2S/MSB Interface & FIFO Status Register
|
||||
* SASR1 Serial Audio AC-link Interface & FIFO Status Register
|
||||
* SASCR Serial Audio Status Clear Register
|
||||
* L3_CAR L3 Control Bus Address Register
|
||||
* L3_CDR L3 Control Bus Data Register
|
||||
* ACCAR AC-link Command Address Register
|
||||
* ACCDR AC-link Command Data Register
|
||||
* ACSAR AC-link Status Address Register
|
||||
* ACSDR AC-link Status Data Register
|
||||
* SADTCS Serial Audio DMA Transmit Control/Status Register
|
||||
* SADTSA Serial Audio DMA Transmit Buffer Start Address A
|
||||
* SADTCA Serial Audio DMA Transmit Buffer Count Register A
|
||||
* SADTSB Serial Audio DMA Transmit Buffer Start Address B
|
||||
* SADTCB Serial Audio DMA Transmit Buffer Count Register B
|
||||
* SADRCS Serial Audio DMA Receive Control/Status Register
|
||||
* SADRSA Serial Audio DMA Receive Buffer Start Address A
|
||||
* SADRCA Serial Audio DMA Receive Buffer Count Register A
|
||||
* SADRSB Serial Audio DMA Receive Buffer Start Address B
|
||||
* SADRCB Serial Audio DMA Receive Buffer Count Register B
|
||||
* SAITR Serial Audio Interrupt Test Register
|
||||
* SADR Serial Audio Data Register (16 x 32-bit)
|
||||
*/
|
||||
|
||||
#define SA1111_SERAUDIO 0x0600
|
||||
|
||||
/*
|
||||
* These are offsets from the above base.
|
||||
*/
|
||||
#define SA1111_SACR0 0x00
|
||||
#define SA1111_SACR1 0x04
|
||||
#define SA1111_SACR2 0x08
|
||||
#define SA1111_SASR0 0x0c
|
||||
#define SA1111_SASR1 0x10
|
||||
#define SA1111_SASCR 0x18
|
||||
#define SA1111_L3_CAR 0x1c
|
||||
#define SA1111_L3_CDR 0x20
|
||||
#define SA1111_ACCAR 0x24
|
||||
#define SA1111_ACCDR 0x28
|
||||
#define SA1111_ACSAR 0x2c
|
||||
#define SA1111_ACSDR 0x30
|
||||
#define SA1111_SADTCS 0x34
|
||||
#define SA1111_SADTSA 0x38
|
||||
#define SA1111_SADTCA 0x3c
|
||||
#define SA1111_SADTSB 0x40
|
||||
#define SA1111_SADTCB 0x44
|
||||
#define SA1111_SADRCS 0x48
|
||||
#define SA1111_SADRSA 0x4c
|
||||
#define SA1111_SADRCA 0x50
|
||||
#define SA1111_SADRSB 0x54
|
||||
#define SA1111_SADRCB 0x58
|
||||
#define SA1111_SAITR 0x5c
|
||||
#define SA1111_SADR 0x80
|
||||
|
||||
#ifndef CONFIG_ARCH_PXA
|
||||
|
||||
#define SACR0_ENB (1<<0)
|
||||
#define SACR0_BCKD (1<<2)
|
||||
#define SACR0_RST (1<<3)
|
||||
|
||||
#define SACR1_AMSL (1<<0)
|
||||
#define SACR1_L3EN (1<<1)
|
||||
#define SACR1_L3MB (1<<2)
|
||||
#define SACR1_DREC (1<<3)
|
||||
#define SACR1_DRPL (1<<4)
|
||||
#define SACR1_ENLBF (1<<5)
|
||||
|
||||
#define SACR2_TS3V (1<<0)
|
||||
#define SACR2_TS4V (1<<1)
|
||||
#define SACR2_WKUP (1<<2)
|
||||
#define SACR2_DREC (1<<3)
|
||||
#define SACR2_DRPL (1<<4)
|
||||
#define SACR2_ENLBF (1<<5)
|
||||
#define SACR2_RESET (1<<6)
|
||||
|
||||
#define SASR0_TNF (1<<0)
|
||||
#define SASR0_RNE (1<<1)
|
||||
#define SASR0_BSY (1<<2)
|
||||
#define SASR0_TFS (1<<3)
|
||||
#define SASR0_RFS (1<<4)
|
||||
#define SASR0_TUR (1<<5)
|
||||
#define SASR0_ROR (1<<6)
|
||||
#define SASR0_L3WD (1<<16)
|
||||
#define SASR0_L3RD (1<<17)
|
||||
|
||||
#define SASR1_TNF (1<<0)
|
||||
#define SASR1_RNE (1<<1)
|
||||
#define SASR1_BSY (1<<2)
|
||||
#define SASR1_TFS (1<<3)
|
||||
#define SASR1_RFS (1<<4)
|
||||
#define SASR1_TUR (1<<5)
|
||||
#define SASR1_ROR (1<<6)
|
||||
#define SASR1_CADT (1<<16)
|
||||
#define SASR1_SADR (1<<17)
|
||||
#define SASR1_RSTO (1<<18)
|
||||
#define SASR1_CLPM (1<<19)
|
||||
#define SASR1_CRDY (1<<20)
|
||||
#define SASR1_RS3V (1<<21)
|
||||
#define SASR1_RS4V (1<<22)
|
||||
|
||||
#define SASCR_TUR (1<<5)
|
||||
#define SASCR_ROR (1<<6)
|
||||
#define SASCR_DTS (1<<16)
|
||||
#define SASCR_RDD (1<<17)
|
||||
#define SASCR_STO (1<<18)
|
||||
|
||||
#define SADTCS_TDEN (1<<0)
|
||||
#define SADTCS_TDIE (1<<1)
|
||||
#define SADTCS_TDBDA (1<<3)
|
||||
#define SADTCS_TDSTA (1<<4)
|
||||
#define SADTCS_TDBDB (1<<5)
|
||||
#define SADTCS_TDSTB (1<<6)
|
||||
#define SADTCS_TBIU (1<<7)
|
||||
|
||||
#define SADRCS_RDEN (1<<0)
|
||||
#define SADRCS_RDIE (1<<1)
|
||||
#define SADRCS_RDBDA (1<<3)
|
||||
#define SADRCS_RDSTA (1<<4)
|
||||
#define SADRCS_RDBDB (1<<5)
|
||||
#define SADRCS_RDSTB (1<<6)
|
||||
#define SADRCS_RBIU (1<<7)
|
||||
|
||||
#define SAD_CS_DEN (1<<0)
|
||||
#define SAD_CS_DIE (1<<1) /* Not functional on metal 1 */
|
||||
#define SAD_CS_DBDA (1<<3) /* Not functional on metal 1 */
|
||||
#define SAD_CS_DSTA (1<<4)
|
||||
#define SAD_CS_DBDB (1<<5) /* Not functional on metal 1 */
|
||||
#define SAD_CS_DSTB (1<<6)
|
||||
#define SAD_CS_BIU (1<<7) /* Not functional on metal 1 */
|
||||
|
||||
#define SAITR_TFS (1<<0)
|
||||
#define SAITR_RFS (1<<1)
|
||||
#define SAITR_TUR (1<<2)
|
||||
#define SAITR_ROR (1<<3)
|
||||
#define SAITR_CADT (1<<4)
|
||||
#define SAITR_SADR (1<<5)
|
||||
#define SAITR_RSTO (1<<6)
|
||||
#define SAITR_TDBDA (1<<8)
|
||||
#define SAITR_TDBDB (1<<9)
|
||||
#define SAITR_RDBDA (1<<10)
|
||||
#define SAITR_RDBDB (1<<11)
|
||||
|
||||
#endif /* !CONFIG_ARCH_PXA */
|
||||
|
||||
/*
|
||||
* General-Purpose I/O Interface
|
||||
*
|
||||
* Registers
|
||||
* PA_DDR GPIO Block A Data Direction
|
||||
* PA_DRR/PA_DWR GPIO Block A Data Value Register (read/write)
|
||||
* PA_SDR GPIO Block A Sleep Direction
|
||||
* PA_SSR GPIO Block A Sleep State
|
||||
* PB_DDR GPIO Block B Data Direction
|
||||
* PB_DRR/PB_DWR GPIO Block B Data Value Register (read/write)
|
||||
* PB_SDR GPIO Block B Sleep Direction
|
||||
* PB_SSR GPIO Block B Sleep State
|
||||
* PC_DDR GPIO Block C Data Direction
|
||||
* PC_DRR/PC_DWR GPIO Block C Data Value Register (read/write)
|
||||
* PC_SDR GPIO Block C Sleep Direction
|
||||
* PC_SSR GPIO Block C Sleep State
|
||||
*/
|
||||
|
||||
#define _PA_DDR _SA1111( 0x1000 )
|
||||
#define _PA_DRR _SA1111( 0x1004 )
|
||||
#define _PA_DWR _SA1111( 0x1004 )
|
||||
#define _PA_SDR _SA1111( 0x1008 )
|
||||
#define _PA_SSR _SA1111( 0x100c )
|
||||
#define _PB_DDR _SA1111( 0x1010 )
|
||||
#define _PB_DRR _SA1111( 0x1014 )
|
||||
#define _PB_DWR _SA1111( 0x1014 )
|
||||
#define _PB_SDR _SA1111( 0x1018 )
|
||||
#define _PB_SSR _SA1111( 0x101c )
|
||||
#define _PC_DDR _SA1111( 0x1020 )
|
||||
#define _PC_DRR _SA1111( 0x1024 )
|
||||
#define _PC_DWR _SA1111( 0x1024 )
|
||||
#define _PC_SDR _SA1111( 0x1028 )
|
||||
#define _PC_SSR _SA1111( 0x102c )
|
||||
|
||||
#define SA1111_GPIO 0x1000
|
||||
|
||||
#define SA1111_GPIO_PADDR (0x000)
|
||||
#define SA1111_GPIO_PADRR (0x004)
|
||||
#define SA1111_GPIO_PADWR (0x004)
|
||||
#define SA1111_GPIO_PASDR (0x008)
|
||||
#define SA1111_GPIO_PASSR (0x00c)
|
||||
#define SA1111_GPIO_PBDDR (0x010)
|
||||
#define SA1111_GPIO_PBDRR (0x014)
|
||||
#define SA1111_GPIO_PBDWR (0x014)
|
||||
#define SA1111_GPIO_PBSDR (0x018)
|
||||
#define SA1111_GPIO_PBSSR (0x01c)
|
||||
#define SA1111_GPIO_PCDDR (0x020)
|
||||
#define SA1111_GPIO_PCDRR (0x024)
|
||||
#define SA1111_GPIO_PCDWR (0x024)
|
||||
#define SA1111_GPIO_PCSDR (0x028)
|
||||
#define SA1111_GPIO_PCSSR (0x02c)
|
||||
|
||||
#define GPIO_A0 (1 << 0)
|
||||
#define GPIO_A1 (1 << 1)
|
||||
#define GPIO_A2 (1 << 2)
|
||||
#define GPIO_A3 (1 << 3)
|
||||
|
||||
#define GPIO_B0 (1 << 8)
|
||||
#define GPIO_B1 (1 << 9)
|
||||
#define GPIO_B2 (1 << 10)
|
||||
#define GPIO_B3 (1 << 11)
|
||||
#define GPIO_B4 (1 << 12)
|
||||
#define GPIO_B5 (1 << 13)
|
||||
#define GPIO_B6 (1 << 14)
|
||||
#define GPIO_B7 (1 << 15)
|
||||
|
||||
#define GPIO_C0 (1 << 16)
|
||||
#define GPIO_C1 (1 << 17)
|
||||
#define GPIO_C2 (1 << 18)
|
||||
#define GPIO_C3 (1 << 19)
|
||||
#define GPIO_C4 (1 << 20)
|
||||
#define GPIO_C5 (1 << 21)
|
||||
#define GPIO_C6 (1 << 22)
|
||||
#define GPIO_C7 (1 << 23)
|
||||
|
||||
/*
|
||||
* Interrupt Controller
|
||||
*
|
||||
* Registers
|
||||
* INTTEST0 Test register 0
|
||||
* INTTEST1 Test register 1
|
||||
* INTEN0 Interrupt Enable register 0
|
||||
* INTEN1 Interrupt Enable register 1
|
||||
* INTPOL0 Interrupt Polarity selection 0
|
||||
* INTPOL1 Interrupt Polarity selection 1
|
||||
* INTTSTSEL Interrupt source selection
|
||||
* INTSTATCLR0 Interrupt Status/Clear 0
|
||||
* INTSTATCLR1 Interrupt Status/Clear 1
|
||||
* INTSET0 Interrupt source set 0
|
||||
* INTSET1 Interrupt source set 1
|
||||
* WAKE_EN0 Wake-up source enable 0
|
||||
* WAKE_EN1 Wake-up source enable 1
|
||||
* WAKE_POL0 Wake-up polarity selection 0
|
||||
* WAKE_POL1 Wake-up polarity selection 1
|
||||
*/
|
||||
#define SA1111_INTC 0x1600
|
||||
|
||||
/*
|
||||
* These are offsets from the above base.
|
||||
*/
|
||||
#define SA1111_INTTEST0 0x0000
|
||||
#define SA1111_INTTEST1 0x0004
|
||||
#define SA1111_INTEN0 0x0008
|
||||
#define SA1111_INTEN1 0x000c
|
||||
#define SA1111_INTPOL0 0x0010
|
||||
#define SA1111_INTPOL1 0x0014
|
||||
#define SA1111_INTTSTSEL 0x0018
|
||||
#define SA1111_INTSTATCLR0 0x001c
|
||||
#define SA1111_INTSTATCLR1 0x0020
|
||||
#define SA1111_INTSET0 0x0024
|
||||
#define SA1111_INTSET1 0x0028
|
||||
#define SA1111_WAKEEN0 0x002c
|
||||
#define SA1111_WAKEEN1 0x0030
|
||||
#define SA1111_WAKEPOL0 0x0034
|
||||
#define SA1111_WAKEPOL1 0x0038
|
||||
|
||||
/*
|
||||
* PS/2 Trackpad and Mouse Interfaces
|
||||
*
|
||||
* Registers
|
||||
* PS2CR Control Register
|
||||
* PS2STAT Status Register
|
||||
* PS2DATA Transmit/Receive Data register
|
||||
* PS2CLKDIV Clock Division Register
|
||||
* PS2PRECNT Clock Precount Register
|
||||
* PS2TEST1 Test register 1
|
||||
* PS2TEST2 Test register 2
|
||||
* PS2TEST3 Test register 3
|
||||
* PS2TEST4 Test register 4
|
||||
*/
|
||||
|
||||
#define SA1111_KBD 0x0a00
|
||||
#define SA1111_MSE 0x0c00
|
||||
|
||||
/*
|
||||
* These are offsets from the above bases.
|
||||
*/
|
||||
#define SA1111_PS2CR 0x0000
|
||||
#define SA1111_PS2STAT 0x0004
|
||||
#define SA1111_PS2DATA 0x0008
|
||||
#define SA1111_PS2CLKDIV 0x000c
|
||||
#define SA1111_PS2PRECNT 0x0010
|
||||
|
||||
#define PS2CR_ENA 0x08
|
||||
#define PS2CR_FKD 0x02
|
||||
#define PS2CR_FKC 0x01
|
||||
|
||||
#define PS2STAT_STP 0x0100
|
||||
#define PS2STAT_TXE 0x0080
|
||||
#define PS2STAT_TXB 0x0040
|
||||
#define PS2STAT_RXF 0x0020
|
||||
#define PS2STAT_RXB 0x0010
|
||||
#define PS2STAT_ENA 0x0008
|
||||
#define PS2STAT_RXP 0x0004
|
||||
#define PS2STAT_KBD 0x0002
|
||||
#define PS2STAT_KBC 0x0001
|
||||
|
||||
/*
|
||||
* PCMCIA Interface
|
||||
*
|
||||
* Registers
|
||||
* PCSR Status Register
|
||||
* PCCR Control Register
|
||||
* PCSSR Sleep State Register
|
||||
*/
|
||||
|
||||
#define SA1111_PCMCIA 0x1600
|
||||
|
||||
/*
|
||||
* These are offsets from the above base.
|
||||
*/
|
||||
#define SA1111_PCCR 0x0000
|
||||
#define SA1111_PCSSR 0x0004
|
||||
#define SA1111_PCSR 0x0008
|
||||
|
||||
#define PCSR_S0_READY (1<<0)
|
||||
#define PCSR_S1_READY (1<<1)
|
||||
#define PCSR_S0_DETECT (1<<2)
|
||||
#define PCSR_S1_DETECT (1<<3)
|
||||
#define PCSR_S0_VS1 (1<<4)
|
||||
#define PCSR_S0_VS2 (1<<5)
|
||||
#define PCSR_S1_VS1 (1<<6)
|
||||
#define PCSR_S1_VS2 (1<<7)
|
||||
#define PCSR_S0_WP (1<<8)
|
||||
#define PCSR_S1_WP (1<<9)
|
||||
#define PCSR_S0_BVD1 (1<<10)
|
||||
#define PCSR_S0_BVD2 (1<<11)
|
||||
#define PCSR_S1_BVD1 (1<<12)
|
||||
#define PCSR_S1_BVD2 (1<<13)
|
||||
|
||||
#define PCCR_S0_RST (1<<0)
|
||||
#define PCCR_S1_RST (1<<1)
|
||||
#define PCCR_S0_FLT (1<<2)
|
||||
#define PCCR_S1_FLT (1<<3)
|
||||
#define PCCR_S0_PWAITEN (1<<4)
|
||||
#define PCCR_S1_PWAITEN (1<<5)
|
||||
#define PCCR_S0_PSE (1<<6)
|
||||
#define PCCR_S1_PSE (1<<7)
|
||||
|
||||
#define PCSSR_S0_SLEEP (1<<0)
|
||||
#define PCSSR_S1_SLEEP (1<<1)
|
||||
|
||||
|
||||
|
||||
|
||||
extern struct bus_type sa1111_bus_type;
|
||||
|
||||
#define SA1111_DEVID_SBI 0
|
||||
#define SA1111_DEVID_SK 1
|
||||
#define SA1111_DEVID_USB 2
|
||||
#define SA1111_DEVID_SAC 3
|
||||
#define SA1111_DEVID_SSP 4
|
||||
#define SA1111_DEVID_PS2 5
|
||||
#define SA1111_DEVID_GPIO 6
|
||||
#define SA1111_DEVID_INT 7
|
||||
#define SA1111_DEVID_PCMCIA 8
|
||||
|
||||
struct sa1111_dev {
|
||||
struct device dev;
|
||||
unsigned int devid;
|
||||
struct resource res;
|
||||
void __iomem *mapbase;
|
||||
unsigned int skpcr_mask;
|
||||
unsigned int irq[6];
|
||||
u64 dma_mask;
|
||||
};
|
||||
|
||||
#define SA1111_DEV(_d) container_of((_d), struct sa1111_dev, dev)
|
||||
|
||||
#define sa1111_get_drvdata(d) dev_get_drvdata(&(d)->dev)
|
||||
#define sa1111_set_drvdata(d,p) dev_set_drvdata(&(d)->dev, p)
|
||||
|
||||
struct sa1111_driver {
|
||||
struct device_driver drv;
|
||||
unsigned int devid;
|
||||
int (*probe)(struct sa1111_dev *);
|
||||
int (*remove)(struct sa1111_dev *);
|
||||
int (*suspend)(struct sa1111_dev *, pm_message_t);
|
||||
int (*resume)(struct sa1111_dev *);
|
||||
};
|
||||
|
||||
#define SA1111_DRV(_d) container_of((_d), struct sa1111_driver, drv)
|
||||
|
||||
#define SA1111_DRIVER_NAME(_sadev) ((_sadev)->dev.driver->name)
|
||||
|
||||
/*
|
||||
* These frob the SKPCR register.
|
||||
*/
|
||||
void sa1111_enable_device(struct sa1111_dev *);
|
||||
void sa1111_disable_device(struct sa1111_dev *);
|
||||
|
||||
unsigned int sa1111_pll_clock(struct sa1111_dev *);
|
||||
|
||||
#define SA1111_AUDIO_ACLINK 0
|
||||
#define SA1111_AUDIO_I2S 1
|
||||
|
||||
void sa1111_select_audio_mode(struct sa1111_dev *sadev, int mode);
|
||||
int sa1111_set_audio_rate(struct sa1111_dev *sadev, int rate);
|
||||
int sa1111_get_audio_rate(struct sa1111_dev *sadev);
|
||||
|
||||
int sa1111_check_dma_bug(dma_addr_t addr);
|
||||
|
||||
int sa1111_driver_register(struct sa1111_driver *);
|
||||
void sa1111_driver_unregister(struct sa1111_driver *);
|
||||
|
||||
void sa1111_set_io_dir(struct sa1111_dev *sadev, unsigned int bits, unsigned int dir, unsigned int sleep_dir);
|
||||
void sa1111_set_io(struct sa1111_dev *sadev, unsigned int bits, unsigned int v);
|
||||
void sa1111_set_sleep_io(struct sa1111_dev *sadev, unsigned int bits, unsigned int v);
|
||||
|
||||
#endif /* _ASM_ARCH_SA1111 */
|
69
arch/arm/include/asm/hardware/scoop.h
Звичайний файл
69
arch/arm/include/asm/hardware/scoop.h
Звичайний файл
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Definitions for the SCOOP interface found on various Sharp PDAs
|
||||
*
|
||||
* Copyright (c) 2004 Richard Purdie
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#define SCOOP_MCR 0x00
|
||||
#define SCOOP_CDR 0x04
|
||||
#define SCOOP_CSR 0x08
|
||||
#define SCOOP_CPR 0x0C
|
||||
#define SCOOP_CCR 0x10
|
||||
#define SCOOP_IRR 0x14
|
||||
#define SCOOP_IRM 0x14
|
||||
#define SCOOP_IMR 0x18
|
||||
#define SCOOP_ISR 0x1C
|
||||
#define SCOOP_GPCR 0x20
|
||||
#define SCOOP_GPWR 0x24
|
||||
#define SCOOP_GPRR 0x28
|
||||
|
||||
#define SCOOP_GPCR_PA22 ( 1 << 12 )
|
||||
#define SCOOP_GPCR_PA21 ( 1 << 11 )
|
||||
#define SCOOP_GPCR_PA20 ( 1 << 10 )
|
||||
#define SCOOP_GPCR_PA19 ( 1 << 9 )
|
||||
#define SCOOP_GPCR_PA18 ( 1 << 8 )
|
||||
#define SCOOP_GPCR_PA17 ( 1 << 7 )
|
||||
#define SCOOP_GPCR_PA16 ( 1 << 6 )
|
||||
#define SCOOP_GPCR_PA15 ( 1 << 5 )
|
||||
#define SCOOP_GPCR_PA14 ( 1 << 4 )
|
||||
#define SCOOP_GPCR_PA13 ( 1 << 3 )
|
||||
#define SCOOP_GPCR_PA12 ( 1 << 2 )
|
||||
#define SCOOP_GPCR_PA11 ( 1 << 1 )
|
||||
|
||||
struct scoop_config {
|
||||
unsigned short io_out;
|
||||
unsigned short io_dir;
|
||||
unsigned short suspend_clr;
|
||||
unsigned short suspend_set;
|
||||
int gpio_base;
|
||||
};
|
||||
|
||||
/* Structure for linking scoop devices to PCMCIA sockets */
|
||||
struct scoop_pcmcia_dev {
|
||||
struct device *dev; /* Pointer to this socket's scoop device */
|
||||
int irq; /* irq for socket */
|
||||
int cd_irq;
|
||||
const char *cd_irq_str;
|
||||
unsigned char keep_vs;
|
||||
unsigned char keep_rd;
|
||||
};
|
||||
|
||||
struct scoop_pcmcia_config {
|
||||
struct scoop_pcmcia_dev *devs;
|
||||
int num_devs;
|
||||
void (*pcmcia_init)(void);
|
||||
void (*power_ctrl)(struct device *scoop, unsigned short cpr, int nr);
|
||||
};
|
||||
|
||||
extern struct scoop_pcmcia_config *platform_scoop_config;
|
||||
|
||||
void reset_scoop(struct device *dev);
|
||||
unsigned short __deprecated set_scoop_gpio(struct device *dev, unsigned short bit);
|
||||
unsigned short __deprecated reset_scoop_gpio(struct device *dev, unsigned short bit);
|
||||
unsigned short read_scoop_reg(struct device *dev, unsigned short reg);
|
||||
void write_scoop_reg(struct device *dev, unsigned short reg, unsigned short data);
|
106
arch/arm/include/asm/hardware/sharpsl_pm.h
Звичайний файл
106
arch/arm/include/asm/hardware/sharpsl_pm.h
Звичайний файл
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* SharpSL Battery/PM Driver
|
||||
*
|
||||
* Copyright (c) 2004-2005 Richard Purdie
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
struct sharpsl_charger_machinfo {
|
||||
void (*init)(void);
|
||||
void (*exit)(void);
|
||||
int gpio_acin;
|
||||
int gpio_batfull;
|
||||
int batfull_irq;
|
||||
int gpio_batlock;
|
||||
int gpio_fatal;
|
||||
void (*discharge)(int);
|
||||
void (*discharge1)(int);
|
||||
void (*charge)(int);
|
||||
void (*measure_temp)(int);
|
||||
void (*presuspend)(void);
|
||||
void (*postsuspend)(void);
|
||||
void (*earlyresume)(void);
|
||||
unsigned long (*read_devdata)(int);
|
||||
#define SHARPSL_BATT_VOLT 1
|
||||
#define SHARPSL_BATT_TEMP 2
|
||||
#define SHARPSL_ACIN_VOLT 3
|
||||
#define SHARPSL_STATUS_ACIN 4
|
||||
#define SHARPSL_STATUS_LOCK 5
|
||||
#define SHARPSL_STATUS_CHRGFULL 6
|
||||
#define SHARPSL_STATUS_FATAL 7
|
||||
unsigned long (*charger_wakeup)(void);
|
||||
int (*should_wakeup)(unsigned int resume_on_alarm);
|
||||
void (*backlight_limit)(int);
|
||||
int (*backlight_get_status) (void);
|
||||
int charge_on_volt;
|
||||
int charge_on_temp;
|
||||
int charge_acin_high;
|
||||
int charge_acin_low;
|
||||
int fatal_acin_volt;
|
||||
int fatal_noacin_volt;
|
||||
int bat_levels;
|
||||
struct battery_thresh *bat_levels_noac;
|
||||
struct battery_thresh *bat_levels_acin;
|
||||
struct battery_thresh *bat_levels_noac_bl;
|
||||
struct battery_thresh *bat_levels_acin_bl;
|
||||
int status_high_acin;
|
||||
int status_low_acin;
|
||||
int status_high_noac;
|
||||
int status_low_noac;
|
||||
};
|
||||
|
||||
struct battery_thresh {
|
||||
int voltage;
|
||||
int percentage;
|
||||
};
|
||||
|
||||
struct battery_stat {
|
||||
int ac_status; /* APM AC Present/Not Present */
|
||||
int mainbat_status; /* APM Main Battery Status */
|
||||
int mainbat_percent; /* Main Battery Percentage Charge */
|
||||
int mainbat_voltage; /* Main Battery Voltage */
|
||||
};
|
||||
|
||||
struct sharpsl_pm_status {
|
||||
struct device *dev;
|
||||
struct timer_list ac_timer;
|
||||
struct timer_list chrg_full_timer;
|
||||
|
||||
int charge_mode;
|
||||
#define CHRG_ERROR (-1)
|
||||
#define CHRG_OFF (0)
|
||||
#define CHRG_ON (1)
|
||||
#define CHRG_DONE (2)
|
||||
|
||||
unsigned int flags;
|
||||
#define SHARPSL_SUSPENDED (1 << 0) /* Device is Suspended */
|
||||
#define SHARPSL_ALARM_ACTIVE (1 << 1) /* Alarm is for charging event (not user) */
|
||||
#define SHARPSL_BL_LIMIT (1 << 2) /* Backlight Intensity Limited */
|
||||
#define SHARPSL_APM_QUEUED (1 << 3) /* APM Event Queued */
|
||||
#define SHARPSL_DO_OFFLINE_CHRG (1 << 4) /* Trigger the offline charger */
|
||||
|
||||
int full_count;
|
||||
unsigned long charge_start_time;
|
||||
struct sharpsl_charger_machinfo *machinfo;
|
||||
struct battery_stat battstat;
|
||||
};
|
||||
|
||||
extern struct sharpsl_pm_status sharpsl_pm;
|
||||
|
||||
|
||||
#define SHARPSL_LED_ERROR 2
|
||||
#define SHARPSL_LED_ON 1
|
||||
#define SHARPSL_LED_OFF 0
|
||||
|
||||
void sharpsl_battery_kick(void);
|
||||
void sharpsl_pm_led(int val);
|
||||
irqreturn_t sharpsl_ac_isr(int irq, void *dev_id);
|
||||
irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id);
|
||||
irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id);
|
||||
|
28
arch/arm/include/asm/hardware/ssp.h
Звичайний файл
28
arch/arm/include/asm/hardware/ssp.h
Звичайний файл
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* ssp.h
|
||||
*
|
||||
* Copyright (C) 2003 Russell King, All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef SSP_H
|
||||
#define SSP_H
|
||||
|
||||
struct ssp_state {
|
||||
unsigned int cr0;
|
||||
unsigned int cr1;
|
||||
};
|
||||
|
||||
int ssp_write_word(u16 data);
|
||||
int ssp_read_word(u16 *data);
|
||||
int ssp_flush(void);
|
||||
void ssp_enable(void);
|
||||
void ssp_disable(void);
|
||||
void ssp_save_state(struct ssp_state *ssp);
|
||||
void ssp_restore_state(struct ssp_state *ssp);
|
||||
int ssp_init(void);
|
||||
void ssp_exit(void);
|
||||
|
||||
#endif
|
62
arch/arm/include/asm/hardware/uengine.h
Звичайний файл
62
arch/arm/include/asm/hardware/uengine.h
Звичайний файл
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Generic library functions for the microengines found on the Intel
|
||||
* IXP2000 series of network processors.
|
||||
*
|
||||
* Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
* Dedicated to Marija Kulikova.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of the
|
||||
* License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __IXP2000_UENGINE_H
|
||||
#define __IXP2000_UENGINE_H
|
||||
|
||||
extern u32 ixp2000_uengine_mask;
|
||||
|
||||
struct ixp2000_uengine_code
|
||||
{
|
||||
u32 cpu_model_bitmask;
|
||||
u8 cpu_min_revision;
|
||||
u8 cpu_max_revision;
|
||||
|
||||
u32 uengine_parameters;
|
||||
|
||||
struct ixp2000_reg_value {
|
||||
int reg;
|
||||
u32 value;
|
||||
} *initial_reg_values;
|
||||
|
||||
int num_insns;
|
||||
u8 *insns;
|
||||
};
|
||||
|
||||
u32 ixp2000_uengine_csr_read(int uengine, int offset);
|
||||
void ixp2000_uengine_csr_write(int uengine, int offset, u32 value);
|
||||
void ixp2000_uengine_reset(u32 uengine_mask);
|
||||
void ixp2000_uengine_set_mode(int uengine, u32 mode);
|
||||
void ixp2000_uengine_load_microcode(int uengine, u8 *ucode, int insns);
|
||||
void ixp2000_uengine_init_context(int uengine, int context, int pc);
|
||||
void ixp2000_uengine_start_contexts(int uengine, u8 ctx_mask);
|
||||
void ixp2000_uengine_stop_contexts(int uengine, u8 ctx_mask);
|
||||
int ixp2000_uengine_load(int uengine, struct ixp2000_uengine_code *c);
|
||||
|
||||
#define IXP2000_UENGINE_8_CONTEXTS 0x00000000
|
||||
#define IXP2000_UENGINE_4_CONTEXTS 0x80000000
|
||||
#define IXP2000_UENGINE_PRN_UPDATE_EVERY 0x40000000
|
||||
#define IXP2000_UENGINE_PRN_UPDATE_ON_ACCESS 0x00000000
|
||||
#define IXP2000_UENGINE_NN_FROM_SELF 0x00100000
|
||||
#define IXP2000_UENGINE_NN_FROM_PREVIOUS 0x00000000
|
||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_3 0x000c0000
|
||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_2 0x00080000
|
||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_1 0x00040000
|
||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_0 0x00000000
|
||||
#define IXP2000_UENGINE_LM_ADDR1_GLOBAL 0x00020000
|
||||
#define IXP2000_UENGINE_LM_ADDR1_PER_CONTEXT 0x00000000
|
||||
#define IXP2000_UENGINE_LM_ADDR0_GLOBAL 0x00010000
|
||||
#define IXP2000_UENGINE_LM_ADDR0_PER_CONTEXT 0x00000000
|
||||
|
||||
|
||||
#endif
|
45
arch/arm/include/asm/hardware/vic.h
Звичайний файл
45
arch/arm/include/asm/hardware/vic.h
Звичайний файл
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* arch/arm/include/asm/hardware/vic.h
|
||||
*
|
||||
* Copyright (c) ARM Limited 2003. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef __ASM_ARM_HARDWARE_VIC_H
|
||||
#define __ASM_ARM_HARDWARE_VIC_H
|
||||
|
||||
#define VIC_IRQ_STATUS 0x00
|
||||
#define VIC_FIQ_STATUS 0x04
|
||||
#define VIC_RAW_STATUS 0x08
|
||||
#define VIC_INT_SELECT 0x0c /* 1 = FIQ, 0 = IRQ */
|
||||
#define VIC_INT_ENABLE 0x10 /* 1 = enable, 0 = disable */
|
||||
#define VIC_INT_ENABLE_CLEAR 0x14
|
||||
#define VIC_INT_SOFT 0x18
|
||||
#define VIC_INT_SOFT_CLEAR 0x1c
|
||||
#define VIC_PROTECT 0x20
|
||||
#define VIC_VECT_ADDR 0x30
|
||||
#define VIC_DEF_VECT_ADDR 0x34
|
||||
|
||||
#define VIC_VECT_ADDR0 0x100 /* 0 to 15 */
|
||||
#define VIC_VECT_CNTL0 0x200 /* 0 to 15 */
|
||||
#define VIC_ITCR 0x300 /* VIC test control register */
|
||||
|
||||
#define VIC_VECT_CNTL_ENABLE (1 << 5)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources);
|
||||
#endif
|
||||
|
||||
#endif
|
9
arch/arm/include/asm/hw_irq.h
Звичайний файл
9
arch/arm/include/asm/hw_irq.h
Звичайний файл
@@ -0,0 +1,9 @@
|
||||
/*
|
||||
* Nothing to see here yet
|
||||
*/
|
||||
#ifndef _ARCH_ARM_HW_IRQ_H
|
||||
#define _ARCH_ARM_HW_IRQ_H
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#endif
|
29
arch/arm/include/asm/hwcap.h
Звичайний файл
29
arch/arm/include/asm/hwcap.h
Звичайний файл
@@ -0,0 +1,29 @@
|
||||
#ifndef __ASMARM_HWCAP_H
|
||||
#define __ASMARM_HWCAP_H
|
||||
|
||||
/*
|
||||
* HWCAP flags - for elf_hwcap (in kernel) and AT_HWCAP
|
||||
*/
|
||||
#define HWCAP_SWP 1
|
||||
#define HWCAP_HALF 2
|
||||
#define HWCAP_THUMB 4
|
||||
#define HWCAP_26BIT 8 /* Play it safe */
|
||||
#define HWCAP_FAST_MULT 16
|
||||
#define HWCAP_FPA 32
|
||||
#define HWCAP_VFP 64
|
||||
#define HWCAP_EDSP 128
|
||||
#define HWCAP_JAVA 256
|
||||
#define HWCAP_IWMMXT 512
|
||||
#define HWCAP_CRUNCH 1024
|
||||
#define HWCAP_THUMBEE 2048
|
||||
|
||||
#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
|
||||
/*
|
||||
* This yields a mask that user programs can use to figure out what
|
||||
* instruction set this cpu supports.
|
||||
*/
|
||||
#define ELF_HWCAP (elf_hwcap)
|
||||
extern unsigned int elf_hwcap;
|
||||
#endif
|
||||
|
||||
#endif
|
23
arch/arm/include/asm/ide.h
Звичайний файл
23
arch/arm/include/asm/ide.h
Звичайний файл
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* arch/arm/include/asm/ide.h
|
||||
*
|
||||
* Copyright (C) 1994-1996 Linus Torvalds & authors
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the ARM architecture specific IDE code.
|
||||
*/
|
||||
|
||||
#ifndef __ASMARM_IDE_H
|
||||
#define __ASMARM_IDE_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define __ide_mm_insw(port,addr,len) readsw(port,addr,len)
|
||||
#define __ide_mm_insl(port,addr,len) readsl(port,addr,len)
|
||||
#define __ide_mm_outsw(port,addr,len) writesw(port,addr,len)
|
||||
#define __ide_mm_outsl(port,addr,len) writesl(port,addr,len)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASMARM_IDE_H */
|
287
arch/arm/include/asm/io.h
Звичайний файл
287
arch/arm/include/asm/io.h
Звичайний файл
@@ -0,0 +1,287 @@
|
||||
/*
|
||||
* arch/arm/include/asm/io.h
|
||||
*
|
||||
* Copyright (C) 1996-2000 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.
|
||||
*
|
||||
* Modifications:
|
||||
* 16-Sep-1996 RMK Inlined the inx/outx functions & optimised for both
|
||||
* constant addresses and variable addresses.
|
||||
* 04-Dec-1997 RMK Moved a lot of this stuff to the new architecture
|
||||
* specific IO header files.
|
||||
* 27-Mar-1999 PJB Second parameter of memcpy_toio is const..
|
||||
* 04-Apr-1999 PJB Added check_signature.
|
||||
* 12-Dec-1999 RMK More cleanups
|
||||
* 18-Jun-2000 RMK Removed virt_to_* and friends definitions
|
||||
* 05-Oct-2004 BJD Moved memory string functions to use void __iomem
|
||||
*/
|
||||
#ifndef __ASM_ARM_IO_H
|
||||
#define __ASM_ARM_IO_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/memory.h>
|
||||
|
||||
/*
|
||||
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
||||
*/
|
||||
#define isa_virt_to_bus virt_to_phys
|
||||
#define isa_page_to_bus page_to_phys
|
||||
#define isa_bus_to_virt phys_to_virt
|
||||
|
||||
/*
|
||||
* Generic IO read/write. These perform native-endian accesses. Note
|
||||
* that some architectures will want to re-define __raw_{read,write}w.
|
||||
*/
|
||||
extern void __raw_writesb(void __iomem *addr, const void *data, int bytelen);
|
||||
extern void __raw_writesw(void __iomem *addr, const void *data, int wordlen);
|
||||
extern void __raw_writesl(void __iomem *addr, const void *data, int longlen);
|
||||
|
||||
extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen);
|
||||
extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
|
||||
extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
|
||||
|
||||
#define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a) = (v))
|
||||
#define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v))
|
||||
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))
|
||||
|
||||
#define __raw_readb(a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a))
|
||||
#define __raw_readw(a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a))
|
||||
#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a))
|
||||
|
||||
/*
|
||||
* Architecture ioremap implementation.
|
||||
*/
|
||||
#define MT_DEVICE 0
|
||||
#define MT_DEVICE_NONSHARED 1
|
||||
#define MT_DEVICE_CACHED 2
|
||||
#define MT_DEVICE_IXP2000 3
|
||||
/*
|
||||
* types 4 onwards can be found in asm/mach/map.h and are undefined
|
||||
* for ioremap
|
||||
*/
|
||||
|
||||
/*
|
||||
* __arm_ioremap takes CPU physical address.
|
||||
* __arm_ioremap_pfn takes a Page Frame Number and an offset into that page
|
||||
*/
|
||||
extern void __iomem * __arm_ioremap_pfn(unsigned long, unsigned long, size_t, unsigned int);
|
||||
extern void __iomem * __arm_ioremap(unsigned long, size_t, unsigned int);
|
||||
extern void __iounmap(volatile void __iomem *addr);
|
||||
|
||||
/*
|
||||
* Bad read/write accesses...
|
||||
*/
|
||||
extern void __readwrite_bug(const char *fn);
|
||||
|
||||
/*
|
||||
* Now, pick up the machine-defined IO definitions
|
||||
*/
|
||||
#include <asm/arch/io.h>
|
||||
|
||||
/*
|
||||
* IO port access primitives
|
||||
* -------------------------
|
||||
*
|
||||
* The ARM doesn't have special IO access instructions; all IO is memory
|
||||
* mapped. Note that these are defined to perform little endian accesses
|
||||
* only. Their primary purpose is to access PCI and ISA peripherals.
|
||||
*
|
||||
* Note that for a big endian machine, this implies that the following
|
||||
* big endian mode connectivity is in place, as described by numerous
|
||||
* ARM documents:
|
||||
*
|
||||
* PCI: D0-D7 D8-D15 D16-D23 D24-D31
|
||||
* ARM: D24-D31 D16-D23 D8-D15 D0-D7
|
||||
*
|
||||
* The machine specific io.h include defines __io to translate an "IO"
|
||||
* address to a memory address.
|
||||
*
|
||||
* Note that we prevent GCC re-ordering or caching values in expressions
|
||||
* by introducing sequence points into the in*() definitions. Note that
|
||||
* __raw_* do not guarantee this behaviour.
|
||||
*
|
||||
* The {in,out}[bwl] macros are for emulating x86-style PCI/ISA IO space.
|
||||
*/
|
||||
#ifdef __io
|
||||
#define outb(v,p) __raw_writeb(v,__io(p))
|
||||
#define outw(v,p) __raw_writew((__force __u16) \
|
||||
cpu_to_le16(v),__io(p))
|
||||
#define outl(v,p) __raw_writel((__force __u32) \
|
||||
cpu_to_le32(v),__io(p))
|
||||
|
||||
#define inb(p) ({ __u8 __v = __raw_readb(__io(p)); __v; })
|
||||
#define inw(p) ({ __u16 __v = le16_to_cpu((__force __le16) \
|
||||
__raw_readw(__io(p))); __v; })
|
||||
#define inl(p) ({ __u32 __v = le32_to_cpu((__force __le32) \
|
||||
__raw_readl(__io(p))); __v; })
|
||||
|
||||
#define outsb(p,d,l) __raw_writesb(__io(p),d,l)
|
||||
#define outsw(p,d,l) __raw_writesw(__io(p),d,l)
|
||||
#define outsl(p,d,l) __raw_writesl(__io(p),d,l)
|
||||
|
||||
#define insb(p,d,l) __raw_readsb(__io(p),d,l)
|
||||
#define insw(p,d,l) __raw_readsw(__io(p),d,l)
|
||||
#define insl(p,d,l) __raw_readsl(__io(p),d,l)
|
||||
#endif
|
||||
|
||||
#define outb_p(val,port) outb((val),(port))
|
||||
#define outw_p(val,port) outw((val),(port))
|
||||
#define outl_p(val,port) outl((val),(port))
|
||||
#define inb_p(port) inb((port))
|
||||
#define inw_p(port) inw((port))
|
||||
#define inl_p(port) inl((port))
|
||||
|
||||
#define outsb_p(port,from,len) outsb(port,from,len)
|
||||
#define outsw_p(port,from,len) outsw(port,from,len)
|
||||
#define outsl_p(port,from,len) outsl(port,from,len)
|
||||
#define insb_p(port,to,len) insb(port,to,len)
|
||||
#define insw_p(port,to,len) insw(port,to,len)
|
||||
#define insl_p(port,to,len) insl(port,to,len)
|
||||
|
||||
/*
|
||||
* String version of IO memory access ops:
|
||||
*/
|
||||
extern void _memcpy_fromio(void *, const volatile void __iomem *, size_t);
|
||||
extern void _memcpy_toio(volatile void __iomem *, const void *, size_t);
|
||||
extern void _memset_io(volatile void __iomem *, int, size_t);
|
||||
|
||||
#define mmiowb()
|
||||
|
||||
/*
|
||||
* Memory access primitives
|
||||
* ------------------------
|
||||
*
|
||||
* These perform PCI memory accesses via an ioremap region. They don't
|
||||
* take an address as such, but a cookie.
|
||||
*
|
||||
* Again, this are defined to perform little endian accesses. See the
|
||||
* IO port primitives for more information.
|
||||
*/
|
||||
#ifdef __mem_pci
|
||||
#define readb(c) ({ __u8 __v = __raw_readb(__mem_pci(c)); __v; })
|
||||
#define readw(c) ({ __u16 __v = le16_to_cpu((__force __le16) \
|
||||
__raw_readw(__mem_pci(c))); __v; })
|
||||
#define readl(c) ({ __u32 __v = le32_to_cpu((__force __le32) \
|
||||
__raw_readl(__mem_pci(c))); __v; })
|
||||
#define readb_relaxed(addr) readb(addr)
|
||||
#define readw_relaxed(addr) readw(addr)
|
||||
#define readl_relaxed(addr) readl(addr)
|
||||
|
||||
#define readsb(p,d,l) __raw_readsb(__mem_pci(p),d,l)
|
||||
#define readsw(p,d,l) __raw_readsw(__mem_pci(p),d,l)
|
||||
#define readsl(p,d,l) __raw_readsl(__mem_pci(p),d,l)
|
||||
|
||||
#define writeb(v,c) __raw_writeb(v,__mem_pci(c))
|
||||
#define writew(v,c) __raw_writew((__force __u16) \
|
||||
cpu_to_le16(v),__mem_pci(c))
|
||||
#define writel(v,c) __raw_writel((__force __u32) \
|
||||
cpu_to_le32(v),__mem_pci(c))
|
||||
|
||||
#define writesb(p,d,l) __raw_writesb(__mem_pci(p),d,l)
|
||||
#define writesw(p,d,l) __raw_writesw(__mem_pci(p),d,l)
|
||||
#define writesl(p,d,l) __raw_writesl(__mem_pci(p),d,l)
|
||||
|
||||
#define memset_io(c,v,l) _memset_io(__mem_pci(c),(v),(l))
|
||||
#define memcpy_fromio(a,c,l) _memcpy_fromio((a),__mem_pci(c),(l))
|
||||
#define memcpy_toio(c,a,l) _memcpy_toio(__mem_pci(c),(a),(l))
|
||||
|
||||
#elif !defined(readb)
|
||||
|
||||
#define readb(c) (__readwrite_bug("readb"),0)
|
||||
#define readw(c) (__readwrite_bug("readw"),0)
|
||||
#define readl(c) (__readwrite_bug("readl"),0)
|
||||
#define writeb(v,c) __readwrite_bug("writeb")
|
||||
#define writew(v,c) __readwrite_bug("writew")
|
||||
#define writel(v,c) __readwrite_bug("writel")
|
||||
|
||||
#define check_signature(io,sig,len) (0)
|
||||
|
||||
#endif /* __mem_pci */
|
||||
|
||||
/*
|
||||
* ioremap and friends.
|
||||
*
|
||||
* ioremap takes a PCI memory address, as specified in
|
||||
* Documentation/IO-mapping.txt.
|
||||
*
|
||||
*/
|
||||
#ifndef __arch_ioremap
|
||||
#define ioremap(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE)
|
||||
#define ioremap_nocache(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE)
|
||||
#define ioremap_cached(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE_CACHED)
|
||||
#define iounmap(cookie) __iounmap(cookie)
|
||||
#else
|
||||
#define ioremap(cookie,size) __arch_ioremap((cookie), (size), MT_DEVICE)
|
||||
#define ioremap_nocache(cookie,size) __arch_ioremap((cookie), (size), MT_DEVICE)
|
||||
#define ioremap_cached(cookie,size) __arch_ioremap((cookie), (size), MT_DEVICE_CACHED)
|
||||
#define iounmap(cookie) __arch_iounmap(cookie)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* io{read,write}{8,16,32} macros
|
||||
*/
|
||||
#ifndef ioread8
|
||||
#define ioread8(p) ({ unsigned int __v = __raw_readb(p); __v; })
|
||||
#define ioread16(p) ({ unsigned int __v = le16_to_cpu((__force __le16)__raw_readw(p)); __v; })
|
||||
#define ioread32(p) ({ unsigned int __v = le32_to_cpu((__force __le32)__raw_readl(p)); __v; })
|
||||
|
||||
#define iowrite8(v,p) __raw_writeb(v, p)
|
||||
#define iowrite16(v,p) __raw_writew((__force __u16)cpu_to_le16(v), p)
|
||||
#define iowrite32(v,p) __raw_writel((__force __u32)cpu_to_le32(v), p)
|
||||
|
||||
#define ioread8_rep(p,d,c) __raw_readsb(p,d,c)
|
||||
#define ioread16_rep(p,d,c) __raw_readsw(p,d,c)
|
||||
#define ioread32_rep(p,d,c) __raw_readsl(p,d,c)
|
||||
|
||||
#define iowrite8_rep(p,s,c) __raw_writesb(p,s,c)
|
||||
#define iowrite16_rep(p,s,c) __raw_writesw(p,s,c)
|
||||
#define iowrite32_rep(p,s,c) __raw_writesl(p,s,c)
|
||||
|
||||
extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
|
||||
extern void ioport_unmap(void __iomem *addr);
|
||||
#endif
|
||||
|
||||
struct pci_dev;
|
||||
|
||||
extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen);
|
||||
extern void pci_iounmap(struct pci_dev *dev, void __iomem *addr);
|
||||
|
||||
/*
|
||||
* can the hardware map this into one segment or not, given no other
|
||||
* constraints.
|
||||
*/
|
||||
#define BIOVEC_MERGEABLE(vec1, vec2) \
|
||||
((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2)))
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
||||
extern int valid_phys_addr_range(unsigned long addr, size_t size);
|
||||
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Convert a physical pointer to a virtual kernel pointer for /dev/mem
|
||||
* access
|
||||
*/
|
||||
#define xlate_dev_mem_ptr(p) __va(p)
|
||||
|
||||
/*
|
||||
* Convert a virtual cached pointer to an uncached pointer
|
||||
*/
|
||||
#define xlate_dev_kmem_ptr(p) p
|
||||
|
||||
/*
|
||||
* Register ISA memory and port locations for glibc iopl/inb/outb
|
||||
* emulation.
|
||||
*/
|
||||
extern void register_isa_ports(unsigned int mmio, unsigned int io,
|
||||
unsigned int io_shift);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __ASM_ARM_IO_H */
|
1
arch/arm/include/asm/ioctl.h
Звичайний файл
1
arch/arm/include/asm/ioctl.h
Звичайний файл
@@ -0,0 +1 @@
|
||||
#include <asm-generic/ioctl.h>
|
84
arch/arm/include/asm/ioctls.h
Звичайний файл
84
arch/arm/include/asm/ioctls.h
Звичайний файл
@@ -0,0 +1,84 @@
|
||||
#ifndef __ASM_ARM_IOCTLS_H
|
||||
#define __ASM_ARM_IOCTLS_H
|
||||
|
||||
#include <asm/ioctl.h>
|
||||
|
||||
/* 0x54 is just a magic number to make these relatively unique ('T') */
|
||||
|
||||
#define TCGETS 0x5401
|
||||
#define TCSETS 0x5402
|
||||
#define TCSETSW 0x5403
|
||||
#define TCSETSF 0x5404
|
||||
#define TCGETA 0x5405
|
||||
#define TCSETA 0x5406
|
||||
#define TCSETAW 0x5407
|
||||
#define TCSETAF 0x5408
|
||||
#define TCSBRK 0x5409
|
||||
#define TCXONC 0x540A
|
||||
#define TCFLSH 0x540B
|
||||
#define TIOCEXCL 0x540C
|
||||
#define TIOCNXCL 0x540D
|
||||
#define TIOCSCTTY 0x540E
|
||||
#define TIOCGPGRP 0x540F
|
||||
#define TIOCSPGRP 0x5410
|
||||
#define TIOCOUTQ 0x5411
|
||||
#define TIOCSTI 0x5412
|
||||
#define TIOCGWINSZ 0x5413
|
||||
#define TIOCSWINSZ 0x5414
|
||||
#define TIOCMGET 0x5415
|
||||
#define TIOCMBIS 0x5416
|
||||
#define TIOCMBIC 0x5417
|
||||
#define TIOCMSET 0x5418
|
||||
#define TIOCGSOFTCAR 0x5419
|
||||
#define TIOCSSOFTCAR 0x541A
|
||||
#define FIONREAD 0x541B
|
||||
#define TIOCINQ FIONREAD
|
||||
#define TIOCLINUX 0x541C
|
||||
#define TIOCCONS 0x541D
|
||||
#define TIOCGSERIAL 0x541E
|
||||
#define TIOCSSERIAL 0x541F
|
||||
#define TIOCPKT 0x5420
|
||||
#define FIONBIO 0x5421
|
||||
#define TIOCNOTTY 0x5422
|
||||
#define TIOCSETD 0x5423
|
||||
#define TIOCGETD 0x5424
|
||||
#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
|
||||
#define TIOCSBRK 0x5427 /* BSD compatibility */
|
||||
#define TIOCCBRK 0x5428 /* BSD compatibility */
|
||||
#define TIOCGSID 0x5429 /* Return the session ID of FD */
|
||||
#define TCGETS2 _IOR('T',0x2A, struct termios2)
|
||||
#define TCSETS2 _IOW('T',0x2B, struct termios2)
|
||||
#define TCSETSW2 _IOW('T',0x2C, struct termios2)
|
||||
#define TCSETSF2 _IOW('T',0x2D, struct termios2)
|
||||
#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
|
||||
#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
|
||||
|
||||
#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
|
||||
#define FIOCLEX 0x5451
|
||||
#define FIOASYNC 0x5452
|
||||
#define TIOCSERCONFIG 0x5453
|
||||
#define TIOCSERGWILD 0x5454
|
||||
#define TIOCSERSWILD 0x5455
|
||||
#define TIOCGLCKTRMIOS 0x5456
|
||||
#define TIOCSLCKTRMIOS 0x5457
|
||||
#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
|
||||
#define TIOCSERGETLSR 0x5459 /* Get line status register */
|
||||
#define TIOCSERGETMULTI 0x545A /* Get multiport config */
|
||||
#define TIOCSERSETMULTI 0x545B /* Set multiport config */
|
||||
|
||||
#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
|
||||
#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
|
||||
#define FIOQSIZE 0x545E
|
||||
|
||||
/* Used for packet mode */
|
||||
#define TIOCPKT_DATA 0
|
||||
#define TIOCPKT_FLUSHREAD 1
|
||||
#define TIOCPKT_FLUSHWRITE 2
|
||||
#define TIOCPKT_STOP 4
|
||||
#define TIOCPKT_START 8
|
||||
#define TIOCPKT_NOSTOP 16
|
||||
#define TIOCPKT_DOSTOP 32
|
||||
|
||||
#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
|
||||
|
||||
#endif
|
29
arch/arm/include/asm/ipcbuf.h
Звичайний файл
29
arch/arm/include/asm/ipcbuf.h
Звичайний файл
@@ -0,0 +1,29 @@
|
||||
#ifndef __ASMARM_IPCBUF_H
|
||||
#define __ASMARM_IPCBUF_H
|
||||
|
||||
/*
|
||||
* The ipc64_perm structure for arm architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 32-bit mode_t and seq
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct ipc64_perm
|
||||
{
|
||||
__kernel_key_t key;
|
||||
__kernel_uid32_t uid;
|
||||
__kernel_gid32_t gid;
|
||||
__kernel_uid32_t cuid;
|
||||
__kernel_gid32_t cgid;
|
||||
__kernel_mode_t mode;
|
||||
unsigned short __pad1;
|
||||
unsigned short seq;
|
||||
unsigned short __pad2;
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
#endif /* __ASMARM_IPCBUF_H */
|
28
arch/arm/include/asm/irq.h
Звичайний файл
28
arch/arm/include/asm/irq.h
Звичайний файл
@@ -0,0 +1,28 @@
|
||||
#ifndef __ASM_ARM_IRQ_H
|
||||
#define __ASM_ARM_IRQ_H
|
||||
|
||||
#include <asm/arch/irqs.h>
|
||||
|
||||
#ifndef irq_canonicalize
|
||||
#define irq_canonicalize(i) (i)
|
||||
#endif
|
||||
|
||||
#ifndef NR_IRQS
|
||||
#define NR_IRQS 128
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Use this value to indicate lack of interrupt
|
||||
* capability
|
||||
*/
|
||||
#ifndef NO_IRQ
|
||||
#define NO_IRQ ((unsigned int)(-1))
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
struct irqaction;
|
||||
extern void migrate_irqs(void);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
1
arch/arm/include/asm/irq_regs.h
Звичайний файл
1
arch/arm/include/asm/irq_regs.h
Звичайний файл
@@ -0,0 +1 @@
|
||||
#include <asm-generic/irq_regs.h>
|
132
arch/arm/include/asm/irqflags.h
Звичайний файл
132
arch/arm/include/asm/irqflags.h
Звичайний файл
@@ -0,0 +1,132 @@
|
||||
#ifndef __ASM_ARM_IRQFLAGS_H
|
||||
#define __ASM_ARM_IRQFLAGS_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
/*
|
||||
* CPU interrupt mask handling.
|
||||
*/
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
|
||||
#define raw_local_irq_save(x) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_save\n" \
|
||||
"cpsid i" \
|
||||
: "=r" (x) : : "memory", "cc"); \
|
||||
})
|
||||
|
||||
#define raw_local_irq_enable() __asm__("cpsie i @ __sti" : : : "memory", "cc")
|
||||
#define raw_local_irq_disable() __asm__("cpsid i @ __cli" : : : "memory", "cc")
|
||||
#define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc")
|
||||
#define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc")
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Save the current interrupt enable state & disable IRQs
|
||||
*/
|
||||
#define raw_local_irq_save(x) \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
(void) (&temp == &x); \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_save\n" \
|
||||
" orr %1, %0, #128\n" \
|
||||
" msr cpsr_c, %1" \
|
||||
: "=r" (x), "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Enable IRQs
|
||||
*/
|
||||
#define raw_local_irq_enable() \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_enable\n" \
|
||||
" bic %0, %0, #128\n" \
|
||||
" msr cpsr_c, %0" \
|
||||
: "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Disable IRQs
|
||||
*/
|
||||
#define raw_local_irq_disable() \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_disable\n" \
|
||||
" orr %0, %0, #128\n" \
|
||||
" msr cpsr_c, %0" \
|
||||
: "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Enable FIQs
|
||||
*/
|
||||
#define local_fiq_enable() \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ stf\n" \
|
||||
" bic %0, %0, #64\n" \
|
||||
" msr cpsr_c, %0" \
|
||||
: "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Disable FIQs
|
||||
*/
|
||||
#define local_fiq_disable() \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ clf\n" \
|
||||
" orr %0, %0, #64\n" \
|
||||
" msr cpsr_c, %0" \
|
||||
: "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Save the current interrupt enable state.
|
||||
*/
|
||||
#define raw_local_save_flags(x) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_save_flags" \
|
||||
: "=r" (x) : : "memory", "cc"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* restore saved IRQ & FIQ state
|
||||
*/
|
||||
#define raw_local_irq_restore(x) \
|
||||
__asm__ __volatile__( \
|
||||
"msr cpsr_c, %0 @ local_irq_restore\n" \
|
||||
: \
|
||||
: "r" (x) \
|
||||
: "memory", "cc")
|
||||
|
||||
#define raw_irqs_disabled_flags(flags) \
|
||||
({ \
|
||||
(int)((flags) & PSR_I_BIT); \
|
||||
})
|
||||
|
||||
#endif
|
||||
#endif
|
1
arch/arm/include/asm/kdebug.h
Звичайний файл
1
arch/arm/include/asm/kdebug.h
Звичайний файл
@@ -0,0 +1 @@
|
||||
#include <asm-generic/kdebug.h>
|
31
arch/arm/include/asm/kexec.h
Звичайний файл
31
arch/arm/include/asm/kexec.h
Звичайний файл
@@ -0,0 +1,31 @@
|
||||
#ifndef _ARM_KEXEC_H
|
||||
#define _ARM_KEXEC_H
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
|
||||
/* Maximum physical address we can use pages from */
|
||||
#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
|
||||
/* Maximum address we can reach in physical address mode */
|
||||
#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
|
||||
/* Maximum address we can use for the control code buffer */
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
|
||||
|
||||
#define KEXEC_CONTROL_CODE_SIZE 4096
|
||||
|
||||
#define KEXEC_ARCH KEXEC_ARCH_ARM
|
||||
|
||||
#define KEXEC_ARM_ATAGS_OFFSET 0x1000
|
||||
#define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct kimage;
|
||||
/* Provide a dummy definition to avoid build failures. */
|
||||
static inline void crash_setup_regs(struct pt_regs *newregs,
|
||||
struct pt_regs *oldregs) { }
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* CONFIG_KEXEC */
|
||||
|
||||
#endif /* _ARM_KEXEC_H */
|
104
arch/arm/include/asm/kgdb.h
Звичайний файл
104
arch/arm/include/asm/kgdb.h
Звичайний файл
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* ARM KGDB support
|
||||
*
|
||||
* Author: Deepak Saxena <dsaxena@mvista.com>
|
||||
*
|
||||
* Copyright (C) 2002 MontaVista Software Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ARM_KGDB_H__
|
||||
#define __ARM_KGDB_H__
|
||||
|
||||
#include <linux/ptrace.h>
|
||||
|
||||
/*
|
||||
* GDB assumes that we're a user process being debugged, so
|
||||
* it will send us an SWI command to write into memory as the
|
||||
* debug trap. When an SWI occurs, the next instruction addr is
|
||||
* placed into R14_svc before jumping to the vector trap.
|
||||
* This doesn't work for kernel debugging as we are already in SVC
|
||||
* we would loose the kernel's LR, which is a bad thing. This
|
||||
* is bad thing.
|
||||
*
|
||||
* By doing this as an undefined instruction trap, we force a mode
|
||||
* switch from SVC to UND mode, allowing us to save full kernel state.
|
||||
*
|
||||
* We also define a KGDB_COMPILED_BREAK which can be used to compile
|
||||
* in breakpoints. This is important for things like sysrq-G and for
|
||||
* the initial breakpoint from trap_init().
|
||||
*
|
||||
* Note to ARM HW designers: Add real trap support like SH && PPC to
|
||||
* make our lives much much simpler. :)
|
||||
*/
|
||||
#define BREAK_INSTR_SIZE 4
|
||||
#define GDB_BREAKINST 0xef9f0001
|
||||
#define KGDB_BREAKINST 0xe7ffdefe
|
||||
#define KGDB_COMPILED_BREAK 0xe7ffdeff
|
||||
#define CACHE_FLUSH_IS_SAFE 1
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
static inline void arch_kgdb_breakpoint(void)
|
||||
{
|
||||
asm(".word 0xe7ffdeff");
|
||||
}
|
||||
|
||||
extern void kgdb_handle_bus_error(void);
|
||||
extern int kgdb_fault_expected;
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* From Kevin Hilman:
|
||||
*
|
||||
* gdb is expecting the following registers layout.
|
||||
*
|
||||
* r0-r15: 1 long word each
|
||||
* f0-f7: unused, 3 long words each !!
|
||||
* fps: unused, 1 long word
|
||||
* cpsr: 1 long word
|
||||
*
|
||||
* Even though f0-f7 and fps are not used, they need to be
|
||||
* present in the registers sent for correct processing in
|
||||
* the host-side gdb.
|
||||
*
|
||||
* In particular, it is crucial that CPSR is in the right place,
|
||||
* otherwise gdb will not be able to correctly interpret stepping over
|
||||
* conditional branches.
|
||||
*/
|
||||
#define _GP_REGS 16
|
||||
#define _FP_REGS 8
|
||||
#define _EXTRA_REGS 2
|
||||
#define GDB_MAX_REGS (_GP_REGS + (_FP_REGS * 3) + _EXTRA_REGS)
|
||||
|
||||
#define KGDB_MAX_NO_CPUS 1
|
||||
#define BUFMAX 400
|
||||
#define NUMREGBYTES (GDB_MAX_REGS << 2)
|
||||
#define NUMCRITREGBYTES (32 << 2)
|
||||
|
||||
#define _R0 0
|
||||
#define _R1 1
|
||||
#define _R2 2
|
||||
#define _R3 3
|
||||
#define _R4 4
|
||||
#define _R5 5
|
||||
#define _R6 6
|
||||
#define _R7 7
|
||||
#define _R8 8
|
||||
#define _R9 9
|
||||
#define _R10 10
|
||||
#define _FP 11
|
||||
#define _IP 12
|
||||
#define _SPT 13
|
||||
#define _LR 14
|
||||
#define _PC 15
|
||||
#define _CPSR (GDB_MAX_REGS - 1)
|
||||
|
||||
/*
|
||||
* So that we can denote the end of a frame for tracing,
|
||||
* in the simple case:
|
||||
*/
|
||||
#define CFI_END_FRAME(func) __CFI_END_FRAME(_PC, _SPT, func)
|
||||
|
||||
#endif /* __ASM_KGDB_H__ */
|
24
arch/arm/include/asm/kmap_types.h
Звичайний файл
24
arch/arm/include/asm/kmap_types.h
Звичайний файл
@@ -0,0 +1,24 @@
|
||||
#ifndef __ARM_KMAP_TYPES_H
|
||||
#define __ARM_KMAP_TYPES_H
|
||||
|
||||
/*
|
||||
* This is the "bare minimum". AIO seems to require this.
|
||||
*/
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_BIO_SRC_IRQ,
|
||||
KM_BIO_DST_IRQ,
|
||||
KM_PTE0,
|
||||
KM_PTE1,
|
||||
KM_IRQ0,
|
||||
KM_IRQ1,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR
|
||||
};
|
||||
|
||||
#endif
|
79
arch/arm/include/asm/kprobes.h
Звичайний файл
79
arch/arm/include/asm/kprobes.h
Звичайний файл
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* arch/arm/include/asm/kprobes.h
|
||||
*
|
||||
* Copyright (C) 2006, 2007 Motorola Inc.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _ARM_KPROBES_H
|
||||
#define _ARM_KPROBES_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
#define __ARCH_WANT_KPROBES_INSN_SLOT
|
||||
#define MAX_INSN_SIZE 2
|
||||
#define MAX_STACK_SIZE 64 /* 32 would probably be OK */
|
||||
|
||||
/*
|
||||
* This undefined instruction must be unique and
|
||||
* reserved solely for kprobes' use.
|
||||
*/
|
||||
#define KPROBE_BREAKPOINT_INSTRUCTION 0xe7f001f8
|
||||
|
||||
#define regs_return_value(regs) ((regs)->ARM_r0)
|
||||
#define flush_insn_slot(p) do { } while (0)
|
||||
#define kretprobe_blacklist_size 0
|
||||
|
||||
typedef u32 kprobe_opcode_t;
|
||||
|
||||
struct kprobe;
|
||||
typedef void (kprobe_insn_handler_t)(struct kprobe *, struct pt_regs *);
|
||||
|
||||
/* Architecture specific copy of original instruction. */
|
||||
struct arch_specific_insn {
|
||||
kprobe_opcode_t *insn;
|
||||
kprobe_insn_handler_t *insn_handler;
|
||||
};
|
||||
|
||||
struct prev_kprobe {
|
||||
struct kprobe *kp;
|
||||
unsigned int status;
|
||||
};
|
||||
|
||||
/* per-cpu kprobe control block */
|
||||
struct kprobe_ctlblk {
|
||||
unsigned int kprobe_status;
|
||||
struct prev_kprobe prev_kprobe;
|
||||
struct pt_regs jprobe_saved_regs;
|
||||
char jprobes_stack[MAX_STACK_SIZE];
|
||||
};
|
||||
|
||||
void arch_remove_kprobe(struct kprobe *);
|
||||
void kretprobe_trampoline(void);
|
||||
|
||||
int kprobe_trap_handler(struct pt_regs *regs, unsigned int instr);
|
||||
int kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr);
|
||||
int kprobe_exceptions_notify(struct notifier_block *self,
|
||||
unsigned long val, void *data);
|
||||
|
||||
enum kprobe_insn {
|
||||
INSN_REJECTED,
|
||||
INSN_GOOD,
|
||||
INSN_GOOD_NO_SLOT
|
||||
};
|
||||
|
||||
enum kprobe_insn arm_kprobe_decode_insn(kprobe_opcode_t,
|
||||
struct arch_specific_insn *);
|
||||
void __init arm_kprobe_decode_init(void);
|
||||
|
||||
#endif /* _ARM_KPROBES_H */
|
50
arch/arm/include/asm/leds.h
Звичайний файл
50
arch/arm/include/asm/leds.h
Звичайний файл
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* arch/arm/include/asm/leds.h
|
||||
*
|
||||
* Copyright (C) 1998 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.
|
||||
*
|
||||
* Event-driven interface for LEDs on machines
|
||||
* Added led_start and led_stop- Alex Holden, 28th Dec 1998.
|
||||
*/
|
||||
#ifndef ASM_ARM_LEDS_H
|
||||
#define ASM_ARM_LEDS_H
|
||||
|
||||
|
||||
typedef enum {
|
||||
led_idle_start,
|
||||
led_idle_end,
|
||||
led_timer,
|
||||
led_start,
|
||||
led_stop,
|
||||
led_claim, /* override idle & timer leds */
|
||||
led_release, /* restore idle & timer leds */
|
||||
led_start_timer_mode,
|
||||
led_stop_timer_mode,
|
||||
led_green_on,
|
||||
led_green_off,
|
||||
led_amber_on,
|
||||
led_amber_off,
|
||||
led_red_on,
|
||||
led_red_off,
|
||||
led_blue_on,
|
||||
led_blue_off,
|
||||
/*
|
||||
* I want this between led_timer and led_start, but
|
||||
* someone has decided to export this to user space
|
||||
*/
|
||||
led_halted
|
||||
} led_event_t;
|
||||
|
||||
/* Use this routine to handle LEDs */
|
||||
|
||||
#ifdef CONFIG_LEDS
|
||||
extern void (*leds_event)(led_event_t);
|
||||
#else
|
||||
#define leds_event(e)
|
||||
#endif
|
||||
|
||||
#endif
|
11
arch/arm/include/asm/limits.h
Звичайний файл
11
arch/arm/include/asm/limits.h
Звичайний файл
@@ -0,0 +1,11 @@
|
||||
#ifndef __ASM_PIPE_H
|
||||
#define __ASM_PIPE_H
|
||||
|
||||
#ifndef PAGE_SIZE
|
||||
#include <asm/page.h>
|
||||
#endif
|
||||
|
||||
#define PIPE_BUF PAGE_SIZE
|
||||
|
||||
#endif
|
||||
|
11
arch/arm/include/asm/linkage.h
Звичайний файл
11
arch/arm/include/asm/linkage.h
Звичайний файл
@@ -0,0 +1,11 @@
|
||||
#ifndef __ASM_LINKAGE_H
|
||||
#define __ASM_LINKAGE_H
|
||||
|
||||
#define __ALIGN .align 0
|
||||
#define __ALIGN_STR ".align 0"
|
||||
|
||||
#define ENDPROC(name) \
|
||||
.type name, %function; \
|
||||
END(name)
|
||||
|
||||
#endif
|
1
arch/arm/include/asm/local.h
Звичайний файл
1
arch/arm/include/asm/local.h
Звичайний файл
@@ -0,0 +1 @@
|
||||
#include <asm-generic/local.h>
|
274
arch/arm/include/asm/locks.h
Звичайний файл
274
arch/arm/include/asm/locks.h
Звичайний файл
@@ -0,0 +1,274 @@
|
||||
/*
|
||||
* arch/arm/include/asm/locks.h
|
||||
*
|
||||
* Copyright (C) 2000 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.
|
||||
*
|
||||
* Interrupt safe locking assembler.
|
||||
*/
|
||||
#ifndef __ASM_PROC_LOCKS_H
|
||||
#define __ASM_PROC_LOCKS_H
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
|
||||
#define __down_op(ptr,fail) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" sub lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" movmi ip, %0\n" \
|
||||
" blmi " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
smp_mb(); \
|
||||
})
|
||||
|
||||
#define __down_op_ret(ptr,fail) \
|
||||
({ \
|
||||
unsigned int ret; \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op_ret\n" \
|
||||
"1: ldrex lr, [%1]\n" \
|
||||
" sub lr, lr, %2\n" \
|
||||
" strex ip, lr, [%1]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" movmi ip, %1\n" \
|
||||
" movpl ip, #0\n" \
|
||||
" blmi " #fail "\n" \
|
||||
" mov %0, ip" \
|
||||
: "=&r" (ret) \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
smp_mb(); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
#define __up_op(ptr,wake) \
|
||||
({ \
|
||||
smp_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" add lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" cmp lr, #0\n" \
|
||||
" movle ip, %0\n" \
|
||||
" blle " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* The value 0x01000000 supports up to 128 processors and
|
||||
* lots of processes. BIAS must be chosen such that sub'ing
|
||||
* BIAS once per CPU will result in the long remaining
|
||||
* negative.
|
||||
*/
|
||||
#define RW_LOCK_BIAS 0x01000000
|
||||
#define RW_LOCK_BIAS_STR "0x01000000"
|
||||
|
||||
#define __down_op_write(ptr,fail) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op_write\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" sub lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" movne ip, %0\n" \
|
||||
" blne " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc"); \
|
||||
smp_mb(); \
|
||||
})
|
||||
|
||||
#define __up_op_write(ptr,wake) \
|
||||
({ \
|
||||
smp_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_write\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" adds lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" movcs ip, %0\n" \
|
||||
" blcs " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc"); \
|
||||
})
|
||||
|
||||
#define __down_op_read(ptr,fail) \
|
||||
__down_op(ptr, fail)
|
||||
|
||||
#define __up_op_read(ptr,wake) \
|
||||
({ \
|
||||
smp_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_read\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" add lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" moveq ip, %0\n" \
|
||||
" bleq " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
})
|
||||
|
||||
#else
|
||||
|
||||
#define __down_op(ptr,fail) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" subs lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movmi ip, %0\n" \
|
||||
" blmi " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
smp_mb(); \
|
||||
})
|
||||
|
||||
#define __down_op_ret(ptr,fail) \
|
||||
({ \
|
||||
unsigned int ret; \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op_ret\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%1]\n" \
|
||||
" subs lr, lr, %2\n" \
|
||||
" str lr, [%1]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movmi ip, %1\n" \
|
||||
" movpl ip, #0\n" \
|
||||
" blmi " #fail "\n" \
|
||||
" mov %0, ip" \
|
||||
: "=&r" (ret) \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
smp_mb(); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
#define __up_op(ptr,wake) \
|
||||
({ \
|
||||
smp_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" adds lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movle ip, %0\n" \
|
||||
" blle " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* The value 0x01000000 supports up to 128 processors and
|
||||
* lots of processes. BIAS must be chosen such that sub'ing
|
||||
* BIAS once per CPU will result in the long remaining
|
||||
* negative.
|
||||
*/
|
||||
#define RW_LOCK_BIAS 0x01000000
|
||||
#define RW_LOCK_BIAS_STR "0x01000000"
|
||||
|
||||
#define __down_op_write(ptr,fail) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op_write\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" subs lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movne ip, %0\n" \
|
||||
" blne " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc"); \
|
||||
smp_mb(); \
|
||||
})
|
||||
|
||||
#define __up_op_write(ptr,wake) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_write\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" adds lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movcs ip, %0\n" \
|
||||
" blcs " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc"); \
|
||||
smp_mb(); \
|
||||
})
|
||||
|
||||
#define __down_op_read(ptr,fail) \
|
||||
__down_op(ptr, fail)
|
||||
|
||||
#define __up_op_read(ptr,wake) \
|
||||
({ \
|
||||
smp_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_read\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" adds lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" moveq ip, %0\n" \
|
||||
" bleq " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc"); \
|
||||
})
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
60
arch/arm/include/asm/mach/arch.h
Звичайний файл
60
arch/arm/include/asm/mach/arch.h
Звичайний файл
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/arch.h
|
||||
*
|
||||
* Copyright (C) 2000 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.
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct tag;
|
||||
struct meminfo;
|
||||
struct sys_timer;
|
||||
|
||||
struct machine_desc {
|
||||
/*
|
||||
* Note! The first four elements are used
|
||||
* by assembler code in head.S, head-common.S
|
||||
*/
|
||||
unsigned int nr; /* architecture number */
|
||||
unsigned int phys_io; /* start of physical io */
|
||||
unsigned int io_pg_offst; /* byte offset for io
|
||||
* page tabe entry */
|
||||
|
||||
const char *name; /* architecture name */
|
||||
unsigned long boot_params; /* tagged list */
|
||||
|
||||
unsigned int video_start; /* start of video RAM */
|
||||
unsigned int video_end; /* end of video RAM */
|
||||
|
||||
unsigned int reserve_lp0 :1; /* never has lp0 */
|
||||
unsigned int reserve_lp1 :1; /* never has lp1 */
|
||||
unsigned int reserve_lp2 :1; /* never has lp2 */
|
||||
unsigned int soft_reboot :1; /* soft reboot */
|
||||
void (*fixup)(struct machine_desc *,
|
||||
struct tag *, char **,
|
||||
struct meminfo *);
|
||||
void (*map_io)(void);/* IO mapping function */
|
||||
void (*init_irq)(void);
|
||||
struct sys_timer *timer; /* system tick timer */
|
||||
void (*init_machine)(void);
|
||||
};
|
||||
|
||||
/*
|
||||
* Set of macros to define architecture features. This is built into
|
||||
* a table by the linker.
|
||||
*/
|
||||
#define MACHINE_START(_type,_name) \
|
||||
static const struct machine_desc __mach_desc_##_type \
|
||||
__used \
|
||||
__attribute__((__section__(".arch.info.init"))) = { \
|
||||
.nr = MACH_TYPE_##_type, \
|
||||
.name = _name,
|
||||
|
||||
#define MACHINE_END \
|
||||
};
|
||||
|
||||
#endif
|
57
arch/arm/include/asm/mach/dma.h
Звичайний файл
57
arch/arm/include/asm/mach/dma.h
Звичайний файл
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/dma.h
|
||||
*
|
||||
* Copyright (C) 1998-2000 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.
|
||||
*
|
||||
* This header file describes the interface between the generic DMA handler
|
||||
* (dma.c) and the architecture-specific DMA backends (dma-*.c)
|
||||
*/
|
||||
|
||||
struct dma_struct;
|
||||
typedef struct dma_struct dma_t;
|
||||
|
||||
struct dma_ops {
|
||||
int (*request)(dmach_t, dma_t *); /* optional */
|
||||
void (*free)(dmach_t, dma_t *); /* optional */
|
||||
void (*enable)(dmach_t, dma_t *); /* mandatory */
|
||||
void (*disable)(dmach_t, dma_t *); /* mandatory */
|
||||
int (*residue)(dmach_t, dma_t *); /* optional */
|
||||
int (*setspeed)(dmach_t, dma_t *, int); /* optional */
|
||||
char *type;
|
||||
};
|
||||
|
||||
struct dma_struct {
|
||||
void *addr; /* single DMA address */
|
||||
unsigned long count; /* single DMA size */
|
||||
struct scatterlist buf; /* single DMA */
|
||||
int sgcount; /* number of DMA SG */
|
||||
struct scatterlist *sg; /* DMA Scatter-Gather List */
|
||||
|
||||
unsigned int active:1; /* Transfer active */
|
||||
unsigned int invalid:1; /* Address/Count changed */
|
||||
|
||||
dmamode_t dma_mode; /* DMA mode */
|
||||
int speed; /* DMA speed */
|
||||
|
||||
unsigned int lock; /* Device is allocated */
|
||||
const char *device_id; /* Device name */
|
||||
|
||||
unsigned int dma_base; /* Controller base address */
|
||||
int dma_irq; /* Controller IRQ */
|
||||
struct scatterlist cur_sg; /* Current controller buffer */
|
||||
unsigned int state;
|
||||
|
||||
struct dma_ops *d_ops;
|
||||
};
|
||||
|
||||
/* Prototype: void arch_dma_init(dma)
|
||||
* Purpose : Initialise architecture specific DMA
|
||||
* Params : dma - pointer to array of DMA structures
|
||||
*/
|
||||
extern void arch_dma_init(dma_t *dma);
|
||||
|
||||
extern void isa_init_dma(dma_t *dma);
|
39
arch/arm/include/asm/mach/flash.h
Звичайний файл
39
arch/arm/include/asm/mach/flash.h
Звичайний файл
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/flash.h
|
||||
*
|
||||
* Copyright (C) 2003 Russell King, All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef ASMARM_MACH_FLASH_H
|
||||
#define ASMARM_MACH_FLASH_H
|
||||
|
||||
struct mtd_partition;
|
||||
struct mtd_info;
|
||||
|
||||
/*
|
||||
* map_name: the map probe function name
|
||||
* name: flash device name (eg, as used with mtdparts=)
|
||||
* width: width of mapped device
|
||||
* init: method called at driver/device initialisation
|
||||
* exit: method called at driver/device removal
|
||||
* set_vpp: method called to enable or disable VPP
|
||||
* mmcontrol: method called to enable or disable Sync. Burst Read in OneNAND
|
||||
* parts: optional array of mtd_partitions for static partitioning
|
||||
* nr_parts: number of mtd_partitions for static partitoning
|
||||
*/
|
||||
struct flash_platform_data {
|
||||
const char *map_name;
|
||||
const char *name;
|
||||
unsigned int width;
|
||||
int (*init)(void);
|
||||
void (*exit)(void);
|
||||
void (*set_vpp)(int on);
|
||||
void (*mmcontrol)(struct mtd_info *mtd, int sync_read);
|
||||
struct mtd_partition *parts;
|
||||
unsigned int nr_parts;
|
||||
};
|
||||
|
||||
#endif
|
20
arch/arm/include/asm/mach/irda.h
Звичайний файл
20
arch/arm/include/asm/mach/irda.h
Звичайний файл
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/irda.h
|
||||
*
|
||||
* Copyright (C) 2004 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.
|
||||
*/
|
||||
#ifndef __ASM_ARM_MACH_IRDA_H
|
||||
#define __ASM_ARM_MACH_IRDA_H
|
||||
|
||||
struct irda_platform_data {
|
||||
int (*startup)(struct device *);
|
||||
void (*shutdown)(struct device *);
|
||||
int (*set_power)(struct device *, unsigned int state);
|
||||
void (*set_speed)(struct device *, unsigned int speed);
|
||||
};
|
||||
|
||||
#endif
|
54
arch/arm/include/asm/mach/irq.h
Звичайний файл
54
arch/arm/include/asm/mach/irq.h
Звичайний файл
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/irq.h
|
||||
*
|
||||
* Copyright (C) 1995-2000 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.
|
||||
*/
|
||||
#ifndef __ASM_ARM_MACH_IRQ_H
|
||||
#define __ASM_ARM_MACH_IRQ_H
|
||||
|
||||
#include <linux/irq.h>
|
||||
|
||||
struct seq_file;
|
||||
|
||||
/*
|
||||
* This is internal. Do not use it.
|
||||
*/
|
||||
extern void (*init_arch_irq)(void);
|
||||
extern void init_FIQ(void);
|
||||
extern int show_fiq_list(struct seq_file *, void *);
|
||||
|
||||
/*
|
||||
* Obsolete inline function for calling irq descriptor handlers.
|
||||
*/
|
||||
static inline void desc_handle_irq(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
desc->handle_irq(irq, desc);
|
||||
}
|
||||
|
||||
void set_irq_flags(unsigned int irq, unsigned int flags);
|
||||
|
||||
#define IRQF_VALID (1 << 0)
|
||||
#define IRQF_PROBE (1 << 1)
|
||||
#define IRQF_NOAUTOEN (1 << 2)
|
||||
|
||||
/*
|
||||
* This is for easy migration, but should be changed in the source
|
||||
*/
|
||||
#define do_bad_IRQ(irq,desc) \
|
||||
do { \
|
||||
spin_lock(&desc->lock); \
|
||||
handle_bad_irq(irq, desc); \
|
||||
spin_unlock(&desc->lock); \
|
||||
} while(0)
|
||||
|
||||
extern unsigned long irq_err_count;
|
||||
static inline void ack_bad_irq(int irq)
|
||||
{
|
||||
irq_err_count++;
|
||||
}
|
||||
|
||||
#endif
|
36
arch/arm/include/asm/mach/map.h
Звичайний файл
36
arch/arm/include/asm/mach/map.h
Звичайний файл
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* arch/arm/include/asm/map.h
|
||||
*
|
||||
* Copyright (C) 1999-2000 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.
|
||||
*
|
||||
* Page table mapping constructs and function prototypes
|
||||
*/
|
||||
#include <asm/io.h>
|
||||
|
||||
struct map_desc {
|
||||
unsigned long virtual;
|
||||
unsigned long pfn;
|
||||
unsigned long length;
|
||||
unsigned int type;
|
||||
};
|
||||
|
||||
/* types 0-3 are defined in asm/io.h */
|
||||
#define MT_CACHECLEAN 4
|
||||
#define MT_MINICLEAN 5
|
||||
#define MT_LOW_VECTORS 6
|
||||
#define MT_HIGH_VECTORS 7
|
||||
#define MT_MEMORY 8
|
||||
#define MT_ROM 9
|
||||
|
||||
#define MT_NONSHARED_DEVICE MT_DEVICE_NONSHARED
|
||||
#define MT_IXP2000_DEVICE MT_DEVICE_IXP2000
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern void iotable_init(struct map_desc *, int);
|
||||
#else
|
||||
#define iotable_init(map,num) do { } while (0)
|
||||
#endif
|
15
arch/arm/include/asm/mach/mmc.h
Звичайний файл
15
arch/arm/include/asm/mach/mmc.h
Звичайний файл
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/mmc.h
|
||||
*/
|
||||
#ifndef ASMARM_MACH_MMC_H
|
||||
#define ASMARM_MACH_MMC_H
|
||||
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
struct mmc_platform_data {
|
||||
unsigned int ocr_mask; /* available voltages */
|
||||
u32 (*translate_vdd)(struct device *, unsigned int);
|
||||
unsigned int (*status)(struct device *);
|
||||
};
|
||||
|
||||
#endif
|
72
arch/arm/include/asm/mach/pci.h
Звичайний файл
72
arch/arm/include/asm/mach/pci.h
Звичайний файл
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/pci.h
|
||||
*
|
||||
* Copyright (C) 2000 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.
|
||||
*/
|
||||
|
||||
struct pci_sys_data;
|
||||
struct pci_bus;
|
||||
|
||||
struct hw_pci {
|
||||
struct list_head buses;
|
||||
int nr_controllers;
|
||||
int (*setup)(int nr, struct pci_sys_data *);
|
||||
struct pci_bus *(*scan)(int nr, struct pci_sys_data *);
|
||||
void (*preinit)(void);
|
||||
void (*postinit)(void);
|
||||
u8 (*swizzle)(struct pci_dev *dev, u8 *pin);
|
||||
int (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin);
|
||||
};
|
||||
|
||||
/*
|
||||
* Per-controller structure
|
||||
*/
|
||||
struct pci_sys_data {
|
||||
struct list_head node;
|
||||
int busnr; /* primary bus number */
|
||||
u64 mem_offset; /* bus->cpu memory mapping offset */
|
||||
unsigned long io_offset; /* bus->cpu IO mapping offset */
|
||||
struct pci_bus *bus; /* PCI bus */
|
||||
struct resource *resource[3]; /* Primary PCI bus resources */
|
||||
/* Bridge swizzling */
|
||||
u8 (*swizzle)(struct pci_dev *, u8 *);
|
||||
/* IRQ mapping */
|
||||
int (*map_irq)(struct pci_dev *, u8, u8);
|
||||
struct hw_pci *hw;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the standard PCI-PCI bridge swizzling algorithm.
|
||||
*/
|
||||
u8 pci_std_swizzle(struct pci_dev *dev, u8 *pinp);
|
||||
|
||||
/*
|
||||
* Call this with your hw_pci struct to initialise the PCI system.
|
||||
*/
|
||||
void pci_common_init(struct hw_pci *);
|
||||
|
||||
/*
|
||||
* PCI controllers
|
||||
*/
|
||||
extern int iop3xx_pci_setup(int nr, struct pci_sys_data *);
|
||||
extern struct pci_bus *iop3xx_pci_scan_bus(int nr, struct pci_sys_data *);
|
||||
extern void iop3xx_pci_preinit(void);
|
||||
extern void iop3xx_pci_preinit_cond(void);
|
||||
|
||||
extern int dc21285_setup(int nr, struct pci_sys_data *);
|
||||
extern struct pci_bus *dc21285_scan_bus(int nr, struct pci_sys_data *);
|
||||
extern void dc21285_preinit(void);
|
||||
extern void dc21285_postinit(void);
|
||||
|
||||
extern int via82c505_setup(int nr, struct pci_sys_data *);
|
||||
extern struct pci_bus *via82c505_scan_bus(int nr, struct pci_sys_data *);
|
||||
extern void via82c505_init(void *sysdata);
|
||||
|
||||
extern int pci_v3_setup(int nr, struct pci_sys_data *);
|
||||
extern struct pci_bus *pci_v3_scan_bus(int nr, struct pci_sys_data *);
|
||||
extern void pci_v3_preinit(void);
|
||||
extern void pci_v3_postinit(void);
|
Деякі з файлів не показано, оскільки було змінено дуже багато файлів Показати більше
Посилання в новій задачі
Заблокувати користувача